├── .cargo └── config.toml ├── .editorconfig ├── .eslintrc.yml ├── .gitattributes ├── .github ├── renovate.json └── workflows │ ├── CI.yml │ └── lint.yml ├── .gitignore ├── .husky ├── .gitignore └── pre-commit ├── .prettierignore ├── .taplo.toml ├── .vscode └── settings.json ├── .yarn └── releases │ └── yarn-4.5.0.cjs ├── .yarnrc.yml ├── Cargo.toml ├── LICENSE ├── README.md ├── __test__ └── webview.test.mjs ├── assets └── preview.png ├── build.rs ├── cli ├── build.mjs ├── index.mjs └── utils.mjs ├── examples ├── html.js ├── http │ ├── server.mjs │ └── webview.mjs ├── multi-webview.mjs ├── multiple.mjs ├── transparent.mjs └── url.mjs ├── index.d.ts ├── index.js ├── npm ├── android-arm-eabi │ ├── README.md │ └── package.json ├── android-arm64 │ ├── README.md │ └── package.json ├── darwin-arm64 │ ├── README.md │ └── package.json ├── darwin-x64 │ ├── README.md │ └── package.json ├── freebsd-x64 │ ├── README.md │ └── package.json ├── linux-x64-gnu │ ├── README.md │ └── package.json ├── win32-arm64-msvc │ ├── README.md │ └── package.json ├── win32-ia32-msvc │ ├── README.md │ └── package.json └── win32-x64-msvc │ ├── README.md │ └── package.json ├── package.json ├── rustfmt.toml ├── src ├── browser_window.rs ├── lib.rs └── webview.rs ├── tsconfig.json └── yarn.lock /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [target.aarch64-unknown-linux-musl] 2 | linker = "aarch64-linux-musl-gcc" 3 | rustflags = ["-C", "target-feature=-crt-static"] 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors or IDEs 3 | # http://editorconfig.org 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | insert_final_newline = true 13 | 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | parser: '@typescript-eslint/parser' 2 | 3 | parserOptions: 4 | ecmaFeatures: 5 | jsx: true 6 | ecmaVersion: latest 7 | sourceType: module 8 | project: ./tsconfig.json 9 | 10 | env: 11 | browser: true 12 | es6: true 13 | node: true 14 | jest: true 15 | 16 | ignorePatterns: ['index.js'] 17 | 18 | plugins: 19 | - import 20 | - '@typescript-eslint' 21 | 22 | extends: 23 | - eslint:recommended 24 | - plugin:prettier/recommended 25 | 26 | rules: 27 | # 0 = off, 1 = warn, 2 = error 28 | 'space-before-function-paren': 0 29 | 'no-useless-constructor': 0 30 | 'no-undef': 2 31 | 'no-console': [2, { allow: ['error', 'warn', 'info', 'assert'] }] 32 | 'comma-dangle': ['error', 'only-multiline'] 33 | 'no-unused-vars': 0 34 | 'no-var': 2 35 | 'one-var-declaration-per-line': 2 36 | 'prefer-const': 2 37 | 'no-const-assign': 2 38 | 'no-duplicate-imports': 2 39 | 'no-use-before-define': [2, { 'functions': false, 'classes': false }] 40 | 'eqeqeq': [2, 'always', { 'null': 'ignore' }] 41 | 'no-case-declarations': 0 42 | 'no-restricted-syntax': 43 | [ 44 | 2, 45 | { 46 | 'selector': 'BinaryExpression[operator=/(==|===|!=|!==)/][left.raw=true], BinaryExpression[operator=/(==|===|!=|!==)/][right.raw=true]', 47 | 'message': Don't compare for equality against boolean literals, 48 | }, 49 | ] 50 | 51 | # https://github.com/benmosher/eslint-plugin-import/pull/334 52 | 'import/no-duplicates': 2 53 | 'import/first': 2 54 | 'import/newline-after-import': 2 55 | 'import/order': 56 | [ 57 | 2, 58 | { 59 | 'newlines-between': 'always', 60 | 'alphabetize': { 'order': 'asc' }, 61 | 'groups': ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], 62 | }, 63 | ] 64 | 65 | overrides: 66 | - files: 67 | - ./**/*{.ts,.tsx} 68 | rules: 69 | 'no-unused-vars': [2, { varsIgnorePattern: '^_', argsIgnorePattern: '^_', ignoreRestSiblings: true }] 70 | 'no-undef': 0 71 | # TypeScript declare merge 72 | 'no-redeclare': 0 73 | 'no-useless-constructor': 0 74 | 'no-dupe-class-members': 0 75 | 'no-case-declarations': 0 76 | 'no-duplicate-imports': 0 77 | # TypeScript Interface and Type 78 | 'no-use-before-define': 0 79 | 80 | '@typescript-eslint/adjacent-overload-signatures': 2 81 | '@typescript-eslint/await-thenable': 2 82 | '@typescript-eslint/consistent-type-assertions': 2 83 | '@typescript-eslint/ban-types': 84 | [ 85 | 'error', 86 | { 87 | 'types': 88 | { 89 | 'String': { 'message': 'Use string instead', 'fixWith': 'string' }, 90 | 'Number': { 'message': 'Use number instead', 'fixWith': 'number' }, 91 | 'Boolean': { 'message': 'Use boolean instead', 'fixWith': 'boolean' }, 92 | 'Function': { 'message': 'Use explicit type instead' }, 93 | }, 94 | }, 95 | ] 96 | '@typescript-eslint/explicit-member-accessibility': 97 | [ 98 | 'error', 99 | { 100 | accessibility: 'explicit', 101 | overrides: 102 | { 103 | accessors: 'no-public', 104 | constructors: 'no-public', 105 | methods: 'no-public', 106 | properties: 'no-public', 107 | parameterProperties: 'explicit', 108 | }, 109 | }, 110 | ] 111 | '@typescript-eslint/method-signature-style': 2 112 | '@typescript-eslint/no-floating-promises': 2 113 | '@typescript-eslint/no-implied-eval': 2 114 | '@typescript-eslint/no-for-in-array': 2 115 | '@typescript-eslint/no-inferrable-types': 2 116 | '@typescript-eslint/no-invalid-void-type': 2 117 | '@typescript-eslint/no-misused-new': 2 118 | '@typescript-eslint/no-misused-promises': 2 119 | '@typescript-eslint/no-namespace': 2 120 | '@typescript-eslint/no-non-null-asserted-optional-chain': 2 121 | '@typescript-eslint/no-throw-literal': 2 122 | '@typescript-eslint/no-unnecessary-boolean-literal-compare': 2 123 | '@typescript-eslint/prefer-for-of': 2 124 | '@typescript-eslint/prefer-nullish-coalescing': 2 125 | '@typescript-eslint/switch-exhaustiveness-check': 2 126 | '@typescript-eslint/prefer-optional-chain': 2 127 | '@typescript-eslint/prefer-readonly': 2 128 | '@typescript-eslint/prefer-string-starts-ends-with': 0 129 | '@typescript-eslint/no-array-constructor': 2 130 | '@typescript-eslint/require-await': 2 131 | '@typescript-eslint/return-await': 2 132 | '@typescript-eslint/ban-ts-comment': 133 | [2, { 'ts-expect-error': false, 'ts-ignore': true, 'ts-nocheck': true, 'ts-check': false }] 134 | '@typescript-eslint/naming-convention': 135 | [ 136 | 2, 137 | { 138 | selector: 'memberLike', 139 | format: ['camelCase', 'PascalCase'], 140 | modifiers: ['private'], 141 | leadingUnderscore: 'forbid', 142 | }, 143 | ] 144 | '@typescript-eslint/no-unused-vars': 145 | [2, { varsIgnorePattern: '^_', argsIgnorePattern: '^_', ignoreRestSiblings: true }] 146 | '@typescript-eslint/member-ordering': 147 | [ 148 | 2, 149 | { 150 | default: 151 | [ 152 | 'public-static-field', 153 | 'protected-static-field', 154 | 'private-static-field', 155 | 'public-static-method', 156 | 'protected-static-method', 157 | 'private-static-method', 158 | 'public-instance-field', 159 | 'protected-instance-field', 160 | 'private-instance-field', 161 | 'public-constructor', 162 | 'protected-constructor', 163 | 'private-constructor', 164 | 'public-instance-method', 165 | 'protected-instance-method', 166 | 'private-instance-method', 167 | ], 168 | }, 169 | ] 170 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | 5 | *.ts text eol=lf merge=union 6 | *.tsx text eol=lf merge=union 7 | *.rs text eol=lf merge=union 8 | *.js text eol=lf merge=union 9 | *.json text eol=lf merge=union 10 | *.debug text eol=lf merge=union 11 | 12 | # Generated codes 13 | index.js linguist-detectable=false 14 | index.d.ts linguist-detectable=false -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["config:base", "group:allNonMajor", ":preserveSemverRanges", ":disablePeerDependencies"], 4 | "labels": ["dependencies"], 5 | "packageRules": [ 6 | { 7 | "matchPackageNames": ["@napi/cli", "napi", "napi-build", "napi-derive"], 8 | "addLabels": ["napi-rs"], 9 | "groupName": "napi-rs" 10 | }, 11 | { 12 | "matchPackagePatterns": ["^eslint", "^@typescript-eslint"], 13 | "groupName": "linter" 14 | } 15 | ], 16 | "commitMessagePrefix": "chore: ", 17 | "commitMessageAction": "bump up", 18 | "commitMessageTopic": "{{depName}} version", 19 | "ignoreDeps": [] 20 | } 21 | -------------------------------------------------------------------------------- /.github/workflows/CI.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | env: 3 | DEBUG: napi:* 4 | APP_NAME: webview 5 | MACOSX_DEPLOYMENT_TARGET: '10.13' 6 | CARGO_INCREMENTAL: '1' 7 | permissions: 8 | contents: write 9 | id-token: write 10 | 'on': 11 | push: 12 | branches: 13 | - main 14 | tags-ignore: 15 | - '**' 16 | paths-ignore: 17 | - '**/*.md' 18 | - LICENSE 19 | - '**/*.gitignore' 20 | - .editorconfig 21 | - docs/** 22 | pull_request: null 23 | concurrency: 24 | group: ${{ github.workflow }}-${{ github.ref }} 25 | cancel-in-progress: true 26 | jobs: 27 | build: 28 | strategy: 29 | fail-fast: false 30 | matrix: 31 | settings: 32 | - host: macos-latest 33 | target: x86_64-apple-darwin 34 | build: yarn build --target x86_64-apple-darwin 35 | - host: windows-latest 36 | build: yarn build --target x86_64-pc-windows-msvc 37 | target: x86_64-pc-windows-msvc 38 | - host: windows-latest 39 | build: yarn build --target i686-pc-windows-msvc 40 | target: i686-pc-windows-msvc 41 | # - host: ubuntu-latest 42 | # target: x86_64-unknown-linux-gnu 43 | # docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian 44 | # setup: | 45 | # sudo apt-get update 46 | # sudo apt-get install pkg-config -y 47 | # build: yarn build --target x86_64-unknown-linux-gnu 48 | # - host: ubuntu-latest 49 | # target: x86_64-unknown-linux-musl 50 | # docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine 51 | # setup: | 52 | # sudo apt-get update 53 | # sudo apt-get install pkg-config -y 54 | # build: yarn build --target x86_64-unknown-linux-musl 55 | - host: macos-latest 56 | target: aarch64-apple-darwin 57 | build: yarn build --target aarch64-apple-darwin 58 | # - host: ubuntu-latest 59 | # target: aarch64-unknown-linux-gnu 60 | # docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 61 | # setup: | 62 | # sudo apt-get update 63 | # sudo apt-get install pkg-config -y 64 | # build: yarn build --target aarch64-unknown-linux-gnu 65 | # - host: ubuntu-latest 66 | # target: armv7-unknown-linux-gnueabihf 67 | # setup: | 68 | # sudo apt-get update 69 | # sudo apt-get install gcc-arm-linux-gnueabihf -y 70 | # build: | 71 | # yarn build --target armv7-unknown-linux-gnueabihf 72 | - host: ubuntu-latest 73 | target: aarch64-linux-android 74 | build: yarn build --target aarch64-linux-android 75 | - host: ubuntu-latest 76 | target: armv7-linux-androideabi 77 | build: yarn build --target armv7-linux-androideabi 78 | # - host: ubuntu-latest 79 | # target: aarch64-unknown-linux-musl 80 | # docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine 81 | # setup: | 82 | # sudo apt-get update 83 | # sudo apt-get install pkg-config -y 84 | # build: |- 85 | # set -e && 86 | # rustup target add aarch64-unknown-linux-musl && 87 | # yarn build --target aarch64-unknown-linux-musl 88 | - host: windows-latest 89 | target: aarch64-pc-windows-msvc 90 | build: yarn build --target aarch64-pc-windows-msvc 91 | name: stable - ${{ matrix.settings.target }} - node@18 92 | runs-on: ${{ matrix.settings.host }} 93 | steps: 94 | - uses: actions/checkout@v4 95 | - name: Setup node 96 | uses: actions/setup-node@v4 97 | if: ${{ !matrix.settings.docker }} 98 | with: 99 | node-version: 20 100 | cache: yarn 101 | - name: Install 102 | uses: dtolnay/rust-toolchain@stable 103 | if: ${{ !matrix.settings.docker }} 104 | with: 105 | toolchain: stable 106 | targets: ${{ matrix.settings.target }} 107 | - name: Cache cargo 108 | uses: actions/cache@v4 109 | with: 110 | path: | 111 | ~/.cargo/registry/index/ 112 | ~/.cargo/registry/cache/ 113 | ~/.cargo/git/db/ 114 | .cargo-cache 115 | target/ 116 | key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} 117 | - uses: goto-bus-stop/setup-zig@v2 118 | if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' }} 119 | with: 120 | version: 0.13.0 121 | - name: Setup toolchain 122 | run: ${{ matrix.settings.setup }} 123 | if: ${{ matrix.settings.setup }} 124 | shell: bash 125 | - name: Install dependencies 126 | run: yarn install 127 | - name: Build in docker 128 | uses: addnab/docker-run-action@v3 129 | if: ${{ matrix.settings.docker }} 130 | with: 131 | image: ${{ matrix.settings.docker }} 132 | options: '--user 0:0 -v ${{ github.workspace }}/.cargo-cache/git/db:/usr/local/cargo/git/db -v ${{ github.workspace }}/.cargo/registry/cache:/usr/local/cargo/registry/cache -v ${{ github.workspace }}/.cargo/registry/index:/usr/local/cargo/registry/index -v ${{ github.workspace }}:/build -w /build' 133 | run: ${{ matrix.settings.build }} 134 | - name: Build 135 | run: ${{ matrix.settings.build }} 136 | if: ${{ !matrix.settings.docker }} 137 | shell: bash 138 | - name: Upload artifact 139 | uses: actions/upload-artifact@v4 140 | with: 141 | name: bindings-${{ matrix.settings.target }} 142 | path: ${{ env.APP_NAME }}.*.node 143 | if-no-files-found: error 144 | # build-freebsd: 145 | # runs-on: ubuntu-latest 146 | # name: Build FreeBSD 147 | # steps: 148 | # - uses: actions/checkout@v4 149 | # - name: Build 150 | # id: build 151 | # uses: cross-platform-actions/action@v0.25.0 152 | # env: 153 | # DEBUG: napi:* 154 | # RUSTUP_IO_THREADS: 1 155 | # with: 156 | # operating_system: freebsd 157 | # version: '14.0' 158 | # memory: 8G 159 | # cpu_count: 3 160 | # environment_variables: 'DEBUG RUSTUP_IO_THREADS' 161 | # shell: bash 162 | # run: | 163 | # sudo pkg install -y -f curl node libnghttp2 npm pkg-config 164 | # sudo npm install -g yarn --ignore-scripts 165 | # curl https://sh.rustup.rs -sSf --output rustup.sh 166 | # sh rustup.sh -y --profile minimal --default-toolchain beta 167 | # source "$HOME/.cargo/env" 168 | # echo "~~~~ rustc --version ~~~~" 169 | # rustc --version 170 | # echo "~~~~ node -v ~~~~" 171 | # node -v 172 | # echo "~~~~ yarn --version ~~~~" 173 | # yarn --version 174 | # pwd 175 | # ls -lah 176 | # whoami 177 | # env 178 | # freebsd-version 179 | # yarn install 180 | # yarn build 181 | # rm -rf node_modules 182 | # rm -rf target 183 | # rm -rf .yarn/cache 184 | # - name: Upload artifact 185 | # uses: actions/upload-artifact@v4 186 | # with: 187 | # name: bindings-freebsd 188 | # path: ${{ env.APP_NAME }}.*.node 189 | # if-no-files-found: error 190 | publish: 191 | name: Publish 192 | runs-on: ubuntu-latest 193 | needs: 194 | - build 195 | # - build-freebsd 196 | steps: 197 | - uses: actions/checkout@v4 198 | - name: Setup node 199 | uses: actions/setup-node@v4 200 | with: 201 | node-version: 20 202 | cache: yarn 203 | - name: Install dependencies 204 | run: yarn install 205 | - name: Download all artifacts 206 | uses: actions/download-artifact@v4 207 | with: 208 | path: artifacts 209 | - name: Move artifacts 210 | run: yarn artifacts 211 | - name: List packages 212 | run: ls -R ./npm 213 | shell: bash 214 | - name: Publish 215 | run: | 216 | npm config set provenance true 217 | if git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+$"; 218 | then 219 | echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc 220 | npm publish --access public 221 | elif git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+"; 222 | then 223 | echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc 224 | npm publish --tag next --access public 225 | else 226 | echo "Not a release, skipping publish" 227 | fi 228 | env: 229 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 230 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 231 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | tags-ignore: 8 | - '**' 9 | pull_request: 10 | concurrency: 11 | group: ${{ github.workflow }}-${{ github.ref }} 12 | cancel-in-progress: true 13 | jobs: 14 | lint: 15 | name: Lint 16 | runs-on: ubuntu-latest 17 | steps: 18 | - uses: actions/checkout@v4 19 | 20 | - name: Setup node 21 | uses: actions/setup-node@v4 22 | with: 23 | node-version: 20 24 | cache: 'yarn' 25 | 26 | - name: Install 27 | uses: dtolnay/rust-toolchain@stable 28 | with: 29 | components: clippy, rustfmt 30 | 31 | - name: Install dependencies 32 | run: yarn install 33 | 34 | - name: ESLint 35 | run: yarn lint 36 | 37 | - name: Cargo fmt 38 | run: cargo fmt -- --check 39 | 40 | - name: Clippy 41 | run: cargo clippy 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/node 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=node 4 | 5 | ### Node ### 6 | # Logs 7 | logs 8 | *.log 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | lerna-debug.log* 13 | 14 | # Diagnostic reports (https://nodejs.org/api/report.html) 15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 16 | 17 | # Runtime data 18 | pids 19 | *.pid 20 | *.seed 21 | *.pid.lock 22 | 23 | # Directory for instrumented libs generated by jscoverage/JSCover 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | coverage 28 | *.lcov 29 | 30 | # nyc test coverage 31 | .nyc_output 32 | 33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 34 | .grunt 35 | 36 | # Bower dependency directory (https://bower.io/) 37 | bower_components 38 | 39 | # node-waf configuration 40 | .lock-wscript 41 | 42 | # Compiled binary addons (https://nodejs.org/api/addons.html) 43 | build/Release 44 | 45 | # Dependency directories 46 | node_modules/ 47 | jspm_packages/ 48 | 49 | # TypeScript v1 declaration files 50 | typings/ 51 | 52 | # TypeScript cache 53 | *.tsbuildinfo 54 | 55 | # Optional npm cache directory 56 | .npm 57 | 58 | # Optional eslint cache 59 | .eslintcache 60 | 61 | # Microbundle cache 62 | .rpt2_cache/ 63 | .rts2_cache_cjs/ 64 | .rts2_cache_es/ 65 | .rts2_cache_umd/ 66 | 67 | # Optional REPL history 68 | .node_repl_history 69 | 70 | # Output of 'npm pack' 71 | *.tgz 72 | 73 | # Yarn Integrity file 74 | .yarn-integrity 75 | 76 | # dotenv environment variables file 77 | .env 78 | .env.test 79 | 80 | # parcel-bundler cache (https://parceljs.org/) 81 | .cache 82 | 83 | # Next.js build output 84 | .next 85 | 86 | # Nuxt.js build / generate output 87 | .nuxt 88 | dist 89 | 90 | # Gatsby files 91 | .cache/ 92 | # Comment in the public line in if your project uses Gatsby and not Next.js 93 | # https://nextjs.org/blog/next-9-1#public-directory-support 94 | # public 95 | 96 | # vuepress build output 97 | .vuepress/dist 98 | 99 | # Serverless directories 100 | .serverless/ 101 | 102 | # FuseBox cache 103 | .fusebox/ 104 | 105 | # DynamoDB Local files 106 | .dynamodb/ 107 | 108 | # TernJS port file 109 | .tern-port 110 | 111 | # Stores VSCode versions used for testing VSCode extensions 112 | .vscode-test 113 | 114 | # End of https://www.toptal.com/developers/gitignore/api/node 115 | 116 | 117 | #Added by cargo 118 | 119 | /target 120 | Cargo.lock 121 | 122 | *.node 123 | .pnp.* 124 | .yarn/* 125 | !.yarn/patches 126 | !.yarn/plugins 127 | !.yarn/releases 128 | !.yarn/sdks 129 | !.yarn/versions -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | yarn lint-staged 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | target 2 | .yarn -------------------------------------------------------------------------------- /.taplo.toml: -------------------------------------------------------------------------------- 1 | exclude = ["node_modules/**/*.toml"] 2 | 3 | # https://taplo.tamasfe.dev/configuration/formatter-options.html 4 | [formatting] 5 | align_entries = true 6 | indent_tables = true 7 | reorder_keys = true 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "rust-analyzer.procMacro.attributes.enable": false 3 | } 4 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | 3 | npmAuditRegistry: 'https://registry.npmjs.org' 4 | 5 | yarnPath: .yarn/releases/yarn-4.5.0.cjs 6 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | authors = ["LongYinan "] 3 | edition = "2021" 4 | name = "webview" 5 | version = "0.1.0" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [lib] 10 | crate-type = ["cdylib"] 11 | 12 | [dependencies] 13 | napi = { version = "2", default-features = true, features = ["napi9"] } 14 | napi-derive = "2" 15 | tao = "0.30.8" 16 | wry = { version = "0.47.0", features = ["devtools", "fullscreen"] } 17 | 18 | [build-dependencies] 19 | napi-build = "2" 20 | 21 | [profile.release] 22 | lto = true 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Twilight 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `@webviewjs/webview` 2 | 3 | ![https://github.com/webviewjs/webview/actions](https://github.com/webviewjs/webview/workflows/CI/badge.svg) 4 | 5 | Robust cross-platform webview library for Node.js written in Rust. It is a native binding to [tao](https://github.com/tauri-apps/tao) and [wry](https://github.com/tauri-apps/wry) allowing you to easily manage cross platform windowing and webview. 6 | 7 | ![preview](https://github.com/webviewjs/webview/raw/main/assets/preview.png) 8 | 9 | > [!CAUTION] 10 | > This library is still in development and not ready for production use. Feel free to experiment with it and report any issues you find. 11 | 12 | # Installation 13 | 14 | ```bash 15 | npm install @webviewjs/webview 16 | ``` 17 | 18 | # Supported platforms 19 | 20 | | Platform | Supported | 21 | | ----------------------- | --------- | 22 | | x86_64-apple-darwin | ✅ | 23 | | x86_64-pc-windows-msvc | ✅ | 24 | | i686-pc-windows-msvc | ✅ | 25 | | aarch64-apple-darwin | ✅ | 26 | | aarch64-linux-android | ✅ | 27 | | armv7-linux-androideabi | ✅ | 28 | | aarch64-pc-windows-msvc | ✅ | 29 | 30 | # Examples 31 | 32 | ## Load external url 33 | 34 | ```js 35 | import { Application } from '@webviewjs/webview'; 36 | // or 37 | const { Application } = require('@webviewjs/webview'); 38 | 39 | const app = new Application(); 40 | const window = app.createBrowserWindow(); 41 | const webview = window.createWebview(); 42 | 43 | webview.loadUrl('https://nodejs.org'); 44 | 45 | app.run(); 46 | ``` 47 | 48 | ## IPC 49 | 50 | ```js 51 | const app = new Application(); 52 | const window = app.createBrowserWindow(); 53 | 54 | const webview = window.createWebview({ 55 | html: ` 56 | 57 | 58 | Webview 59 | 60 | 61 |

Hello world!

62 | 63 | 68 | 69 | 70 | `, 71 | preload: `window.onIpcMessage = function(data) { 72 | const output = document.getElementById('output'); 73 | output.innerText = \`Server Sent A Message: \${data}\`; 74 | }` 75 | }); 76 | 77 | if (!webview.isDevtoolsOpen()) webview.openDevtools(); 78 | 79 | webview.onIpcMessage((data) => { 80 | const reply = `You sent ${data.body.toString('utf-8')}`; 81 | window.evaluateScript(`onIpcMessage("${reply}")`) 82 | }) 83 | 84 | app.run(); 85 | ``` 86 | 87 | Check out [examples](./examples) directory for more examples, such as serving contents from a web server to webview, etc. 88 | 89 | # Building executables 90 | 91 | > [!WARNING] 92 | > The CLI feature is very experimental and may not work as expected. Please report any issues you find. 93 | 94 | You can use [Single Executable Applications](https://nodejs.org/api/single-executable-applications.html) feature of Node.js to build an executable file. WebviewJS comes with a helper cli script to make this process easier. 95 | 96 | ```bash 97 | webview --build --input ./path/to/your/script.js --output ./path/to/output-directory --name my-app 98 | ``` 99 | 100 | You can pass `--resources ./my-resource.json` to include additional resources in the executable. This resource can be imported using `getAsset()` or `getRawAsset()` functions from `node:sea` module. 101 | -------------------------------------------------------------------------------- /__test__/webview.test.mjs: -------------------------------------------------------------------------------- 1 | import { test } from 'node:test' 2 | import assert from 'node:assert/strict' 3 | 4 | test('webview', () => { 5 | assert.equal(1, 1) 6 | }) 7 | -------------------------------------------------------------------------------- /assets/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webviewjs/webview/bb55ded69403a15be32e174a1a41f0f22e8d540b/assets/preview.png -------------------------------------------------------------------------------- /build.rs: -------------------------------------------------------------------------------- 1 | extern crate napi_build; 2 | 3 | fn main() { 4 | napi_build::setup(); 5 | } 6 | -------------------------------------------------------------------------------- /cli/build.mjs: -------------------------------------------------------------------------------- 1 | import { execSync } from 'node:child_process'; 2 | import { copyFileSync, constants, writeFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs'; 3 | import { dirname, join, sep } from 'node:path'; 4 | import { execPath } from 'node:process' 5 | 6 | const isWindows = process.platform === 'win32'; 7 | const isMac = process.platform === 'darwin'; 8 | const NODE_SEA_FUSE = 'NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2'; 9 | 10 | function writeSeaConfig(main, dest, resources = {}) { 11 | const config = { 12 | main, 13 | output: join(dirname(dest), 'sea-prep.blob'), 14 | disableExperimentalSEAWarning: true, 15 | assets: resources 16 | }; 17 | 18 | writeFileSync(dest, JSON.stringify(config, null, 2)); 19 | } 20 | 21 | function run(command, args) { 22 | const cmd = !args?.length ? command : `${command} ${args.join(' ')}`; 23 | execSync(cmd, { stdio: 'inherit' }); 24 | } 25 | 26 | function generateBlob(configPath) { 27 | run('node', ['--experimental-sea-config', configPath]) 28 | 29 | return join(dirname(configPath), 'sea-prep.blob'); 30 | } 31 | 32 | function copyNode(output, name) { 33 | const ext = isWindows ? '.exe' : ''; 34 | const f = join(output, name + ext); 35 | copyFileSync(execPath, f, constants.COPYFILE_FICLONE); 36 | 37 | return f; 38 | } 39 | 40 | function removeSignature(path) { 41 | if (!isWindows && !isMac) return; 42 | 43 | if (isWindows) { 44 | try { 45 | run('signtool remove /s ' + path) 46 | } catch (e) { 47 | console.warn(`Failed to remove signature: ${e.message}`) 48 | } 49 | } else { 50 | run('codesign --remove-signature ' + path) 51 | } 52 | } 53 | 54 | function injectFuse(target, blob) { 55 | let args; 56 | 57 | if (isMac) { 58 | args = [`"${target}"`, 'NODE_SEA_BLOB', blob, '--sentinel-fuse', NODE_SEA_FUSE, '--macho-segment-name', 'NODE_SEA']; 59 | } else { 60 | args = [target, 'NODE_SEA_BLOB', blob, '--sentinel-fuse', NODE_SEA_FUSE]; 61 | } 62 | 63 | run('npx', ['--yes', 'postject', ...args]) 64 | } 65 | 66 | function sign(bin) { 67 | if (isWindows) { 68 | try { 69 | run('signtool', ['sign', '/fd', 'SHA256', bin]) 70 | } catch (e) { 71 | console.warn(`Failed to sign: ${e.message}`) 72 | } 73 | } else if (isMac) { 74 | run('codesign', ['--sign', '-', bin]) 75 | } 76 | } 77 | 78 | export function build(input, output, name, resources) { 79 | if (!existsSync(input)) { 80 | throw new Error('Input file does not exist'); 81 | } 82 | 83 | if (resources && !existsSync(resources)) { 84 | throw new Error('Resources file does not exist'); 85 | } 86 | 87 | if (!existsSync(output)) { 88 | mkdirSync(output, { recursive: true }); 89 | } 90 | 91 | const assets = resources ? JSON.parse(readFileSync(resources, 'utf-8')) : {}; 92 | const configPath = join(output, 'sea-config.json'); 93 | const execPath = copyNode(output, name); 94 | 95 | writeSeaConfig(input, configPath, assets); 96 | const blob = generateBlob(configPath); 97 | removeSignature(execPath); 98 | injectFuse(execPath, blob); 99 | sign(execPath); 100 | 101 | return execPath; 102 | } -------------------------------------------------------------------------------- /cli/index.mjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import { readFile } from 'node:fs/promises' 3 | import { parseArgs, styleText } from 'node:util' 4 | import { join } from 'node:path'; 5 | import { stripIndents } from './utils.mjs'; 6 | import { build } from './build.mjs'; 7 | 8 | async function readPackageJSON() { 9 | const packageJSON = await readFile(join(import.meta.dirname, '..', 'package.json'), 'utf-8'); 10 | return JSON.parse(packageJSON); 11 | } 12 | 13 | const { version, description, main } = await readPackageJSON(); 14 | 15 | const options = { 16 | help: { type: 'boolean', short: 'h', description: 'Show help' }, 17 | version: { type: 'boolean', short: 'v', description: 'Show version' }, 18 | build: { 19 | type: 'boolean', 20 | short: 'b', 21 | description: 'Build the project', 22 | }, 23 | name: { 24 | type: 'string', 25 | short: 'n', 26 | default: 'webviewjs', 27 | description: 'Project name', 28 | }, 29 | output: { 30 | type: 'string', 31 | short: 'o', 32 | default: join(process.cwd(), 'dist'), 33 | description: 'Output directory', 34 | }, 35 | input: { 36 | type: 'string', 37 | short: 'i', 38 | default: join(process.cwd(), main), 39 | description: 'Entry file', 40 | }, 41 | resources: { 42 | type: 'string', 43 | short: 'r', 44 | description: 'Resources mapping json file path' 45 | }, 46 | 'dry-run': { 47 | type: 'boolean', 48 | short: 'd', 49 | description: 'Dry run', 50 | } 51 | }; 52 | 53 | const args = parseArgs({ 54 | strict: true, 55 | args: process.argv.slice(2), 56 | options 57 | }); 58 | 59 | let stdErr = false; 60 | 61 | 62 | const logger = (message) => { 63 | console.log(message); 64 | process.exit(+stdErr); 65 | } 66 | 67 | const defaultValuesOptionNames = new Set(Object.keys(options).filter(k => !!options[k].default)); 68 | 69 | if (!Object.keys(args.values).filter(k => !defaultValuesOptionNames.has(k)).length) { 70 | args.values.help = true; 71 | stdErr = true; 72 | } 73 | 74 | if (args.values.help) { 75 | const message = stripIndents`WebviewJS: ${styleText('greenBright', description)} 76 | 77 | ${styleText('dim', 'Usage:')} ${styleText('greenBright', 'webview [options]')} 78 | 79 | ${styleText('dim', 'Options:')} 80 | ${Object.entries(options).map(([name, { short, default: defaultValue, type }]) => { 81 | const msg = ` ${styleText('greenBright', ` -${short}, --${name}`)} - ${styleText('dim', options[name].description || `${type} option`)}`; 82 | 83 | if (defaultValue) { 84 | return `${msg} (default: ${styleText('blueBright', defaultValue)})`; 85 | } 86 | 87 | return msg; 88 | }).join('\n')} 89 | `; 90 | 91 | logger(message); 92 | } else if (args.values.version) { 93 | logger(`- WebviewJS v${version}\n- Node.js ${process.version}\n- Operating System: ${process.platform} ${process.arch}`); 94 | } else if (args.values.build) { 95 | const isDry = !!args.values['dry-run']; 96 | const { output, input, resources } = args.values; 97 | 98 | if (isDry) { 99 | logger(`Dry run: building ${input} to ${output}`); 100 | } else { 101 | const projectName = args.values.name || 'webviewjs'; 102 | const target = build(input, output, prettify(projectName), resources); 103 | logger(styleText('greenBright', `\nBuilt ${input} to ${target}. You can now run the executable using ${styleText(['cyanBright', 'bold'], target)}`)); 104 | } 105 | } 106 | 107 | function prettify(str) { 108 | // remove stuff like @, /, whitespace, etc 109 | return str.replace(/[^a-zA-Z0-9]/g, ''); 110 | } -------------------------------------------------------------------------------- /cli/utils.mjs: -------------------------------------------------------------------------------- 1 | export function stripIndents(strings, ...values) { 2 | let str = ''; 3 | strings.forEach((string, i) => { 4 | str += string + (values[i] || ''); 5 | }); 6 | return str.replace(/(\t)+/g, ' ').trim(); 7 | } -------------------------------------------------------------------------------- /examples/html.js: -------------------------------------------------------------------------------- 1 | // const requireScript = require('node:module').createRequire(__filename); 2 | // const { Application } = requireScript('../index.js'); 3 | const { Application } = require('../index.js'); 4 | 5 | const app = new Application(); 6 | const window = app.createBrowserWindow(); 7 | 8 | const webview = window.createWebview({ 9 | html: ` 10 | 11 | 12 | Webview 13 | 14 | 15 |

Hello world!

16 | 17 | 22 | 23 | 24 | `, 25 | preload: `window.onIpcMessage = function(data) { 26 | const output = document.getElementById('output'); 27 | output.innerText = \`Server Sent A Message: \${data}\`; 28 | }` 29 | }); 30 | 31 | if (!webview.isDevtoolsOpen()) webview.openDevtools(); 32 | 33 | webview.onIpcMessage((data) => { 34 | const reply = `You sent ${data.body.toString('utf-8')}`; 35 | window.evaluateScript(`onIpcMessage("${reply}")`) 36 | }) 37 | 38 | app.run(); 39 | -------------------------------------------------------------------------------- /examples/http/server.mjs: -------------------------------------------------------------------------------- 1 | import { serve } from 'nodeia'; 2 | import { parentPort } from 'worker_threads'; 3 | 4 | serve({ 5 | fetch(_req) { 6 | const html = ` 7 | 8 | 9 | Webview 10 | 11 | 12 |

Hello world!

13 |

The date is ${new Date().toLocaleString()}

14 | 15 | `; 16 | 17 | return new Response(html, { 18 | headers: { 19 | 'Content-Type': 'text/html', 20 | }, 21 | }); 22 | }, 23 | listening(hostname, port) { 24 | console.log(`Server listening on http://${hostname}:${port}`); 25 | parentPort?.postMessage('ready'); 26 | }, 27 | port: 3000, 28 | }); 29 | -------------------------------------------------------------------------------- /examples/http/webview.mjs: -------------------------------------------------------------------------------- 1 | import { join } from 'node:path'; 2 | import { Application, getWebviewVersion } from '../../index.js'; 3 | import { Worker } from 'node:worker_threads'; 4 | 5 | console.log('Initializing http server worker...'); 6 | 7 | const worker = new Worker(join(import.meta.dirname, 'server.mjs'), { 8 | stdout: true, 9 | stderr: true, 10 | }); 11 | 12 | worker.on('message', (message) => { 13 | if (message === 'ready') createWindow(); 14 | }); 15 | 16 | function createWindow() { 17 | console.log(`Initializing webview (version: ${getWebviewVersion()})`); 18 | 19 | const app = new Application(); 20 | const window = app.createBrowserWindow(); 21 | const webview = window.createWebview(); 22 | 23 | if (!webview.isDevtoolsOpen()) webview.openDevtools(); 24 | webview.loadUrl('http://localhost:3000'); 25 | 26 | app.run(); 27 | } 28 | -------------------------------------------------------------------------------- /examples/multi-webview.mjs: -------------------------------------------------------------------------------- 1 | import { Application, ProgressBarState } from '../index.js' 2 | 3 | const width = 800; 4 | const height = 600; 5 | 6 | const app = new Application(); 7 | 8 | app.onEvent(console.log) 9 | 10 | const window = app.createBrowserWindow({ 11 | width, 12 | height, 13 | title: 'Multiple Webviews', 14 | }); 15 | 16 | const webview1 = window.createWebview({ 17 | url: 'https://nodejs.org', 18 | child: true, 19 | width: width / 2, 20 | height 21 | }); 22 | 23 | const webview2 = window.createWebview({ 24 | url: 'https://deno.land', 25 | child: true, 26 | width: width / 2, 27 | x: width / 2, 28 | height, 29 | }); 30 | 31 | webview1.onIpcMessage((message) => { 32 | const str = message.body.toString('utf8') 33 | 34 | console.log('Received message from webview 1:', str) 35 | }) 36 | 37 | webview1.evaluateScript(`setTimeout(() => { 38 | window.ipc.postMessage('Hello from webview1') 39 | }, 1000)`) 40 | 41 | webview2.onIpcMessage((message) => { 42 | const str = message.body.toString('utf8') 43 | 44 | console.log('Received message from webview 2:', str) 45 | }) 46 | 47 | webview2.evaluateScript(`setTimeout(() => { 48 | window.ipc.postMessage('Hello from webview2') 49 | }, 1000)`) 50 | 51 | app.run() -------------------------------------------------------------------------------- /examples/multiple.mjs: -------------------------------------------------------------------------------- 1 | import { Application } from '../index.js' 2 | 3 | const webview1 = new Application(); 4 | 5 | webview1.createBrowserWindow().createWebview({ url: 'https://nodejs.org' }); 6 | 7 | const webview2 = new Application(); 8 | webview2.createBrowserWindow().createWebview({ url: 'https://wikipedia.org' }); 9 | 10 | await Promise.all([webview1.run(), webview2.run()]); -------------------------------------------------------------------------------- /examples/transparent.mjs: -------------------------------------------------------------------------------- 1 | import { Application } from "../index.js"; 2 | 3 | const app = new Application(); 4 | const window = app.createBrowserWindow({ 5 | transparent: true, 6 | decorations: false, 7 | }); 8 | 9 | const webview = window.createWebview({ 10 | html: /* html */ ` 11 | 12 | 13 |

Hello, transparent!

14 | 15 | `, 16 | transparent: true, 17 | enableDevtools: true, 18 | }); 19 | 20 | app.run(); 21 | -------------------------------------------------------------------------------- /examples/url.mjs: -------------------------------------------------------------------------------- 1 | import { Application, Theme } from '../index.js'; 2 | 3 | const app = new Application(); 4 | const window = app.createBrowserWindow(); 5 | 6 | window.createWebview({ 7 | title: 'Hello world', 8 | url: 'https://nodejs.org', 9 | }); 10 | 11 | window.setTheme(Theme.Dark); 12 | 13 | app.run(); 14 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable */ 2 | /* eslint-disable */ 3 | 4 | /* auto-generated by NAPI-RS */ 5 | 6 | export const enum FullscreenType { 7 | /** Exclusive fullscreen. */ 8 | Exclusive = 0, 9 | /** Borderless fullscreen. */ 10 | Borderless = 1 11 | } 12 | export interface Dimensions { 13 | /** The width of the size. */ 14 | width: number 15 | /** The height of the size. */ 16 | height: number 17 | } 18 | export interface Position { 19 | /** The x position. */ 20 | x: number 21 | /** The y position. */ 22 | y: number 23 | } 24 | export interface VideoMode { 25 | /** The size of the video mode. */ 26 | size: Dimensions 27 | /** The bit depth of the video mode. */ 28 | bitDepth: number 29 | /** The refresh rate of the video mode. */ 30 | refreshRate: number 31 | } 32 | export interface Monitor { 33 | /** The name of the monitor. */ 34 | name?: string 35 | /** The scale factor of the monitor. */ 36 | scaleFactor: number 37 | /** The size of the monitor. */ 38 | size: Dimensions 39 | /** The position of the monitor. */ 40 | position: Position 41 | /** The video modes of the monitor. */ 42 | videoModes: Array 43 | } 44 | export const enum ProgressBarState { 45 | None = 0, 46 | Normal = 1, 47 | /** Treated as normal in linux and macos */ 48 | Indeterminate = 2, 49 | /** Treated as normal in linux */ 50 | Paused = 3, 51 | /** Treated as normal in linux */ 52 | Error = 4 53 | } 54 | export interface JsProgressBar { 55 | /** The progress state. */ 56 | state?: ProgressBarState 57 | /** The progress value. */ 58 | progress?: number 59 | } 60 | export interface BrowserWindowOptions { 61 | /** Whether the window is resizable. Default is `true`. */ 62 | resizable?: boolean 63 | /** The window title. */ 64 | title?: string 65 | /** The width of the window. */ 66 | width?: number 67 | /** The height of the window. */ 68 | height?: number 69 | /** The x position of the window. */ 70 | x?: number 71 | /** The y position of the window. */ 72 | y?: number 73 | /** Whether or not the window should be created with content protection mode. */ 74 | contentProtection?: boolean 75 | /** Whether or not the window is always on top. */ 76 | alwaysOnTop?: boolean 77 | /** Whether or not the window is always on bottom. */ 78 | alwaysOnBottom?: boolean 79 | /** Whether or not the window is visible. */ 80 | visible?: boolean 81 | /** Whether or not the window decorations are enabled. */ 82 | decorations?: boolean 83 | /** Whether or not the window is visible on all workspaces */ 84 | visibleOnAllWorkspaces?: boolean 85 | /** Whether or not the window is maximized. */ 86 | maximized?: boolean 87 | /** Whether or not the window is maximizable */ 88 | maximizable?: boolean 89 | /** Whether or not the window is minimizable */ 90 | minimizable?: boolean 91 | /** Whether or not the window is focused */ 92 | focused?: boolean 93 | /** Whether or not the window is transparent */ 94 | transparent?: boolean 95 | /** The fullscreen state of the window. */ 96 | fullscreen?: FullscreenType 97 | } 98 | /** Represents the theme of the window. */ 99 | export const enum Theme { 100 | /** The light theme. */ 101 | Light = 0, 102 | /** The dark theme. */ 103 | Dark = 1, 104 | /** The system theme. */ 105 | System = 2 106 | } 107 | export interface WebviewOptions { 108 | /** The URL to load. */ 109 | url?: string 110 | /** The HTML content to load. */ 111 | html?: string 112 | /** The width of the window. */ 113 | width?: number 114 | /** The height of the window. */ 115 | height?: number 116 | /** The x position of the window. */ 117 | x?: number 118 | /** The y position of the window. */ 119 | y?: number 120 | /** Whether to enable devtools. Default is `true`. */ 121 | enableDevtools?: boolean 122 | /** Whether the window is incognito. Default is `false`. */ 123 | incognito?: boolean 124 | /** The default user agent. */ 125 | userAgent?: string 126 | /** Whether the webview should be built as a child. */ 127 | child?: boolean 128 | /** The preload script to inject. */ 129 | preload?: string 130 | /** Whether the window is transparent. Default is `false`. */ 131 | transparent?: boolean 132 | /** The default theme. */ 133 | theme?: Theme 134 | /** Whether the window is zoomable via hotkeys or gestures. */ 135 | hotkeysZoom?: boolean 136 | /** Whether the clipboard access is enabled. */ 137 | clipboard?: boolean 138 | /** Whether the autoplay policy is enabled. */ 139 | autoplay?: boolean 140 | /** Indicates whether horizontal swipe gestures trigger backward and forward page navigation. */ 141 | backForwardNavigationGestures?: boolean 142 | } 143 | /** TODO */ 144 | export const enum WebviewApplicationEvent { 145 | /** Window close event. */ 146 | WindowCloseRequested = 0 147 | } 148 | export interface HeaderData { 149 | /** The key of the header. */ 150 | key: string 151 | /** The value of the header. */ 152 | value?: string 153 | } 154 | export interface IpcMessage { 155 | /** The body of the message. */ 156 | body: Buffer 157 | /** The HTTP method of the message. */ 158 | method: string 159 | /** The http headers of the message. */ 160 | headers: Array 161 | /** The URI of the message. */ 162 | uri: string 163 | } 164 | /** Returns the version of the webview. */ 165 | export declare function getWebviewVersion(): string 166 | /** Represents the control flow of the application. */ 167 | export const enum ControlFlow { 168 | /** The application will continue running. */ 169 | Poll = 0, 170 | /** The application will wait until the specified time. */ 171 | WaitUntil = 1, 172 | /** The application will exit. */ 173 | Exit = 2, 174 | /** The application will exit with the given exit code. */ 175 | ExitWithCode = 3 176 | } 177 | /** Represents the options for creating an application. */ 178 | export interface ApplicationOptions { 179 | /** The control flow of the application. Default is `Poll`. */ 180 | controlFlow?: ControlFlow 181 | /** The waiting time in ms for the application (only applicable if control flow is set to `WaitUntil`). */ 182 | waitTime?: number 183 | /** The exit code of the application. Only applicable if control flow is set to `ExitWithCode`. */ 184 | exitCode?: number 185 | } 186 | /** Represents an event for the application. */ 187 | export interface ApplicationEvent { 188 | /** The event type. */ 189 | event: WebviewApplicationEvent 190 | } 191 | export declare class BrowserWindow { 192 | /** Creates a webview on this window. */ 193 | createWebview(options?: WebviewOptions | undefined | null): JsWebview 194 | /** Whether or not the window is a child window. */ 195 | get isChild(): boolean 196 | /** Whether the window is focused. */ 197 | isFocused(): boolean 198 | /** Whether the window is visible. */ 199 | isVisible(): boolean 200 | /** Whether the window is decorated. */ 201 | isDecorated(): boolean 202 | /** Whether the window is closable. */ 203 | isClosable(): boolean 204 | /** Whether the window is maximizable. */ 205 | isMaximizable(): boolean 206 | /** Whether the window is minimizable. */ 207 | isMinimizable(): boolean 208 | /** Whether the window is maximized. */ 209 | isMaximized(): boolean 210 | /** Whether the window is minimized. */ 211 | isMinimized(): boolean 212 | /** Whether the window is resizable. */ 213 | isResizable(): boolean 214 | /** Sets the window title. */ 215 | setTitle(title: string): void 216 | /** Sets the window title. */ 217 | get title(): string 218 | /** Sets closable. */ 219 | setClosable(closable: boolean): void 220 | /** Sets maximizable. */ 221 | setMaximizable(maximizable: boolean): void 222 | /** Sets minimizable. */ 223 | setMinimizable(minimizable: boolean): void 224 | /** Sets resizable. */ 225 | setResizable(resizable: boolean): void 226 | /** Gets the window theme. */ 227 | get theme(): JsTheme 228 | /** Sets the window theme. */ 229 | setTheme(theme: JsTheme): void 230 | /** Sets the window icon. */ 231 | setWindowIcon(icon: Array | string, width: number, height: number): void 232 | /** Removes the window icon. */ 233 | removeWindowIcon(): void 234 | /** 235 | * Modifies the window's visibility. 236 | * If `false`, this will hide all the window. If `true`, this will show the window. 237 | */ 238 | setVisible(visible: boolean): void 239 | /** Modifies the window's progress bar. */ 240 | setProgressBar(state: JsProgressBar): void 241 | /** Maximizes the window. */ 242 | setMaximized(value: boolean): void 243 | /** Minimizes the window. */ 244 | setMinimized(value: boolean): void 245 | /** Bring the window to front and focus. */ 246 | focus(): void 247 | /** Get available monitors. */ 248 | getAvailableMonitors(): Array 249 | /** Get the current monitor. */ 250 | getCurrentMonitor(): Monitor | null 251 | /** Get the primary monitor. */ 252 | getPrimaryMonitor(): Monitor | null 253 | /** Get the monitor from the given point. */ 254 | getMonitorFromPoint(x: number, y: number): Monitor | null 255 | /** Prevents the window contents from being captured by other apps. */ 256 | setContentProtection(enabled: boolean): void 257 | /** Sets the window always on top. */ 258 | setAlwaysOnTop(enabled: boolean): void 259 | /** Sets always on bottom. */ 260 | setAlwaysOnBottom(enabled: boolean): void 261 | /** Turn window decorations on or off. */ 262 | setDecorations(enabled: boolean): void 263 | /** Gets the window's current fullscreen state. */ 264 | get fullscreen(): FullscreenType | null 265 | /** Sets the window to fullscreen or back. */ 266 | setFullscreen(fullscreenType?: FullscreenType | undefined | null): void 267 | } 268 | export type JsWebview = Webview 269 | export declare class Webview { 270 | constructor() 271 | /** Sets the IPC handler callback. */ 272 | onIpcMessage(handler?: (arg: IpcMessage) => void | undefined | null): void 273 | /** Launch a print modal for this window's contents. */ 274 | print(): void 275 | /** Set webview zoom level. */ 276 | zoom(scaleFacotr: number): void 277 | /** Hides or shows the webview. */ 278 | setWebviewVisibility(visible: boolean): void 279 | /** Whether the devtools is opened. */ 280 | isDevtoolsOpen(): boolean 281 | /** Opens the devtools. */ 282 | openDevtools(): void 283 | /** Closes the devtools. */ 284 | closeDevtools(): void 285 | /** Loads the given URL. */ 286 | loadUrl(url: string): void 287 | /** Loads the given HTML content. */ 288 | loadHtml(html: string): void 289 | /** Evaluates the given JavaScript code. */ 290 | evaluateScript(js: string): void 291 | evaluateScriptWithCallback(js: string, callback: (err: Error | null, arg: string) => any): void 292 | } 293 | /** Represents an application. */ 294 | export declare class Application { 295 | /** Creates a new application. */ 296 | constructor(options?: ApplicationOptions | undefined | null) 297 | /** Sets the event handler callback. */ 298 | onEvent(handler?: (arg: ApplicationEvent) => void | undefined | null): void 299 | /** Creates a new browser window. */ 300 | createBrowserWindow(options?: BrowserWindowOptions | undefined | null): BrowserWindow 301 | /** Creates a new browser window as a child window. */ 302 | createChildBrowserWindow(options?: BrowserWindowOptions | undefined | null): BrowserWindow 303 | /** Runs the application. This method will block the current thread. */ 304 | run(): void 305 | } 306 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /* tslint:disable */ 2 | /* eslint-disable */ 3 | /* prettier-ignore */ 4 | 5 | /* auto-generated by NAPI-RS */ 6 | 7 | const { existsSync, readFileSync } = require('fs') 8 | const { join } = require('path') 9 | 10 | const { platform, arch } = process 11 | 12 | let nativeBinding = null 13 | let localFileExisted = false 14 | let loadError = null 15 | 16 | function isMusl() { 17 | // For Node 10 18 | if (!process.report || typeof process.report.getReport !== 'function') { 19 | try { 20 | const lddPath = require('child_process').execSync('which ldd').toString().trim() 21 | return readFileSync(lddPath, 'utf8').includes('musl') 22 | } catch (e) { 23 | return true 24 | } 25 | } else { 26 | const { glibcVersionRuntime } = process.report.getReport().header 27 | return !glibcVersionRuntime 28 | } 29 | } 30 | 31 | switch (platform) { 32 | case 'android': 33 | switch (arch) { 34 | case 'arm64': 35 | localFileExisted = existsSync(join(__dirname, 'webview.android-arm64.node')) 36 | try { 37 | if (localFileExisted) { 38 | nativeBinding = require('./webview.android-arm64.node') 39 | } else { 40 | nativeBinding = require('@webviewjs/webview-android-arm64') 41 | } 42 | } catch (e) { 43 | loadError = e 44 | } 45 | break 46 | case 'arm': 47 | localFileExisted = existsSync(join(__dirname, 'webview.android-arm-eabi.node')) 48 | try { 49 | if (localFileExisted) { 50 | nativeBinding = require('./webview.android-arm-eabi.node') 51 | } else { 52 | nativeBinding = require('@webviewjs/webview-android-arm-eabi') 53 | } 54 | } catch (e) { 55 | loadError = e 56 | } 57 | break 58 | default: 59 | throw new Error(`Unsupported architecture on Android ${arch}`) 60 | } 61 | break 62 | case 'win32': 63 | switch (arch) { 64 | case 'x64': 65 | localFileExisted = existsSync( 66 | join(__dirname, 'webview.win32-x64-msvc.node') 67 | ) 68 | try { 69 | if (localFileExisted) { 70 | nativeBinding = require('./webview.win32-x64-msvc.node') 71 | } else { 72 | nativeBinding = require('@webviewjs/webview-win32-x64-msvc') 73 | } 74 | } catch (e) { 75 | loadError = e 76 | } 77 | break 78 | case 'ia32': 79 | localFileExisted = existsSync( 80 | join(__dirname, 'webview.win32-ia32-msvc.node') 81 | ) 82 | try { 83 | if (localFileExisted) { 84 | nativeBinding = require('./webview.win32-ia32-msvc.node') 85 | } else { 86 | nativeBinding = require('@webviewjs/webview-win32-ia32-msvc') 87 | } 88 | } catch (e) { 89 | loadError = e 90 | } 91 | break 92 | case 'arm64': 93 | localFileExisted = existsSync( 94 | join(__dirname, 'webview.win32-arm64-msvc.node') 95 | ) 96 | try { 97 | if (localFileExisted) { 98 | nativeBinding = require('./webview.win32-arm64-msvc.node') 99 | } else { 100 | nativeBinding = require('@webviewjs/webview-win32-arm64-msvc') 101 | } 102 | } catch (e) { 103 | loadError = e 104 | } 105 | break 106 | default: 107 | throw new Error(`Unsupported architecture on Windows: ${arch}`) 108 | } 109 | break 110 | case 'darwin': 111 | localFileExisted = existsSync(join(__dirname, 'webview.darwin-universal.node')) 112 | try { 113 | if (localFileExisted) { 114 | nativeBinding = require('./webview.darwin-universal.node') 115 | } else { 116 | nativeBinding = require('@webviewjs/webview-darwin-universal') 117 | } 118 | break 119 | } catch {} 120 | switch (arch) { 121 | case 'x64': 122 | localFileExisted = existsSync(join(__dirname, 'webview.darwin-x64.node')) 123 | try { 124 | if (localFileExisted) { 125 | nativeBinding = require('./webview.darwin-x64.node') 126 | } else { 127 | nativeBinding = require('@webviewjs/webview-darwin-x64') 128 | } 129 | } catch (e) { 130 | loadError = e 131 | } 132 | break 133 | case 'arm64': 134 | localFileExisted = existsSync( 135 | join(__dirname, 'webview.darwin-arm64.node') 136 | ) 137 | try { 138 | if (localFileExisted) { 139 | nativeBinding = require('./webview.darwin-arm64.node') 140 | } else { 141 | nativeBinding = require('@webviewjs/webview-darwin-arm64') 142 | } 143 | } catch (e) { 144 | loadError = e 145 | } 146 | break 147 | default: 148 | throw new Error(`Unsupported architecture on macOS: ${arch}`) 149 | } 150 | break 151 | case 'freebsd': 152 | if (arch !== 'x64') { 153 | throw new Error(`Unsupported architecture on FreeBSD: ${arch}`) 154 | } 155 | localFileExisted = existsSync(join(__dirname, 'webview.freebsd-x64.node')) 156 | try { 157 | if (localFileExisted) { 158 | nativeBinding = require('./webview.freebsd-x64.node') 159 | } else { 160 | nativeBinding = require('@webviewjs/webview-freebsd-x64') 161 | } 162 | } catch (e) { 163 | loadError = e 164 | } 165 | break 166 | case 'linux': 167 | switch (arch) { 168 | case 'x64': 169 | if (isMusl()) { 170 | localFileExisted = existsSync( 171 | join(__dirname, 'webview.linux-x64-musl.node') 172 | ) 173 | try { 174 | if (localFileExisted) { 175 | nativeBinding = require('./webview.linux-x64-musl.node') 176 | } else { 177 | nativeBinding = require('@webviewjs/webview-linux-x64-musl') 178 | } 179 | } catch (e) { 180 | loadError = e 181 | } 182 | } else { 183 | localFileExisted = existsSync( 184 | join(__dirname, 'webview.linux-x64-gnu.node') 185 | ) 186 | try { 187 | if (localFileExisted) { 188 | nativeBinding = require('./webview.linux-x64-gnu.node') 189 | } else { 190 | nativeBinding = require('@webviewjs/webview-linux-x64-gnu') 191 | } 192 | } catch (e) { 193 | loadError = e 194 | } 195 | } 196 | break 197 | case 'arm64': 198 | if (isMusl()) { 199 | localFileExisted = existsSync( 200 | join(__dirname, 'webview.linux-arm64-musl.node') 201 | ) 202 | try { 203 | if (localFileExisted) { 204 | nativeBinding = require('./webview.linux-arm64-musl.node') 205 | } else { 206 | nativeBinding = require('@webviewjs/webview-linux-arm64-musl') 207 | } 208 | } catch (e) { 209 | loadError = e 210 | } 211 | } else { 212 | localFileExisted = existsSync( 213 | join(__dirname, 'webview.linux-arm64-gnu.node') 214 | ) 215 | try { 216 | if (localFileExisted) { 217 | nativeBinding = require('./webview.linux-arm64-gnu.node') 218 | } else { 219 | nativeBinding = require('@webviewjs/webview-linux-arm64-gnu') 220 | } 221 | } catch (e) { 222 | loadError = e 223 | } 224 | } 225 | break 226 | case 'arm': 227 | if (isMusl()) { 228 | localFileExisted = existsSync( 229 | join(__dirname, 'webview.linux-arm-musleabihf.node') 230 | ) 231 | try { 232 | if (localFileExisted) { 233 | nativeBinding = require('./webview.linux-arm-musleabihf.node') 234 | } else { 235 | nativeBinding = require('@webviewjs/webview-linux-arm-musleabihf') 236 | } 237 | } catch (e) { 238 | loadError = e 239 | } 240 | } else { 241 | localFileExisted = existsSync( 242 | join(__dirname, 'webview.linux-arm-gnueabihf.node') 243 | ) 244 | try { 245 | if (localFileExisted) { 246 | nativeBinding = require('./webview.linux-arm-gnueabihf.node') 247 | } else { 248 | nativeBinding = require('@webviewjs/webview-linux-arm-gnueabihf') 249 | } 250 | } catch (e) { 251 | loadError = e 252 | } 253 | } 254 | break 255 | case 'riscv64': 256 | if (isMusl()) { 257 | localFileExisted = existsSync( 258 | join(__dirname, 'webview.linux-riscv64-musl.node') 259 | ) 260 | try { 261 | if (localFileExisted) { 262 | nativeBinding = require('./webview.linux-riscv64-musl.node') 263 | } else { 264 | nativeBinding = require('@webviewjs/webview-linux-riscv64-musl') 265 | } 266 | } catch (e) { 267 | loadError = e 268 | } 269 | } else { 270 | localFileExisted = existsSync( 271 | join(__dirname, 'webview.linux-riscv64-gnu.node') 272 | ) 273 | try { 274 | if (localFileExisted) { 275 | nativeBinding = require('./webview.linux-riscv64-gnu.node') 276 | } else { 277 | nativeBinding = require('@webviewjs/webview-linux-riscv64-gnu') 278 | } 279 | } catch (e) { 280 | loadError = e 281 | } 282 | } 283 | break 284 | case 's390x': 285 | localFileExisted = existsSync( 286 | join(__dirname, 'webview.linux-s390x-gnu.node') 287 | ) 288 | try { 289 | if (localFileExisted) { 290 | nativeBinding = require('./webview.linux-s390x-gnu.node') 291 | } else { 292 | nativeBinding = require('@webviewjs/webview-linux-s390x-gnu') 293 | } 294 | } catch (e) { 295 | loadError = e 296 | } 297 | break 298 | default: 299 | throw new Error(`Unsupported architecture on Linux: ${arch}`) 300 | } 301 | break 302 | default: 303 | throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`) 304 | } 305 | 306 | if (!nativeBinding) { 307 | if (loadError) { 308 | throw loadError 309 | } 310 | throw new Error(`Failed to load native binding`) 311 | } 312 | 313 | const { FullscreenType, ProgressBarState, BrowserWindow, Theme, Webview, WebviewApplicationEvent, getWebviewVersion, ControlFlow, Application } = nativeBinding 314 | 315 | module.exports.FullscreenType = FullscreenType 316 | module.exports.ProgressBarState = ProgressBarState 317 | module.exports.BrowserWindow = BrowserWindow 318 | module.exports.Theme = Theme 319 | module.exports.Webview = Webview 320 | module.exports.WebviewApplicationEvent = WebviewApplicationEvent 321 | module.exports.getWebviewVersion = getWebviewVersion 322 | module.exports.ControlFlow = ControlFlow 323 | module.exports.Application = Application 324 | -------------------------------------------------------------------------------- /npm/android-arm-eabi/README.md: -------------------------------------------------------------------------------- 1 | # `@webviewjs/webview-android-arm-eabi` 2 | 3 | This is the **armv7-linux-androideabi** binary for `@webviewjs/webview` 4 | -------------------------------------------------------------------------------- /npm/android-arm-eabi/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webviewjs/webview-android-arm-eabi", 3 | "version": "0.1.0", 4 | "os": [ 5 | "android" 6 | ], 7 | "cpu": [ 8 | "arm" 9 | ], 10 | "main": "webview.android-arm-eabi.node", 11 | "files": [ 12 | "webview.android-arm-eabi.node" 13 | ], 14 | "description": "Robust cross-platform webview library for Node.js written in Rust", 15 | "keywords": [ 16 | "webview", 17 | "node", 18 | "rust", 19 | "cross-platform", 20 | "gui" 21 | ], 22 | "license": "MIT", 23 | "engines": { 24 | "node": ">= 10" 25 | }, 26 | "publishConfig": { 27 | "registry": "https://registry.npmjs.org/", 28 | "access": "public" 29 | }, 30 | "repository": "git@github.com:webviewjs/webview.git" 31 | } -------------------------------------------------------------------------------- /npm/android-arm64/README.md: -------------------------------------------------------------------------------- 1 | # `@webviewjs/webview-android-arm64` 2 | 3 | This is the **aarch64-linux-android** binary for `@webviewjs/webview` 4 | -------------------------------------------------------------------------------- /npm/android-arm64/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webviewjs/webview-android-arm64", 3 | "version": "0.1.0", 4 | "os": [ 5 | "android" 6 | ], 7 | "cpu": [ 8 | "arm64" 9 | ], 10 | "main": "webview.android-arm64.node", 11 | "files": [ 12 | "webview.android-arm64.node" 13 | ], 14 | "description": "Robust cross-platform webview library for Node.js written in Rust", 15 | "keywords": [ 16 | "webview", 17 | "node", 18 | "rust", 19 | "cross-platform", 20 | "gui" 21 | ], 22 | "license": "MIT", 23 | "engines": { 24 | "node": ">= 10" 25 | }, 26 | "publishConfig": { 27 | "registry": "https://registry.npmjs.org/", 28 | "access": "public" 29 | }, 30 | "repository": "git@github.com:webviewjs/webview.git" 31 | } -------------------------------------------------------------------------------- /npm/darwin-arm64/README.md: -------------------------------------------------------------------------------- 1 | # `@webviewjs/webview-darwin-arm64` 2 | 3 | This is the **aarch64-apple-darwin** binary for `@webviewjs/webview` 4 | -------------------------------------------------------------------------------- /npm/darwin-arm64/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webviewjs/webview-darwin-arm64", 3 | "version": "0.1.0", 4 | "os": [ 5 | "darwin" 6 | ], 7 | "cpu": [ 8 | "arm64" 9 | ], 10 | "main": "webview.darwin-arm64.node", 11 | "files": [ 12 | "webview.darwin-arm64.node" 13 | ], 14 | "description": "Robust cross-platform webview library for Node.js written in Rust", 15 | "keywords": [ 16 | "webview", 17 | "node", 18 | "rust", 19 | "cross-platform", 20 | "gui" 21 | ], 22 | "license": "MIT", 23 | "engines": { 24 | "node": ">= 10" 25 | }, 26 | "publishConfig": { 27 | "registry": "https://registry.npmjs.org/", 28 | "access": "public" 29 | }, 30 | "repository": "git@github.com:webviewjs/webview.git" 31 | } -------------------------------------------------------------------------------- /npm/darwin-x64/README.md: -------------------------------------------------------------------------------- 1 | # `@webviewjs/webview-darwin-x64` 2 | 3 | This is the **x86_64-apple-darwin** binary for `@webviewjs/webview` 4 | -------------------------------------------------------------------------------- /npm/darwin-x64/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webviewjs/webview-darwin-x64", 3 | "version": "0.1.0", 4 | "os": [ 5 | "darwin" 6 | ], 7 | "cpu": [ 8 | "x64" 9 | ], 10 | "main": "webview.darwin-x64.node", 11 | "files": [ 12 | "webview.darwin-x64.node" 13 | ], 14 | "description": "Robust cross-platform webview library for Node.js written in Rust", 15 | "keywords": [ 16 | "webview", 17 | "node", 18 | "rust", 19 | "cross-platform", 20 | "gui" 21 | ], 22 | "license": "MIT", 23 | "engines": { 24 | "node": ">= 10" 25 | }, 26 | "publishConfig": { 27 | "registry": "https://registry.npmjs.org/", 28 | "access": "public" 29 | }, 30 | "repository": "git@github.com:webviewjs/webview.git" 31 | } -------------------------------------------------------------------------------- /npm/freebsd-x64/README.md: -------------------------------------------------------------------------------- 1 | # `@webviewjs/webview-freebsd-x64` 2 | 3 | This is the **x86_64-unknown-freebsd** binary for `@webviewjs/webview` 4 | -------------------------------------------------------------------------------- /npm/freebsd-x64/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webviewjs/webview-freebsd-x64", 3 | "version": "0.1.0", 4 | "os": [ 5 | "freebsd" 6 | ], 7 | "cpu": [ 8 | "x64" 9 | ], 10 | "main": "webview.freebsd-x64.node", 11 | "files": [ 12 | "webview.freebsd-x64.node" 13 | ], 14 | "description": "Robust cross-platform webview library for Node.js written in Rust", 15 | "keywords": [ 16 | "webview", 17 | "node", 18 | "rust", 19 | "cross-platform", 20 | "gui" 21 | ], 22 | "license": "MIT", 23 | "engines": { 24 | "node": ">= 10" 25 | }, 26 | "publishConfig": { 27 | "registry": "https://registry.npmjs.org/", 28 | "access": "public" 29 | }, 30 | "repository": "git@github.com:webviewjs/webview.git" 31 | } -------------------------------------------------------------------------------- /npm/linux-x64-gnu/README.md: -------------------------------------------------------------------------------- 1 | # `@webviewjs/webview-linux-x64-gnu` 2 | 3 | This is the **x86_64-unknown-linux-gnu** binary for `@webviewjs/webview` 4 | -------------------------------------------------------------------------------- /npm/linux-x64-gnu/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webviewjs/webview-linux-x64-gnu", 3 | "version": "0.1.0", 4 | "os": [ 5 | "linux" 6 | ], 7 | "cpu": [ 8 | "x64" 9 | ], 10 | "main": "webview.linux-x64-gnu.node", 11 | "files": [ 12 | "webview.linux-x64-gnu.node" 13 | ], 14 | "description": "Robust cross-platform webview library for Node.js written in Rust", 15 | "keywords": [ 16 | "webview", 17 | "node", 18 | "rust", 19 | "cross-platform", 20 | "gui" 21 | ], 22 | "license": "MIT", 23 | "engines": { 24 | "node": ">= 10" 25 | }, 26 | "publishConfig": { 27 | "registry": "https://registry.npmjs.org/", 28 | "access": "public" 29 | }, 30 | "repository": "git@github.com:webviewjs/webview.git", 31 | "libc": [ 32 | "glibc" 33 | ] 34 | } -------------------------------------------------------------------------------- /npm/win32-arm64-msvc/README.md: -------------------------------------------------------------------------------- 1 | # `@webviewjs/webview-win32-arm64-msvc` 2 | 3 | This is the **aarch64-pc-windows-msvc** binary for `@webviewjs/webview` 4 | -------------------------------------------------------------------------------- /npm/win32-arm64-msvc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webviewjs/webview-win32-arm64-msvc", 3 | "version": "0.1.0", 4 | "os": [ 5 | "win32" 6 | ], 7 | "cpu": [ 8 | "arm64" 9 | ], 10 | "main": "webview.win32-arm64-msvc.node", 11 | "files": [ 12 | "webview.win32-arm64-msvc.node" 13 | ], 14 | "description": "Robust cross-platform webview library for Node.js written in Rust", 15 | "keywords": [ 16 | "webview", 17 | "node", 18 | "rust", 19 | "cross-platform", 20 | "gui" 21 | ], 22 | "license": "MIT", 23 | "engines": { 24 | "node": ">= 10" 25 | }, 26 | "publishConfig": { 27 | "registry": "https://registry.npmjs.org/", 28 | "access": "public" 29 | }, 30 | "repository": "git@github.com:webviewjs/webview.git" 31 | } -------------------------------------------------------------------------------- /npm/win32-ia32-msvc/README.md: -------------------------------------------------------------------------------- 1 | # `@webviewjs/webview-win32-ia32-msvc` 2 | 3 | This is the **i686-pc-windows-msvc** binary for `@webviewjs/webview` 4 | -------------------------------------------------------------------------------- /npm/win32-ia32-msvc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webviewjs/webview-win32-ia32-msvc", 3 | "version": "0.1.0", 4 | "os": [ 5 | "win32" 6 | ], 7 | "cpu": [ 8 | "ia32" 9 | ], 10 | "main": "webview.win32-ia32-msvc.node", 11 | "files": [ 12 | "webview.win32-ia32-msvc.node" 13 | ], 14 | "description": "Robust cross-platform webview library for Node.js written in Rust", 15 | "keywords": [ 16 | "webview", 17 | "node", 18 | "rust", 19 | "cross-platform", 20 | "gui" 21 | ], 22 | "license": "MIT", 23 | "engines": { 24 | "node": ">= 10" 25 | }, 26 | "publishConfig": { 27 | "registry": "https://registry.npmjs.org/", 28 | "access": "public" 29 | }, 30 | "repository": "git@github.com:webviewjs/webview.git" 31 | } -------------------------------------------------------------------------------- /npm/win32-x64-msvc/README.md: -------------------------------------------------------------------------------- 1 | # `@webviewjs/webview-win32-x64-msvc` 2 | 3 | This is the **x86_64-pc-windows-msvc** binary for `@webviewjs/webview` 4 | -------------------------------------------------------------------------------- /npm/win32-x64-msvc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webviewjs/webview-win32-x64-msvc", 3 | "version": "0.1.0", 4 | "os": [ 5 | "win32" 6 | ], 7 | "cpu": [ 8 | "x64" 9 | ], 10 | "main": "webview.win32-x64-msvc.node", 11 | "files": [ 12 | "webview.win32-x64-msvc.node" 13 | ], 14 | "description": "Robust cross-platform webview library for Node.js written in Rust", 15 | "keywords": [ 16 | "webview", 17 | "node", 18 | "rust", 19 | "cross-platform", 20 | "gui" 21 | ], 22 | "license": "MIT", 23 | "engines": { 24 | "node": ">= 10" 25 | }, 26 | "publishConfig": { 27 | "registry": "https://registry.npmjs.org/", 28 | "access": "public" 29 | }, 30 | "repository": "git@github.com:webviewjs/webview.git" 31 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webviewjs/webview", 3 | "version": "0.1.3", 4 | "bin": { 5 | "webview": "./cli/index.mjs", 6 | "webviewjs": "./cli/index.mjs" 7 | }, 8 | "description": "Robust cross-platform webview library for Node.js written in Rust. It also works with deno and bun.", 9 | "main": "./index.js", 10 | "types": "./index.d.ts", 11 | "repository": "git@github.com:webviewjs/webview.git", 12 | "license": "MIT", 13 | "type": "commonjs", 14 | "keywords": [ 15 | "webview", 16 | "node", 17 | "rust", 18 | "cross-platform", 19 | "gui" 20 | ], 21 | "files": [ 22 | "cli", 23 | "index.d.ts", 24 | "index.js" 25 | ], 26 | "napi": { 27 | "name": "webview", 28 | "triples": { 29 | "defaults": true, 30 | "additional": [ 31 | "i686-pc-windows-msvc", 32 | "aarch64-apple-darwin", 33 | "aarch64-linux-android", 34 | "x86_64-unknown-freebsd", 35 | "aarch64-pc-windows-msvc", 36 | "armv7-linux-androideabi" 37 | ] 38 | } 39 | }, 40 | "engines": { 41 | "node": ">= 10" 42 | }, 43 | "publishConfig": { 44 | "registry": "https://registry.npmjs.org/", 45 | "access": "public" 46 | }, 47 | "scripts": { 48 | "artifacts": "napi artifacts", 49 | "build": "napi build --platform --release", 50 | "build:debug": "napi build --platform", 51 | "format": "run-p format:prettier format:rs format:toml", 52 | "format:prettier": "prettier . -w", 53 | "format:toml": "taplo format", 54 | "format:rs": "cargo fmt", 55 | "lint": "oxlint .", 56 | "prepublishOnly": "napi prepublish -t npm", 57 | "version": "napi version", 58 | "test": "node --test './__test__/**/*.test.*'" 59 | }, 60 | "devDependencies": { 61 | "@napi-rs/cli": "^2.18.4", 62 | "@swc-node/register": "^1.10.6", 63 | "@swc/core": "^1.6.13", 64 | "@taplo/cli": "^0.7.0", 65 | "@types/node": "^22.7.4", 66 | "ava": "^6.1.3", 67 | "chalk": "^5.3.0", 68 | "husky": "^9.0.11", 69 | "lint-staged": "^15.2.7", 70 | "nodeia": "^0.0.1", 71 | "npm-run-all2": "^6.2.2", 72 | "oxlint": "^0.9.0", 73 | "prettier": "^3.3.3", 74 | "tinybench": "^2.8.0", 75 | "typescript": "^5.5.3" 76 | }, 77 | "lint-staged": { 78 | "*.@(js|ts|tsx)": [ 79 | "oxlint --fix" 80 | ], 81 | "*.@(js|ts|tsx|yml|yaml|md|json)": [ 82 | "prettier --write" 83 | ], 84 | "*.toml": [ 85 | "taplo format" 86 | ] 87 | }, 88 | "prettier": { 89 | "printWidth": 120, 90 | "semi": true, 91 | "trailingComma": "all", 92 | "singleQuote": true, 93 | "arrowParens": "always", 94 | "endOfLine": "lf", 95 | "tabWidth": 2, 96 | "useTabs": false 97 | }, 98 | "packageManager": "yarn@4.5.0" 99 | } 100 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | tab_spaces = 2 2 | -------------------------------------------------------------------------------- /src/browser_window.rs: -------------------------------------------------------------------------------- 1 | use napi::{Either, Env, Result}; 2 | use napi_derive::*; 3 | use tao::{ 4 | dpi::{LogicalPosition, PhysicalSize}, 5 | event_loop::EventLoop, 6 | window::{Fullscreen, Icon, ProgressBarState, Window, WindowBuilder}, 7 | }; 8 | 9 | use crate::webview::{JsTheme, JsWebview, WebviewOptions}; 10 | 11 | // #[cfg(target_os = "windows")] 12 | // use tao::platform::windows::IconExtWindows; 13 | 14 | #[napi] 15 | pub enum FullscreenType { 16 | /// Exclusive fullscreen. 17 | Exclusive, 18 | /// Borderless fullscreen. 19 | Borderless, 20 | } 21 | 22 | #[napi(object)] 23 | pub struct Dimensions { 24 | /// The width of the size. 25 | pub width: u32, 26 | /// The height of the size. 27 | pub height: u32, 28 | } 29 | 30 | #[napi(object)] 31 | pub struct Position { 32 | /// The x position. 33 | pub x: i32, 34 | /// The y position. 35 | pub y: i32, 36 | } 37 | 38 | #[napi(object, js_name = "VideoMode")] 39 | pub struct JsVideoMode { 40 | /// The size of the video mode. 41 | pub size: Dimensions, 42 | /// The bit depth of the video mode. 43 | pub bit_depth: u16, 44 | /// The refresh rate of the video mode. 45 | pub refresh_rate: u16, 46 | } 47 | 48 | #[napi(object)] 49 | pub struct Monitor { 50 | /// The name of the monitor. 51 | pub name: Option, 52 | /// The scale factor of the monitor. 53 | pub scale_factor: f64, 54 | /// The size of the monitor. 55 | pub size: Dimensions, 56 | /// The position of the monitor. 57 | pub position: Position, 58 | /// The video modes of the monitor. 59 | pub video_modes: Vec, 60 | } 61 | 62 | #[napi(js_name = "ProgressBarState")] 63 | pub enum JsProgressBarState { 64 | None, 65 | Normal, 66 | /// Treated as normal in linux and macos 67 | Indeterminate, 68 | /// Treated as normal in linux 69 | Paused, 70 | /// Treated as normal in linux 71 | Error, 72 | } 73 | 74 | #[napi(object)] 75 | pub struct JsProgressBar { 76 | /// The progress state. 77 | pub state: Option, 78 | /// The progress value. 79 | pub progress: Option, 80 | } 81 | 82 | #[napi(object)] 83 | pub struct BrowserWindowOptions { 84 | /// Whether the window is resizable. Default is `true`. 85 | pub resizable: Option, 86 | /// The window title. 87 | pub title: Option, 88 | /// The width of the window. 89 | pub width: Option, 90 | /// The height of the window. 91 | pub height: Option, 92 | /// The x position of the window. 93 | pub x: Option, 94 | /// The y position of the window. 95 | pub y: Option, 96 | /// Whether or not the window should be created with content protection mode. 97 | pub content_protection: Option, 98 | /// Whether or not the window is always on top. 99 | pub always_on_top: Option, 100 | /// Whether or not the window is always on bottom. 101 | pub always_on_bottom: Option, 102 | /// Whether or not the window is visible. 103 | pub visible: Option, 104 | /// Whether or not the window decorations are enabled. 105 | pub decorations: Option, 106 | /// Whether or not the window is visible on all workspaces 107 | pub visible_on_all_workspaces: Option, 108 | /// Whether or not the window is maximized. 109 | pub maximized: Option, 110 | /// Whether or not the window is maximizable 111 | pub maximizable: Option, 112 | /// Whether or not the window is minimizable 113 | pub minimizable: Option, 114 | /// Whether or not the window is focused 115 | pub focused: Option, 116 | /// Whether or not the window is transparent 117 | pub transparent: Option, 118 | /// The fullscreen state of the window. 119 | pub fullscreen: Option, 120 | } 121 | 122 | impl Default for BrowserWindowOptions { 123 | fn default() -> Self { 124 | Self { 125 | resizable: Some(true), 126 | title: Some("WebviewJS".to_owned()), 127 | width: Some(800.0), 128 | height: Some(600.0), 129 | x: Some(0.0), 130 | y: Some(0.0), 131 | content_protection: Some(false), 132 | always_on_top: Some(false), 133 | always_on_bottom: Some(false), 134 | visible: Some(true), 135 | decorations: Some(true), 136 | visible_on_all_workspaces: Some(false), 137 | maximized: Some(false), 138 | maximizable: Some(true), 139 | minimizable: Some(true), 140 | focused: Some(true), 141 | transparent: Some(false), 142 | fullscreen: None, 143 | } 144 | } 145 | } 146 | 147 | #[napi] 148 | pub struct BrowserWindow { 149 | is_child_window: bool, 150 | window: Window, 151 | } 152 | 153 | #[napi] 154 | impl BrowserWindow { 155 | pub fn new( 156 | event_loop: &EventLoop<()>, 157 | options: Option, 158 | child: bool, 159 | ) -> Result { 160 | let options = options.unwrap_or(BrowserWindowOptions::default()); 161 | 162 | let mut window = WindowBuilder::new(); 163 | 164 | if let Some(resizable) = options.resizable { 165 | window = window.with_resizable(resizable); 166 | } 167 | 168 | if let Some(width) = options.width { 169 | window = window.with_inner_size(PhysicalSize::new(width, options.height.unwrap())); 170 | } 171 | 172 | if let Some(x) = options.x { 173 | window = window.with_position(LogicalPosition::new(x, options.y.unwrap())); 174 | } 175 | 176 | if let Some(visible) = options.visible { 177 | window = window.with_visible(visible); 178 | } 179 | 180 | if let Some(decorations) = options.decorations { 181 | window = window.with_decorations(decorations); 182 | } 183 | 184 | if let Some(always_on_top) = options.always_on_top { 185 | window = window.with_always_on_top(always_on_top); 186 | } 187 | 188 | if let Some(always_on_bottom) = options.always_on_bottom { 189 | window = window.with_always_on_bottom(always_on_bottom); 190 | } 191 | 192 | if let Some(visible_on_all_workspaces) = options.visible_on_all_workspaces { 193 | window = window.with_visible_on_all_workspaces(visible_on_all_workspaces); 194 | } 195 | 196 | if let Some(maximized) = options.maximized { 197 | window = window.with_maximized(maximized); 198 | } 199 | 200 | if let Some(maximizable) = options.maximizable { 201 | window = window.with_maximizable(maximizable); 202 | } 203 | 204 | if let Some(minimizable) = options.minimizable { 205 | window = window.with_minimizable(minimizable); 206 | } 207 | 208 | if let Some(focused) = options.focused { 209 | window = window.with_focused(focused); 210 | } 211 | 212 | if let Some(transparent) = options.transparent { 213 | window = window.with_transparent(transparent); 214 | #[cfg(target_os = "windows")] 215 | { 216 | use tao::platform::windows::WindowBuilderExtWindows; 217 | window = window.with_undecorated_shadow(false); 218 | } 219 | } 220 | 221 | if let Some(fullscreen) = options.fullscreen { 222 | let fs = match fullscreen { 223 | // Some(FullscreenType::Exclusive) => Some(Fullscreen::Exclusive()), 224 | FullscreenType::Borderless => Some(Fullscreen::Borderless(None)), 225 | _ => None, 226 | }; 227 | 228 | window = window.with_fullscreen(fs); 229 | } 230 | 231 | if let Some(title) = options.title { 232 | window = window.with_title(&title); 233 | } 234 | 235 | let window = window.build(event_loop).map_err(|e| { 236 | napi::Error::new( 237 | napi::Status::GenericFailure, 238 | format!("Failed to create window: {}", e), 239 | ) 240 | })?; 241 | 242 | Ok(Self { 243 | window, 244 | is_child_window: child, 245 | }) 246 | } 247 | 248 | #[napi] 249 | /// Creates a webview on this window. 250 | pub fn create_webview(&mut self, env: Env, options: Option) -> Result { 251 | let webview = JsWebview::create(&env, &self.window, options.unwrap_or(Default::default()))?; 252 | Ok(webview) 253 | } 254 | 255 | #[napi(getter)] 256 | /// Whether or not the window is a child window. 257 | pub fn is_child(&self) -> bool { 258 | self.is_child_window 259 | } 260 | 261 | #[napi] 262 | /// Whether the window is focused. 263 | pub fn is_focused(&self) -> bool { 264 | self.window.is_focused() 265 | } 266 | 267 | #[napi] 268 | /// Whether the window is visible. 269 | pub fn is_visible(&self) -> bool { 270 | self.window.is_visible() 271 | } 272 | 273 | #[napi] 274 | /// Whether the window is decorated. 275 | pub fn is_decorated(&self) -> bool { 276 | self.window.is_decorated() 277 | } 278 | 279 | #[napi] 280 | /// Whether the window is closable. 281 | pub fn is_closable(&self) -> bool { 282 | self.window.is_closable() 283 | } 284 | 285 | #[napi] 286 | /// Whether the window is maximizable. 287 | pub fn is_maximizable(&self) -> bool { 288 | self.window.is_maximizable() 289 | } 290 | 291 | #[napi] 292 | /// Whether the window is minimizable. 293 | pub fn is_minimizable(&self) -> bool { 294 | self.window.is_minimizable() 295 | } 296 | 297 | #[napi] 298 | /// Whether the window is maximized. 299 | pub fn is_maximized(&self) -> bool { 300 | self.window.is_maximized() 301 | } 302 | 303 | #[napi] 304 | /// Whether the window is minimized. 305 | pub fn is_minimized(&self) -> bool { 306 | self.window.is_minimized() 307 | } 308 | 309 | #[napi] 310 | /// Whether the window is resizable. 311 | pub fn is_resizable(&self) -> bool { 312 | self.window.is_resizable() 313 | } 314 | 315 | #[napi] 316 | /// Sets the window title. 317 | pub fn set_title(&self, title: String) { 318 | self.window.set_title(&title); 319 | } 320 | 321 | #[napi(getter)] 322 | /// Sets the window title. 323 | pub fn get_title(&self) -> String { 324 | self.window.title() 325 | } 326 | 327 | #[napi] 328 | /// Sets closable. 329 | pub fn set_closable(&self, closable: bool) { 330 | self.window.set_closable(closable); 331 | } 332 | 333 | #[napi] 334 | /// Sets maximizable. 335 | pub fn set_maximizable(&self, maximizable: bool) { 336 | self.window.set_maximizable(maximizable); 337 | } 338 | 339 | #[napi] 340 | /// Sets minimizable. 341 | pub fn set_minimizable(&self, minimizable: bool) { 342 | self.window.set_minimizable(minimizable); 343 | } 344 | 345 | #[napi] 346 | /// Sets resizable. 347 | pub fn set_resizable(&self, resizable: bool) { 348 | self.window.set_resizable(resizable); 349 | } 350 | 351 | #[napi(getter)] 352 | /// Gets the window theme. 353 | pub fn get_theme(&self) -> JsTheme { 354 | match self.window.theme() { 355 | tao::window::Theme::Light => JsTheme::Light, 356 | tao::window::Theme::Dark => JsTheme::Dark, 357 | _ => JsTheme::System, 358 | } 359 | } 360 | 361 | #[napi] 362 | /// Sets the window theme. 363 | pub fn set_theme(&self, theme: JsTheme) { 364 | let theme = match theme { 365 | JsTheme::Light => Some(tao::window::Theme::Light), 366 | JsTheme::Dark => Some(tao::window::Theme::Dark), 367 | _ => None, 368 | }; 369 | 370 | self.window.set_theme(theme); 371 | } 372 | 373 | #[napi] 374 | /// Sets the window icon. 375 | pub fn set_window_icon( 376 | &self, 377 | icon: Either, String>, 378 | width: u32, 379 | height: u32, 380 | ) -> Result<()> { 381 | #[cfg(target_os = "windows")] 382 | { 383 | use tao::platform::windows::IconExtWindows; 384 | 385 | let ico = match icon { 386 | Either::A(bytes) => Icon::from_rgba(bytes, width, height), 387 | Either::B(path) => Icon::from_path(&path, PhysicalSize::new(width, height).into()), 388 | }; 389 | 390 | let parsed = ico.map_err(|e| { 391 | napi::Error::new( 392 | napi::Status::GenericFailure, 393 | format!("Failed to set window icon: {}", e), 394 | ) 395 | })?; 396 | 397 | self.window.set_window_icon(Some(parsed)); 398 | } 399 | 400 | Ok(()) 401 | } 402 | 403 | #[napi] 404 | /// Removes the window icon. 405 | pub fn remove_window_icon(&self) { 406 | self.window.set_window_icon(None); 407 | } 408 | 409 | #[napi] 410 | /// Modifies the window's visibility. 411 | /// If `false`, this will hide all the window. If `true`, this will show the window. 412 | pub fn set_visible(&self, visible: bool) { 413 | self.window.set_visible(visible); 414 | } 415 | 416 | #[napi] 417 | /// Modifies the window's progress bar. 418 | pub fn set_progress_bar(&self, state: JsProgressBar) { 419 | let progress_state = match state.state { 420 | Some(JsProgressBarState::Normal) => Some(tao::window::ProgressState::Normal), 421 | Some(JsProgressBarState::Indeterminate) => Some(tao::window::ProgressState::Indeterminate), 422 | Some(JsProgressBarState::Paused) => Some(tao::window::ProgressState::Paused), 423 | Some(JsProgressBarState::Error) => Some(tao::window::ProgressState::Error), 424 | _ => None, 425 | }; 426 | 427 | let progress_value = match state.progress { 428 | Some(value) => Some(value as u64), 429 | _ => None, 430 | }; 431 | 432 | let progress = ProgressBarState { 433 | progress: progress_value, 434 | state: progress_state, 435 | desktop_filename: None, 436 | }; 437 | 438 | self.window.set_progress_bar(progress); 439 | } 440 | 441 | #[napi] 442 | /// Maximizes the window. 443 | pub fn set_maximized(&self, value: bool) { 444 | self.window.set_maximized(value); 445 | } 446 | 447 | #[napi] 448 | /// Minimizes the window. 449 | pub fn set_minimized(&self, value: bool) { 450 | self.window.set_minimized(value); 451 | } 452 | 453 | #[napi] 454 | /// Bring the window to front and focus. 455 | pub fn focus(&self) { 456 | self.window.set_focus(); 457 | } 458 | 459 | #[napi] 460 | /// Get available monitors. 461 | pub fn get_available_monitors(&self) -> Vec { 462 | self 463 | .window 464 | .available_monitors() 465 | .map(|m| Monitor { 466 | name: m.name(), 467 | scale_factor: m.scale_factor(), 468 | size: Dimensions { 469 | width: m.size().width, 470 | height: m.size().height, 471 | }, 472 | position: Position { 473 | x: m.position().x, 474 | y: m.position().y, 475 | }, 476 | video_modes: m 477 | .video_modes() 478 | .map(|v| JsVideoMode { 479 | size: Dimensions { 480 | width: v.size().width, 481 | height: v.size().height, 482 | }, 483 | bit_depth: v.bit_depth(), 484 | refresh_rate: v.refresh_rate(), 485 | }) 486 | .collect(), 487 | }) 488 | .collect() 489 | } 490 | 491 | #[napi] 492 | /// Get the current monitor. 493 | pub fn get_current_monitor(&self) -> Option { 494 | match self.window.current_monitor() { 495 | Some(monitor) => Some(Monitor { 496 | name: monitor.name(), 497 | scale_factor: monitor.scale_factor(), 498 | size: Dimensions { 499 | width: monitor.size().width, 500 | height: monitor.size().height, 501 | }, 502 | position: Position { 503 | x: monitor.position().x, 504 | y: monitor.position().y, 505 | }, 506 | video_modes: monitor 507 | .video_modes() 508 | .map(|v| JsVideoMode { 509 | size: Dimensions { 510 | width: v.size().width, 511 | height: v.size().height, 512 | }, 513 | bit_depth: v.bit_depth(), 514 | refresh_rate: v.refresh_rate(), 515 | }) 516 | .collect(), 517 | }), 518 | _ => None, 519 | } 520 | } 521 | 522 | #[napi] 523 | /// Get the primary monitor. 524 | pub fn get_primary_monitor(&self) -> Option { 525 | match self.window.primary_monitor() { 526 | Some(monitor) => Some(Monitor { 527 | name: monitor.name(), 528 | scale_factor: monitor.scale_factor(), 529 | size: Dimensions { 530 | width: monitor.size().width, 531 | height: monitor.size().height, 532 | }, 533 | position: Position { 534 | x: monitor.position().x, 535 | y: monitor.position().y, 536 | }, 537 | video_modes: monitor 538 | .video_modes() 539 | .map(|v| JsVideoMode { 540 | size: Dimensions { 541 | width: v.size().width, 542 | height: v.size().height, 543 | }, 544 | bit_depth: v.bit_depth(), 545 | refresh_rate: v.refresh_rate(), 546 | }) 547 | .collect(), 548 | }), 549 | _ => None, 550 | } 551 | } 552 | 553 | #[napi] 554 | /// Get the monitor from the given point. 555 | pub fn get_monitor_from_point(&self, x: f64, y: f64) -> Option { 556 | match self.window.monitor_from_point(x, y) { 557 | Some(monitor) => Some(Monitor { 558 | name: monitor.name(), 559 | scale_factor: monitor.scale_factor(), 560 | size: Dimensions { 561 | width: monitor.size().width, 562 | height: monitor.size().height, 563 | }, 564 | position: Position { 565 | x: monitor.position().x, 566 | y: monitor.position().y, 567 | }, 568 | video_modes: monitor 569 | .video_modes() 570 | .map(|v| JsVideoMode { 571 | size: Dimensions { 572 | width: v.size().width, 573 | height: v.size().height, 574 | }, 575 | bit_depth: v.bit_depth(), 576 | refresh_rate: v.refresh_rate(), 577 | }) 578 | .collect(), 579 | }), 580 | _ => None, 581 | } 582 | } 583 | 584 | #[napi] 585 | /// Prevents the window contents from being captured by other apps. 586 | pub fn set_content_protection(&self, enabled: bool) { 587 | self.window.set_content_protection(enabled); 588 | } 589 | 590 | #[napi] 591 | /// Sets the window always on top. 592 | pub fn set_always_on_top(&self, enabled: bool) { 593 | self.window.set_always_on_top(enabled); 594 | } 595 | 596 | #[napi] 597 | /// Sets always on bottom. 598 | pub fn set_always_on_bottom(&self, enabled: bool) { 599 | self.window.set_always_on_bottom(enabled); 600 | } 601 | 602 | #[napi] 603 | /// Turn window decorations on or off. 604 | pub fn set_decorations(&self, enabled: bool) { 605 | self.window.set_decorations(enabled); 606 | } 607 | 608 | #[napi(getter)] 609 | /// Gets the window's current fullscreen state. 610 | pub fn get_fullscreen(&self) -> Option { 611 | match self.window.fullscreen() { 612 | None => None, 613 | Some(Fullscreen::Borderless(None)) => Some(FullscreenType::Borderless), 614 | _ => Some(FullscreenType::Exclusive), 615 | } 616 | } 617 | 618 | #[napi] 619 | /// Sets the window to fullscreen or back. 620 | pub fn set_fullscreen(&self, fullscreen_type: Option) { 621 | let monitor = self.window.current_monitor(); 622 | 623 | if monitor.is_none() { 624 | return; 625 | }; 626 | 627 | let video_mode = monitor.unwrap().video_modes().next(); 628 | 629 | if video_mode.is_none() { 630 | return; 631 | }; 632 | 633 | let fs = match fullscreen_type { 634 | Some(FullscreenType::Exclusive) => Some(Fullscreen::Exclusive(video_mode.unwrap())), 635 | Some(FullscreenType::Borderless) => Some(Fullscreen::Borderless(None)), 636 | _ => None, 637 | }; 638 | 639 | self.window.set_fullscreen(fs); 640 | } 641 | } 642 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #![deny(clippy::all)] 2 | #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] 3 | 4 | use std::cell::RefCell; 5 | use std::rc::Rc; 6 | 7 | use browser_window::{BrowserWindow, BrowserWindowOptions}; 8 | use napi::bindgen_prelude::*; 9 | use napi::Result; 10 | use napi_derive::napi; 11 | use tao::{ 12 | event::{Event, WindowEvent}, 13 | event_loop::{ControlFlow, EventLoop}, 14 | }; 15 | 16 | pub mod browser_window; 17 | pub mod webview; 18 | 19 | #[napi] 20 | /// TODO 21 | pub enum WebviewApplicationEvent { 22 | /// Window close event. 23 | WindowCloseRequested, 24 | } 25 | 26 | #[napi(object)] 27 | pub struct HeaderData { 28 | /// The key of the header. 29 | pub key: String, 30 | /// The value of the header. 31 | pub value: Option, 32 | } 33 | 34 | #[napi(object)] 35 | pub struct IpcMessage { 36 | /// The body of the message. 37 | pub body: Buffer, 38 | /// The HTTP method of the message. 39 | pub method: String, 40 | /// The http headers of the message. 41 | pub headers: Vec, 42 | /// The URI of the message. 43 | pub uri: String, 44 | } 45 | 46 | #[napi] 47 | /// Returns the version of the webview. 48 | pub fn get_webview_version() -> Result { 49 | wry::webview_version().map_err(|e| { 50 | napi::Error::new( 51 | napi::Status::GenericFailure, 52 | format!("Failed to get webview version: {}", e), 53 | ) 54 | }) 55 | } 56 | 57 | #[napi(js_name = "ControlFlow")] 58 | /// Represents the control flow of the application. 59 | pub enum JsControlFlow { 60 | /// The application will continue running. 61 | Poll, 62 | /// The application will wait until the specified time. 63 | WaitUntil, 64 | /// The application will exit. 65 | Exit, 66 | /// The application will exit with the given exit code. 67 | ExitWithCode, 68 | } 69 | 70 | #[napi(object)] 71 | /// Represents the options for creating an application. 72 | pub struct ApplicationOptions { 73 | /// The control flow of the application. Default is `Poll`. 74 | pub control_flow: Option, 75 | /// The waiting time in ms for the application (only applicable if control flow is set to `WaitUntil`). 76 | pub wait_time: Option, 77 | /// The exit code of the application. Only applicable if control flow is set to `ExitWithCode`. 78 | pub exit_code: Option, 79 | } 80 | 81 | #[napi(object)] 82 | /// Represents an event for the application. 83 | pub struct ApplicationEvent { 84 | /// The event type. 85 | pub event: WebviewApplicationEvent, 86 | } 87 | 88 | #[napi] 89 | /// Represents an application. 90 | pub struct Application { 91 | /// The event loop. 92 | event_loop: Option>, 93 | /// The options for creating the application. 94 | options: ApplicationOptions, 95 | /// The event handler for the application. 96 | handler: Rc>>>, 97 | /// The env 98 | env: Env, 99 | } 100 | 101 | #[napi] 102 | impl Application { 103 | #[napi(constructor)] 104 | /// Creates a new application. 105 | pub fn new(env: Env, options: Option) -> Result { 106 | let event_loop = EventLoop::new(); 107 | 108 | Ok(Self { 109 | event_loop: Some(event_loop), 110 | options: options.unwrap_or(ApplicationOptions { 111 | control_flow: Some(JsControlFlow::Poll), 112 | wait_time: None, 113 | exit_code: None, 114 | }), 115 | handler: Rc::new(RefCell::new(None::>)), 116 | env, 117 | }) 118 | } 119 | 120 | #[napi] 121 | /// Sets the event handler callback. 122 | pub fn on_event(&mut self, handler: Option>) { 123 | *self.handler.borrow_mut() = handler; 124 | } 125 | 126 | #[napi] 127 | /// Creates a new browser window. 128 | pub fn create_browser_window( 129 | &'static mut self, 130 | options: Option, 131 | ) -> Result { 132 | let event_loop = self.event_loop.as_ref(); 133 | 134 | if event_loop.is_none() { 135 | return Err(napi::Error::new( 136 | napi::Status::GenericFailure, 137 | "Event loop is not initialized", 138 | )); 139 | } 140 | 141 | let window = BrowserWindow::new(event_loop.unwrap(), options, false)?; 142 | 143 | Ok(window) 144 | } 145 | 146 | #[napi] 147 | /// Creates a new browser window as a child window. 148 | pub fn create_child_browser_window( 149 | &'static mut self, 150 | options: Option, 151 | ) -> Result { 152 | let event_loop = self.event_loop.as_ref(); 153 | 154 | if event_loop.is_none() { 155 | return Err(napi::Error::new( 156 | napi::Status::GenericFailure, 157 | "Event loop is not initialized", 158 | )); 159 | } 160 | 161 | let window = BrowserWindow::new(event_loop.unwrap(), options, true)?; 162 | 163 | Ok(window) 164 | } 165 | 166 | #[napi] 167 | /// Runs the application. This method will block the current thread. 168 | pub fn run(&mut self) -> Result<()> { 169 | let ctrl = match self.options.control_flow { 170 | None => ControlFlow::Poll, 171 | Some(JsControlFlow::Poll) => ControlFlow::Poll, 172 | Some(JsControlFlow::WaitUntil) => { 173 | let wait_time = self.options.wait_time.unwrap_or(0); 174 | ControlFlow::WaitUntil( 175 | std::time::Instant::now() + std::time::Duration::from_millis(wait_time as u64), 176 | ) 177 | } 178 | Some(JsControlFlow::Exit) => ControlFlow::Exit, 179 | Some(JsControlFlow::ExitWithCode) => { 180 | let exit_code = self.options.exit_code.unwrap_or(0); 181 | ControlFlow::ExitWithCode(exit_code) 182 | } 183 | }; 184 | 185 | if let Some(event_loop) = self.event_loop.take() { 186 | let handler = self.handler.clone(); 187 | let env = self.env.clone(); 188 | 189 | event_loop.run(move |event, _, control_flow| { 190 | *control_flow = ctrl; 191 | 192 | match event { 193 | Event::WindowEvent { 194 | event: WindowEvent::CloseRequested, 195 | .. 196 | } => { 197 | let callback = handler.borrow(); 198 | if callback.is_some() { 199 | let callback = callback.as_ref().unwrap().borrow_back(&env); 200 | 201 | if callback.is_ok() { 202 | let callback = callback.unwrap(); 203 | match callback.call(ApplicationEvent { 204 | event: WebviewApplicationEvent::WindowCloseRequested, 205 | }) { 206 | _ => (), 207 | }; 208 | } 209 | } 210 | 211 | *control_flow = ControlFlow::Exit 212 | } 213 | _ => (), 214 | } 215 | }); 216 | } 217 | 218 | Ok(()) 219 | } 220 | } 221 | -------------------------------------------------------------------------------- /src/webview.rs: -------------------------------------------------------------------------------- 1 | use std::{borrow::Borrow, cell::RefCell, rc::Rc}; 2 | 3 | use napi::{ 4 | bindgen_prelude::FunctionRef, 5 | threadsafe_function::{ThreadsafeFunction, ThreadsafeFunctionCallMode}, 6 | Env, Result, 7 | }; 8 | use napi_derive::*; 9 | use tao::dpi::{LogicalPosition, LogicalSize}; 10 | use wry::{http::Request, Rect, WebViewBuilder}; 11 | 12 | use crate::{HeaderData, IpcMessage}; 13 | 14 | /// Represents the theme of the window. 15 | #[napi(js_name = "Theme")] 16 | pub enum JsTheme { 17 | /// The light theme. 18 | Light, 19 | /// The dark theme. 20 | Dark, 21 | /// The system theme. 22 | System, 23 | } 24 | 25 | #[napi(object)] 26 | pub struct WebviewOptions { 27 | /// The URL to load. 28 | pub url: Option, 29 | /// The HTML content to load. 30 | pub html: Option, 31 | /// The width of the window. 32 | pub width: Option, 33 | /// The height of the window. 34 | pub height: Option, 35 | /// The x position of the window. 36 | pub x: Option, 37 | /// The y position of the window. 38 | pub y: Option, 39 | /// Whether to enable devtools. Default is `true`. 40 | pub enable_devtools: Option, 41 | /// Whether the window is incognito. Default is `false`. 42 | pub incognito: Option, 43 | /// The default user agent. 44 | pub user_agent: Option, 45 | /// Whether the webview should be built as a child. 46 | pub child: Option, 47 | /// The preload script to inject. 48 | pub preload: Option, 49 | /// Whether the window is transparent. Default is `false`. 50 | pub transparent: Option, 51 | /// The default theme. 52 | pub theme: Option, 53 | /// Whether the window is zoomable via hotkeys or gestures. 54 | pub hotkeys_zoom: Option, 55 | /// Whether the clipboard access is enabled. 56 | pub clipboard: Option, 57 | /// Whether the autoplay policy is enabled. 58 | pub autoplay: Option, 59 | /// Indicates whether horizontal swipe gestures trigger backward and forward page navigation. 60 | pub back_forward_navigation_gestures: Option, 61 | } 62 | 63 | impl Default for WebviewOptions { 64 | fn default() -> Self { 65 | Self { 66 | url: None, 67 | html: None, 68 | width: None, 69 | height: None, 70 | x: None, 71 | y: None, 72 | enable_devtools: Some(true), 73 | incognito: Some(false), 74 | user_agent: Some("WebviewJS".to_owned()), 75 | child: Some(false), 76 | preload: None, 77 | transparent: Some(false), 78 | theme: None, 79 | hotkeys_zoom: Some(true), 80 | clipboard: Some(true), 81 | autoplay: Some(true), 82 | back_forward_navigation_gestures: Some(true), 83 | } 84 | } 85 | } 86 | 87 | #[napi(js_name = "Webview")] 88 | pub struct JsWebview { 89 | /// The inner webview. 90 | webview_inner: wry::WebView, 91 | /// The ipc handler fn 92 | ipc_state: Rc>>>, 93 | } 94 | 95 | #[napi] 96 | impl JsWebview { 97 | pub fn create(env: &Env, window: &tao::window::Window, options: WebviewOptions) -> Result { 98 | // let mut webview = if options.child.unwrap_or(false) { 99 | // WebViewBuilder::new_as_child(window) 100 | // } else { 101 | // WebViewBuilder::new(window) 102 | // }; 103 | let mut webview = WebViewBuilder::new(); 104 | 105 | if let Some(devtools) = options.enable_devtools { 106 | webview = webview.with_devtools(devtools); 107 | } 108 | 109 | webview = webview.with_bounds(Rect { 110 | position: LogicalPosition::new(options.x.unwrap_or(0.0), options.y.unwrap_or(0.0)).into(), 111 | size: LogicalSize::new( 112 | options.width.unwrap_or(800.0), 113 | options.height.unwrap_or(600.0), 114 | ) 115 | .into(), 116 | }); 117 | 118 | if let Some(incognito) = options.incognito { 119 | webview = webview.with_incognito(incognito); 120 | } 121 | 122 | if let Some(preload) = options.preload { 123 | webview = webview.with_initialization_script(&preload); 124 | } 125 | 126 | if let Some(transparent) = options.transparent { 127 | webview = webview.with_transparent(transparent); 128 | } 129 | 130 | if let Some(autoplay) = options.autoplay { 131 | webview = webview.with_autoplay(autoplay); 132 | } 133 | 134 | if let Some(clipboard) = options.clipboard { 135 | webview = webview.with_clipboard(clipboard); 136 | } 137 | 138 | if let Some(back_forward_navigation_gestures) = options.back_forward_navigation_gestures { 139 | webview = webview.with_back_forward_navigation_gestures(back_forward_navigation_gestures); 140 | } 141 | 142 | if let Some(hotkeys_zoom) = options.hotkeys_zoom { 143 | webview = webview.with_hotkeys_zoom(hotkeys_zoom); 144 | } 145 | 146 | #[cfg(target_os = "windows")] 147 | { 148 | use wry::WebViewBuilderExtWindows; 149 | 150 | if let Some(theme) = options.theme { 151 | let theme = match theme { 152 | JsTheme::Light => wry::Theme::Light, 153 | JsTheme::Dark => wry::Theme::Dark, 154 | _ => wry::Theme::Auto, 155 | }; 156 | 157 | webview = webview.with_theme(theme) 158 | } 159 | } 160 | 161 | if let Some(user_agent) = options.user_agent { 162 | webview = webview.with_user_agent(&user_agent); 163 | } 164 | 165 | if let Some(html) = options.html { 166 | webview = webview.with_html(&html); 167 | } 168 | 169 | if let Some(url) = options.url { 170 | webview = webview.with_url(&url); 171 | } 172 | 173 | let ipc_state = Rc::new(RefCell::new(None::>)); 174 | let ipc_state_clone = ipc_state.clone(); 175 | 176 | let env = env.clone(); 177 | let ipc_handler = move |req: Request| { 178 | let callback: &RefCell>> = ipc_state_clone.borrow(); 179 | let callback = callback.borrow(); 180 | if let Some(func) = callback.as_ref() { 181 | let on_ipc_msg = func.borrow_back(&env); 182 | 183 | if on_ipc_msg.is_err() { 184 | return; 185 | } 186 | 187 | let on_ipc_msg = on_ipc_msg.unwrap(); 188 | 189 | let body = req.body().as_bytes().to_vec().into(); 190 | let headers = req 191 | .headers() 192 | .iter() 193 | .map(|(k, v)| HeaderData { 194 | key: k.as_str().to_string(), 195 | value: v.to_str().ok().map(|s| s.to_string()), 196 | }) 197 | .collect::>(); 198 | 199 | let ipc_message = IpcMessage { 200 | body, 201 | headers, 202 | method: req.method().to_string(), 203 | uri: req.uri().to_string(), 204 | }; 205 | 206 | match on_ipc_msg.call(ipc_message) { 207 | _ => {} 208 | }; 209 | } 210 | }; 211 | 212 | webview = webview.with_ipc_handler(ipc_handler); 213 | 214 | let handle_build_error = |e| { 215 | napi::Error::new( 216 | napi::Status::GenericFailure, 217 | format!("Failed to create webview: {}", e), 218 | ) 219 | }; 220 | 221 | #[cfg(not(target_os = "linux"))] 222 | let webview = { 223 | if options.child.unwrap_or(false) { 224 | webview.build_as_child(&window).map_err(handle_build_error) 225 | } else { 226 | webview.build(&window).map_err(handle_build_error) 227 | } 228 | }?; 229 | 230 | #[cfg(target_os = "linux")] 231 | let webview = { 232 | if options.child.unwrap_or(false) { 233 | webview 234 | .build_as_child(window.gtk_window()) 235 | .map_err(handle_build_error) 236 | } else { 237 | webview 238 | .build(window.gtk_window()) 239 | .map_err(handle_build_error) 240 | } 241 | }; 242 | 243 | Ok(Self { 244 | webview_inner: webview, 245 | ipc_state, 246 | }) 247 | } 248 | 249 | #[napi(constructor)] 250 | pub fn new() -> Result { 251 | Err(napi::Error::new( 252 | napi::Status::GenericFailure, 253 | "Webview constructor is not directly supported", 254 | )) 255 | } 256 | 257 | #[napi] 258 | /// Sets the IPC handler callback. 259 | pub fn on_ipc_message(&mut self, handler: Option>) { 260 | *self.ipc_state.borrow_mut() = handler; 261 | } 262 | 263 | #[napi] 264 | /// Launch a print modal for this window's contents. 265 | pub fn print(&self) -> Result<()> { 266 | self.webview_inner.print().map_err(|e| { 267 | napi::Error::new( 268 | napi::Status::GenericFailure, 269 | format!("Failed to print: {}", e), 270 | ) 271 | }) 272 | } 273 | 274 | #[napi] 275 | /// Set webview zoom level. 276 | pub fn zoom(&self, scale_facotr: f64) -> Result<()> { 277 | self.webview_inner.zoom(scale_facotr).map_err(|e| { 278 | napi::Error::new( 279 | napi::Status::GenericFailure, 280 | format!("Failed to zoom: {}", e), 281 | ) 282 | }) 283 | } 284 | 285 | #[napi] 286 | /// Hides or shows the webview. 287 | pub fn set_webview_visibility(&self, visible: bool) -> Result<()> { 288 | self.webview_inner.set_visible(visible).map_err(|e| { 289 | napi::Error::new( 290 | napi::Status::GenericFailure, 291 | format!("Failed to set webview visibility: {}", e), 292 | ) 293 | }) 294 | } 295 | 296 | #[napi] 297 | /// Whether the devtools is opened. 298 | pub fn is_devtools_open(&self) -> bool { 299 | self.webview_inner.is_devtools_open() 300 | } 301 | 302 | #[napi] 303 | /// Opens the devtools. 304 | pub fn open_devtools(&self) { 305 | self.webview_inner.open_devtools(); 306 | } 307 | 308 | #[napi] 309 | /// Closes the devtools. 310 | pub fn close_devtools(&self) { 311 | self.webview_inner.close_devtools(); 312 | } 313 | 314 | #[napi] 315 | /// Loads the given URL. 316 | pub fn load_url(&self, url: String) -> Result<()> { 317 | self.webview_inner.load_url(&url).map_err(|e| { 318 | napi::Error::new( 319 | napi::Status::GenericFailure, 320 | format!("Failed to load URL: {}", e), 321 | ) 322 | }) 323 | } 324 | 325 | #[napi] 326 | /// Loads the given HTML content. 327 | pub fn load_html(&self, html: String) -> Result<()> { 328 | self.webview_inner.load_html(&html).map_err(|e| { 329 | napi::Error::new( 330 | napi::Status::GenericFailure, 331 | format!("Failed to load HTML: {}", e), 332 | ) 333 | }) 334 | } 335 | 336 | #[napi] 337 | /// Evaluates the given JavaScript code. 338 | pub fn evaluate_script(&self, js: String) -> Result<()> { 339 | self 340 | .webview_inner 341 | .evaluate_script(&js) 342 | .map_err(|e| napi::Error::new(napi::Status::GenericFailure, format!("{}", e))) 343 | } 344 | 345 | #[napi] 346 | pub fn evaluate_script_with_callback( 347 | &self, 348 | js: String, 349 | callback: ThreadsafeFunction, 350 | ) -> Result<()> { 351 | let tsfn = callback.clone(); 352 | 353 | self 354 | .webview_inner 355 | .evaluate_script_with_callback(&js, move |val| { 356 | tsfn.call(Ok(val), ThreadsafeFunctionCallMode::Blocking); 357 | }) 358 | .map_err(|e| napi::Error::new(napi::Status::GenericFailure, format!("{}", e))) 359 | } 360 | } 361 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "strict": true, 5 | "moduleResolution": "node", 6 | "module": "CommonJS", 7 | "noUnusedLocals": true, 8 | "noUnusedParameters": true, 9 | "esModuleInterop": true, 10 | "allowSyntheticDefaultImports": true 11 | }, 12 | "include": ["."], 13 | "exclude": ["node_modules", "bench", "__test__"] 14 | } 15 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # This file is generated by running "yarn install" inside your project. 2 | # Manual changes might be lost - proceed with caution! 3 | 4 | __metadata: 5 | version: 8 6 | cacheKey: 10c0 7 | 8 | "@emnapi/core@npm:^1.1.0": 9 | version: 1.2.0 10 | resolution: "@emnapi/core@npm:1.2.0" 11 | dependencies: 12 | "@emnapi/wasi-threads": "npm:1.0.1" 13 | tslib: "npm:^2.4.0" 14 | checksum: 10c0/a9cf024c1982cd965f6888d1b4514926ad3675fa9d0bd792c9a0770fb592c4c4d20aa1e97a225a7682f9c7900231751434820d5558fd5a00929c2ee976ce5265 15 | languageName: node 16 | linkType: hard 17 | 18 | "@emnapi/runtime@npm:^1.1.0": 19 | version: 1.2.0 20 | resolution: "@emnapi/runtime@npm:1.2.0" 21 | dependencies: 22 | tslib: "npm:^2.4.0" 23 | checksum: 10c0/7005ff8b67724c9e61b6cd79a3decbdb2ce25d24abd4d3d187472f200ee6e573329c30264335125fb136bd813aa9cf9f4f7c9391d04b07dd1e63ce0a3427be57 24 | languageName: node 25 | linkType: hard 26 | 27 | "@emnapi/wasi-threads@npm:1.0.1": 28 | version: 1.0.1 29 | resolution: "@emnapi/wasi-threads@npm:1.0.1" 30 | dependencies: 31 | tslib: "npm:^2.4.0" 32 | checksum: 10c0/1e0c8036b8d53e9b07cc9acf021705ef6c86ab6b13e1acda7fffaf541a2d3565072afb92597419173ced9ea14f6bf32fce149106e669b5902b825e8b499e5c6c 33 | languageName: node 34 | linkType: hard 35 | 36 | "@mapbox/node-pre-gyp@npm:^1.0.5": 37 | version: 1.0.11 38 | resolution: "@mapbox/node-pre-gyp@npm:1.0.11" 39 | dependencies: 40 | detect-libc: "npm:^2.0.0" 41 | https-proxy-agent: "npm:^5.0.0" 42 | make-dir: "npm:^3.1.0" 43 | node-fetch: "npm:^2.6.7" 44 | nopt: "npm:^5.0.0" 45 | npmlog: "npm:^5.0.1" 46 | rimraf: "npm:^3.0.2" 47 | semver: "npm:^7.3.5" 48 | tar: "npm:^6.1.11" 49 | bin: 50 | node-pre-gyp: bin/node-pre-gyp 51 | checksum: 10c0/2b24b93c31beca1c91336fa3b3769fda98e202fb7f9771f0f4062588d36dcc30fcf8118c36aa747fa7f7610d8cf601872bdaaf62ce7822bb08b545d1bbe086cc 52 | languageName: node 53 | linkType: hard 54 | 55 | "@napi-rs/cli@npm:^2.18.4": 56 | version: 2.18.4 57 | resolution: "@napi-rs/cli@npm:2.18.4" 58 | bin: 59 | napi: scripts/index.js 60 | checksum: 10c0/cb80bc86687ba01077a0faa8d38198bc632b7caacf3a42ec42c3ec04700084ca26be9eec13bf7ac7da90e6afb46c65a39de8a86825a53b74dec2f2f459c0a7ea 61 | languageName: node 62 | linkType: hard 63 | 64 | "@napi-rs/wasm-runtime@npm:^0.2.4": 65 | version: 0.2.4 66 | resolution: "@napi-rs/wasm-runtime@npm:0.2.4" 67 | dependencies: 68 | "@emnapi/core": "npm:^1.1.0" 69 | "@emnapi/runtime": "npm:^1.1.0" 70 | "@tybys/wasm-util": "npm:^0.9.0" 71 | checksum: 10c0/1040de49b2ef509db207e2517465dbf7fb3474f20e8ec32897672a962ff4f59872385666dac61dc9dbeae3cae5dad265d8dc3865da756adeb07d1634c67b03a1 72 | languageName: node 73 | linkType: hard 74 | 75 | "@nodelib/fs.scandir@npm:2.1.5": 76 | version: 2.1.5 77 | resolution: "@nodelib/fs.scandir@npm:2.1.5" 78 | dependencies: 79 | "@nodelib/fs.stat": "npm:2.0.5" 80 | run-parallel: "npm:^1.1.9" 81 | checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb 82 | languageName: node 83 | linkType: hard 84 | 85 | "@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": 86 | version: 2.0.5 87 | resolution: "@nodelib/fs.stat@npm:2.0.5" 88 | checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d 89 | languageName: node 90 | linkType: hard 91 | 92 | "@nodelib/fs.walk@npm:^1.2.3": 93 | version: 1.2.8 94 | resolution: "@nodelib/fs.walk@npm:1.2.8" 95 | dependencies: 96 | "@nodelib/fs.scandir": "npm:2.1.5" 97 | fastq: "npm:^1.6.0" 98 | checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 99 | languageName: node 100 | linkType: hard 101 | 102 | "@oxc-resolver/binding-darwin-arm64@npm:1.10.0": 103 | version: 1.10.0 104 | resolution: "@oxc-resolver/binding-darwin-arm64@npm:1.10.0" 105 | conditions: os=darwin & cpu=arm64 106 | languageName: node 107 | linkType: hard 108 | 109 | "@oxc-resolver/binding-darwin-x64@npm:1.10.0": 110 | version: 1.10.0 111 | resolution: "@oxc-resolver/binding-darwin-x64@npm:1.10.0" 112 | conditions: os=darwin & cpu=x64 113 | languageName: node 114 | linkType: hard 115 | 116 | "@oxc-resolver/binding-linux-arm-gnueabihf@npm:1.10.0": 117 | version: 1.10.0 118 | resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:1.10.0" 119 | conditions: os=linux & cpu=arm 120 | languageName: node 121 | linkType: hard 122 | 123 | "@oxc-resolver/binding-linux-arm64-gnu@npm:1.10.0": 124 | version: 1.10.0 125 | resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:1.10.0" 126 | conditions: os=linux & cpu=arm64 & libc=glibc 127 | languageName: node 128 | linkType: hard 129 | 130 | "@oxc-resolver/binding-linux-arm64-musl@npm:1.10.0": 131 | version: 1.10.0 132 | resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:1.10.0" 133 | conditions: os=linux & cpu=arm64 & libc=musl 134 | languageName: node 135 | linkType: hard 136 | 137 | "@oxc-resolver/binding-linux-x64-gnu@npm:1.10.0": 138 | version: 1.10.0 139 | resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:1.10.0" 140 | conditions: os=linux & cpu=x64 & libc=glibc 141 | languageName: node 142 | linkType: hard 143 | 144 | "@oxc-resolver/binding-linux-x64-musl@npm:1.10.0": 145 | version: 1.10.0 146 | resolution: "@oxc-resolver/binding-linux-x64-musl@npm:1.10.0" 147 | conditions: os=linux & cpu=x64 & libc=musl 148 | languageName: node 149 | linkType: hard 150 | 151 | "@oxc-resolver/binding-wasm32-wasi@npm:1.10.0": 152 | version: 1.10.0 153 | resolution: "@oxc-resolver/binding-wasm32-wasi@npm:1.10.0" 154 | dependencies: 155 | "@napi-rs/wasm-runtime": "npm:^0.2.4" 156 | conditions: cpu=wasm32 157 | languageName: node 158 | linkType: hard 159 | 160 | "@oxc-resolver/binding-win32-arm64-msvc@npm:1.10.0": 161 | version: 1.10.0 162 | resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:1.10.0" 163 | conditions: os=win32 & cpu=arm64 164 | languageName: node 165 | linkType: hard 166 | 167 | "@oxc-resolver/binding-win32-x64-msvc@npm:1.10.0": 168 | version: 1.10.0 169 | resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:1.10.0" 170 | conditions: os=win32 & cpu=x64 171 | languageName: node 172 | linkType: hard 173 | 174 | "@oxlint/darwin-arm64@npm:0.9.0": 175 | version: 0.9.0 176 | resolution: "@oxlint/darwin-arm64@npm:0.9.0" 177 | conditions: os=darwin & cpu=arm64 178 | languageName: node 179 | linkType: hard 180 | 181 | "@oxlint/darwin-x64@npm:0.9.0": 182 | version: 0.9.0 183 | resolution: "@oxlint/darwin-x64@npm:0.9.0" 184 | conditions: os=darwin & cpu=x64 185 | languageName: node 186 | linkType: hard 187 | 188 | "@oxlint/linux-arm64-gnu@npm:0.9.0": 189 | version: 0.9.0 190 | resolution: "@oxlint/linux-arm64-gnu@npm:0.9.0" 191 | conditions: os=linux & cpu=arm64 & libc=glibc 192 | languageName: node 193 | linkType: hard 194 | 195 | "@oxlint/linux-arm64-musl@npm:0.9.0": 196 | version: 0.9.0 197 | resolution: "@oxlint/linux-arm64-musl@npm:0.9.0" 198 | conditions: os=linux & cpu=arm64 & libc=musl 199 | languageName: node 200 | linkType: hard 201 | 202 | "@oxlint/linux-x64-gnu@npm:0.9.0": 203 | version: 0.9.0 204 | resolution: "@oxlint/linux-x64-gnu@npm:0.9.0" 205 | conditions: os=linux & cpu=x64 & libc=glibc 206 | languageName: node 207 | linkType: hard 208 | 209 | "@oxlint/linux-x64-musl@npm:0.9.0": 210 | version: 0.9.0 211 | resolution: "@oxlint/linux-x64-musl@npm:0.9.0" 212 | conditions: os=linux & cpu=x64 & libc=musl 213 | languageName: node 214 | linkType: hard 215 | 216 | "@oxlint/win32-arm64@npm:0.9.0": 217 | version: 0.9.0 218 | resolution: "@oxlint/win32-arm64@npm:0.9.0" 219 | conditions: os=win32 & cpu=arm64 220 | languageName: node 221 | linkType: hard 222 | 223 | "@oxlint/win32-x64@npm:0.9.0": 224 | version: 0.9.0 225 | resolution: "@oxlint/win32-x64@npm:0.9.0" 226 | conditions: os=win32 & cpu=x64 227 | languageName: node 228 | linkType: hard 229 | 230 | "@rollup/pluginutils@npm:^4.0.0": 231 | version: 4.2.1 232 | resolution: "@rollup/pluginutils@npm:4.2.1" 233 | dependencies: 234 | estree-walker: "npm:^2.0.1" 235 | picomatch: "npm:^2.2.2" 236 | checksum: 10c0/3ee56b2c8f1ed8dfd0a92631da1af3a2dfdd0321948f089b3752b4de1b54dc5076701eadd0e5fc18bd191b77af594ac1db6279e83951238ba16bf8a414c64c48 237 | languageName: node 238 | linkType: hard 239 | 240 | "@sindresorhus/merge-streams@npm:^2.1.0": 241 | version: 2.3.0 242 | resolution: "@sindresorhus/merge-streams@npm:2.3.0" 243 | checksum: 10c0/69ee906f3125fb2c6bb6ec5cdd84e8827d93b49b3892bce8b62267116cc7e197b5cccf20c160a1d32c26014ecd14470a72a5e3ee37a58f1d6dadc0db1ccf3894 244 | languageName: node 245 | linkType: hard 246 | 247 | "@swc-node/core@npm:^1.13.2": 248 | version: 1.13.2 249 | resolution: "@swc-node/core@npm:1.13.2" 250 | peerDependencies: 251 | "@swc/core": ">= 1.4.13" 252 | "@swc/types": ">= 0.1" 253 | checksum: 10c0/0fec01cd6b3823301d85728d9fdff42949777608e6f1717373c60da415698ea18e4b5b0f904174b62261a97e352f57c13a3222a164786e58c1cbf255feac0966 254 | languageName: node 255 | linkType: hard 256 | 257 | "@swc-node/register@npm:^1.10.6": 258 | version: 1.10.6 259 | resolution: "@swc-node/register@npm:1.10.6" 260 | dependencies: 261 | "@swc-node/core": "npm:^1.13.2" 262 | "@swc-node/sourcemap-support": "npm:^0.5.1" 263 | colorette: "npm:^2.0.20" 264 | debug: "npm:^4.3.5" 265 | oxc-resolver: "npm:^1.10.0" 266 | pirates: "npm:^4.0.6" 267 | tslib: "npm:^2.6.3" 268 | peerDependencies: 269 | "@swc/core": ">= 1.4.13" 270 | typescript: ">= 4.3" 271 | checksum: 10c0/9e9a0f2ece211fad5a974fab1afda6c04f7c96245388984f5d9b40aff9ef77c4f45dcb96df6b8cbe3642cd337076400cc207bb0be3d313a82ceac119fa7e0d39 272 | languageName: node 273 | linkType: hard 274 | 275 | "@swc-node/sourcemap-support@npm:^0.5.1": 276 | version: 0.5.1 277 | resolution: "@swc-node/sourcemap-support@npm:0.5.1" 278 | dependencies: 279 | source-map-support: "npm:^0.5.21" 280 | tslib: "npm:^2.6.3" 281 | checksum: 10c0/5ac7e701a0683e0e6760c8078d4bb2829daa78c4946dcc729c75588b87112afc7352f7c8cd90cea9417b5f7494418d374a354795344c4cf81152bce3d5a17853 282 | languageName: node 283 | linkType: hard 284 | 285 | "@swc/core-darwin-arm64@npm:1.6.13": 286 | version: 1.6.13 287 | resolution: "@swc/core-darwin-arm64@npm:1.6.13" 288 | conditions: os=darwin & cpu=arm64 289 | languageName: node 290 | linkType: hard 291 | 292 | "@swc/core-darwin-x64@npm:1.6.13": 293 | version: 1.6.13 294 | resolution: "@swc/core-darwin-x64@npm:1.6.13" 295 | conditions: os=darwin & cpu=x64 296 | languageName: node 297 | linkType: hard 298 | 299 | "@swc/core-linux-arm-gnueabihf@npm:1.6.13": 300 | version: 1.6.13 301 | resolution: "@swc/core-linux-arm-gnueabihf@npm:1.6.13" 302 | conditions: os=linux & cpu=arm 303 | languageName: node 304 | linkType: hard 305 | 306 | "@swc/core-linux-arm64-gnu@npm:1.6.13": 307 | version: 1.6.13 308 | resolution: "@swc/core-linux-arm64-gnu@npm:1.6.13" 309 | conditions: os=linux & cpu=arm64 & libc=glibc 310 | languageName: node 311 | linkType: hard 312 | 313 | "@swc/core-linux-arm64-musl@npm:1.6.13": 314 | version: 1.6.13 315 | resolution: "@swc/core-linux-arm64-musl@npm:1.6.13" 316 | conditions: os=linux & cpu=arm64 & libc=musl 317 | languageName: node 318 | linkType: hard 319 | 320 | "@swc/core-linux-x64-gnu@npm:1.6.13": 321 | version: 1.6.13 322 | resolution: "@swc/core-linux-x64-gnu@npm:1.6.13" 323 | conditions: os=linux & cpu=x64 & libc=glibc 324 | languageName: node 325 | linkType: hard 326 | 327 | "@swc/core-linux-x64-musl@npm:1.6.13": 328 | version: 1.6.13 329 | resolution: "@swc/core-linux-x64-musl@npm:1.6.13" 330 | conditions: os=linux & cpu=x64 & libc=musl 331 | languageName: node 332 | linkType: hard 333 | 334 | "@swc/core-win32-arm64-msvc@npm:1.6.13": 335 | version: 1.6.13 336 | resolution: "@swc/core-win32-arm64-msvc@npm:1.6.13" 337 | conditions: os=win32 & cpu=arm64 338 | languageName: node 339 | linkType: hard 340 | 341 | "@swc/core-win32-ia32-msvc@npm:1.6.13": 342 | version: 1.6.13 343 | resolution: "@swc/core-win32-ia32-msvc@npm:1.6.13" 344 | conditions: os=win32 & cpu=ia32 345 | languageName: node 346 | linkType: hard 347 | 348 | "@swc/core-win32-x64-msvc@npm:1.6.13": 349 | version: 1.6.13 350 | resolution: "@swc/core-win32-x64-msvc@npm:1.6.13" 351 | conditions: os=win32 & cpu=x64 352 | languageName: node 353 | linkType: hard 354 | 355 | "@swc/core@npm:^1.6.13": 356 | version: 1.6.13 357 | resolution: "@swc/core@npm:1.6.13" 358 | dependencies: 359 | "@swc/core-darwin-arm64": "npm:1.6.13" 360 | "@swc/core-darwin-x64": "npm:1.6.13" 361 | "@swc/core-linux-arm-gnueabihf": "npm:1.6.13" 362 | "@swc/core-linux-arm64-gnu": "npm:1.6.13" 363 | "@swc/core-linux-arm64-musl": "npm:1.6.13" 364 | "@swc/core-linux-x64-gnu": "npm:1.6.13" 365 | "@swc/core-linux-x64-musl": "npm:1.6.13" 366 | "@swc/core-win32-arm64-msvc": "npm:1.6.13" 367 | "@swc/core-win32-ia32-msvc": "npm:1.6.13" 368 | "@swc/core-win32-x64-msvc": "npm:1.6.13" 369 | "@swc/counter": "npm:^0.1.3" 370 | "@swc/types": "npm:^0.1.9" 371 | peerDependencies: 372 | "@swc/helpers": "*" 373 | dependenciesMeta: 374 | "@swc/core-darwin-arm64": 375 | optional: true 376 | "@swc/core-darwin-x64": 377 | optional: true 378 | "@swc/core-linux-arm-gnueabihf": 379 | optional: true 380 | "@swc/core-linux-arm64-gnu": 381 | optional: true 382 | "@swc/core-linux-arm64-musl": 383 | optional: true 384 | "@swc/core-linux-x64-gnu": 385 | optional: true 386 | "@swc/core-linux-x64-musl": 387 | optional: true 388 | "@swc/core-win32-arm64-msvc": 389 | optional: true 390 | "@swc/core-win32-ia32-msvc": 391 | optional: true 392 | "@swc/core-win32-x64-msvc": 393 | optional: true 394 | peerDependenciesMeta: 395 | "@swc/helpers": 396 | optional: true 397 | checksum: 10c0/679fe7fd80370601b5be999636a16052608fff7c039738016f3382bb307e7f48af2e465f8a6d4c1202778d4c1e324feabfd3033ebed4e5b0e3c19bdff5f7f2fb 398 | languageName: node 399 | linkType: hard 400 | 401 | "@swc/counter@npm:^0.1.3": 402 | version: 0.1.3 403 | resolution: "@swc/counter@npm:0.1.3" 404 | checksum: 10c0/8424f60f6bf8694cfd2a9bca45845bce29f26105cda8cf19cdb9fd3e78dc6338699e4db77a89ae449260bafa1cc6bec307e81e7fb96dbf7dcfce0eea55151356 405 | languageName: node 406 | linkType: hard 407 | 408 | "@swc/types@npm:^0.1.9": 409 | version: 0.1.9 410 | resolution: "@swc/types@npm:0.1.9" 411 | dependencies: 412 | "@swc/counter": "npm:^0.1.3" 413 | checksum: 10c0/e47db2a06189f100696837ac3d56feaf67e8e68541b236c2de497e066689230f5cbb538fc0ca77c04739ae7653c20a2d79c7ab57ecf7506e2d008cb5e523f724 414 | languageName: node 415 | linkType: hard 416 | 417 | "@taplo/cli@npm:^0.7.0": 418 | version: 0.7.0 419 | resolution: "@taplo/cli@npm:0.7.0" 420 | bin: 421 | taplo: dist/cli.js 422 | checksum: 10c0/c5a9a34502335731e405547fe24ba1a2f867fccdf8abe4d13e261e30fad6c18a2773a961981206166fde0c85b19accef40381c189c8c6ed4952c5b082c1d4996 423 | languageName: node 424 | linkType: hard 425 | 426 | "@tybys/wasm-util@npm:^0.9.0": 427 | version: 0.9.0 428 | resolution: "@tybys/wasm-util@npm:0.9.0" 429 | dependencies: 430 | tslib: "npm:^2.4.0" 431 | checksum: 10c0/f9fde5c554455019f33af6c8215f1a1435028803dc2a2825b077d812bed4209a1a64444a4ca0ce2ea7e1175c8d88e2f9173a36a33c199e8a5c671aa31de8242d 432 | languageName: node 433 | linkType: hard 434 | 435 | "@types/node@npm:^22.7.4": 436 | version: 22.7.4 437 | resolution: "@types/node@npm:22.7.4" 438 | dependencies: 439 | undici-types: "npm:~6.19.2" 440 | checksum: 10c0/c22bf54515c78ff3170142c1e718b90e2a0003419dc2d55f79c9c9362edd590a6ab1450deb09ff6e1b32d1b4698da407930b16285e8be3a009ea6cd2695cac01 441 | languageName: node 442 | linkType: hard 443 | 444 | "@vercel/nft@npm:^0.26.2": 445 | version: 0.26.5 446 | resolution: "@vercel/nft@npm:0.26.5" 447 | dependencies: 448 | "@mapbox/node-pre-gyp": "npm:^1.0.5" 449 | "@rollup/pluginutils": "npm:^4.0.0" 450 | acorn: "npm:^8.6.0" 451 | acorn-import-attributes: "npm:^1.9.2" 452 | async-sema: "npm:^3.1.1" 453 | bindings: "npm:^1.4.0" 454 | estree-walker: "npm:2.0.2" 455 | glob: "npm:^7.1.3" 456 | graceful-fs: "npm:^4.2.9" 457 | micromatch: "npm:^4.0.2" 458 | node-gyp-build: "npm:^4.2.2" 459 | resolve-from: "npm:^5.0.0" 460 | bin: 461 | nft: out/cli.js 462 | checksum: 10c0/b7034b2f851384f26316c856a731c0973a99bd02f6bb349916a750328a4919944ed6fd12c321b38ec6535d29dfb627d7fa8ab0f1e8c1c3cabd71e3350bd77548 463 | languageName: node 464 | linkType: hard 465 | 466 | "@webviewjs/webview@workspace:.": 467 | version: 0.0.0-use.local 468 | resolution: "@webviewjs/webview@workspace:." 469 | dependencies: 470 | "@napi-rs/cli": "npm:^2.18.4" 471 | "@swc-node/register": "npm:^1.10.6" 472 | "@swc/core": "npm:^1.6.13" 473 | "@taplo/cli": "npm:^0.7.0" 474 | "@types/node": "npm:^22.7.4" 475 | ava: "npm:^6.1.3" 476 | chalk: "npm:^5.3.0" 477 | husky: "npm:^9.0.11" 478 | lint-staged: "npm:^15.2.7" 479 | nodeia: "npm:^0.0.1" 480 | npm-run-all2: "npm:^6.2.2" 481 | oxlint: "npm:^0.9.0" 482 | prettier: "npm:^3.3.3" 483 | tinybench: "npm:^2.8.0" 484 | typescript: "npm:^5.5.3" 485 | bin: 486 | webview: ./cli/index.mjs 487 | webviewjs: ./cli/index.mjs 488 | languageName: unknown 489 | linkType: soft 490 | 491 | "abbrev@npm:1": 492 | version: 1.1.1 493 | resolution: "abbrev@npm:1.1.1" 494 | checksum: 10c0/3f762677702acb24f65e813070e306c61fafe25d4b2583f9dfc935131f774863f3addd5741572ed576bd69cabe473c5af18e1e108b829cb7b6b4747884f726e6 495 | languageName: node 496 | linkType: hard 497 | 498 | "acorn-import-attributes@npm:^1.9.2": 499 | version: 1.9.5 500 | resolution: "acorn-import-attributes@npm:1.9.5" 501 | peerDependencies: 502 | acorn: ^8 503 | checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d 504 | languageName: node 505 | linkType: hard 506 | 507 | "acorn-walk@npm:^8.3.2": 508 | version: 8.3.3 509 | resolution: "acorn-walk@npm:8.3.3" 510 | dependencies: 511 | acorn: "npm:^8.11.0" 512 | checksum: 10c0/4a9e24313e6a0a7b389e712ba69b66b455b4cb25988903506a8d247e7b126f02060b05a8a5b738a9284214e4ca95f383dd93443a4ba84f1af9b528305c7f243b 513 | languageName: node 514 | linkType: hard 515 | 516 | "acorn@npm:^8.11.0, acorn@npm:^8.11.3, acorn@npm:^8.6.0": 517 | version: 8.12.1 518 | resolution: "acorn@npm:8.12.1" 519 | bin: 520 | acorn: bin/acorn 521 | checksum: 10c0/51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386 522 | languageName: node 523 | linkType: hard 524 | 525 | "agent-base@npm:6": 526 | version: 6.0.2 527 | resolution: "agent-base@npm:6.0.2" 528 | dependencies: 529 | debug: "npm:4" 530 | checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 531 | languageName: node 532 | linkType: hard 533 | 534 | "ansi-escapes@npm:^6.2.0": 535 | version: 6.2.1 536 | resolution: "ansi-escapes@npm:6.2.1" 537 | checksum: 10c0/a2c6f58b044be5f69662ee17073229b492daa2425a7fd99a665db6c22eab6e4ab42752807def7281c1c7acfed48f87f2362dda892f08c2c437f1b39c6b033103 538 | languageName: node 539 | linkType: hard 540 | 541 | "ansi-regex@npm:^5.0.1": 542 | version: 5.0.1 543 | resolution: "ansi-regex@npm:5.0.1" 544 | checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 545 | languageName: node 546 | linkType: hard 547 | 548 | "ansi-regex@npm:^6.0.1": 549 | version: 6.0.1 550 | resolution: "ansi-regex@npm:6.0.1" 551 | checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 552 | languageName: node 553 | linkType: hard 554 | 555 | "ansi-styles@npm:^4.0.0": 556 | version: 4.3.0 557 | resolution: "ansi-styles@npm:4.3.0" 558 | dependencies: 559 | color-convert: "npm:^2.0.1" 560 | checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 561 | languageName: node 562 | linkType: hard 563 | 564 | "ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.2.1": 565 | version: 6.2.1 566 | resolution: "ansi-styles@npm:6.2.1" 567 | checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c 568 | languageName: node 569 | linkType: hard 570 | 571 | "aproba@npm:^1.0.3 || ^2.0.0": 572 | version: 2.0.0 573 | resolution: "aproba@npm:2.0.0" 574 | checksum: 10c0/d06e26384a8f6245d8c8896e138c0388824e259a329e0c9f196b4fa533c82502a6fd449586e3604950a0c42921832a458bb3aa0aa9f0ba449cfd4f50fd0d09b5 575 | languageName: node 576 | linkType: hard 577 | 578 | "are-we-there-yet@npm:^2.0.0": 579 | version: 2.0.0 580 | resolution: "are-we-there-yet@npm:2.0.0" 581 | dependencies: 582 | delegates: "npm:^1.0.0" 583 | readable-stream: "npm:^3.6.0" 584 | checksum: 10c0/375f753c10329153c8d66dc95e8f8b6c7cc2aa66e05cb0960bd69092b10dae22900cacc7d653ad11d26b3ecbdbfe1e8bfb6ccf0265ba8077a7d979970f16b99c 585 | languageName: node 586 | linkType: hard 587 | 588 | "argparse@npm:^1.0.7": 589 | version: 1.0.10 590 | resolution: "argparse@npm:1.0.10" 591 | dependencies: 592 | sprintf-js: "npm:~1.0.2" 593 | checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de 594 | languageName: node 595 | linkType: hard 596 | 597 | "array-find-index@npm:^1.0.1": 598 | version: 1.0.2 599 | resolution: "array-find-index@npm:1.0.2" 600 | checksum: 10c0/86b9485c74ddd324feab807e10a6de3f9c1683856267236fac4bb4d4667ada6463e106db3f6c540ae6b720e0442b590ec701d13676df4c6af30ebf4da09b4f57 601 | languageName: node 602 | linkType: hard 603 | 604 | "arrgv@npm:^1.0.2": 605 | version: 1.0.2 606 | resolution: "arrgv@npm:1.0.2" 607 | checksum: 10c0/7e6e782e6b749923ac7cbc4048ef6fe0844c4a59bfc8932fcd4c44566ba25eed46501f94dd7cf3c7297da88f3f599ca056bfb77d0c2484aebc92f04239f69124 608 | languageName: node 609 | linkType: hard 610 | 611 | "arrify@npm:^3.0.0": 612 | version: 3.0.0 613 | resolution: "arrify@npm:3.0.0" 614 | checksum: 10c0/2e26601b8486f29780f1f70f7ac05a226755814c2a3ab42e196748f650af1dc310cd575a11dd4b9841c70fd7460b2dd2b8fe6fb7a3375878e2660706efafa58e 615 | languageName: node 616 | linkType: hard 617 | 618 | "async-sema@npm:^3.1.1": 619 | version: 3.1.1 620 | resolution: "async-sema@npm:3.1.1" 621 | checksum: 10c0/a16da9f7f2dbdd00a969bf264b7ad331b59df3eac2b38f529b881c5cc8662594e68ed096d927ec2aabdc13454379cdc6d677bcdb0a3d2db338fb4be17957832b 622 | languageName: node 623 | linkType: hard 624 | 625 | "ava@npm:^6.1.3": 626 | version: 6.1.3 627 | resolution: "ava@npm:6.1.3" 628 | dependencies: 629 | "@vercel/nft": "npm:^0.26.2" 630 | acorn: "npm:^8.11.3" 631 | acorn-walk: "npm:^8.3.2" 632 | ansi-styles: "npm:^6.2.1" 633 | arrgv: "npm:^1.0.2" 634 | arrify: "npm:^3.0.0" 635 | callsites: "npm:^4.1.0" 636 | cbor: "npm:^9.0.1" 637 | chalk: "npm:^5.3.0" 638 | chunkd: "npm:^2.0.1" 639 | ci-info: "npm:^4.0.0" 640 | ci-parallel-vars: "npm:^1.0.1" 641 | cli-truncate: "npm:^4.0.0" 642 | code-excerpt: "npm:^4.0.0" 643 | common-path-prefix: "npm:^3.0.0" 644 | concordance: "npm:^5.0.4" 645 | currently-unhandled: "npm:^0.4.1" 646 | debug: "npm:^4.3.4" 647 | emittery: "npm:^1.0.1" 648 | figures: "npm:^6.0.1" 649 | globby: "npm:^14.0.0" 650 | ignore-by-default: "npm:^2.1.0" 651 | indent-string: "npm:^5.0.0" 652 | is-plain-object: "npm:^5.0.0" 653 | is-promise: "npm:^4.0.0" 654 | matcher: "npm:^5.0.0" 655 | memoize: "npm:^10.0.0" 656 | ms: "npm:^2.1.3" 657 | p-map: "npm:^7.0.1" 658 | package-config: "npm:^5.0.0" 659 | picomatch: "npm:^3.0.1" 660 | plur: "npm:^5.1.0" 661 | pretty-ms: "npm:^9.0.0" 662 | resolve-cwd: "npm:^3.0.0" 663 | stack-utils: "npm:^2.0.6" 664 | strip-ansi: "npm:^7.1.0" 665 | supertap: "npm:^3.0.1" 666 | temp-dir: "npm:^3.0.0" 667 | write-file-atomic: "npm:^5.0.1" 668 | yargs: "npm:^17.7.2" 669 | peerDependencies: 670 | "@ava/typescript": "*" 671 | peerDependenciesMeta: 672 | "@ava/typescript": 673 | optional: true 674 | bin: 675 | ava: entrypoints/cli.mjs 676 | checksum: 10c0/108b28aceb0dfdb077bcf4c96109d736667999c2ce9f564489c4747482ea0e0c455d4d96fdfaad610b1125b74129b7b1d2ce570ec4903e767f6950d7f722f2cd 677 | languageName: node 678 | linkType: hard 679 | 680 | "balanced-match@npm:^1.0.0": 681 | version: 1.0.2 682 | resolution: "balanced-match@npm:1.0.2" 683 | checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee 684 | languageName: node 685 | linkType: hard 686 | 687 | "bindings@npm:^1.4.0": 688 | version: 1.5.0 689 | resolution: "bindings@npm:1.5.0" 690 | dependencies: 691 | file-uri-to-path: "npm:1.0.0" 692 | checksum: 10c0/3dab2491b4bb24124252a91e656803eac24292473e56554e35bbfe3cc1875332cfa77600c3bac7564049dc95075bf6fcc63a4609920ff2d64d0fe405fcf0d4ba 693 | languageName: node 694 | linkType: hard 695 | 696 | "blueimp-md5@npm:^2.10.0": 697 | version: 2.19.0 698 | resolution: "blueimp-md5@npm:2.19.0" 699 | checksum: 10c0/85d04343537dd99a288c62450341dcce7380d3454c81f8e5a971ddd80307d6f9ef51b5b92ad7d48aaaa92fd6d3a1f6b2f4fada068faae646887f7bfabc17a346 700 | languageName: node 701 | linkType: hard 702 | 703 | "brace-expansion@npm:^1.1.7": 704 | version: 1.1.11 705 | resolution: "brace-expansion@npm:1.1.11" 706 | dependencies: 707 | balanced-match: "npm:^1.0.0" 708 | concat-map: "npm:0.0.1" 709 | checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 710 | languageName: node 711 | linkType: hard 712 | 713 | "brace-expansion@npm:^2.0.1": 714 | version: 2.0.1 715 | resolution: "brace-expansion@npm:2.0.1" 716 | dependencies: 717 | balanced-match: "npm:^1.0.0" 718 | checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f 719 | languageName: node 720 | linkType: hard 721 | 722 | "braces@npm:^3.0.3": 723 | version: 3.0.3 724 | resolution: "braces@npm:3.0.3" 725 | dependencies: 726 | fill-range: "npm:^7.1.1" 727 | checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 728 | languageName: node 729 | linkType: hard 730 | 731 | "buffer-from@npm:^1.0.0": 732 | version: 1.1.2 733 | resolution: "buffer-from@npm:1.1.2" 734 | checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 735 | languageName: node 736 | linkType: hard 737 | 738 | "callsites@npm:^4.1.0": 739 | version: 4.2.0 740 | resolution: "callsites@npm:4.2.0" 741 | checksum: 10c0/8f7e269ec09fc0946bb22d838a8bc7932e1909ab4a833b964749f4d0e8bdeaa1f253287c4f911f61781f09620b6925ccd19a5ea4897489c4e59442c660c312a3 742 | languageName: node 743 | linkType: hard 744 | 745 | "cbor@npm:^9.0.1": 746 | version: 9.0.2 747 | resolution: "cbor@npm:9.0.2" 748 | dependencies: 749 | nofilter: "npm:^3.1.0" 750 | checksum: 10c0/709d4378067e663107b3d63a02d123a7b33e28946b4c5cc40c102f2f0ba13b072a79adc4369bb87a4e743399fce45deec30463fc84d363ab7cb39192d0fe5f30 751 | languageName: node 752 | linkType: hard 753 | 754 | "chalk@npm:^5.3.0, chalk@npm:~5.3.0": 755 | version: 5.3.0 756 | resolution: "chalk@npm:5.3.0" 757 | checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 758 | languageName: node 759 | linkType: hard 760 | 761 | "chownr@npm:^2.0.0": 762 | version: 2.0.0 763 | resolution: "chownr@npm:2.0.0" 764 | checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 765 | languageName: node 766 | linkType: hard 767 | 768 | "chunkd@npm:^2.0.1": 769 | version: 2.0.1 770 | resolution: "chunkd@npm:2.0.1" 771 | checksum: 10c0/4e0c5aac6048ecedfa4cd0a5f6c4f010c70a7b7645aeca7bfeb47cb0733c3463054f0ced3f2667b2e0e67edd75d68a8e05481b01115ba3f8a952a93026254504 772 | languageName: node 773 | linkType: hard 774 | 775 | "ci-info@npm:^4.0.0": 776 | version: 4.0.0 777 | resolution: "ci-info@npm:4.0.0" 778 | checksum: 10c0/ecc003e5b60580bd081d83dd61d398ddb8607537f916313e40af4667f9c92a1243bd8e8a591a5aa78e418afec245dbe8e90a0e26e39ca0825129a99b978dd3f9 779 | languageName: node 780 | linkType: hard 781 | 782 | "ci-parallel-vars@npm:^1.0.1": 783 | version: 1.0.1 784 | resolution: "ci-parallel-vars@npm:1.0.1" 785 | checksum: 10c0/80952f699cbbc146092b077b4f3e28d085620eb4e6be37f069b4dbb3db0ee70e8eec3beef4ebe70ff60631e9fc743b9d0869678489f167442cac08b260e5ac08 786 | languageName: node 787 | linkType: hard 788 | 789 | "cli-cursor@npm:^4.0.0": 790 | version: 4.0.0 791 | resolution: "cli-cursor@npm:4.0.0" 792 | dependencies: 793 | restore-cursor: "npm:^4.0.0" 794 | checksum: 10c0/e776e8c3c6727300d0539b0d25160b2bb56aed1a63942753ba1826b012f337a6f4b7ace3548402e4f2f13b5e16bfd751be672c44b203205e7eca8be94afec42c 795 | languageName: node 796 | linkType: hard 797 | 798 | "cli-truncate@npm:^4.0.0": 799 | version: 4.0.0 800 | resolution: "cli-truncate@npm:4.0.0" 801 | dependencies: 802 | slice-ansi: "npm:^5.0.0" 803 | string-width: "npm:^7.0.0" 804 | checksum: 10c0/d7f0b73e3d9b88cb496e6c086df7410b541b56a43d18ade6a573c9c18bd001b1c3fba1ad578f741a4218fdc794d042385f8ac02c25e1c295a2d8b9f3cb86eb4c 805 | languageName: node 806 | linkType: hard 807 | 808 | "cliui@npm:^8.0.1": 809 | version: 8.0.1 810 | resolution: "cliui@npm:8.0.1" 811 | dependencies: 812 | string-width: "npm:^4.2.0" 813 | strip-ansi: "npm:^6.0.1" 814 | wrap-ansi: "npm:^7.0.0" 815 | checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 816 | languageName: node 817 | linkType: hard 818 | 819 | "code-excerpt@npm:^4.0.0": 820 | version: 4.0.0 821 | resolution: "code-excerpt@npm:4.0.0" 822 | dependencies: 823 | convert-to-spaces: "npm:^2.0.1" 824 | checksum: 10c0/b6c5a06e039cecd2ab6a0e10ee0831de8362107d1f298ca3558b5f9004cb8e0260b02dd6c07f57b9a0e346c76864d2873311ee1989809fdeb05bd5fbbadde773 825 | languageName: node 826 | linkType: hard 827 | 828 | "color-convert@npm:^2.0.1": 829 | version: 2.0.1 830 | resolution: "color-convert@npm:2.0.1" 831 | dependencies: 832 | color-name: "npm:~1.1.4" 833 | checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 834 | languageName: node 835 | linkType: hard 836 | 837 | "color-name@npm:~1.1.4": 838 | version: 1.1.4 839 | resolution: "color-name@npm:1.1.4" 840 | checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 841 | languageName: node 842 | linkType: hard 843 | 844 | "color-support@npm:^1.1.2": 845 | version: 1.1.3 846 | resolution: "color-support@npm:1.1.3" 847 | bin: 848 | color-support: bin.js 849 | checksum: 10c0/8ffeaa270a784dc382f62d9be0a98581db43e11eee301af14734a6d089bd456478b1a8b3e7db7ca7dc5b18a75f828f775c44074020b51c05fc00e6d0992b1cc6 850 | languageName: node 851 | linkType: hard 852 | 853 | "colorette@npm:^2.0.20": 854 | version: 2.0.20 855 | resolution: "colorette@npm:2.0.20" 856 | checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 857 | languageName: node 858 | linkType: hard 859 | 860 | "commander@npm:~12.1.0": 861 | version: 12.1.0 862 | resolution: "commander@npm:12.1.0" 863 | checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 864 | languageName: node 865 | linkType: hard 866 | 867 | "common-path-prefix@npm:^3.0.0": 868 | version: 3.0.0 869 | resolution: "common-path-prefix@npm:3.0.0" 870 | checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb 871 | languageName: node 872 | linkType: hard 873 | 874 | "concat-map@npm:0.0.1": 875 | version: 0.0.1 876 | resolution: "concat-map@npm:0.0.1" 877 | checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f 878 | languageName: node 879 | linkType: hard 880 | 881 | "concordance@npm:^5.0.4": 882 | version: 5.0.4 883 | resolution: "concordance@npm:5.0.4" 884 | dependencies: 885 | date-time: "npm:^3.1.0" 886 | esutils: "npm:^2.0.3" 887 | fast-diff: "npm:^1.2.0" 888 | js-string-escape: "npm:^1.0.1" 889 | lodash: "npm:^4.17.15" 890 | md5-hex: "npm:^3.0.1" 891 | semver: "npm:^7.3.2" 892 | well-known-symbols: "npm:^2.0.0" 893 | checksum: 10c0/59b440f330df3a7c9aa148ba588b3e99aed86acab225b4f01ffcea34ace4cf11f817e31153254e8f38ed48508998dad40b9106951a743c334d751f7ab21afb8a 894 | languageName: node 895 | linkType: hard 896 | 897 | "console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": 898 | version: 1.1.0 899 | resolution: "console-control-strings@npm:1.1.0" 900 | checksum: 10c0/7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 901 | languageName: node 902 | linkType: hard 903 | 904 | "convert-to-spaces@npm:^2.0.1": 905 | version: 2.0.1 906 | resolution: "convert-to-spaces@npm:2.0.1" 907 | checksum: 10c0/d90aa0e3b6a27f9d5265a8d32def3c5c855b3e823a9db1f26d772f8146d6b91020a2fdfd905ce8048a73fad3aaf836fef8188c67602c374405e2ae8396c4ac46 908 | languageName: node 909 | linkType: hard 910 | 911 | "cross-spawn@npm:^7.0.3": 912 | version: 7.0.3 913 | resolution: "cross-spawn@npm:7.0.3" 914 | dependencies: 915 | path-key: "npm:^3.1.0" 916 | shebang-command: "npm:^2.0.0" 917 | which: "npm:^2.0.1" 918 | checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 919 | languageName: node 920 | linkType: hard 921 | 922 | "currently-unhandled@npm:^0.4.1": 923 | version: 0.4.1 924 | resolution: "currently-unhandled@npm:0.4.1" 925 | dependencies: 926 | array-find-index: "npm:^1.0.1" 927 | checksum: 10c0/32d197689ec32f035910202c1abb0dc6424dce01d7b51779c685119b380d98535c110ffff67a262fc7e367612a7dfd30d3d3055f9a6634b5a9dd1302de7ef11c 928 | languageName: node 929 | linkType: hard 930 | 931 | "date-time@npm:^3.1.0": 932 | version: 3.1.0 933 | resolution: "date-time@npm:3.1.0" 934 | dependencies: 935 | time-zone: "npm:^1.0.0" 936 | checksum: 10c0/aa3e2e930d74b0b9e90f69de7a16d3376e30f21f1f4ce9a2311d8fec32d760e776efea752dafad0ce188187265235229013036202be053fc2d7979813bfb6ded 937 | languageName: node 938 | linkType: hard 939 | 940 | "debug@npm:4, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:~4.3.4": 941 | version: 4.3.5 942 | resolution: "debug@npm:4.3.5" 943 | dependencies: 944 | ms: "npm:2.1.2" 945 | peerDependenciesMeta: 946 | supports-color: 947 | optional: true 948 | checksum: 10c0/082c375a2bdc4f4469c99f325ff458adad62a3fc2c482d59923c260cb08152f34e2659f72b3767db8bb2f21ca81a60a42d1019605a412132d7b9f59363a005cc 949 | languageName: node 950 | linkType: hard 951 | 952 | "delegates@npm:^1.0.0": 953 | version: 1.0.0 954 | resolution: "delegates@npm:1.0.0" 955 | checksum: 10c0/ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5 956 | languageName: node 957 | linkType: hard 958 | 959 | "detect-libc@npm:^2.0.0": 960 | version: 2.0.3 961 | resolution: "detect-libc@npm:2.0.3" 962 | checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 963 | languageName: node 964 | linkType: hard 965 | 966 | "emittery@npm:^1.0.1": 967 | version: 1.0.3 968 | resolution: "emittery@npm:1.0.3" 969 | checksum: 10c0/91605d044f3891dd1f8ab731aeb94b520488b21e707f7064dcbcf5303bac3b4e7133dfa23c343ede1fc970340bd78a9b1aed522b805bc15104606bba630dd71e 970 | languageName: node 971 | linkType: hard 972 | 973 | "emoji-regex@npm:^10.3.0": 974 | version: 10.3.0 975 | resolution: "emoji-regex@npm:10.3.0" 976 | checksum: 10c0/b4838e8dcdceb44cf47f59abe352c25ff4fe7857acaf5fb51097c427f6f75b44d052eb907a7a3b86f86bc4eae3a93f5c2b7460abe79c407307e6212d65c91163 977 | languageName: node 978 | linkType: hard 979 | 980 | "emoji-regex@npm:^8.0.0": 981 | version: 8.0.0 982 | resolution: "emoji-regex@npm:8.0.0" 983 | checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 984 | languageName: node 985 | linkType: hard 986 | 987 | "escalade@npm:^3.1.1": 988 | version: 3.1.2 989 | resolution: "escalade@npm:3.1.2" 990 | checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 991 | languageName: node 992 | linkType: hard 993 | 994 | "escape-string-regexp@npm:^2.0.0": 995 | version: 2.0.0 996 | resolution: "escape-string-regexp@npm:2.0.0" 997 | checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 998 | languageName: node 999 | linkType: hard 1000 | 1001 | "escape-string-regexp@npm:^5.0.0": 1002 | version: 5.0.0 1003 | resolution: "escape-string-regexp@npm:5.0.0" 1004 | checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 1005 | languageName: node 1006 | linkType: hard 1007 | 1008 | "esprima@npm:^4.0.0": 1009 | version: 4.0.1 1010 | resolution: "esprima@npm:4.0.1" 1011 | bin: 1012 | esparse: ./bin/esparse.js 1013 | esvalidate: ./bin/esvalidate.js 1014 | checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 1015 | languageName: node 1016 | linkType: hard 1017 | 1018 | "estree-walker@npm:2.0.2, estree-walker@npm:^2.0.1": 1019 | version: 2.0.2 1020 | resolution: "estree-walker@npm:2.0.2" 1021 | checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af 1022 | languageName: node 1023 | linkType: hard 1024 | 1025 | "esutils@npm:^2.0.3": 1026 | version: 2.0.3 1027 | resolution: "esutils@npm:2.0.3" 1028 | checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 1029 | languageName: node 1030 | linkType: hard 1031 | 1032 | "eventemitter3@npm:^5.0.1": 1033 | version: 5.0.1 1034 | resolution: "eventemitter3@npm:5.0.1" 1035 | checksum: 10c0/4ba5c00c506e6c786b4d6262cfbce90ddc14c10d4667e5c83ae993c9de88aa856033994dd2b35b83e8dc1170e224e66a319fa80adc4c32adcd2379bbc75da814 1036 | languageName: node 1037 | linkType: hard 1038 | 1039 | "execa@npm:~8.0.1": 1040 | version: 8.0.1 1041 | resolution: "execa@npm:8.0.1" 1042 | dependencies: 1043 | cross-spawn: "npm:^7.0.3" 1044 | get-stream: "npm:^8.0.1" 1045 | human-signals: "npm:^5.0.0" 1046 | is-stream: "npm:^3.0.0" 1047 | merge-stream: "npm:^2.0.0" 1048 | npm-run-path: "npm:^5.1.0" 1049 | onetime: "npm:^6.0.0" 1050 | signal-exit: "npm:^4.1.0" 1051 | strip-final-newline: "npm:^3.0.0" 1052 | checksum: 10c0/2c52d8775f5bf103ce8eec9c7ab3059909ba350a5164744e9947ed14a53f51687c040a250bda833f906d1283aa8803975b84e6c8f7a7c42f99dc8ef80250d1af 1053 | languageName: node 1054 | linkType: hard 1055 | 1056 | "fast-diff@npm:^1.2.0": 1057 | version: 1.3.0 1058 | resolution: "fast-diff@npm:1.3.0" 1059 | checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 1060 | languageName: node 1061 | linkType: hard 1062 | 1063 | "fast-glob@npm:^3.3.2": 1064 | version: 3.3.2 1065 | resolution: "fast-glob@npm:3.3.2" 1066 | dependencies: 1067 | "@nodelib/fs.stat": "npm:^2.0.2" 1068 | "@nodelib/fs.walk": "npm:^1.2.3" 1069 | glob-parent: "npm:^5.1.2" 1070 | merge2: "npm:^1.3.0" 1071 | micromatch: "npm:^4.0.4" 1072 | checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 1073 | languageName: node 1074 | linkType: hard 1075 | 1076 | "fastq@npm:^1.6.0": 1077 | version: 1.17.1 1078 | resolution: "fastq@npm:1.17.1" 1079 | dependencies: 1080 | reusify: "npm:^1.0.4" 1081 | checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 1082 | languageName: node 1083 | linkType: hard 1084 | 1085 | "figures@npm:^6.0.1": 1086 | version: 6.1.0 1087 | resolution: "figures@npm:6.1.0" 1088 | dependencies: 1089 | is-unicode-supported: "npm:^2.0.0" 1090 | checksum: 10c0/9159df4264d62ef447a3931537de92f5012210cf5135c35c010df50a2169377581378149abfe1eb238bd6acbba1c0d547b1f18e0af6eee49e30363cedaffcfe4 1091 | languageName: node 1092 | linkType: hard 1093 | 1094 | "file-uri-to-path@npm:1.0.0": 1095 | version: 1.0.0 1096 | resolution: "file-uri-to-path@npm:1.0.0" 1097 | checksum: 10c0/3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519 1098 | languageName: node 1099 | linkType: hard 1100 | 1101 | "fill-range@npm:^7.1.1": 1102 | version: 7.1.1 1103 | resolution: "fill-range@npm:7.1.1" 1104 | dependencies: 1105 | to-regex-range: "npm:^5.0.1" 1106 | checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 1107 | languageName: node 1108 | linkType: hard 1109 | 1110 | "find-up-simple@npm:^1.0.0": 1111 | version: 1.0.0 1112 | resolution: "find-up-simple@npm:1.0.0" 1113 | checksum: 10c0/de1ad5e55c8c162f5600fe3297bb55a3da5cd9cb8c6755e463ec1d52c4c15a84e312a68397fb5962d13263b3dbd4ea294668c465ccacc41291d7cc97588769f9 1114 | languageName: node 1115 | linkType: hard 1116 | 1117 | "fs-minipass@npm:^2.0.0": 1118 | version: 2.1.0 1119 | resolution: "fs-minipass@npm:2.1.0" 1120 | dependencies: 1121 | minipass: "npm:^3.0.0" 1122 | checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 1123 | languageName: node 1124 | linkType: hard 1125 | 1126 | "fs.realpath@npm:^1.0.0": 1127 | version: 1.0.0 1128 | resolution: "fs.realpath@npm:1.0.0" 1129 | checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 1130 | languageName: node 1131 | linkType: hard 1132 | 1133 | "gauge@npm:^3.0.0": 1134 | version: 3.0.2 1135 | resolution: "gauge@npm:3.0.2" 1136 | dependencies: 1137 | aproba: "npm:^1.0.3 || ^2.0.0" 1138 | color-support: "npm:^1.1.2" 1139 | console-control-strings: "npm:^1.0.0" 1140 | has-unicode: "npm:^2.0.1" 1141 | object-assign: "npm:^4.1.1" 1142 | signal-exit: "npm:^3.0.0" 1143 | string-width: "npm:^4.2.3" 1144 | strip-ansi: "npm:^6.0.1" 1145 | wide-align: "npm:^1.1.2" 1146 | checksum: 10c0/75230ccaf216471e31025c7d5fcea1629596ca20792de50c596eb18ffb14d8404f927cd55535aab2eeecd18d1e11bd6f23ec3c2e9878d2dda1dc74bccc34b913 1147 | languageName: node 1148 | linkType: hard 1149 | 1150 | "get-caller-file@npm:^2.0.5": 1151 | version: 2.0.5 1152 | resolution: "get-caller-file@npm:2.0.5" 1153 | checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde 1154 | languageName: node 1155 | linkType: hard 1156 | 1157 | "get-east-asian-width@npm:^1.0.0": 1158 | version: 1.2.0 1159 | resolution: "get-east-asian-width@npm:1.2.0" 1160 | checksum: 10c0/914b1e217cf38436c24b4c60b4c45289e39a45bf9e65ef9fd343c2815a1a02b8a0215aeec8bf9c07c516089004b6e3826332481f40a09529fcadbf6e579f286b 1161 | languageName: node 1162 | linkType: hard 1163 | 1164 | "get-stream@npm:^8.0.1": 1165 | version: 8.0.1 1166 | resolution: "get-stream@npm:8.0.1" 1167 | checksum: 10c0/5c2181e98202b9dae0bb4a849979291043e5892eb40312b47f0c22b9414fc9b28a3b6063d2375705eb24abc41ecf97894d9a51f64ff021511b504477b27b4290 1168 | languageName: node 1169 | linkType: hard 1170 | 1171 | "glob-parent@npm:^5.1.2": 1172 | version: 5.1.2 1173 | resolution: "glob-parent@npm:5.1.2" 1174 | dependencies: 1175 | is-glob: "npm:^4.0.1" 1176 | checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee 1177 | languageName: node 1178 | linkType: hard 1179 | 1180 | "glob@npm:^7.1.3": 1181 | version: 7.2.3 1182 | resolution: "glob@npm:7.2.3" 1183 | dependencies: 1184 | fs.realpath: "npm:^1.0.0" 1185 | inflight: "npm:^1.0.4" 1186 | inherits: "npm:2" 1187 | minimatch: "npm:^3.1.1" 1188 | once: "npm:^1.3.0" 1189 | path-is-absolute: "npm:^1.0.0" 1190 | checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe 1191 | languageName: node 1192 | linkType: hard 1193 | 1194 | "globby@npm:^14.0.0": 1195 | version: 14.0.2 1196 | resolution: "globby@npm:14.0.2" 1197 | dependencies: 1198 | "@sindresorhus/merge-streams": "npm:^2.1.0" 1199 | fast-glob: "npm:^3.3.2" 1200 | ignore: "npm:^5.2.4" 1201 | path-type: "npm:^5.0.0" 1202 | slash: "npm:^5.1.0" 1203 | unicorn-magic: "npm:^0.1.0" 1204 | checksum: 10c0/3f771cd683b8794db1e7ebc8b6b888d43496d93a82aad4e9d974620f578581210b6c5a6e75ea29573ed16a1345222fab6e9b877a8d1ed56eeb147e09f69c6f78 1205 | languageName: node 1206 | linkType: hard 1207 | 1208 | "graceful-fs@npm:^4.2.9": 1209 | version: 4.2.11 1210 | resolution: "graceful-fs@npm:4.2.11" 1211 | checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 1212 | languageName: node 1213 | linkType: hard 1214 | 1215 | "has-unicode@npm:^2.0.1": 1216 | version: 2.0.1 1217 | resolution: "has-unicode@npm:2.0.1" 1218 | checksum: 10c0/ebdb2f4895c26bb08a8a100b62d362e49b2190bcfd84b76bc4be1a3bd4d254ec52d0dd9f2fbcc093fc5eb878b20c52146f9dfd33e2686ed28982187be593b47c 1219 | languageName: node 1220 | linkType: hard 1221 | 1222 | "https-proxy-agent@npm:^5.0.0": 1223 | version: 5.0.1 1224 | resolution: "https-proxy-agent@npm:5.0.1" 1225 | dependencies: 1226 | agent-base: "npm:6" 1227 | debug: "npm:4" 1228 | checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 1229 | languageName: node 1230 | linkType: hard 1231 | 1232 | "human-signals@npm:^5.0.0": 1233 | version: 5.0.0 1234 | resolution: "human-signals@npm:5.0.0" 1235 | checksum: 10c0/5a9359073fe17a8b58e5a085e9a39a950366d9f00217c4ff5878bd312e09d80f460536ea6a3f260b5943a01fe55c158d1cea3fc7bee3d0520aeef04f6d915c82 1236 | languageName: node 1237 | linkType: hard 1238 | 1239 | "husky@npm:^9.0.11": 1240 | version: 9.0.11 1241 | resolution: "husky@npm:9.0.11" 1242 | bin: 1243 | husky: bin.mjs 1244 | checksum: 10c0/2c787dcf74a837fc9a4fea7da907509d4bd9a289f4ea10ecc9d86279e4d4542b0f5f6443a619bccae19e265f2677172cc2b86aae5c932a35a330cc227d914605 1245 | languageName: node 1246 | linkType: hard 1247 | 1248 | "ignore-by-default@npm:^2.1.0": 1249 | version: 2.1.0 1250 | resolution: "ignore-by-default@npm:2.1.0" 1251 | checksum: 10c0/3a6040dac25ed9da39dee73bf1634fdd1e15b0eb7cf52a6bdec81c310565782d8811c104ce40acb3d690d61c5fc38a91c78e6baee830a8a2232424dbc6b66981 1252 | languageName: node 1253 | linkType: hard 1254 | 1255 | "ignore@npm:^5.2.4": 1256 | version: 5.3.1 1257 | resolution: "ignore@npm:5.3.1" 1258 | checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd 1259 | languageName: node 1260 | linkType: hard 1261 | 1262 | "imurmurhash@npm:^0.1.4": 1263 | version: 0.1.4 1264 | resolution: "imurmurhash@npm:0.1.4" 1265 | checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 1266 | languageName: node 1267 | linkType: hard 1268 | 1269 | "indent-string@npm:^5.0.0": 1270 | version: 5.0.0 1271 | resolution: "indent-string@npm:5.0.0" 1272 | checksum: 10c0/8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 1273 | languageName: node 1274 | linkType: hard 1275 | 1276 | "inflight@npm:^1.0.4": 1277 | version: 1.0.6 1278 | resolution: "inflight@npm:1.0.6" 1279 | dependencies: 1280 | once: "npm:^1.3.0" 1281 | wrappy: "npm:1" 1282 | checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 1283 | languageName: node 1284 | linkType: hard 1285 | 1286 | "inherits@npm:2, inherits@npm:^2.0.3": 1287 | version: 2.0.4 1288 | resolution: "inherits@npm:2.0.4" 1289 | checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 1290 | languageName: node 1291 | linkType: hard 1292 | 1293 | "irregular-plurals@npm:^3.3.0": 1294 | version: 3.5.0 1295 | resolution: "irregular-plurals@npm:3.5.0" 1296 | checksum: 10c0/7c033bbe7325e5a6e0a26949cc6863b6ce273403d4cd5b93bd99b33fecb6605b0884097c4259c23ed0c52c2133bf7d1cdcdd7a0630e8c325161fe269b3447918 1297 | languageName: node 1298 | linkType: hard 1299 | 1300 | "is-extglob@npm:^2.1.1": 1301 | version: 2.1.1 1302 | resolution: "is-extglob@npm:2.1.1" 1303 | checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 1304 | languageName: node 1305 | linkType: hard 1306 | 1307 | "is-fullwidth-code-point@npm:^3.0.0": 1308 | version: 3.0.0 1309 | resolution: "is-fullwidth-code-point@npm:3.0.0" 1310 | checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc 1311 | languageName: node 1312 | linkType: hard 1313 | 1314 | "is-fullwidth-code-point@npm:^4.0.0": 1315 | version: 4.0.0 1316 | resolution: "is-fullwidth-code-point@npm:4.0.0" 1317 | checksum: 10c0/df2a717e813567db0f659c306d61f2f804d480752526886954a2a3e2246c7745fd07a52b5fecf2b68caf0a6c79dcdace6166fdf29cc76ed9975cc334f0a018b8 1318 | languageName: node 1319 | linkType: hard 1320 | 1321 | "is-fullwidth-code-point@npm:^5.0.0": 1322 | version: 5.0.0 1323 | resolution: "is-fullwidth-code-point@npm:5.0.0" 1324 | dependencies: 1325 | get-east-asian-width: "npm:^1.0.0" 1326 | checksum: 10c0/cd591b27d43d76b05fa65ed03eddce57a16e1eca0b7797ff7255de97019bcaf0219acfc0c4f7af13319e13541f2a53c0ace476f442b13267b9a6a7568f2b65c8 1327 | languageName: node 1328 | linkType: hard 1329 | 1330 | "is-glob@npm:^4.0.1": 1331 | version: 4.0.3 1332 | resolution: "is-glob@npm:4.0.3" 1333 | dependencies: 1334 | is-extglob: "npm:^2.1.1" 1335 | checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a 1336 | languageName: node 1337 | linkType: hard 1338 | 1339 | "is-number@npm:^7.0.0": 1340 | version: 7.0.0 1341 | resolution: "is-number@npm:7.0.0" 1342 | checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 1343 | languageName: node 1344 | linkType: hard 1345 | 1346 | "is-plain-object@npm:^5.0.0": 1347 | version: 5.0.0 1348 | resolution: "is-plain-object@npm:5.0.0" 1349 | checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c 1350 | languageName: node 1351 | linkType: hard 1352 | 1353 | "is-promise@npm:^4.0.0": 1354 | version: 4.0.0 1355 | resolution: "is-promise@npm:4.0.0" 1356 | checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 1357 | languageName: node 1358 | linkType: hard 1359 | 1360 | "is-stream@npm:^3.0.0": 1361 | version: 3.0.0 1362 | resolution: "is-stream@npm:3.0.0" 1363 | checksum: 10c0/eb2f7127af02ee9aa2a0237b730e47ac2de0d4e76a4a905a50a11557f2339df5765eaea4ceb8029f1efa978586abe776908720bfcb1900c20c6ec5145f6f29d8 1364 | languageName: node 1365 | linkType: hard 1366 | 1367 | "is-unicode-supported@npm:^2.0.0": 1368 | version: 2.0.0 1369 | resolution: "is-unicode-supported@npm:2.0.0" 1370 | checksum: 10c0/3013dfb8265fe9f9a0d1e9433fc4e766595631a8d85d60876c457b4bedc066768dab1477c553d02e2f626d88a4e019162706e04263c94d74994ef636a33b5f94 1371 | languageName: node 1372 | linkType: hard 1373 | 1374 | "isexe@npm:^2.0.0": 1375 | version: 2.0.0 1376 | resolution: "isexe@npm:2.0.0" 1377 | checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d 1378 | languageName: node 1379 | linkType: hard 1380 | 1381 | "js-string-escape@npm:^1.0.1": 1382 | version: 1.0.1 1383 | resolution: "js-string-escape@npm:1.0.1" 1384 | checksum: 10c0/2c33b9ff1ba6b84681c51ca0997e7d5a1639813c95d5b61cb7ad47e55cc28fa4a0b1935c3d218710d8e6bcee5d0cd8c44755231e3a4e45fc604534d9595a3628 1385 | languageName: node 1386 | linkType: hard 1387 | 1388 | "js-yaml@npm:^3.14.1": 1389 | version: 3.14.1 1390 | resolution: "js-yaml@npm:3.14.1" 1391 | dependencies: 1392 | argparse: "npm:^1.0.7" 1393 | esprima: "npm:^4.0.0" 1394 | bin: 1395 | js-yaml: bin/js-yaml.js 1396 | checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b 1397 | languageName: node 1398 | linkType: hard 1399 | 1400 | "json-parse-even-better-errors@npm:^3.0.0": 1401 | version: 3.0.2 1402 | resolution: "json-parse-even-better-errors@npm:3.0.2" 1403 | checksum: 10c0/147f12b005768abe9fab78d2521ce2b7e1381a118413d634a40e6d907d7d10f5e9a05e47141e96d6853af7cc36d2c834d0a014251be48791e037ff2f13d2b94b 1404 | languageName: node 1405 | linkType: hard 1406 | 1407 | "lilconfig@npm:~3.1.1": 1408 | version: 3.1.2 1409 | resolution: "lilconfig@npm:3.1.2" 1410 | checksum: 10c0/f059630b1a9bddaeba83059db00c672b64dc14074e9f232adce32b38ca1b5686ab737eb665c5ba3c32f147f0002b4bee7311ad0386a9b98547b5623e87071fbe 1411 | languageName: node 1412 | linkType: hard 1413 | 1414 | "lint-staged@npm:^15.2.7": 1415 | version: 15.2.7 1416 | resolution: "lint-staged@npm:15.2.7" 1417 | dependencies: 1418 | chalk: "npm:~5.3.0" 1419 | commander: "npm:~12.1.0" 1420 | debug: "npm:~4.3.4" 1421 | execa: "npm:~8.0.1" 1422 | lilconfig: "npm:~3.1.1" 1423 | listr2: "npm:~8.2.1" 1424 | micromatch: "npm:~4.0.7" 1425 | pidtree: "npm:~0.6.0" 1426 | string-argv: "npm:~0.3.2" 1427 | yaml: "npm:~2.4.2" 1428 | bin: 1429 | lint-staged: bin/lint-staged.js 1430 | checksum: 10c0/c14399f9782ae222a1748144254f24b5b9afc816dc8840bd02d50f523c6582796ff18410767eb1a73cf1a83bc6e492dea7b1c4f0912bf3e434c068221f13c878 1431 | languageName: node 1432 | linkType: hard 1433 | 1434 | "listr2@npm:~8.2.1": 1435 | version: 8.2.3 1436 | resolution: "listr2@npm:8.2.3" 1437 | dependencies: 1438 | cli-truncate: "npm:^4.0.0" 1439 | colorette: "npm:^2.0.20" 1440 | eventemitter3: "npm:^5.0.1" 1441 | log-update: "npm:^6.0.0" 1442 | rfdc: "npm:^1.4.1" 1443 | wrap-ansi: "npm:^9.0.0" 1444 | checksum: 10c0/44404ecfcb49719538b39aceaa1c7f5a61e6ed88456769c8c876bfc326fc69c26c88cc1cc81ea6cc8341f5ca14ed56558b65263f3ec4d396e83ff02ee8a69508 1445 | languageName: node 1446 | linkType: hard 1447 | 1448 | "load-json-file@npm:^7.0.1": 1449 | version: 7.0.1 1450 | resolution: "load-json-file@npm:7.0.1" 1451 | checksum: 10c0/7117459608a0b6329c7f78e6e1f541b3162dd901c29dd5af721fec8b270177d2e3d7999c971f344fff04daac368d052732e2c7146014bc84d15e0b636975e19a 1452 | languageName: node 1453 | linkType: hard 1454 | 1455 | "lodash@npm:^4.17.15": 1456 | version: 4.17.21 1457 | resolution: "lodash@npm:4.17.21" 1458 | checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c 1459 | languageName: node 1460 | linkType: hard 1461 | 1462 | "log-update@npm:^6.0.0": 1463 | version: 6.0.0 1464 | resolution: "log-update@npm:6.0.0" 1465 | dependencies: 1466 | ansi-escapes: "npm:^6.2.0" 1467 | cli-cursor: "npm:^4.0.0" 1468 | slice-ansi: "npm:^7.0.0" 1469 | strip-ansi: "npm:^7.1.0" 1470 | wrap-ansi: "npm:^9.0.0" 1471 | checksum: 10c0/e0b3c3401ef49ce3eb17e2f83d644765e4f7988498fc1344eaa4f31ab30e510dcc469a7fb64dc01bd1c8d9237d917598fa677a9818705fb3774c10f6e9d4b27c 1472 | languageName: node 1473 | linkType: hard 1474 | 1475 | "make-dir@npm:^3.1.0": 1476 | version: 3.1.0 1477 | resolution: "make-dir@npm:3.1.0" 1478 | dependencies: 1479 | semver: "npm:^6.0.0" 1480 | checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa 1481 | languageName: node 1482 | linkType: hard 1483 | 1484 | "matcher@npm:^5.0.0": 1485 | version: 5.0.0 1486 | resolution: "matcher@npm:5.0.0" 1487 | dependencies: 1488 | escape-string-regexp: "npm:^5.0.0" 1489 | checksum: 10c0/eda5471fc9d5b7264d63c81727824adc3585ddb5cfdc5fce5a9b7c86f946ff181610735d330b1c37a84811df872d1290bf4e9401d2be2a414204343701144b18 1490 | languageName: node 1491 | linkType: hard 1492 | 1493 | "md5-hex@npm:^3.0.1": 1494 | version: 3.0.1 1495 | resolution: "md5-hex@npm:3.0.1" 1496 | dependencies: 1497 | blueimp-md5: "npm:^2.10.0" 1498 | checksum: 10c0/ee2b4d8da16b527b3a3fe4d7a96720f43afd07b46a82d49421208b5a126235fb75cfb30b80d4029514772c8844273f940bddfbf4155c787f968f3be4060d01e4 1499 | languageName: node 1500 | linkType: hard 1501 | 1502 | "memoize@npm:^10.0.0": 1503 | version: 10.0.0 1504 | resolution: "memoize@npm:10.0.0" 1505 | dependencies: 1506 | mimic-function: "npm:^5.0.0" 1507 | checksum: 10c0/1584351834564be66b21d47b7afe495851f622669ad49e2f4fa4f35d5633471b93176cf602130a95f71fa0aee65a20179817ffac2dd11fa354aa19a8109a14e8 1508 | languageName: node 1509 | linkType: hard 1510 | 1511 | "memorystream@npm:^0.3.1": 1512 | version: 0.3.1 1513 | resolution: "memorystream@npm:0.3.1" 1514 | checksum: 10c0/4bd164657711d9747ff5edb0508b2944414da3464b7fe21ac5c67cf35bba975c4b446a0124bd0f9a8be54cfc18faf92e92bd77563a20328b1ccf2ff04e9f39b9 1515 | languageName: node 1516 | linkType: hard 1517 | 1518 | "merge-stream@npm:^2.0.0": 1519 | version: 2.0.0 1520 | resolution: "merge-stream@npm:2.0.0" 1521 | checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 1522 | languageName: node 1523 | linkType: hard 1524 | 1525 | "merge2@npm:^1.3.0": 1526 | version: 1.4.1 1527 | resolution: "merge2@npm:1.4.1" 1528 | checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb 1529 | languageName: node 1530 | linkType: hard 1531 | 1532 | "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:~4.0.7": 1533 | version: 4.0.8 1534 | resolution: "micromatch@npm:4.0.8" 1535 | dependencies: 1536 | braces: "npm:^3.0.3" 1537 | picomatch: "npm:^2.3.1" 1538 | checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 1539 | languageName: node 1540 | linkType: hard 1541 | 1542 | "mimic-fn@npm:^2.1.0": 1543 | version: 2.1.0 1544 | resolution: "mimic-fn@npm:2.1.0" 1545 | checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 1546 | languageName: node 1547 | linkType: hard 1548 | 1549 | "mimic-fn@npm:^4.0.0": 1550 | version: 4.0.0 1551 | resolution: "mimic-fn@npm:4.0.0" 1552 | checksum: 10c0/de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf 1553 | languageName: node 1554 | linkType: hard 1555 | 1556 | "mimic-function@npm:^5.0.0": 1557 | version: 5.0.1 1558 | resolution: "mimic-function@npm:5.0.1" 1559 | checksum: 10c0/f3d9464dd1816ecf6bdf2aec6ba32c0728022039d992f178237d8e289b48764fee4131319e72eedd4f7f094e22ded0af836c3187a7edc4595d28dd74368fd81d 1560 | languageName: node 1561 | linkType: hard 1562 | 1563 | "minimatch@npm:^3.1.1": 1564 | version: 3.1.2 1565 | resolution: "minimatch@npm:3.1.2" 1566 | dependencies: 1567 | brace-expansion: "npm:^1.1.7" 1568 | checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 1569 | languageName: node 1570 | linkType: hard 1571 | 1572 | "minimatch@npm:^9.0.0": 1573 | version: 9.0.5 1574 | resolution: "minimatch@npm:9.0.5" 1575 | dependencies: 1576 | brace-expansion: "npm:^2.0.1" 1577 | checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed 1578 | languageName: node 1579 | linkType: hard 1580 | 1581 | "minipass@npm:^3.0.0": 1582 | version: 3.3.6 1583 | resolution: "minipass@npm:3.3.6" 1584 | dependencies: 1585 | yallist: "npm:^4.0.0" 1586 | checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c 1587 | languageName: node 1588 | linkType: hard 1589 | 1590 | "minipass@npm:^5.0.0": 1591 | version: 5.0.0 1592 | resolution: "minipass@npm:5.0.0" 1593 | checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 1594 | languageName: node 1595 | linkType: hard 1596 | 1597 | "minizlib@npm:^2.1.1": 1598 | version: 2.1.2 1599 | resolution: "minizlib@npm:2.1.2" 1600 | dependencies: 1601 | minipass: "npm:^3.0.0" 1602 | yallist: "npm:^4.0.0" 1603 | checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 1604 | languageName: node 1605 | linkType: hard 1606 | 1607 | "mkdirp@npm:^1.0.3": 1608 | version: 1.0.4 1609 | resolution: "mkdirp@npm:1.0.4" 1610 | bin: 1611 | mkdirp: bin/cmd.js 1612 | checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf 1613 | languageName: node 1614 | linkType: hard 1615 | 1616 | "ms@npm:2.1.2": 1617 | version: 2.1.2 1618 | resolution: "ms@npm:2.1.2" 1619 | checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc 1620 | languageName: node 1621 | linkType: hard 1622 | 1623 | "ms@npm:^2.1.3": 1624 | version: 2.1.3 1625 | resolution: "ms@npm:2.1.3" 1626 | checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 1627 | languageName: node 1628 | linkType: hard 1629 | 1630 | "node-fetch@npm:^2.6.7": 1631 | version: 2.7.0 1632 | resolution: "node-fetch@npm:2.7.0" 1633 | dependencies: 1634 | whatwg-url: "npm:^5.0.0" 1635 | peerDependencies: 1636 | encoding: ^0.1.0 1637 | peerDependenciesMeta: 1638 | encoding: 1639 | optional: true 1640 | checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 1641 | languageName: node 1642 | linkType: hard 1643 | 1644 | "node-gyp-build@npm:^4.2.2": 1645 | version: 4.8.1 1646 | resolution: "node-gyp-build@npm:4.8.1" 1647 | bin: 1648 | node-gyp-build: bin.js 1649 | node-gyp-build-optional: optional.js 1650 | node-gyp-build-test: build-test.js 1651 | checksum: 10c0/e36ca3d2adf2b9cca316695d7687207c19ac6ed326d6d7c68d7112cebe0de4f82d6733dff139132539fcc01cf5761f6c9082a21864ab9172edf84282bc849ce7 1652 | languageName: node 1653 | linkType: hard 1654 | 1655 | "nodeia@npm:^0.0.1": 1656 | version: 0.0.1 1657 | resolution: "nodeia@npm:0.0.1" 1658 | dependencies: 1659 | ws: "npm:^8.17.0" 1660 | checksum: 10c0/8c414e267a817025bd11b33312613b3b2bbd1bc654302b917ec631664d456e20ed9be94c8601d6849705536ba650a91c384fb531f3841ba2feddf846cc62ebe9 1661 | languageName: node 1662 | linkType: hard 1663 | 1664 | "nofilter@npm:^3.1.0": 1665 | version: 3.1.0 1666 | resolution: "nofilter@npm:3.1.0" 1667 | checksum: 10c0/92459f3864a067b347032263f0b536223cbfc98153913b5dce350cb39c8470bc1813366e41993f22c33cc6400c0f392aa324a4b51e24c22040635c1cdb046499 1668 | languageName: node 1669 | linkType: hard 1670 | 1671 | "nopt@npm:^5.0.0": 1672 | version: 5.0.0 1673 | resolution: "nopt@npm:5.0.0" 1674 | dependencies: 1675 | abbrev: "npm:1" 1676 | bin: 1677 | nopt: bin/nopt.js 1678 | checksum: 10c0/fc5c4f07155cb455bf5fc3dd149fac421c1a40fd83c6bfe83aa82b52f02c17c5e88301321318adaa27611c8a6811423d51d29deaceab5fa158b585a61a551061 1679 | languageName: node 1680 | linkType: hard 1681 | 1682 | "npm-normalize-package-bin@npm:^3.0.0": 1683 | version: 3.0.1 1684 | resolution: "npm-normalize-package-bin@npm:3.0.1" 1685 | checksum: 10c0/f1831a7f12622840e1375c785c3dab7b1d82dd521211c17ee5e9610cd1a34d8b232d3fdeebf50c170eddcb321d2c644bf73dbe35545da7d588c6b3fa488db0a5 1686 | languageName: node 1687 | linkType: hard 1688 | 1689 | "npm-run-all2@npm:^6.2.2": 1690 | version: 6.2.2 1691 | resolution: "npm-run-all2@npm:6.2.2" 1692 | dependencies: 1693 | ansi-styles: "npm:^6.2.1" 1694 | cross-spawn: "npm:^7.0.3" 1695 | memorystream: "npm:^0.3.1" 1696 | minimatch: "npm:^9.0.0" 1697 | pidtree: "npm:^0.6.0" 1698 | read-package-json-fast: "npm:^3.0.2" 1699 | shell-quote: "npm:^1.7.3" 1700 | bin: 1701 | npm-run-all: bin/npm-run-all/index.js 1702 | npm-run-all2: bin/npm-run-all/index.js 1703 | run-p: bin/run-p/index.js 1704 | run-s: bin/run-s/index.js 1705 | checksum: 10c0/b32984a1fb6b495415258f88f87269b4049c19a73a1d6e2b13e0dd36dd311a5a4d945c9fd1cc356eb10811febaa03cf1c85d04dc43decd4ab1d590b625918440 1706 | languageName: node 1707 | linkType: hard 1708 | 1709 | "npm-run-path@npm:^5.1.0": 1710 | version: 5.3.0 1711 | resolution: "npm-run-path@npm:5.3.0" 1712 | dependencies: 1713 | path-key: "npm:^4.0.0" 1714 | checksum: 10c0/124df74820c40c2eb9a8612a254ea1d557ddfab1581c3e751f825e3e366d9f00b0d76a3c94ecd8398e7f3eee193018622677e95816e8491f0797b21e30b2deba 1715 | languageName: node 1716 | linkType: hard 1717 | 1718 | "npmlog@npm:^5.0.1": 1719 | version: 5.0.1 1720 | resolution: "npmlog@npm:5.0.1" 1721 | dependencies: 1722 | are-we-there-yet: "npm:^2.0.0" 1723 | console-control-strings: "npm:^1.1.0" 1724 | gauge: "npm:^3.0.0" 1725 | set-blocking: "npm:^2.0.0" 1726 | checksum: 10c0/489ba519031013001135c463406f55491a17fc7da295c18a04937fe3a4d523fd65e88dd418a28b967ab743d913fdeba1e29838ce0ad8c75557057c481f7d49fa 1727 | languageName: node 1728 | linkType: hard 1729 | 1730 | "object-assign@npm:^4.1.1": 1731 | version: 4.1.1 1732 | resolution: "object-assign@npm:4.1.1" 1733 | checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 1734 | languageName: node 1735 | linkType: hard 1736 | 1737 | "once@npm:^1.3.0": 1738 | version: 1.4.0 1739 | resolution: "once@npm:1.4.0" 1740 | dependencies: 1741 | wrappy: "npm:1" 1742 | checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 1743 | languageName: node 1744 | linkType: hard 1745 | 1746 | "onetime@npm:^5.1.0": 1747 | version: 5.1.2 1748 | resolution: "onetime@npm:5.1.2" 1749 | dependencies: 1750 | mimic-fn: "npm:^2.1.0" 1751 | checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f 1752 | languageName: node 1753 | linkType: hard 1754 | 1755 | "onetime@npm:^6.0.0": 1756 | version: 6.0.0 1757 | resolution: "onetime@npm:6.0.0" 1758 | dependencies: 1759 | mimic-fn: "npm:^4.0.0" 1760 | checksum: 10c0/4eef7c6abfef697dd4479345a4100c382d73c149d2d56170a54a07418c50816937ad09500e1ed1e79d235989d073a9bade8557122aee24f0576ecde0f392bb6c 1761 | languageName: node 1762 | linkType: hard 1763 | 1764 | "oxc-resolver@npm:^1.10.0": 1765 | version: 1.10.0 1766 | resolution: "oxc-resolver@npm:1.10.0" 1767 | dependencies: 1768 | "@oxc-resolver/binding-darwin-arm64": "npm:1.10.0" 1769 | "@oxc-resolver/binding-darwin-x64": "npm:1.10.0" 1770 | "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:1.10.0" 1771 | "@oxc-resolver/binding-linux-arm64-gnu": "npm:1.10.0" 1772 | "@oxc-resolver/binding-linux-arm64-musl": "npm:1.10.0" 1773 | "@oxc-resolver/binding-linux-x64-gnu": "npm:1.10.0" 1774 | "@oxc-resolver/binding-linux-x64-musl": "npm:1.10.0" 1775 | "@oxc-resolver/binding-wasm32-wasi": "npm:1.10.0" 1776 | "@oxc-resolver/binding-win32-arm64-msvc": "npm:1.10.0" 1777 | "@oxc-resolver/binding-win32-x64-msvc": "npm:1.10.0" 1778 | dependenciesMeta: 1779 | "@oxc-resolver/binding-darwin-arm64": 1780 | optional: true 1781 | "@oxc-resolver/binding-darwin-x64": 1782 | optional: true 1783 | "@oxc-resolver/binding-linux-arm-gnueabihf": 1784 | optional: true 1785 | "@oxc-resolver/binding-linux-arm64-gnu": 1786 | optional: true 1787 | "@oxc-resolver/binding-linux-arm64-musl": 1788 | optional: true 1789 | "@oxc-resolver/binding-linux-x64-gnu": 1790 | optional: true 1791 | "@oxc-resolver/binding-linux-x64-musl": 1792 | optional: true 1793 | "@oxc-resolver/binding-wasm32-wasi": 1794 | optional: true 1795 | "@oxc-resolver/binding-win32-arm64-msvc": 1796 | optional: true 1797 | "@oxc-resolver/binding-win32-x64-msvc": 1798 | optional: true 1799 | checksum: 10c0/154fa92fb51cf54af2f736ac1f3e2e30907c192470b23e8489f938cb00b676e18502b49bd26ca54be5d2fbbc2485788fa69b26c2cebf2c7b398135cea302854e 1800 | languageName: node 1801 | linkType: hard 1802 | 1803 | "oxlint@npm:^0.9.0": 1804 | version: 0.9.0 1805 | resolution: "oxlint@npm:0.9.0" 1806 | dependencies: 1807 | "@oxlint/darwin-arm64": "npm:0.9.0" 1808 | "@oxlint/darwin-x64": "npm:0.9.0" 1809 | "@oxlint/linux-arm64-gnu": "npm:0.9.0" 1810 | "@oxlint/linux-arm64-musl": "npm:0.9.0" 1811 | "@oxlint/linux-x64-gnu": "npm:0.9.0" 1812 | "@oxlint/linux-x64-musl": "npm:0.9.0" 1813 | "@oxlint/win32-arm64": "npm:0.9.0" 1814 | "@oxlint/win32-x64": "npm:0.9.0" 1815 | dependenciesMeta: 1816 | "@oxlint/darwin-arm64": 1817 | optional: true 1818 | "@oxlint/darwin-x64": 1819 | optional: true 1820 | "@oxlint/linux-arm64-gnu": 1821 | optional: true 1822 | "@oxlint/linux-arm64-musl": 1823 | optional: true 1824 | "@oxlint/linux-x64-gnu": 1825 | optional: true 1826 | "@oxlint/linux-x64-musl": 1827 | optional: true 1828 | "@oxlint/win32-arm64": 1829 | optional: true 1830 | "@oxlint/win32-x64": 1831 | optional: true 1832 | bin: 1833 | oxlint: bin/oxlint 1834 | checksum: 10c0/0e679bd185728bec8fc2c893f0e56ff6795c576aa8c8ca0bd1a55409db1c460287d7c57b70deb1714100c66b39519881b71abccfc998361093eb22aa4c3cdbc5 1835 | languageName: node 1836 | linkType: hard 1837 | 1838 | "p-map@npm:^7.0.1": 1839 | version: 7.0.2 1840 | resolution: "p-map@npm:7.0.2" 1841 | checksum: 10c0/e10548036648d1c043153f9997112fe5a7de54a319210238628f8ea22ee36587fd6ee740811f88b60bbf29d932e23ae35df7fced40df477116c84c18e797047e 1842 | languageName: node 1843 | linkType: hard 1844 | 1845 | "package-config@npm:^5.0.0": 1846 | version: 5.0.0 1847 | resolution: "package-config@npm:5.0.0" 1848 | dependencies: 1849 | find-up-simple: "npm:^1.0.0" 1850 | load-json-file: "npm:^7.0.1" 1851 | checksum: 10c0/f6c48930700b73a41d839bf2898b628d23665827488a4f34aed2d05e4a99d7a70a70ada115c3546765947fbc8accff94c0779da21ea084b25df47cb774531eeb 1852 | languageName: node 1853 | linkType: hard 1854 | 1855 | "parse-ms@npm:^4.0.0": 1856 | version: 4.0.0 1857 | resolution: "parse-ms@npm:4.0.0" 1858 | checksum: 10c0/a7900f4f1ebac24cbf5e9708c16fb2fd482517fad353aecd7aefb8c2ba2f85ce017913ccb8925d231770404780df46244ea6fec598b3bde6490882358b4d2d16 1859 | languageName: node 1860 | linkType: hard 1861 | 1862 | "path-is-absolute@npm:^1.0.0": 1863 | version: 1.0.1 1864 | resolution: "path-is-absolute@npm:1.0.1" 1865 | checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 1866 | languageName: node 1867 | linkType: hard 1868 | 1869 | "path-key@npm:^3.1.0": 1870 | version: 3.1.1 1871 | resolution: "path-key@npm:3.1.1" 1872 | checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c 1873 | languageName: node 1874 | linkType: hard 1875 | 1876 | "path-key@npm:^4.0.0": 1877 | version: 4.0.0 1878 | resolution: "path-key@npm:4.0.0" 1879 | checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 1880 | languageName: node 1881 | linkType: hard 1882 | 1883 | "path-type@npm:^5.0.0": 1884 | version: 5.0.0 1885 | resolution: "path-type@npm:5.0.0" 1886 | checksum: 10c0/e8f4b15111bf483900c75609e5e74e3fcb79f2ddb73e41470028fcd3e4b5162ec65da9907be077ee5012c18801ff7fffb35f9f37a077f3f81d85a0b7d6578efd 1887 | languageName: node 1888 | linkType: hard 1889 | 1890 | "picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": 1891 | version: 2.3.1 1892 | resolution: "picomatch@npm:2.3.1" 1893 | checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be 1894 | languageName: node 1895 | linkType: hard 1896 | 1897 | "picomatch@npm:^3.0.1": 1898 | version: 3.0.1 1899 | resolution: "picomatch@npm:3.0.1" 1900 | checksum: 10c0/70ec738569f1864658378b7abdab8939d15dae0718c1df994eae3346fd33daf6a3c1ff4e0c1a0cd1e2c0319130985b63a2cff34d192f2f2acbb78aca76111736 1901 | languageName: node 1902 | linkType: hard 1903 | 1904 | "pidtree@npm:^0.6.0, pidtree@npm:~0.6.0": 1905 | version: 0.6.0 1906 | resolution: "pidtree@npm:0.6.0" 1907 | bin: 1908 | pidtree: bin/pidtree.js 1909 | checksum: 10c0/0829ec4e9209e230f74ebf4265f5ccc9ebfb488334b525cb13f86ff801dca44b362c41252cd43ae4d7653a10a5c6ab3be39d2c79064d6895e0d78dc50a5ed6e9 1910 | languageName: node 1911 | linkType: hard 1912 | 1913 | "pirates@npm:^4.0.6": 1914 | version: 4.0.6 1915 | resolution: "pirates@npm:4.0.6" 1916 | checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 1917 | languageName: node 1918 | linkType: hard 1919 | 1920 | "plur@npm:^5.1.0": 1921 | version: 5.1.0 1922 | resolution: "plur@npm:5.1.0" 1923 | dependencies: 1924 | irregular-plurals: "npm:^3.3.0" 1925 | checksum: 10c0/26bb622b8545fcfd47bbf56fbcca66c08693708a232e403fa3589e00003c56c14231ac57c7588ca5db83ef4be1f61383402c4ea954000768f779f8aef6eb6da8 1926 | languageName: node 1927 | linkType: hard 1928 | 1929 | "prettier@npm:^3.3.3": 1930 | version: 3.3.3 1931 | resolution: "prettier@npm:3.3.3" 1932 | bin: 1933 | prettier: bin/prettier.cjs 1934 | checksum: 10c0/b85828b08e7505716324e4245549b9205c0cacb25342a030ba8885aba2039a115dbcf75a0b7ca3b37bc9d101ee61fab8113fc69ca3359f2a226f1ecc07ad2e26 1935 | languageName: node 1936 | linkType: hard 1937 | 1938 | "pretty-ms@npm:^9.0.0": 1939 | version: 9.0.0 1940 | resolution: "pretty-ms@npm:9.0.0" 1941 | dependencies: 1942 | parse-ms: "npm:^4.0.0" 1943 | checksum: 10c0/ba4a2acd1fe92a1c629e5cdeb555d7fa344ae9920e20fa00e8ac1db61b8d3dff8638ffc70c7569f681e375df68c9f31291c2c1912cefd02ef1b1bdd0861a4aed 1944 | languageName: node 1945 | linkType: hard 1946 | 1947 | "queue-microtask@npm:^1.2.2": 1948 | version: 1.2.3 1949 | resolution: "queue-microtask@npm:1.2.3" 1950 | checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 1951 | languageName: node 1952 | linkType: hard 1953 | 1954 | "read-package-json-fast@npm:^3.0.2": 1955 | version: 3.0.2 1956 | resolution: "read-package-json-fast@npm:3.0.2" 1957 | dependencies: 1958 | json-parse-even-better-errors: "npm:^3.0.0" 1959 | npm-normalize-package-bin: "npm:^3.0.0" 1960 | checksum: 10c0/37787e075f0260a92be0428687d9020eecad7ece3bda37461c2219e50d1ec183ab6ba1d9ada193691435dfe119a42c8a5b5b5463f08c8ddbc3d330800b265318 1961 | languageName: node 1962 | linkType: hard 1963 | 1964 | "readable-stream@npm:^3.6.0": 1965 | version: 3.6.2 1966 | resolution: "readable-stream@npm:3.6.2" 1967 | dependencies: 1968 | inherits: "npm:^2.0.3" 1969 | string_decoder: "npm:^1.1.1" 1970 | util-deprecate: "npm:^1.0.1" 1971 | checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 1972 | languageName: node 1973 | linkType: hard 1974 | 1975 | "require-directory@npm:^2.1.1": 1976 | version: 2.1.1 1977 | resolution: "require-directory@npm:2.1.1" 1978 | checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 1979 | languageName: node 1980 | linkType: hard 1981 | 1982 | "resolve-cwd@npm:^3.0.0": 1983 | version: 3.0.0 1984 | resolution: "resolve-cwd@npm:3.0.0" 1985 | dependencies: 1986 | resolve-from: "npm:^5.0.0" 1987 | checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 1988 | languageName: node 1989 | linkType: hard 1990 | 1991 | "resolve-from@npm:^5.0.0": 1992 | version: 5.0.0 1993 | resolution: "resolve-from@npm:5.0.0" 1994 | checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 1995 | languageName: node 1996 | linkType: hard 1997 | 1998 | "restore-cursor@npm:^4.0.0": 1999 | version: 4.0.0 2000 | resolution: "restore-cursor@npm:4.0.0" 2001 | dependencies: 2002 | onetime: "npm:^5.1.0" 2003 | signal-exit: "npm:^3.0.2" 2004 | checksum: 10c0/6f7da8c5e422ac26aa38354870b1afac09963572cf2879443540449068cb43476e9cbccf6f8de3e0171e0d6f7f533c2bc1a0a008003c9a525bbc098e89041318 2005 | languageName: node 2006 | linkType: hard 2007 | 2008 | "reusify@npm:^1.0.4": 2009 | version: 1.0.4 2010 | resolution: "reusify@npm:1.0.4" 2011 | checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 2012 | languageName: node 2013 | linkType: hard 2014 | 2015 | "rfdc@npm:^1.4.1": 2016 | version: 1.4.1 2017 | resolution: "rfdc@npm:1.4.1" 2018 | checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 2019 | languageName: node 2020 | linkType: hard 2021 | 2022 | "rimraf@npm:^3.0.2": 2023 | version: 3.0.2 2024 | resolution: "rimraf@npm:3.0.2" 2025 | dependencies: 2026 | glob: "npm:^7.1.3" 2027 | bin: 2028 | rimraf: bin.js 2029 | checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 2030 | languageName: node 2031 | linkType: hard 2032 | 2033 | "run-parallel@npm:^1.1.9": 2034 | version: 1.2.0 2035 | resolution: "run-parallel@npm:1.2.0" 2036 | dependencies: 2037 | queue-microtask: "npm:^1.2.2" 2038 | checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 2039 | languageName: node 2040 | linkType: hard 2041 | 2042 | "safe-buffer@npm:~5.2.0": 2043 | version: 5.2.1 2044 | resolution: "safe-buffer@npm:5.2.1" 2045 | checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 2046 | languageName: node 2047 | linkType: hard 2048 | 2049 | "semver@npm:^6.0.0": 2050 | version: 6.3.1 2051 | resolution: "semver@npm:6.3.1" 2052 | bin: 2053 | semver: bin/semver.js 2054 | checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d 2055 | languageName: node 2056 | linkType: hard 2057 | 2058 | "semver@npm:^7.3.2, semver@npm:^7.3.5": 2059 | version: 7.6.2 2060 | resolution: "semver@npm:7.6.2" 2061 | bin: 2062 | semver: bin/semver.js 2063 | checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c 2064 | languageName: node 2065 | linkType: hard 2066 | 2067 | "serialize-error@npm:^7.0.1": 2068 | version: 7.0.1 2069 | resolution: "serialize-error@npm:7.0.1" 2070 | dependencies: 2071 | type-fest: "npm:^0.13.1" 2072 | checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 2073 | languageName: node 2074 | linkType: hard 2075 | 2076 | "set-blocking@npm:^2.0.0": 2077 | version: 2.0.0 2078 | resolution: "set-blocking@npm:2.0.0" 2079 | checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 2080 | languageName: node 2081 | linkType: hard 2082 | 2083 | "shebang-command@npm:^2.0.0": 2084 | version: 2.0.0 2085 | resolution: "shebang-command@npm:2.0.0" 2086 | dependencies: 2087 | shebang-regex: "npm:^3.0.0" 2088 | checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e 2089 | languageName: node 2090 | linkType: hard 2091 | 2092 | "shebang-regex@npm:^3.0.0": 2093 | version: 3.0.0 2094 | resolution: "shebang-regex@npm:3.0.0" 2095 | checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 2096 | languageName: node 2097 | linkType: hard 2098 | 2099 | "shell-quote@npm:^1.7.3": 2100 | version: 1.8.1 2101 | resolution: "shell-quote@npm:1.8.1" 2102 | checksum: 10c0/8cec6fd827bad74d0a49347057d40dfea1e01f12a6123bf82c4649f3ef152fc2bc6d6176e6376bffcd205d9d0ccb4f1f9acae889384d20baff92186f01ea455a 2103 | languageName: node 2104 | linkType: hard 2105 | 2106 | "signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2": 2107 | version: 3.0.7 2108 | resolution: "signal-exit@npm:3.0.7" 2109 | checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 2110 | languageName: node 2111 | linkType: hard 2112 | 2113 | "signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": 2114 | version: 4.1.0 2115 | resolution: "signal-exit@npm:4.1.0" 2116 | checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 2117 | languageName: node 2118 | linkType: hard 2119 | 2120 | "slash@npm:^5.1.0": 2121 | version: 5.1.0 2122 | resolution: "slash@npm:5.1.0" 2123 | checksum: 10c0/eb48b815caf0bdc390d0519d41b9e0556a14380f6799c72ba35caf03544d501d18befdeeef074bc9c052acf69654bc9e0d79d7f1de0866284137a40805299eb3 2124 | languageName: node 2125 | linkType: hard 2126 | 2127 | "slice-ansi@npm:^5.0.0": 2128 | version: 5.0.0 2129 | resolution: "slice-ansi@npm:5.0.0" 2130 | dependencies: 2131 | ansi-styles: "npm:^6.0.0" 2132 | is-fullwidth-code-point: "npm:^4.0.0" 2133 | checksum: 10c0/2d4d40b2a9d5cf4e8caae3f698fe24ae31a4d778701724f578e984dcb485ec8c49f0c04dab59c401821e80fcdfe89cace9c66693b0244e40ec485d72e543914f 2134 | languageName: node 2135 | linkType: hard 2136 | 2137 | "slice-ansi@npm:^7.0.0": 2138 | version: 7.1.0 2139 | resolution: "slice-ansi@npm:7.1.0" 2140 | dependencies: 2141 | ansi-styles: "npm:^6.2.1" 2142 | is-fullwidth-code-point: "npm:^5.0.0" 2143 | checksum: 10c0/631c971d4abf56cf880f034d43fcc44ff883624867bf11ecbd538c47343911d734a4656d7bc02362b40b89d765652a7f935595441e519b59e2ad3f4d5d6fe7ca 2144 | languageName: node 2145 | linkType: hard 2146 | 2147 | "source-map-support@npm:^0.5.21": 2148 | version: 0.5.21 2149 | resolution: "source-map-support@npm:0.5.21" 2150 | dependencies: 2151 | buffer-from: "npm:^1.0.0" 2152 | source-map: "npm:^0.6.0" 2153 | checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d 2154 | languageName: node 2155 | linkType: hard 2156 | 2157 | "source-map@npm:^0.6.0": 2158 | version: 0.6.1 2159 | resolution: "source-map@npm:0.6.1" 2160 | checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 2161 | languageName: node 2162 | linkType: hard 2163 | 2164 | "sprintf-js@npm:~1.0.2": 2165 | version: 1.0.3 2166 | resolution: "sprintf-js@npm:1.0.3" 2167 | checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb 2168 | languageName: node 2169 | linkType: hard 2170 | 2171 | "stack-utils@npm:^2.0.6": 2172 | version: 2.0.6 2173 | resolution: "stack-utils@npm:2.0.6" 2174 | dependencies: 2175 | escape-string-regexp: "npm:^2.0.0" 2176 | checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a 2177 | languageName: node 2178 | linkType: hard 2179 | 2180 | "string-argv@npm:~0.3.2": 2181 | version: 0.3.2 2182 | resolution: "string-argv@npm:0.3.2" 2183 | checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 2184 | languageName: node 2185 | linkType: hard 2186 | 2187 | "string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": 2188 | version: 4.2.3 2189 | resolution: "string-width@npm:4.2.3" 2190 | dependencies: 2191 | emoji-regex: "npm:^8.0.0" 2192 | is-fullwidth-code-point: "npm:^3.0.0" 2193 | strip-ansi: "npm:^6.0.1" 2194 | checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b 2195 | languageName: node 2196 | linkType: hard 2197 | 2198 | "string-width@npm:^7.0.0": 2199 | version: 7.2.0 2200 | resolution: "string-width@npm:7.2.0" 2201 | dependencies: 2202 | emoji-regex: "npm:^10.3.0" 2203 | get-east-asian-width: "npm:^1.0.0" 2204 | strip-ansi: "npm:^7.1.0" 2205 | checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 2206 | languageName: node 2207 | linkType: hard 2208 | 2209 | "string_decoder@npm:^1.1.1": 2210 | version: 1.3.0 2211 | resolution: "string_decoder@npm:1.3.0" 2212 | dependencies: 2213 | safe-buffer: "npm:~5.2.0" 2214 | checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d 2215 | languageName: node 2216 | linkType: hard 2217 | 2218 | "strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": 2219 | version: 6.0.1 2220 | resolution: "strip-ansi@npm:6.0.1" 2221 | dependencies: 2222 | ansi-regex: "npm:^5.0.1" 2223 | checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 2224 | languageName: node 2225 | linkType: hard 2226 | 2227 | "strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": 2228 | version: 7.1.0 2229 | resolution: "strip-ansi@npm:7.1.0" 2230 | dependencies: 2231 | ansi-regex: "npm:^6.0.1" 2232 | checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 2233 | languageName: node 2234 | linkType: hard 2235 | 2236 | "strip-final-newline@npm:^3.0.0": 2237 | version: 3.0.0 2238 | resolution: "strip-final-newline@npm:3.0.0" 2239 | checksum: 10c0/a771a17901427bac6293fd416db7577e2bc1c34a19d38351e9d5478c3c415f523f391003b42ed475f27e33a78233035df183525395f731d3bfb8cdcbd4da08ce 2240 | languageName: node 2241 | linkType: hard 2242 | 2243 | "supertap@npm:^3.0.1": 2244 | version: 3.0.1 2245 | resolution: "supertap@npm:3.0.1" 2246 | dependencies: 2247 | indent-string: "npm:^5.0.0" 2248 | js-yaml: "npm:^3.14.1" 2249 | serialize-error: "npm:^7.0.1" 2250 | strip-ansi: "npm:^7.0.1" 2251 | checksum: 10c0/8164674f2e280cab875f0fef5bb36c15553c13e29697ff92f4e0d6bc62149f0303a89eee47535413ed145ea72e14a24d065bab233059d48a499ec5ebb4566b0f 2252 | languageName: node 2253 | linkType: hard 2254 | 2255 | "tar@npm:^6.1.11": 2256 | version: 6.2.1 2257 | resolution: "tar@npm:6.2.1" 2258 | dependencies: 2259 | chownr: "npm:^2.0.0" 2260 | fs-minipass: "npm:^2.0.0" 2261 | minipass: "npm:^5.0.0" 2262 | minizlib: "npm:^2.1.1" 2263 | mkdirp: "npm:^1.0.3" 2264 | yallist: "npm:^4.0.0" 2265 | checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 2266 | languageName: node 2267 | linkType: hard 2268 | 2269 | "temp-dir@npm:^3.0.0": 2270 | version: 3.0.0 2271 | resolution: "temp-dir@npm:3.0.0" 2272 | checksum: 10c0/a86978a400984cd5f315b77ebf3fe53bb58c61f192278cafcb1f3fb32d584a21dc8e08b93171d7874b7cc972234d3455c467306cc1bfc4524b622e5ad3bfd671 2273 | languageName: node 2274 | linkType: hard 2275 | 2276 | "time-zone@npm:^1.0.0": 2277 | version: 1.0.0 2278 | resolution: "time-zone@npm:1.0.0" 2279 | checksum: 10c0/d00ebd885039109011b6e2423ebbf225160927333c2ade6d833e9cc4676db20759f1f3855fafde00d1bd668c243a6aa68938ce71fe58aab0d514e820d59c1d81 2280 | languageName: node 2281 | linkType: hard 2282 | 2283 | "tinybench@npm:^2.8.0": 2284 | version: 2.8.0 2285 | resolution: "tinybench@npm:2.8.0" 2286 | checksum: 10c0/5a9a642351fa3e4955e0cbf38f5674be5f3ba6730fd872fd23a5c953ad6c914234d5aba6ea41ef88820180a81829ceece5bd8d3967c490c5171bca1141c2f24d 2287 | languageName: node 2288 | linkType: hard 2289 | 2290 | "to-regex-range@npm:^5.0.1": 2291 | version: 5.0.1 2292 | resolution: "to-regex-range@npm:5.0.1" 2293 | dependencies: 2294 | is-number: "npm:^7.0.0" 2295 | checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 2296 | languageName: node 2297 | linkType: hard 2298 | 2299 | "tr46@npm:~0.0.3": 2300 | version: 0.0.3 2301 | resolution: "tr46@npm:0.0.3" 2302 | checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 2303 | languageName: node 2304 | linkType: hard 2305 | 2306 | "tslib@npm:^2.4.0, tslib@npm:^2.6.3": 2307 | version: 2.6.3 2308 | resolution: "tslib@npm:2.6.3" 2309 | checksum: 10c0/2598aef53d9dbe711af75522464b2104724d6467b26a60f2bdac8297d2b5f1f6b86a71f61717384aa8fd897240467aaa7bcc36a0700a0faf751293d1331db39a 2310 | languageName: node 2311 | linkType: hard 2312 | 2313 | "type-fest@npm:^0.13.1": 2314 | version: 0.13.1 2315 | resolution: "type-fest@npm:0.13.1" 2316 | checksum: 10c0/0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b 2317 | languageName: node 2318 | linkType: hard 2319 | 2320 | "typescript@npm:^5.5.3": 2321 | version: 5.6.3 2322 | resolution: "typescript@npm:5.6.3" 2323 | bin: 2324 | tsc: bin/tsc 2325 | tsserver: bin/tsserver 2326 | checksum: 10c0/44f61d3fb15c35359bc60399cb8127c30bae554cd555b8e2b46d68fa79d680354b83320ad419ff1b81a0bdf324197b29affe6cc28988cd6a74d4ac60c94f9799 2327 | languageName: node 2328 | linkType: hard 2329 | 2330 | "typescript@patch:typescript@npm%3A^5.5.3#optional!builtin": 2331 | version: 5.6.3 2332 | resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=8c6c40" 2333 | bin: 2334 | tsc: bin/tsc 2335 | tsserver: bin/tsserver 2336 | checksum: 10c0/7c9d2e07c81226d60435939618c91ec2ff0b75fbfa106eec3430f0fcf93a584bc6c73176676f532d78c3594fe28a54b36eb40b3d75593071a7ec91301533ace7 2337 | languageName: node 2338 | linkType: hard 2339 | 2340 | "undici-types@npm:~6.19.2": 2341 | version: 6.19.8 2342 | resolution: "undici-types@npm:6.19.8" 2343 | checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 2344 | languageName: node 2345 | linkType: hard 2346 | 2347 | "unicorn-magic@npm:^0.1.0": 2348 | version: 0.1.0 2349 | resolution: "unicorn-magic@npm:0.1.0" 2350 | checksum: 10c0/e4ed0de05b0a05e735c7d8a2930881e5efcfc3ec897204d5d33e7e6247f4c31eac92e383a15d9a6bccb7319b4271ee4bea946e211bf14951fec6ff2cbbb66a92 2351 | languageName: node 2352 | linkType: hard 2353 | 2354 | "util-deprecate@npm:^1.0.1": 2355 | version: 1.0.2 2356 | resolution: "util-deprecate@npm:1.0.2" 2357 | checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 2358 | languageName: node 2359 | linkType: hard 2360 | 2361 | "webidl-conversions@npm:^3.0.0": 2362 | version: 3.0.1 2363 | resolution: "webidl-conversions@npm:3.0.1" 2364 | checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db 2365 | languageName: node 2366 | linkType: hard 2367 | 2368 | "well-known-symbols@npm:^2.0.0": 2369 | version: 2.0.0 2370 | resolution: "well-known-symbols@npm:2.0.0" 2371 | checksum: 10c0/cb6c12e98877e8952ec28d13ae6f4fdb54ae1cb49b16a728720276dadd76c930e6cb0e174af3a4620054dd2752546f842540122920c6e31410208abd4958ee6b 2372 | languageName: node 2373 | linkType: hard 2374 | 2375 | "whatwg-url@npm:^5.0.0": 2376 | version: 5.0.0 2377 | resolution: "whatwg-url@npm:5.0.0" 2378 | dependencies: 2379 | tr46: "npm:~0.0.3" 2380 | webidl-conversions: "npm:^3.0.0" 2381 | checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 2382 | languageName: node 2383 | linkType: hard 2384 | 2385 | "which@npm:^2.0.1": 2386 | version: 2.0.2 2387 | resolution: "which@npm:2.0.2" 2388 | dependencies: 2389 | isexe: "npm:^2.0.0" 2390 | bin: 2391 | node-which: ./bin/node-which 2392 | checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f 2393 | languageName: node 2394 | linkType: hard 2395 | 2396 | "wide-align@npm:^1.1.2": 2397 | version: 1.1.5 2398 | resolution: "wide-align@npm:1.1.5" 2399 | dependencies: 2400 | string-width: "npm:^1.0.2 || 2 || 3 || 4" 2401 | checksum: 10c0/1d9c2a3e36dfb09832f38e2e699c367ef190f96b82c71f809bc0822c306f5379df87bab47bed27ea99106d86447e50eb972d3c516c2f95782807a9d082fbea95 2402 | languageName: node 2403 | linkType: hard 2404 | 2405 | "wrap-ansi@npm:^7.0.0": 2406 | version: 7.0.0 2407 | resolution: "wrap-ansi@npm:7.0.0" 2408 | dependencies: 2409 | ansi-styles: "npm:^4.0.0" 2410 | string-width: "npm:^4.1.0" 2411 | strip-ansi: "npm:^6.0.0" 2412 | checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da 2413 | languageName: node 2414 | linkType: hard 2415 | 2416 | "wrap-ansi@npm:^9.0.0": 2417 | version: 9.0.0 2418 | resolution: "wrap-ansi@npm:9.0.0" 2419 | dependencies: 2420 | ansi-styles: "npm:^6.2.1" 2421 | string-width: "npm:^7.0.0" 2422 | strip-ansi: "npm:^7.1.0" 2423 | checksum: 10c0/a139b818da9573677548dd463bd626a5a5286271211eb6e4e82f34a4f643191d74e6d4a9bb0a3c26ec90e6f904f679e0569674ac099ea12378a8b98e20706066 2424 | languageName: node 2425 | linkType: hard 2426 | 2427 | "wrappy@npm:1": 2428 | version: 1.0.2 2429 | resolution: "wrappy@npm:1.0.2" 2430 | checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 2431 | languageName: node 2432 | linkType: hard 2433 | 2434 | "write-file-atomic@npm:^5.0.1": 2435 | version: 5.0.1 2436 | resolution: "write-file-atomic@npm:5.0.1" 2437 | dependencies: 2438 | imurmurhash: "npm:^0.1.4" 2439 | signal-exit: "npm:^4.0.1" 2440 | checksum: 10c0/e8c850a8e3e74eeadadb8ad23c9d9d63e4e792bd10f4836ed74189ef6e996763959f1249c5650e232f3c77c11169d239cbfc8342fc70f3fe401407d23810505d 2441 | languageName: node 2442 | linkType: hard 2443 | 2444 | "ws@npm:^8.17.0": 2445 | version: 8.18.0 2446 | resolution: "ws@npm:8.18.0" 2447 | peerDependencies: 2448 | bufferutil: ^4.0.1 2449 | utf-8-validate: ">=5.0.2" 2450 | peerDependenciesMeta: 2451 | bufferutil: 2452 | optional: true 2453 | utf-8-validate: 2454 | optional: true 2455 | checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 2456 | languageName: node 2457 | linkType: hard 2458 | 2459 | "y18n@npm:^5.0.5": 2460 | version: 5.0.8 2461 | resolution: "y18n@npm:5.0.8" 2462 | checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 2463 | languageName: node 2464 | linkType: hard 2465 | 2466 | "yallist@npm:^4.0.0": 2467 | version: 4.0.0 2468 | resolution: "yallist@npm:4.0.0" 2469 | checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a 2470 | languageName: node 2471 | linkType: hard 2472 | 2473 | "yaml@npm:~2.4.2": 2474 | version: 2.4.5 2475 | resolution: "yaml@npm:2.4.5" 2476 | bin: 2477 | yaml: bin.mjs 2478 | checksum: 10c0/e1ee78b381e5c710f715cc4082fd10fc82f7f5c92bd6f075771d20559e175616f56abf1c411f545ea0e9e16e4f84a83a50b42764af5f16ec006328ba9476bb31 2479 | languageName: node 2480 | linkType: hard 2481 | 2482 | "yargs-parser@npm:^21.1.1": 2483 | version: 21.1.1 2484 | resolution: "yargs-parser@npm:21.1.1" 2485 | checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 2486 | languageName: node 2487 | linkType: hard 2488 | 2489 | "yargs@npm:^17.7.2": 2490 | version: 17.7.2 2491 | resolution: "yargs@npm:17.7.2" 2492 | dependencies: 2493 | cliui: "npm:^8.0.1" 2494 | escalade: "npm:^3.1.1" 2495 | get-caller-file: "npm:^2.0.5" 2496 | require-directory: "npm:^2.1.1" 2497 | string-width: "npm:^4.2.3" 2498 | y18n: "npm:^5.0.5" 2499 | yargs-parser: "npm:^21.1.1" 2500 | checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 2501 | languageName: node 2502 | linkType: hard 2503 | --------------------------------------------------------------------------------