diff --git a/.cargo/config b/.cargo/config deleted file mode 100644 index eaa0fee..0000000 --- a/.cargo/config +++ /dev/null @@ -1,5 +0,0 @@ -# These command aliases are not final, may change -[alias] -# Alias to build actual plugin binary for the specified target. -build-wasi = "build --target wasm32-wasi" -build-wasm32 = "build --target wasm32-unknown-unknown" diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..1261fea --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,3 @@ +[target.aarch64-unknown-linux-musl] +linker = "aarch64-linux-musl-gcc" +rustflags = ["-C", "target-feature=-crt-static"] diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d9971cc --- /dev/null +++ b/.gitattributes @@ -0,0 +1,14 @@ +# Auto detect text files and perform LF normalization +* text=auto + + +*.ts text eol=lf merge=union +*.tsx text eol=lf merge=union +*.rs text eol=lf merge=union +*.js text eol=lf merge=union +*.json text eol=lf merge=union +*.debug text eol=lf merge=union + +# Generated codes +index.js linguist-detectable=false +index.d.ts linguist-detectable=false \ No newline at end of file diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..5ccec21 --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,365 @@ +name: CI +env: + DEBUG: napi:* + APP_NAME: rsc-rs + MACOSX_DEPLOYMENT_TARGET: '10.13' +permissions: + contents: write + id-token: write +'on': + push: + branches: + - main + tags-ignore: + - '**' + paths-ignore: + - '**/*.md' + - LICENSE + - '**/*.gitignore' + - .editorconfig + - docs/** + pull_request: null +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + build: + strategy: + fail-fast: false + matrix: + settings: + - host: macos-latest + target: x86_64-apple-darwin + build: pnpm build --target x86_64-apple-darwin + - host: windows-latest + build: pnpm build --target x86_64-pc-windows-msvc + target: x86_64-pc-windows-msvc + - host: windows-latest + build: pnpm build --target i686-pc-windows-msvc + target: i686-pc-windows-msvc + - host: ubuntu-latest + target: x86_64-unknown-linux-gnu + build: pnpm build --target x86_64-unknown-linux-gnu --use-napi-cross + - host: ubuntu-latest + target: x86_64-unknown-linux-musl + build: pnpm build --target x86_64-unknown-linux-musl -x + - host: macos-14 + target: aarch64-apple-darwin + build: pnpm build --target aarch64-apple-darwin + - host: ubuntu-latest + target: aarch64-unknown-linux-gnu + build: pnpm build --target aarch64-unknown-linux-gnu --use-napi-cross + - host: ubuntu-latest + target: armv7-unknown-linux-gnueabihf + build: pnpm build --target armv7-unknown-linux-gnueabihf --use-napi-cross + - host: ubuntu-latest + target: aarch64-linux-android + build: pnpm build --target aarch64-linux-android + - host: ubuntu-latest + target: armv7-linux-androideabi + build: pnpm build --target armv7-linux-androideabi + - host: ubuntu-latest + target: aarch64-unknown-linux-musl + build: pnpm build --target aarch64-unknown-linux-musl -x + - host: windows-latest + target: aarch64-pc-windows-msvc + build: pnpm build --target aarch64-pc-windows-msvc + # NO WASM + # - host: ubuntu-latest + # target: wasm32-wasip1-threads + # build: pnpm build --target wasm32-wasip1-threads + name: stable - ${{ matrix.settings.target }} - node@20 + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v4 + - name: setup pnpm + uses: pnpm/action-setup@v2 + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - name: Install + uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + targets: ${{ matrix.settings.target }} + - name: Cache cargo + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + ~/.napi-rs + .cargo-cache + target/ + key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} + - uses: goto-bus-stop/setup-zig@v2 + if: ${{ contains(matrix.settings.target, 'musl') }} + with: + version: 0.12.0 + - name: Setup toolchain + run: ${{ matrix.settings.setup }} + if: ${{ matrix.settings.setup }} + shell: bash + - name: Install dependencies + run: pnpm install + - name: Setup node x86 + uses: actions/setup-node@v4 + if: matrix.settings.target == 'i686-pc-windows-msvc' + with: + node-version: 20 + cache: pnpm + architecture: x86 + - name: Build + run: ${{ matrix.settings.build }} + shell: bash + - name: Upload artifact + uses: actions/upload-artifact@v4 + if: matrix.settings.target != 'wasm32-wasip1-threads' + with: + name: bindings-${{ matrix.settings.target }} + path: '*.node' + if-no-files-found: error + + - name: Upload artifact + uses: actions/upload-artifact@v4 + if: matrix.settings.target == 'wasm32-wasip1-threads' + with: + name: bindings-${{ matrix.settings.target }} + path: '*.wasm' + if-no-files-found: error + build-freebsd: + runs-on: macos-13 + name: Build FreeBSD + steps: + - uses: actions/checkout@v4 + - name: Build + id: build + uses: cross-platform-actions/action@v0.24.0 + env: + DEBUG: napi:* + RUSTUP_IO_THREADS: 1 + with: + operating_system: freebsd + version: '13.2' + memory: 8G + cpu_count: 3 + environment_variables: 'DEBUG RUSTUP_IO_THREADS' + shell: bash + run: | + sudo pkg install -y -f curl node libnghttp2 npm + sudo npm install -g corepack + curl https://sh.rustup.rs -sSf --output rustup.sh + sh rustup.sh -y --profile minimal --default-toolchain beta + corepack prepare + corepack enable + source "$HOME/.cargo/env" + echo "~~~~ rustc --version ~~~~" + rustc --version + echo "~~~~ node -v ~~~~" + node -v + echo "~~~~ pnpm --version ~~~~" + pnpm --version + pwd + ls -lah + whoami + env + freebsd-version + pnpm install + pnpm build + rm -rf node_modules + rm -rf target + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: bindings-freebsd + path: ${{ env.APP_NAME }}.*.node + if-no-files-found: error + test-macOS-windows-binding: + name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + settings: + - host: windows-latest + target: x86_64-pc-windows-msvc + architecture: x64 + - host: macos-latest + target: x86_64-apple-darwin + architecture: x64 + - host: macos-latest + target: aarch64-apple-darwin + architecture: arm64 + node: + - '18' + - '20' + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v4 + - name: setup pnpm + uses: pnpm/action-setup@v2 + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + cache: pnpm + architecture: ${{ matrix.settings.architecture }} + - name: Install dependencies + run: pnpm install + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: bindings-${{ matrix.settings.target }} + path: . + - name: List packages + run: ls -R . + shell: bash + - name: Test bindings + run: pnpm test + test-linux-binding: + name: Test ${{ matrix.target }} - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + target: + - x86_64-unknown-linux-gnu + - x86_64-unknown-linux-musl + - aarch64-unknown-linux-gnu + - aarch64-unknown-linux-musl + - armv7-unknown-linux-gnueabihf + node: + - '18' + - '20' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: setup pnpm + uses: pnpm/action-setup@v2 + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + cache: pnpm + - name: Output docker params + id: docker + run: | + node -e " + if ('${{ matrix.target }}'.startsWith('aarch64')) { + console.log('PLATFORM=linux/arm64') + } else if ('${{ matrix.target }}'.startsWith('armv7')) { + console.log('PLATFORM=linux/arm/v7') + } else { + console.log('PLATFORM=linux/amd64') + } + " >> $GITHUB_OUTPUT + node -e " + if ('${{ matrix.target }}'.endsWith('-musl')) { + console.log('IMAGE=node:${{ matrix.node }}-alpine') + } else { + console.log('IMAGE=node:${{ matrix.node }}-slim') + } + " >> $GITHUB_OUTPUT + echo "PNPM_STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT + # use --force to download the all platform/arch dependencies + - name: Install dependencies + run: pnpm install --force + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: bindings-${{ matrix.target }} + path: . + - name: List packages + run: ls -R . + shell: bash + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: all + - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + - name: Test bindings + uses: addnab/docker-run-action@v3 + with: + image: ${{ steps.docker.outputs.IMAGE }} + options: -v ${{ steps.docker.outputs.PNPM_STORE_PATH }}:${{ steps.docker.outputs.PNPM_STORE_PATH }} -v ${{ github.workspace }}:${{ github.workspace }} -w ${{ github.workspace }} --platform ${{ steps.docker.outputs.PLATFORM }} + run: npm run test + # test-wasi: + # name: Test WASI target + # needs: + # - build + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v4 + # - name: setup pnpm + # uses: pnpm/action-setup@v2 + # - name: Setup node + # uses: actions/setup-node@v4 + # with: + # node-version: 20 + # cache: pnpm + # - name: Install dependencies + # run: pnpm install + # - name: Download artifacts + # uses: actions/download-artifact@v4 + # with: + # name: bindings-wasm32-wasip1-threads + # path: . + # - name: List packages + # run: ls -R . + # shell: bash + # - name: Test bindings + # run: pnpm test + # env: + # NAPI_RS_FORCE_WASI: 1 + publish: + name: Publish + runs-on: ubuntu-latest + needs: + - build-freebsd + - test-macOS-windows-binding + - test-linux-binding + # - test-wasi + steps: + - uses: actions/checkout@v4 + - name: setup pnpm + uses: pnpm/action-setup@v2 + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - name: Install dependencies + run: pnpm install + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + - name: create npm dirs + run: pnpm napi create-npm-dirs + - name: Move artifacts + run: pnpm artifacts + - name: List packages + run: ls -R ./npm + shell: bash + - name: Publish + run: | + npm config set provenance true + if git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+$"; + then + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + npm publish --access public + elif git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+"; + then + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + npm publish --tag next --access public + else + echo "Not a release, skipping publish" + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore index 6bdfa85..255bf4e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,129 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# End of https://www.toptal.com/developers/gitignore/api/node + + +#Added by cargo + /target -^target/ -target +Cargo.lock + +*.node +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..ec144db --- /dev/null +++ b/.npmignore @@ -0,0 +1,13 @@ +target +Cargo.lock +.cargo +.github +npm +.eslintrc +.prettierignore +rustfmt.toml +yarn.lock +*.node +.yarn +__test__ +renovate.json diff --git a/.taplo.toml b/.taplo.toml new file mode 100644 index 0000000..b2d27a7 --- /dev/null +++ b/.taplo.toml @@ -0,0 +1,7 @@ +exclude = ["node_modules/**/*.toml"] + +# https://taplo.tamasfe.dev/configuration/formatter-options.html +[formatting] +align_entries = true +indent_tables = true +reorder_keys = true diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f76a793 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,96 @@ +{ + // Disable the default formatter, use eslint instead + "prettier.enable": false, + "editor.formatOnSave": false, + + // Auto fix + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "never" + }, + + // Silent the stylistic rules in you IDE, but still auto fix them + "eslint.rules.customizations": [ + { "rule": "style/*", "severity": "off" }, + { "rule": "format/*", "severity": "off" }, + { "rule": "*-indent", "severity": "off" }, + { "rule": "*-spacing", "severity": "off" }, + { "rule": "*-spaces", "severity": "off" }, + { "rule": "*-order", "severity": "off" }, + { "rule": "*-dangle", "severity": "off" }, + { "rule": "*-newline", "severity": "off" }, + { "rule": "*quotes", "severity": "off" }, + { "rule": "*semi", "severity": "off" } + ], + + // Enable eslint for all supported languages + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "vue", + "html", + "markdown", + "json", + "jsonc", + "yaml", + "toml", + "xml", + "gql", + "graphql", + "astro", + "css", + "less", + "scss", + "pcss", + "postcss" + ], + // Disable the default formatter, use eslint instead + "prettier.enable": false, + "editor.formatOnSave": false, + + // Auto fix + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "never" + }, + + // Silent the stylistic rules in you IDE, but still auto fix them + "eslint.rules.customizations": [ + { "rule": "style/*", "severity": "off" }, + { "rule": "format/*", "severity": "off" }, + { "rule": "*-indent", "severity": "off" }, + { "rule": "*-spacing", "severity": "off" }, + { "rule": "*-spaces", "severity": "off" }, + { "rule": "*-order", "severity": "off" }, + { "rule": "*-dangle", "severity": "off" }, + { "rule": "*-newline", "severity": "off" }, + { "rule": "*quotes", "severity": "off" }, + { "rule": "*semi", "severity": "off" } + ], + + // Enable eslint for all supported languages + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "vue", + "html", + "markdown", + "json", + "jsonc", + "yaml", + "toml", + "xml", + "gql", + "graphql", + "astro", + "css", + "less", + "scss", + "pcss", + "postcss" + ] +} diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..3186f3f --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index ec575c7..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,2101 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" -dependencies = [ - "memchr", -] - -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - -[[package]] -name = "anyhow" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" - -[[package]] -name = "ast_node" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab31376d309dd3bfc9cfb3c11c93ce0e0741bbe0354b20e7f8c60b044730b79" -dependencies = [ - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.52", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64-simd" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" -dependencies = [ - "simd-abstraction", -] - -[[package]] -name = "better_scoped_tls" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "794edcc9b3fb07bb4aecaa11f093fd45663b4feadb782d68303a2268bc2701de" -dependencies = [ - "scoped-tls", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.11.0-pre.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded684142010808eb980d9974ef794da2bcf97d13396143b1515e9f0fb4a10e" -dependencies = [ - "crypto-common 0.2.0-pre.5", -] - -[[package]] -name = "bytecheck" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.22", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.22", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cc" -version = "1.0.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "const-oid" -version = "0.10.0-pre.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e3352a27098ba6b09546e5f13b15165e6a88b5c2723afecb3ea9576b27e3ea" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "crypto-common" -version = "0.2.0-pre.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7aa2ec04f5120b830272a481e8d9d8ba4dda140d2cda59b0f1110d5eb93c38e" -dependencies = [ - "getrandom", - "hybrid-array", - "rand_core", -] - -[[package]] -name = "data-encoding" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" - -[[package]] -name = "debugid" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" -dependencies = [ - "serde", - "uuid", -] - -[[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - -[[package]] -name = "difference" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "crypto-common 0.1.6", -] - -[[package]] -name = "digest" -version = "0.11.0-pre.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065d93ead7c220b85d5b4be4795d8398eac4ff68b5ee63895de0a3c1fb6edf25" -dependencies = [ - "block-buffer 0.11.0-pre.5", - "const-oid", - "crypto-common 0.2.0-pre.5", -] - -[[package]] -name = "either" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "from_variant" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc9cc75639b041067353b9bce2450d6847e547276c6fbe4487d7407980e07db" -dependencies = [ - "proc-macro2", - "swc_macros_common", - "syn 2.0.52", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hstr" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96274be293b8877e61974a607105d09c84caebe9620b47774aa8a6b942042dd4" -dependencies = [ - "hashbrown 0.14.3", - "new_debug_unreachable", - "once_cell", - "phf", - "rustc-hash", - "triomphe", -] - -[[package]] -name = "hybrid-array" -version = "0.2.0-rc.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53668f5da5a41d9eaf4bf7064be46d1ebe6a4e1ceed817f387587b18f2b51047" -dependencies = [ - "typenum", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "if_chain" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" - -[[package]] -name = "indexmap" -version = "2.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" -dependencies = [ - "equivalent", - "hashbrown 0.14.3", -] - -[[package]] -name = "is-macro" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a85abdc13717906baccb5a1e435556ce0df215f242892f721dff62bf25288f" -dependencies = [ - "Inflector", - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "is_ci" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" - -[[package]] -name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.153" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "lock_api" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "memchr" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" - -[[package]] -name = "miette" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c90329e44f9208b55f45711f9558cec15d7ef8295cc65ecd6d4188ae8edc58c" -dependencies = [ - "atty", - "backtrace", - "miette-derive", - "once_cell", - "owo-colors", - "supports-color", - "supports-hyperlinks", - "supports-unicode", - "terminal_size", - "textwrap", - "thiserror", - "unicode-width", -] - -[[package]] -name = "miette-derive" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b5bc45b761bcf1b5e6e6c4128cd93b84c218721a8d9b894aa0aff4ed180174c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", - "serde", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.9", - "libc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "outref" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "owo-colors" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.48.5", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pretty_assertions" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" -dependencies = [ - "diff", - "yansi", -] - -[[package]] -name = "proc-macro2" -version = "1.0.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "psm" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" -dependencies = [ - "cc", -] - -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "react-server" -version = "0.2.2" -dependencies = [ - "hex", - "serde", - "serde_json", - "sha1", - "swc_core", - "tracing", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "regex" -version = "1.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.5", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "relative-path" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "rkyv" -version = "0.7.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - -[[package]] -name = "rustix" -version = "0.38.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" -dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ryu" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" - -[[package]] -name = "ryu-js" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad97d4ce1560a5e27cec89519dc8300d1aa6035b099821261c651486a19e44d5" - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" -dependencies = [ - "serde", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "serde" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.11.0-pre.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3885de8cb916f223718c1ccd47a840b91f806333e76002dc5cb3862154b4fed3" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.11.0-pre.8", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "simd-abstraction" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" -dependencies = [ - "outref", -] - -[[package]] -name = "simdutf8" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "smallvec" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" - -[[package]] -name = "smartstring" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" -dependencies = [ - "autocfg", - "static_assertions", - "version_check", -] - -[[package]] -name = "smawk" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" - -[[package]] -name = "sourcemap" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "208d40b9e8cad9f93613778ea295ed8f3c2b1824217c6cfc7219d3f6f45b96d4" -dependencies = [ - "base64-simd", - "bitvec", - "data-encoding", - "debugid", - "if_chain", - "rustc-hash", - "rustc_version", - "serde", - "serde_json", - "unicode-id-start", - "url", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "stacker" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "winapi", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_enum" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e383308aebc257e7d7920224fa055c632478d92744eca77f99be8fa1545b90" -dependencies = [ - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.52", -] - -[[package]] -name = "supports-color" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba6faf2ca7ee42fdd458f4347ae0a9bd6bcc445ad7cb57ad82b383f18870d6f" -dependencies = [ - "atty", - "is_ci", -] - -[[package]] -name = "supports-hyperlinks" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "590b34f7c5f01ecc9d78dba4b3f445f31df750a67621cf31626f3b7441ce6406" -dependencies = [ - "atty", -] - -[[package]] -name = "supports-unicode" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8b945e45b417b125a8ec51f1b7df2f8df7920367700d1f98aedd21e5735f8b2" -dependencies = [ - "atty", -] - -[[package]] -name = "swc_atoms" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6567e4e67485b3e7662b486f1565bdae54bd5b9d6b16b2ba1a9babb1e42125" -dependencies = [ - "bytecheck", - "hstr", - "once_cell", - "rkyv", - "rustc-hash", - "serde", -] - -[[package]] -name = "swc_common" -version = "0.34.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add6efe3f1a2fe9108b27fb6ba94998ab5bfd8696d590033003987c82452b8f9" -dependencies = [ - "anyhow", - "ast_node", - "atty", - "better_scoped_tls", - "bytecheck", - "cfg-if", - "either", - "from_variant", - "new_debug_unreachable", - "num-bigint", - "once_cell", - "parking_lot", - "rkyv", - "rustc-hash", - "serde", - "siphasher", - "sourcemap", - "swc_atoms", - "swc_eq_ignore_macros", - "swc_visit", - "termcolor", - "tracing", - "unicode-width", - "url", -] - -[[package]] -name = "swc_core" -version = "0.95.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91bc4f59fcb3fbaa32355f586baff65396d0b027f0ba6292aee6f5b3326a6b0" -dependencies = [ - "once_cell", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_transforms_base", - "swc_ecma_transforms_testing", - "swc_ecma_utils", - "swc_ecma_visit", - "swc_plugin", - "swc_plugin_macro", - "swc_plugin_proxy", - "vergen", -] - -[[package]] -name = "swc_ecma_ast" -version = "0.115.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be1306930c235435a892104c00c2b5e16231043c085d5a10bd3e7537b15659b" -dependencies = [ - "bitflags 2.5.0", - "bytecheck", - "is-macro", - "num-bigint", - "phf", - "rkyv", - "scoped-tls", - "string_enum", - "swc_atoms", - "swc_common", - "unicode-id-start", -] - -[[package]] -name = "swc_ecma_codegen" -version = "0.151.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6602bcf4fd78b2ef0c7b2abcdbd3e35dfa564a6bcfb0f256e86b41ff3299d7" -dependencies = [ - "memchr", - "num-bigint", - "once_cell", - "rustc-hash", - "serde", - "sourcemap", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_codegen_macros", - "tracing", -] - -[[package]] -name = "swc_ecma_codegen_macros" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090e409af49c8d1a3c13b3aab1ed09dd4eda982207eb3e63c2ad342f072b49c8" -dependencies = [ - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.52", -] - -[[package]] -name = "swc_ecma_parser" -version = "0.146.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f884c766155c58b98503961612d1caced9d50267fcbf7914d9407d6fc5447efe" -dependencies = [ - "either", - "new_debug_unreachable", - "num-bigint", - "num-traits", - "phf", - "serde", - "smallvec", - "smartstring", - "stacker", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "tracing", - "typed-arena", -] - -[[package]] -name = "swc_ecma_testing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f495dae76f1ef3f5be46993b050c3c7f9bf534bcdacf1e40789d32255040776" -dependencies = [ - "anyhow", - "hex", - "sha2", - "testing", - "tracing", -] - -[[package]] -name = "swc_ecma_transforms_base" -version = "0.140.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daee7af0abfccc9855656fc36ac472e1e6a61398a3a1a1b3bf05ef7a7e7af6b0" -dependencies = [ - "better_scoped_tls", - "bitflags 2.5.0", - "indexmap", - "once_cell", - "phf", - "rustc-hash", - "serde", - "smallvec", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_parser", - "swc_ecma_utils", - "swc_ecma_visit", - "tracing", -] - -[[package]] -name = "swc_ecma_transforms_testing" -version = "0.143.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2622a94000bb4e04548afe0540150f616c58296d5485c0653d1fae69c23efd98" -dependencies = [ - "ansi_term", - "anyhow", - "base64", - "hex", - "serde", - "serde_json", - "sha2", - "sourcemap", - "swc_common", - "swc_ecma_ast", - "swc_ecma_codegen", - "swc_ecma_parser", - "swc_ecma_testing", - "swc_ecma_transforms_base", - "swc_ecma_utils", - "swc_ecma_visit", - "tempfile", - "testing", -] - -[[package]] -name = "swc_ecma_utils" -version = "0.130.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831490c6d4a52f06932fa2c3d87fc0d0aa43211a5df6b5e05a1ec2c57a2f2519" -dependencies = [ - "indexmap", - "num_cpus", - "once_cell", - "rustc-hash", - "ryu-js", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_visit", - "tracing", - "unicode-id", -] - -[[package]] -name = "swc_ecma_visit" -version = "0.101.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce0d997f0c9b4e181225f603d161f6757c2a97022258170982cfe005ec69ec92" -dependencies = [ - "num-bigint", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_visit", - "tracing", -] - -[[package]] -name = "swc_eq_ignore_macros" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695a1d8b461033d32429b5befbf0ad4d7a2c4d6ba9cd5ba4e0645c615839e8e4" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "swc_error_reporters" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd8f9a90efb59dc5d918b4470e5d152f34cac2f8733bfba141a96440cab3eff" -dependencies = [ - "anyhow", - "miette", - "once_cell", - "parking_lot", - "swc_common", -] - -[[package]] -name = "swc_macros_common" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91745f3561057493d2da768437c427c0e979dff7396507ae02f16c981c4a8466" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "swc_plugin" -version = "0.90.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5df720531bfbd7ceb1139319c39c20c446abfb8f7e0eb47b104205a71152b4" -dependencies = [ - "once_cell", -] - -[[package]] -name = "swc_plugin_macro" -version = "0.9.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3232db481484070637b20a155c064096c0ea1ba04fa2247b89b618661b3574f4" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "swc_plugin_proxy" -version = "0.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98740e5a1ac82ad0de823bcf4aea97a76dce77c1ccff167d148e8a114b2932c0" -dependencies = [ - "better_scoped_tls", - "rkyv", - "swc_common", - "swc_ecma_ast", - "swc_trace_macro", - "tracing", -] - -[[package]] -name = "swc_trace_macro" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff9719b6085dd2824fd61938a881937be14b08f95e2d27c64c825a9f65e052ba" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "swc_visit" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043d11fe683dcb934583ead49405c0896a5af5face522e4682c16971ef7871b9" -dependencies = [ - "either", - "swc_visit_macros", -] - -[[package]] -name = "swc_visit_macros" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae9ef18ff8daffa999f729db056d2821cd2f790f3a11e46422d19f46bb193e7" -dependencies = [ - "Inflector", - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.52", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "terminal_size" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "testing" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27d395aa823f3ad1ad845ed74b96188f493b469794cfbe9ef82f03196064086f" -dependencies = [ - "ansi_term", - "cargo_metadata 0.15.4", - "difference", - "once_cell", - "pretty_assertions", - "regex", - "serde", - "serde_json", - "swc_common", - "swc_error_reporters", - "testing_macros", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "testing_macros" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d3864d4184569c1428645a51a304b3b6e8d3094cd61fb3cce8dfdd9f6d0f72" -dependencies = [ - "anyhow", - "glob", - "once_cell", - "proc-macro2", - "quote", - "regex", - "relative-path", - "syn 2.0.52", -] - -[[package]] -name = "textwrap" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" -dependencies = [ - "smawk", - "unicode-linebreak", - "unicode-width", -] - -[[package]] -name = "thiserror" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "triomphe" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6631e42e10b40c0690bf92f404ebcfe6e1fdb480391d15f17cc8e96eeed5369" -dependencies = [ - "serde", - "stable_deref_trait", -] - -[[package]] -name = "typed-arena" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-id" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1b6def86329695390197b82c1e244a54a131ceb66c996f2088a3876e2ae083f" - -[[package]] -name = "unicode-id-start" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02aebfa694eccbbbffdd92922c7de136b9fe764396d2f10e21bce1681477cfc1" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-linebreak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-width" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "uuid" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "vergen" -version = "8.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525" -dependencies = [ - "anyhow", - "cargo_metadata 0.18.1", - "regex", - "rustversion", -] - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.4", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" -dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "yansi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" diff --git a/Cargo.toml b/Cargo.toml index 578840a..f5f17a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,22 +1,29 @@ [package] -name = "react-server" -version = "0.2.2" edition = "2021" +name = "rsc-rs" +version = "0.0.0" [lib] crate-type = ["cdylib"] -[profile.release] -lto = true - [dependencies] -serde = "1" -swc_core = { version = "0.95.*", features = ["ecma_plugin_transform", "ecma_utils"] } -hex = "0.4.3" -sha1 = "0.11.0-pre.3" -tracing = "0.1.40" -serde_json = "1.0.117" +napi = { version = "2.16.7", default-features = false, features = ["napi9", "async"] } +napi-derive = "2.16.6" +serde_json = "1.0.118" +oxc_allocator = { version = "0.16.0" } +oxc_codegen = { version = "0.16.0" } +oxc_span = { version = "0.16.0" } +oxc_ast = { version = "0.16.0" } +oxc_semantic = { version = "0.16.0" } +oxc_syntax = { version = "0.16.0" } +oxc_diagnostics = { version = "0.16.0" } +oxc_parser = { version = "0.16.0" } +futures = "0.3.30" +tokio = { version = "1.38.0", features = ["default", "fs"] } -# .cargo/config defines few alias to build plugin. -# cargo build-wasi generates wasm-wasi32 binary -# cargo build-wasm32 generates wasm32-unknown-unknown binary. +[build-dependencies] +napi-build = "2.1.3" + +[profile.release] +lto = true +strip = "symbols" diff --git a/README.md b/README.md index 1a57a32..a8f1928 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,4 @@ -# swc-plugin-react-server - -This is a swc plugin for [react server](https://github.com/reactjs/rfcs/blob/main/text/0188-server-components.md). - -- [x] server action transform (port from [next.js](https://github.com/vercel/next.js/blob/f30e5dbb29e16b652172e92a2691bb6a0a75768d/packages/next-swc/crates/next-custom-transforms/src/lib.rs)) - -## Usage - -```ts -import { transform } from '@swc/core' -import { createRequire } from 'node:module' - -const require = createRequire(import.meta.url) - -const output = await transform(` - async function foo() { - "use server"; - return 0; - } - export async function bar() { - "use server"; - return "Hello world"; - } -`, { - swcrc: false, - jsc: { - target: 'esnext', - experimental: { - plugins: [ - [ - require.resolve('swc-plugin-react-server'), {} - ] - ] - } - } -}) -``` +# React Server ## LICENSE diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..1f866b6 --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +extern crate napi_build; + +fn main() { + napi_build::setup(); +} diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..e107e0c --- /dev/null +++ b/index.d.ts @@ -0,0 +1,26 @@ +/* auto-generated by NAPI-RS */ +/* eslint-disable */ +export interface ModuleImports { + name: string +} + +export function reactServerAction( + filePath: string, + actionExportPrefix: string, + isServerLayer: boolean, + isActionFile: boolean, +): Promise + +export const enum RSCError { + CannotUseBothClientAndServer = 0, + ServerActionMustBeAsync = 1, +} + +export function validate(filePath: string): Promise + +export interface ValidateResult { + isClientEntry: boolean + isServerAction: boolean + error?: RSCError + imports: Array +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..84640b4 --- /dev/null +++ b/index.js @@ -0,0 +1,347 @@ +// prettier-ignore +/* eslint-disable */ +/* auto-generated by NAPI-RS */ + +const { readFileSync } = require('fs') + +let nativeBinding = null +const loadErrors = [] + +const isMusl = () => { + let musl = false + if (process.platform === 'linux') { + musl = isMuslFromFilesystem() + if (musl === null) { + musl = isMuslFromReport() + } + if (musl === null) { + musl = isMuslFromChildProcess() + } + } + return musl +} + +const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-') + +const isMuslFromFilesystem = () => { + try { + return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl') + } catch { + return null + } +} + +const isMuslFromReport = () => { + const report = typeof process.report.getReport === 'function' ? process.report.getReport() : null + if (!report) { + return null + } + if (report.header && report.header.glibcVersionRuntime) { + return false + } + if (Array.isArray(report.sharedObjects)) { + if (report.sharedObjects.some(isFileMusl)) { + return true + } + } + return false +} + +const isMuslFromChildProcess = () => { + try { + return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl') + } catch (e) { + // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false + return false + } +} + +function requireNative() { + if (process.platform === 'android') { + if (process.arch === 'arm64') { + try { + return require('./rsc-rs.android-arm64.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-android-arm64') + } catch (e) { + loadErrors.push(e) + } + } else if (process.arch === 'arm') { + try { + return require('./rsc-rs.android-arm-eabi.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-android-arm-eabi') + } catch (e) { + loadErrors.push(e) + } + } else { + loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`)) + } + } else if (process.platform === 'win32') { + if (process.arch === 'x64') { + try { + return require('./rsc-rs.win32-x64-msvc.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-win32-x64-msvc') + } catch (e) { + loadErrors.push(e) + } + } else if (process.arch === 'ia32') { + try { + return require('./rsc-rs.win32-ia32-msvc.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-win32-ia32-msvc') + } catch (e) { + loadErrors.push(e) + } + } else if (process.arch === 'arm64') { + try { + return require('./rsc-rs.win32-arm64-msvc.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-win32-arm64-msvc') + } catch (e) { + loadErrors.push(e) + } + } else { + loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`)) + } + } else if (process.platform === 'darwin') { + try { + return require('./rsc-rs.darwin-universal.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-darwin-universal') + } catch (e) { + loadErrors.push(e) + } + + if (process.arch === 'x64') { + try { + return require('./rsc-rs.darwin-x64.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-darwin-x64') + } catch (e) { + loadErrors.push(e) + } + } else if (process.arch === 'arm64') { + try { + return require('./rsc-rs.darwin-arm64.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-darwin-arm64') + } catch (e) { + loadErrors.push(e) + } + } else { + loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`)) + } + } else if (process.platform === 'freebsd') { + if (process.arch === 'x64') { + try { + return require('./rsc-rs.freebsd-x64.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-freebsd-x64') + } catch (e) { + loadErrors.push(e) + } + } else if (process.arch === 'arm64') { + try { + return require('./rsc-rs.freebsd-arm64.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-freebsd-arm64') + } catch (e) { + loadErrors.push(e) + } + } else { + loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`)) + } + } else if (process.platform === 'linux') { + if (process.arch === 'x64') { + if (isMusl()) { + try { + return require('./rsc-rs.linux-x64-musl.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-linux-x64-musl') + } catch (e) { + loadErrors.push(e) + } + } else { + try { + return require('./rsc-rs.linux-x64-gnu.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-linux-x64-gnu') + } catch (e) { + loadErrors.push(e) + } + } + } else if (process.arch === 'arm64') { + if (isMusl()) { + try { + return require('./rsc-rs.linux-arm64-musl.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-linux-arm64-musl') + } catch (e) { + loadErrors.push(e) + } + } else { + try { + return require('./rsc-rs.linux-arm64-gnu.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-linux-arm64-gnu') + } catch (e) { + loadErrors.push(e) + } + } + } else if (process.arch === 'arm') { + if (isMusl()) { + try { + return require('./rsc-rs.linux-arm-musleabihf.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-linux-arm-musleabihf') + } catch (e) { + loadErrors.push(e) + } + } else { + try { + return require('./rsc-rs.linux-arm-gnueabihf.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-linux-arm-gnueabihf') + } catch (e) { + loadErrors.push(e) + } + } + } else if (process.arch === 'riscv64') { + if (isMusl()) { + try { + return require('./rsc-rs.linux-riscv64-musl.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-linux-riscv64-musl') + } catch (e) { + loadErrors.push(e) + } + } else { + try { + return require('./rsc-rs.linux-riscv64-gnu.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-linux-riscv64-gnu') + } catch (e) { + loadErrors.push(e) + } + } + } else if (process.arch === 'ppc64') { + try { + return require('./rsc-rs.linux-ppc64-gnu.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-linux-ppc64-gnu') + } catch (e) { + loadErrors.push(e) + } + } else if (process.arch === 's390x') { + try { + return require('./rsc-rs.linux-s390x-gnu.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('rsc-rs-linux-s390x-gnu') + } catch (e) { + loadErrors.push(e) + } + } else { + loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`)) + } + } else { + loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`)) + } +} + +nativeBinding = requireNative() + +if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) { + try { + nativeBinding = require('./rsc-rs.wasi.cjs') + } catch (err) { + if (process.env.NAPI_RS_FORCE_WASI) { + console.error(err) + } + } + if (!nativeBinding) { + try { + nativeBinding = require('rsc-rs-wasm32-wasi') + } catch (err) { + if (process.env.NAPI_RS_FORCE_WASI) { + console.error(err) + } + } + } +} + +if (!nativeBinding) { + if (loadErrors.length > 0) { + // TODO Link to documentation with potential fixes + // - The package owner could build/publish bindings for this arch + // - The user may need to bundle the correct files + // - The user may need to re-install node_modules to get new packages + throw new Error('Failed to load native binding', { cause: loadErrors }) + } + throw new Error(`Failed to load native binding`) +} + +module.exports.reactServerAction = nativeBinding.reactServerAction +module.exports.RSCError = nativeBinding.RSCError +module.exports.validate = nativeBinding.validate diff --git a/npm/android-arm-eabi/README.md b/npm/android-arm-eabi/README.md new file mode 100644 index 0000000..7ac9a2b --- /dev/null +++ b/npm/android-arm-eabi/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-android-arm-eabi` + +This is the **armv7-linux-androideabi** binary for `rsc-rs` diff --git a/npm/android-arm-eabi/package.json b/npm/android-arm-eabi/package.json new file mode 100644 index 0000000..6c1e5cf --- /dev/null +++ b/npm/android-arm-eabi/package.json @@ -0,0 +1,32 @@ +{ + "name": "rsc-rs-android-arm-eabi", + "version": "1.0.0", + "os": [ + "android" + ], + "cpu": [ + "arm" + ], + "main": "rsc-rs.android-arm-eabi.node", + "files": [ + "rsc-rs.android-arm-eabi.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/android-arm64/README.md b/npm/android-arm64/README.md new file mode 100644 index 0000000..2340a96 --- /dev/null +++ b/npm/android-arm64/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-android-arm64` + +This is the **aarch64-linux-android** binary for `rsc-rs` diff --git a/npm/android-arm64/package.json b/npm/android-arm64/package.json new file mode 100644 index 0000000..ac6796d --- /dev/null +++ b/npm/android-arm64/package.json @@ -0,0 +1,32 @@ +{ + "name": "rsc-rs-android-arm64", + "version": "1.0.0", + "os": [ + "android" + ], + "cpu": [ + "arm64" + ], + "main": "rsc-rs.android-arm64.node", + "files": [ + "rsc-rs.android-arm64.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/darwin-arm64/README.md b/npm/darwin-arm64/README.md new file mode 100644 index 0000000..b4741f5 --- /dev/null +++ b/npm/darwin-arm64/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-darwin-arm64` + +This is the **aarch64-apple-darwin** binary for `rsc-rs` diff --git a/npm/darwin-arm64/package.json b/npm/darwin-arm64/package.json new file mode 100644 index 0000000..11d1b1c --- /dev/null +++ b/npm/darwin-arm64/package.json @@ -0,0 +1,32 @@ +{ + "name": "rsc-rs-darwin-arm64", + "version": "1.0.0", + "os": [ + "darwin" + ], + "cpu": [ + "arm64" + ], + "main": "rsc-rs.darwin-arm64.node", + "files": [ + "rsc-rs.darwin-arm64.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/darwin-x64/README.md b/npm/darwin-x64/README.md new file mode 100644 index 0000000..7358a13 --- /dev/null +++ b/npm/darwin-x64/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-darwin-x64` + +This is the **x86_64-apple-darwin** binary for `rsc-rs` diff --git a/npm/darwin-x64/package.json b/npm/darwin-x64/package.json new file mode 100644 index 0000000..fb88de7 --- /dev/null +++ b/npm/darwin-x64/package.json @@ -0,0 +1,32 @@ +{ + "name": "rsc-rs-darwin-x64", + "version": "1.0.0", + "os": [ + "darwin" + ], + "cpu": [ + "x64" + ], + "main": "rsc-rs.darwin-x64.node", + "files": [ + "rsc-rs.darwin-x64.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/freebsd-x64/README.md b/npm/freebsd-x64/README.md new file mode 100644 index 0000000..bd6b083 --- /dev/null +++ b/npm/freebsd-x64/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-freebsd-x64` + +This is the **x86_64-unknown-freebsd** binary for `rsc-rs` diff --git a/npm/freebsd-x64/package.json b/npm/freebsd-x64/package.json new file mode 100644 index 0000000..d2d730d --- /dev/null +++ b/npm/freebsd-x64/package.json @@ -0,0 +1,32 @@ +{ + "name": "rsc-rs-freebsd-x64", + "version": "1.0.0", + "os": [ + "freebsd" + ], + "cpu": [ + "x64" + ], + "main": "rsc-rs.freebsd-x64.node", + "files": [ + "rsc-rs.freebsd-x64.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/linux-arm-gnueabihf/README.md b/npm/linux-arm-gnueabihf/README.md new file mode 100644 index 0000000..4981f5e --- /dev/null +++ b/npm/linux-arm-gnueabihf/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-linux-arm-gnueabihf` + +This is the **armv7-unknown-linux-gnueabihf** binary for `rsc-rs` diff --git a/npm/linux-arm-gnueabihf/package.json b/npm/linux-arm-gnueabihf/package.json new file mode 100644 index 0000000..e538fb8 --- /dev/null +++ b/npm/linux-arm-gnueabihf/package.json @@ -0,0 +1,32 @@ +{ + "name": "rsc-rs-linux-arm-gnueabihf", + "version": "1.0.0", + "os": [ + "linux" + ], + "cpu": [ + "arm" + ], + "main": "rsc-rs.linux-arm-gnueabihf.node", + "files": [ + "rsc-rs.linux-arm-gnueabihf.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/linux-arm64-gnu/README.md b/npm/linux-arm64-gnu/README.md new file mode 100644 index 0000000..4a6be86 --- /dev/null +++ b/npm/linux-arm64-gnu/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-linux-arm64-gnu` + +This is the **aarch64-unknown-linux-gnu** binary for `rsc-rs` diff --git a/npm/linux-arm64-gnu/package.json b/npm/linux-arm64-gnu/package.json new file mode 100644 index 0000000..2f62ca2 --- /dev/null +++ b/npm/linux-arm64-gnu/package.json @@ -0,0 +1,35 @@ +{ + "name": "rsc-rs-linux-arm64-gnu", + "version": "1.0.0", + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "main": "rsc-rs.linux-arm64-gnu.node", + "files": [ + "rsc-rs.linux-arm64-gnu.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/linux-arm64-musl/README.md b/npm/linux-arm64-musl/README.md new file mode 100644 index 0000000..11ab69f --- /dev/null +++ b/npm/linux-arm64-musl/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-linux-arm64-musl` + +This is the **aarch64-unknown-linux-musl** binary for `rsc-rs` diff --git a/npm/linux-arm64-musl/package.json b/npm/linux-arm64-musl/package.json new file mode 100644 index 0000000..9c18bf7 --- /dev/null +++ b/npm/linux-arm64-musl/package.json @@ -0,0 +1,35 @@ +{ + "name": "rsc-rs-linux-arm64-musl", + "version": "1.0.0", + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "main": "rsc-rs.linux-arm64-musl.node", + "files": [ + "rsc-rs.linux-arm64-musl.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/linux-x64-gnu/README.md b/npm/linux-x64-gnu/README.md new file mode 100644 index 0000000..1880411 --- /dev/null +++ b/npm/linux-x64-gnu/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-linux-x64-gnu` + +This is the **x86_64-unknown-linux-gnu** binary for `rsc-rs` diff --git a/npm/linux-x64-gnu/package.json b/npm/linux-x64-gnu/package.json new file mode 100644 index 0000000..9a9dbbf --- /dev/null +++ b/npm/linux-x64-gnu/package.json @@ -0,0 +1,35 @@ +{ + "name": "rsc-rs-linux-x64-gnu", + "version": "1.0.0", + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "main": "rsc-rs.linux-x64-gnu.node", + "files": [ + "rsc-rs.linux-x64-gnu.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/linux-x64-musl/README.md b/npm/linux-x64-musl/README.md new file mode 100644 index 0000000..a40f6c9 --- /dev/null +++ b/npm/linux-x64-musl/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-linux-x64-musl` + +This is the **x86_64-unknown-linux-musl** binary for `rsc-rs` diff --git a/npm/linux-x64-musl/package.json b/npm/linux-x64-musl/package.json new file mode 100644 index 0000000..de6b237 --- /dev/null +++ b/npm/linux-x64-musl/package.json @@ -0,0 +1,35 @@ +{ + "name": "rsc-rs-linux-x64-musl", + "version": "1.0.0", + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "main": "rsc-rs.linux-x64-musl.node", + "files": [ + "rsc-rs.linux-x64-musl.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/win32-arm64-msvc/README.md b/npm/win32-arm64-msvc/README.md new file mode 100644 index 0000000..5b21ef2 --- /dev/null +++ b/npm/win32-arm64-msvc/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-win32-arm64-msvc` + +This is the **aarch64-pc-windows-msvc** binary for `rsc-rs` diff --git a/npm/win32-arm64-msvc/package.json b/npm/win32-arm64-msvc/package.json new file mode 100644 index 0000000..29361cf --- /dev/null +++ b/npm/win32-arm64-msvc/package.json @@ -0,0 +1,32 @@ +{ + "name": "rsc-rs-win32-arm64-msvc", + "version": "1.0.0", + "os": [ + "win32" + ], + "cpu": [ + "arm64" + ], + "main": "rsc-rs.win32-arm64-msvc.node", + "files": [ + "rsc-rs.win32-arm64-msvc.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/win32-ia32-msvc/README.md b/npm/win32-ia32-msvc/README.md new file mode 100644 index 0000000..94861a0 --- /dev/null +++ b/npm/win32-ia32-msvc/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-win32-ia32-msvc` + +This is the **i686-pc-windows-msvc** binary for `rsc-rs` diff --git a/npm/win32-ia32-msvc/package.json b/npm/win32-ia32-msvc/package.json new file mode 100644 index 0000000..0cbfb59 --- /dev/null +++ b/npm/win32-ia32-msvc/package.json @@ -0,0 +1,32 @@ +{ + "name": "rsc-rs-win32-ia32-msvc", + "version": "1.0.0", + "os": [ + "win32" + ], + "cpu": [ + "ia32" + ], + "main": "rsc-rs.win32-ia32-msvc.node", + "files": [ + "rsc-rs.win32-ia32-msvc.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/npm/win32-x64-msvc/README.md b/npm/win32-x64-msvc/README.md new file mode 100644 index 0000000..6617975 --- /dev/null +++ b/npm/win32-x64-msvc/README.md @@ -0,0 +1,3 @@ +# `rsc-rs-win32-x64-msvc` + +This is the **x86_64-pc-windows-msvc** binary for `rsc-rs` diff --git a/npm/win32-x64-msvc/package.json b/npm/win32-x64-msvc/package.json new file mode 100644 index 0000000..0e8a57a --- /dev/null +++ b/npm/win32-x64-msvc/package.json @@ -0,0 +1,32 @@ +{ + "name": "rsc-rs-win32-x64-msvc", + "version": "1.0.0", + "os": [ + "win32" + ], + "cpu": [ + "x64" + ], + "main": "rsc-rs.win32-x64-msvc.node", + "files": [ + "rsc-rs.win32-x64-msvc.node" + ], + "description": "Template project for writing node package with napi-rs", + "keywords": [ + "napi-rs", + "NAPI", + "N-API", + "Rust", + "node-addon", + "node-addon-api" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "repository": "git@github.com:himself65/react-server.git" +} diff --git a/package.json b/package.json index 28fb424..de9e8e4 100644 --- a/package.json +++ b/package.json @@ -1,27 +1,82 @@ { - "name": "swc-plugin-react-server", - "version": "0.2.2", - "author": "himself65 ", + "name": "rsc-rs", + "version": "0.2.0", + "main": "index.js", + "types": "index.d.ts", + "napi": { + "name": "rsc-rs", + "triples": { + "defaults": true, + "additional": [ + "x86_64-unknown-linux-musl", + "aarch64-unknown-linux-gnu", + "i686-pc-windows-msvc", + "armv7-unknown-linux-gnueabihf", + "aarch64-apple-darwin", + "aarch64-linux-android", + "x86_64-unknown-freebsd", + "aarch64-unknown-linux-musl", + "aarch64-pc-windows-msvc", + "armv7-linux-androideabi" + ] + } + }, "license": "MIT", - "type": "module", - "main": "target/wasm32-wasi/release/react_server.wasm", - "exports": { - ".": "./target/wasm32-wasi/release/react_server.wasm" + "devDependencies": { + "@napi-rs/cli": "^3.0.0-alpha.55", + "@swc-node/register": "^1.10.0", + "@swc/core": "^1.6.5", + "@taplo/cli": "^0.7.0", + "ava": "^6.1.3", + "benny": "^3.7.1", + "chalk": "^5.3.0", + "emnapi": "^1.1.1", + "husky": "^9.0.11", + "lint-staged": "^15.2.2", + "npm-run-all2": "^6.1.2", + "oxlint": "^0.5.0", + "prettier": "^3.2.5", + "typescript": "^5.5.2" + }, + "lint-staged": { + "*.@(js|ts|tsx)": [ + "eslint --fix" + ], + "*.@(js|ts|tsx|yml|yaml|md|json)": [ + "prettier --write" + ], + "*.toml": [ + "taplo format" + ] + }, + "ava": { + "require": [ + "@swc-node/register" + ], + "extensions": [ + "ts" + ], + "timeout": "2m", + "workerThreads": false, + "environmentVariables": { + "TS_NODE_PROJECT": "./tsconfig.json" + } + }, + "prettier": { + "printWidth": 120, + "semi": false, + "trailingComma": "all", + "singleQuote": true, + "arrowParens": "always" }, - "keywords": [ - "swc-plugin", - "react", - "react-server" - ], "scripts": { - "prepublishOnly": "cargo build-wasi --release" + "artifacts": "napi artifacts", + "build": "napi build --platform --release", + "build:debug": "napi build --platform", + "prepublishOnly": "napi prepublish -t npm", + "test": "ava ./tests", + "universal": "napi universal", + "version": "napi version" }, - "files": [ - "lib", - "target/wasm32-wasi/release/react_server.wasm" - ], - "preferUnplugged": true, - "devDependencies": { - "@swc/core": "^1.6.1" - } + "packageManager": "pnpm@9.4.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 71fb493..e058ba5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,78 +5,665 @@ settings: excludeLinksFromLockfile: false importers: - .: devDependencies: + '@napi-rs/cli': + specifier: ^3.0.0-alpha.55 + version: 3.0.0-alpha.55(@emnapi/runtime@1.2.0)(emnapi@1.2.0) + '@swc-node/register': + specifier: ^1.10.0 + version: 1.10.0(@swc/core@1.6.5)(@swc/types@0.1.9)(typescript@5.5.2) '@swc/core': - specifier: ^1.6.1 - version: 1.6.1 + specifier: ^1.6.5 + version: 1.6.5 + '@taplo/cli': + specifier: ^0.7.0 + version: 0.7.0 + ava: + specifier: ^6.1.3 + version: 6.1.3 + benny: + specifier: ^3.7.1 + version: 3.7.1 + chalk: + specifier: ^5.3.0 + version: 5.3.0 + emnapi: + specifier: ^1.1.1 + version: 1.2.0 + husky: + specifier: ^9.0.11 + version: 9.0.11 + lint-staged: + specifier: ^15.2.2 + version: 15.2.7 + npm-run-all2: + specifier: ^6.1.2 + version: 6.2.0 + oxlint: + specifier: ^0.5.0 + version: 0.5.0 + prettier: + specifier: ^3.2.5 + version: 3.3.2 + typescript: + specifier: ^5.5.2 + version: 5.5.2 packages: + '@arrows/array@1.4.1': + resolution: + { integrity: sha512-MGYS8xi3c4tTy1ivhrVntFvufoNzje0PchjEz6G/SsWRgUKxL4tKwS6iPdO8vsaJYldagAeWMd5KRD0aX3Q39g== } + + '@arrows/composition@1.2.2': + resolution: + { integrity: sha512-9fh1yHwrx32lundiB3SlZ/VwuStPB4QakPsSLrGJFH6rCXvdrd060ivAZ7/2vlqPnEjBkPRRXOcG1YOu19p2GQ== } + + '@arrows/dispatch@1.0.3': + resolution: + { integrity: sha512-v/HwvrFonitYZM2PmBlAlCqVqxrkIIoiEuy5bQgn0BdfvlL0ooSBzcPzTMrtzY8eYktPyYcHg8fLbSgyybXEqw== } + + '@arrows/error@1.0.2': + resolution: + { integrity: sha512-yvkiv1ay4Z3+Z6oQsUkedsQm5aFdyPpkBUQs8vejazU/RmANABx6bMMcBPPHI4aW43VPQmXFfBzr/4FExwWTEA== } + + '@arrows/multimethod@1.4.1': + resolution: + { integrity: sha512-AZnAay0dgPnCJxn3We5uKiB88VL+1ZIF2SjZohLj6vqY2UyvB/sKdDnFP+LZNVsTC5lcnGPmLlRRkAh4sXkXsQ== } + + '@emnapi/core@1.2.0': + resolution: + { integrity: sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w== } + + '@emnapi/runtime@1.2.0': + resolution: + { integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ== } + + '@emnapi/wasi-threads@1.0.1': + resolution: + { integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw== } + + '@inquirer/figures@1.0.3': + resolution: + { integrity: sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw== } + engines: { node: '>=18' } + + '@mapbox/node-pre-gyp@1.0.11': + resolution: + { integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== } + hasBin: true + + '@napi-rs/cli@3.0.0-alpha.55': + resolution: + { integrity: sha512-6XgBBTX8O28W5gcSzqYkI72UVJV6Y2YcyQNrEqak39JavJRLlXCv09uLF97raynXAOO50KeP6DEXFy5P8MR2sw== } + engines: { node: '>= 16' } + hasBin: true + peerDependencies: + '@emnapi/runtime': ^1.1.0 + emnapi: ^1.1.0 + peerDependenciesMeta: + '@emnapi/runtime': + optional: true + emnapi: + optional: true + + '@napi-rs/cross-toolchain@0.0.16': + resolution: + { integrity: sha512-jwdjHT5L0m9MH0CmzDwPp0ckn/UO7afHCsPeo7NugHUvYgvlgS7SWhdMVgIgJW2HHqhcW/2nhaLLGpAU1c7QRQ== } + peerDependencies: + '@napi-rs/cross-toolchain-arm64-target-aarch64': ^0.0.16 + '@napi-rs/cross-toolchain-arm64-target-armv7': ^0.0.16 + '@napi-rs/cross-toolchain-arm64-target-x86_64': ^0.0.16 + '@napi-rs/cross-toolchain-x64-target-aarch64': ^0.0.16 + '@napi-rs/cross-toolchain-x64-target-armv7': ^0.0.16 + '@napi-rs/cross-toolchain-x64-target-x86_64': ^0.0.16 + peerDependenciesMeta: + '@napi-rs/cross-toolchain-arm64-target-aarch64': + optional: true + '@napi-rs/cross-toolchain-arm64-target-armv7': + optional: true + '@napi-rs/cross-toolchain-arm64-target-x86_64': + optional: true + '@napi-rs/cross-toolchain-x64-target-aarch64': + optional: true + '@napi-rs/cross-toolchain-x64-target-armv7': + optional: true + '@napi-rs/cross-toolchain-x64-target-x86_64': + optional: true + + '@napi-rs/lzma-android-arm-eabi@1.3.1': + resolution: + { integrity: sha512-mtGOg8jXlc+pTBI86cqohfndS9UmOAkk9d5CChKMb8btVks70yhUN1e7YYS3QFbmoxbPs2Ee+wmuH1Khdc7B2w== } + engines: { node: '>= 10' } + cpu: [arm] + os: [android] + + '@napi-rs/lzma-android-arm64@1.3.1': + resolution: + { integrity: sha512-4uGkQgAv9Tnc/i0k2eIgbhZgyzs94+iECWxz4MFZNcZ1fNGvGbRL2j+SITE4OmwrUn3TuFK/uYWfgzooq8E1Qg== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [android] + + '@napi-rs/lzma-darwin-arm64@1.3.1': + resolution: + { integrity: sha512-MZBg4iwHTS8icjTiCMdzh8kYrMmKBCEglFPa+vjI91R2XDwuuwSzqmpATRpmMH8cWUUWtGPF4fnxKzjgkzhd4Q== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [darwin] + + '@napi-rs/lzma-darwin-x64@1.3.1': + resolution: + { integrity: sha512-7vte+1lYV7xgZERKH/pjAeh4T16aQASKOzu4op70pK6VP/64Plr5rrvqxQqQmlAIe4pwyo/RkFl1n4LXDod3xg== } + engines: { node: '>= 10' } + cpu: [x64] + os: [darwin] + + '@napi-rs/lzma-freebsd-x64@1.3.1': + resolution: + { integrity: sha512-uBS74fynTqLUC3catIxyezCafn8UDlr2yxVV47vz1T6Vop2PGDz/cMQdV6rnLSjPE08Rv66ihM36mgf/MmOkOg== } + engines: { node: '>= 10' } + cpu: [x64] + os: [freebsd] + + '@napi-rs/lzma-linux-arm-gnueabihf@1.3.1': + resolution: + { integrity: sha512-rrVLyqBJeN29gPJCNkPbZ7dAzaseEcERKyhjwM+DfbFrDUvtkEcrYPvo+iwE/NmF+OkZQkzcanrVMGnq/mcJYQ== } + engines: { node: '>= 10' } + cpu: [arm] + os: [linux] + + '@napi-rs/lzma-linux-arm64-gnu@1.3.1': + resolution: + { integrity: sha512-vDmVsthRbX2opkgRirJJGKQxUP/spvyVM2Y5CyCWZ7sadSID3hA97r38gf9ISn/sJ8/r93IPWLq+iycudNKi+Q== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + + '@napi-rs/lzma-linux-arm64-musl@1.3.1': + resolution: + { integrity: sha512-x4m/J3hRdFd3IoqKc+4aBcSUkcuDEP7hH6vdss8bKNLjPfXmnG/lcHJEQX3hNnNOULPP8xVRxgiY8jeL62cnsw== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + + '@napi-rs/lzma-linux-x64-gnu@1.3.1': + resolution: + { integrity: sha512-riB+Xg72NfH8Kcpq07omshVu0QsLW0v2bhywBNYxvA+t2dGGWSIEN1U/zazUXys+IEA6pBQKqLVseurWE6Cl8g== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + + '@napi-rs/lzma-linux-x64-musl@1.3.1': + resolution: + { integrity: sha512-JXLgJFwoeysxdSg7rdVYP8wrliCQVJlU5JcLYjRVSCL4P0mQTjnYi7R7VdaOkDACw/Fvlji7oIJXt0KiaDTcOw== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + + '@napi-rs/lzma-wasm32-wasi@1.3.1': + resolution: + { integrity: sha512-XTA9XTUtj0KPKuzNS2oi3bWN6tJodk00wwMd/TiKoEqx9Fe/zu+OfDGuXAn+xs+P7S3YCDHqjYinuTQMZ0ucJw== } + engines: { node: '>=14.0.0' } + cpu: [wasm32] + + '@napi-rs/lzma-win32-arm64-msvc@1.3.1': + resolution: + { integrity: sha512-qLDfs9UEtLPPTN/FdSz3gSdlx86VwFQBuLBrQtaiYQtUTKZCOYV1Z1fXqFt5Zqa1HKV2oyXnwGcTI7RpcyXxtg== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [win32] + + '@napi-rs/lzma-win32-ia32-msvc@1.3.1': + resolution: + { integrity: sha512-rWNlxLFMIfvxzfdQCfeQ3D/HEnQG3vfladFYrXUx6ePXO6r+BLCGn6/LWSSuKlw4vKkb1iHEWsAVaRLIcJEMIA== } + engines: { node: '>= 10' } + cpu: [ia32] + os: [win32] + + '@napi-rs/lzma-win32-x64-msvc@1.3.1': + resolution: + { integrity: sha512-SNfHNqEjabXfTL1+KRi0qiAhwIlZHhQystvfSYX6p1g+2trSC/3WUpUQ4fbbR7KyE31g2AAnwjXivnlQ0af/pg== } + engines: { node: '>= 10' } + cpu: [x64] + os: [win32] + + '@napi-rs/lzma@1.3.1': + resolution: + { integrity: sha512-XyZoBlYNMvCulK/RmVK/0nB3j7IdH7HpqcrMMg0U+HqQqKRLOQBwvnKNBocPC1bZQ7iZuKWYTLn1ayZwTyek8w== } + engines: { node: '>= 10' } + + '@napi-rs/tar-android-arm-eabi@0.1.1': + resolution: + { integrity: sha512-Ufa0ahZvE5KGrC2WBux5svCe/jvC+e8IgtleiicwqnfgTfbDknYyq/QuqkP1AnMp/IvTmx2iutCZt6OFIG0zAg== } + engines: { node: '>= 10' } + cpu: [arm] + os: [android] + + '@napi-rs/tar-android-arm64@0.1.1': + resolution: + { integrity: sha512-KUu5fHIiIObSuZ/crHxUrQ243+LiCRKPwdCVLHwjtftqFjzls+R2Mp6GrpM41XxexDMN00SUta3kazi93Xr19A== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [android] + + '@napi-rs/tar-darwin-arm64@0.1.1': + resolution: + { integrity: sha512-jaqgdX20iIga+2gzotQ78eF00Cm8vECocUYeMY62WqyzJNv/jx1dlOfELWEccOjpmawFT9tjWebsS9F1QMvSUg== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [darwin] + + '@napi-rs/tar-darwin-x64@0.1.1': + resolution: + { integrity: sha512-80sa32IxfRso9x9sGTFpfLSx3BnruyJODpSkUzalOCz9i14n5gOKA8KR/JrnSWwDz0p5l5P9kfQD3pu8Voj7WA== } + engines: { node: '>= 10' } + cpu: [x64] + os: [darwin] + + '@napi-rs/tar-freebsd-x64@0.1.1': + resolution: + { integrity: sha512-P7V1zBjjC1dCrTwtUzuzYM4AeZduigeCtd8qQw2IUZowM5AsmhMd77oYuXjdU29cEpKUpyYjJRxjPCzFy+WbAQ== } + engines: { node: '>= 10' } + cpu: [x64] + os: [freebsd] + + '@napi-rs/tar-linux-arm-gnueabihf@0.1.1': + resolution: + { integrity: sha512-qpC71ILPkWKt8k1iJCYt5gjwcOkd2VFSQIelTRr12t5CVNKV04rE/TMdwFoCP7kxbtb9Fl2cZzCRISw2BhMCmQ== } + engines: { node: '>= 10' } + cpu: [arm] + os: [linux] + + '@napi-rs/tar-linux-arm64-gnu@0.1.1': + resolution: + { integrity: sha512-71QgxcFJCog6O4Tauoge8D0ILkDGJTRk3ru7zG8PUFG1QXJ1kkiRikdT77YmoVxtomc9FUOt+bdEdU5Yn+3QUQ== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + + '@napi-rs/tar-linux-arm64-musl@0.1.1': + resolution: + { integrity: sha512-R2e7YEILPKc447N1hUt1zQuyy0st83HX6nhmtFywS1aOj76/3hzxLVrebGiiS6kifyCrO82o66CNTYe7DixMZw== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + + '@napi-rs/tar-linux-x64-gnu@0.1.1': + resolution: + { integrity: sha512-tmy9q2LXUB2GQ+IgUzJn3+us52leplMu96ORyFq1iHQEelGSqXt4xi5DzU07JhX3obJPqVqkybtcRS4enBfmBA== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + + '@napi-rs/tar-linux-x64-musl@0.1.1': + resolution: + { integrity: sha512-j5ePbe6vihApl0cGPPDUVTWZbf2mF4NhxngAoG2jp7AeX3cWP2O4pjsvaOraW6QfvWEMFPeER7S0b6eBS7duvA== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + + '@napi-rs/tar-wasm32-wasi@0.1.1': + resolution: + { integrity: sha512-se0+DlOiIRt7mcz7BeOJDoZtCrROpKLwiAOGmNgrjQ/SZS7TnOPuwm3wy9XN9WLoepttEjCEem6UP8yD5GJuQg== } + engines: { node: '>=14.0.0' } + cpu: [wasm32] + + '@napi-rs/tar-win32-arm64-msvc@0.1.1': + resolution: + { integrity: sha512-FDZPi2wC7RwzvodogigLh/pJvhqCTVTUqOYuHlLkPSUbSAGiEkI55wk9RqH3y3EdJQaDuzyqC0QKz5ket2U+GA== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [win32] + + '@napi-rs/tar-win32-ia32-msvc@0.1.1': + resolution: + { integrity: sha512-OPR9Tou5z5M912G7Kc7gkf1ltinbOQx5dS/OeDIWHvPGOfdFDIxt0YVKhzSLRJi43+zIDp8/+cbeMD/cKXfX8w== } + engines: { node: '>= 10' } + cpu: [ia32] + os: [win32] + + '@napi-rs/tar-win32-x64-msvc@0.1.1': + resolution: + { integrity: sha512-hiv5KfhrMSg8tTRC2oQXVckVg1h6ZVjwbd5aF9Esl0V3p2TaNFwwbqgnAN4Gm/PmSnHWNL/IRTHkk3cOzDWihQ== } + engines: { node: '>= 10' } + cpu: [x64] + os: [win32] + + '@napi-rs/tar@0.1.1': + resolution: + { integrity: sha512-FOMhwwlvoYjHaDBxP26K3D92ltw1Y/CC4CIjgC6qXdzW4MYNwTlEyI58smCM3k+nCVJH3kpOYyH3sgbK4WZA4A== } + engines: { node: '>= 10' } + + '@napi-rs/wasm-runtime@0.2.4': + resolution: + { integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ== } + + '@napi-rs/wasm-tools-android-arm-eabi@0.0.2': + resolution: + { integrity: sha512-/b+UU3suXjW4P0DzHRNdrnebQtFKcQf/YMeZJH+xUlKgvwli5kbmWjx8Wqqz0VETVkUTuPqJMBDIVLyc+14FGw== } + engines: { node: '>= 10' } + cpu: [arm] + os: [android] + + '@napi-rs/wasm-tools-android-arm64@0.0.2': + resolution: + { integrity: sha512-j57GbDflwJdZtT8pZj5fOV4JAP+LdKN+wzsUYs+QRUoBqpWbbUANudolqfw63bkS9sD4z7fbCuz8iwtJqzxTVA== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [android] + + '@napi-rs/wasm-tools-darwin-arm64@0.0.2': + resolution: + { integrity: sha512-P2ChgWgVuv9GwmbxN89R84KzIImoTqXINteEixUvmkdnhyFiR+I8deNs89Yed+5w8QLC6MEfrtRqLP9YI+NoQA== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [darwin] + + '@napi-rs/wasm-tools-darwin-x64@0.0.2': + resolution: + { integrity: sha512-T/kQQ0gt8+wau1Z821PKVAD76QhmwVoLs2CT7Z9tTBs2pJvwSCP0C/kQiQAHcJIMi7A2E9Ab/Mez0BERy50EFA== } + engines: { node: '>= 10' } + cpu: [x64] + os: [darwin] + + '@napi-rs/wasm-tools-freebsd-x64@0.0.2': + resolution: + { integrity: sha512-GnnHu+r5sfzuxC/1J5UMF/h3BOZnHb3NQZ5hmbCfZYCKzpzRxrAJhzRunlbRN+v0x8M/49dztVTYR3s7K4ooAw== } + engines: { node: '>= 10' } + cpu: [x64] + os: [freebsd] + + '@napi-rs/wasm-tools-linux-arm64-gnu@0.0.2': + resolution: + { integrity: sha512-KnZdLT0OnKb1CG2kdt3/WvM43vr9i+FEwXCvSOVC/6Tsifz7ynhMg7LAVESILd03HubzQJfg9nbRsk0bQ+IOwg== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + + '@napi-rs/wasm-tools-linux-arm64-musl@0.0.2': + resolution: + { integrity: sha512-HkpZOID2U8P6pWqK3mqZ8bxU5xcuT3iA2fO+jrxn78h006iYgfNmdc5JaVhHnHazMmk32xKhSV4iV0VUh8UWDg== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + + '@napi-rs/wasm-tools-linux-x64-gnu@0.0.2': + resolution: + { integrity: sha512-YksJWBCyOalB9ogtP9+/dZKP+vR6+h7BmzMXaXMT71WW/GvIsifMVgv+DY/FRSNJQupp5Y+ugjqVAOUOc/G65g== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + + '@napi-rs/wasm-tools-linux-x64-musl@0.0.2': + resolution: + { integrity: sha512-sPtRxPMdw05KdTcxgSPMmSXG2+PiK3vJ/l2+g9hvjnnKtvslJN2Hr7j8zgzuoKRAUFPaJVe6+D2xVh5cpdqhww== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + + '@napi-rs/wasm-tools-wasm32-wasi@0.0.2': + resolution: + { integrity: sha512-muRvZK7AIuo88G2AxYx3gA59rHMQgoN004saQkBvXnz3K/DVHKfTZ6TtUebss8zI3dURU6xExL8drxFWYxjEbQ== } + engines: { node: '>=14.0.0' } + cpu: [wasm32] + + '@napi-rs/wasm-tools-win32-arm64-msvc@0.0.2': + resolution: + { integrity: sha512-Cn13WQ+tpFqdVwx0DIWKbsI9auFyzVZV4F5UNOUeDt6GgOL+NndgJul0Pc9bSU6fi03AylMPfF/nTCaDWO2Wgw== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [win32] + + '@napi-rs/wasm-tools-win32-ia32-msvc@0.0.2': + resolution: + { integrity: sha512-xsg5DkIQi82a8rcx6246Y3XC8TIqHamY+/C6sIlPLaZEuHctDkMECAw0AANwRf5vN//D2oo2oljOuoYtB1GOKw== } + engines: { node: '>= 10' } + cpu: [ia32] + os: [win32] + + '@napi-rs/wasm-tools-win32-x64-msvc@0.0.2': + resolution: + { integrity: sha512-yHigltEt33eq8bappvKsIliz4MxfMPn1M+NWbIFRWN+IS1Z57mhmc1osuk+IRXrSlq0Tom0R6MYN1jpkZKz81Q== } + engines: { node: '>= 10' } + cpu: [x64] + os: [win32] + + '@napi-rs/wasm-tools@0.0.2': + resolution: + { integrity: sha512-kBvDQCP5BLw2TxTENXLp3Of7vVEx0uyIye824JHE4dduzzOHVgSoOFVhVqAT3Fx/hLV445RVWfEqQbXMg4w/Mw== } + engines: { node: '>= 10' } + + '@nodelib/fs.scandir@2.1.5': + resolution: + { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } + engines: { node: '>= 8' } + + '@nodelib/fs.stat@2.0.5': + resolution: + { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } + engines: { node: '>= 8' } + + '@nodelib/fs.walk@1.2.8': + resolution: + { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } + engines: { node: '>= 8' } + + '@octokit/auth-token@4.0.0': + resolution: + { integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== } + engines: { node: '>= 18' } + + '@octokit/core@5.2.0': + resolution: + { integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== } + engines: { node: '>= 18' } + + '@octokit/endpoint@9.0.5': + resolution: + { integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== } + engines: { node: '>= 18' } + + '@octokit/graphql@7.1.0': + resolution: + { integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ== } + engines: { node: '>= 18' } + + '@octokit/openapi-types@22.2.0': + resolution: + { integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== } + + '@octokit/plugin-paginate-rest@11.3.1': + resolution: + { integrity: sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g== } + engines: { node: '>= 18' } + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-request-log@4.0.1': + resolution: + { integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA== } + engines: { node: '>= 18' } + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-rest-endpoint-methods@13.2.2': + resolution: + { integrity: sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA== } + engines: { node: '>= 18' } + peerDependencies: + '@octokit/core': ^5 + + '@octokit/request-error@5.1.0': + resolution: + { integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q== } + engines: { node: '>= 18' } + + '@octokit/request@8.4.0': + resolution: + { integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw== } + engines: { node: '>= 18' } + + '@octokit/rest@20.1.1': + resolution: + { integrity: sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw== } + engines: { node: '>= 18' } + + '@octokit/types@13.5.0': + resolution: + { integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ== } + + '@oxlint/darwin-arm64@0.5.0': + resolution: + { integrity: sha512-1WS+jX0cw6Xq7BM5NkBm0hIVf1CVwaHYFyfpVwDS84kcryGPrfEGepW+J2nquQK3iu8squCA5mBMIKWrdpzCGg== } + cpu: [arm64] + os: [darwin] + + '@oxlint/darwin-x64@0.5.0': + resolution: + { integrity: sha512-EC3rLi0PmO7ts2EUmn+pVlTz4szFT/FOqqkeX1gcHPFfh7I+mE7DMBTnmDSZvU0SVSrMvIW2u/tVvZ7mie+UTA== } + cpu: [x64] + os: [darwin] - '@swc/core-darwin-arm64@1.6.1': - resolution: {integrity: sha512-u6GdwOXsOEdNAdSI6nWq6G2BQw5HiSNIZVcBaH1iSvBnxZvWbnIKyDiZKaYnDwTLHLzig2GuUjjE2NaCJPy4jg==} - engines: {node: '>=10'} + '@oxlint/linux-arm64-gnu@0.5.0': + resolution: + { integrity: sha512-yosA5HkNs9LjaO2NR4nhr7Jjfdsci2ctDBrjvPNez0G4NGgIMSyIhWnLn9xzv6aws1hMUaO5qd+POxWJ1SB0+A== } + cpu: [arm64] + os: [linux] + + '@oxlint/linux-arm64-musl@0.5.0': + resolution: + { integrity: sha512-B9u5Hz8a6NmCspJFkAfMSEhddZXa7QUn8JbHGB62aReY/kl+DAyRTZ4gbPQzfPmTd7zbr1vvqiU24dzAMxS9jw== } + cpu: [arm64] + os: [linux] + + '@oxlint/linux-x64-gnu@0.5.0': + resolution: + { integrity: sha512-9X4d2GARKK7WnHcMSdKeXLsnrNwRK9T9/C2YSxVfYEgBUqXza8L9ACbGH1v2BUm1ScHzKOakpRQ3XKD2Xe/G1w== } + cpu: [x64] + os: [linux] + + '@oxlint/linux-x64-musl@0.5.0': + resolution: + { integrity: sha512-fv3GE5PXtvrl1q9ZrF55ImoRgehPuD56c8FqGGd88Aj4Uo1pDHYpNtmlm6RHdicAkwIytrpzc3o/uuxYb89/Zw== } + cpu: [x64] + os: [linux] + + '@oxlint/win32-arm64@0.5.0': + resolution: + { integrity: sha512-wd5HqczvEFqs8YeIkeGC6vDD7LodNPjMcJrnD3zxXHkHFrn/vPPk8jLLLq6YyfmudPwOV+Rfjq7TvvWqOfloaQ== } + cpu: [arm64] + os: [win32] + + '@oxlint/win32-x64@0.5.0': + resolution: + { integrity: sha512-upNYLh71F9pAh3m79a1K6Tm4IHYbDdkmRBdwUc3Kdz3jXw0vDBH2KsfUP6YitJKvTn6gzryzf7O7LNRh3rp75Q== } + cpu: [x64] + os: [win32] + + '@rollup/pluginutils@4.2.1': + resolution: + { integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== } + engines: { node: '>= 8.0.0' } + + '@sindresorhus/merge-streams@2.3.0': + resolution: + { integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== } + engines: { node: '>=18' } + + '@swc-node/core@1.13.1': + resolution: + { integrity: sha512-emB5l2nZsXjUEAuusqjYvWnQMLWZp6K039Mv8aq5SX1rsNM/N7DNhw1i4/DX7AyzNZ0tT+ASWyTvqEURldp5HA== } + engines: { node: '>= 10' } + peerDependencies: + '@swc/core': '>= 1.4.13' + '@swc/types': '>= 0.1' + + '@swc-node/register@1.10.0': + resolution: + { integrity: sha512-38w10C3fWLi5nd1BltCjj75p5JUn35o8Qvp9yg4y59WrOMLqJ2vzjUva/v7E5IxpY7irE9RMovoxI6uF8/QXJg== } + peerDependencies: + '@swc/core': '>= 1.4.13' + typescript: '>= 4.3' + + '@swc-node/sourcemap-support@0.5.0': + resolution: + { integrity: sha512-fbhjL5G0YvFoWwNhWleuBUfotiX+USiA9oJqu9STFw+Hb0Cgnddn+HVS/K5fI45mn92e8V+cHD2jgFjk4w2T9Q== } + + '@swc/core-darwin-arm64@1.6.5': + resolution: + { integrity: sha512-RGQhMdni2v1/ANQ/2K+F+QYdzaucekYBewZcX1ogqJ8G5sbPaBdYdDN1qQ4kHLCIkPtGP6qC7c71qPEqL2RidQ== } + engines: { node: '>=10' } cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.6.1': - resolution: {integrity: sha512-/tXwQibkDNLVbAtr7PUQI0iQjoB708fjhDDDfJ6WILSBVZ3+qs/LHjJ7jHwumEYxVq1XA7Fv2Q7SE/ZSQoWHcQ==} - engines: {node: '>=10'} + '@swc/core-darwin-x64@1.6.5': + resolution: + { integrity: sha512-/pSN0/Jtcbbb9+ovS9rKxR3qertpFAM3OEJr/+Dh/8yy7jK5G5EFPIrfsw/7Q5987ERPIJIH6BspK2CBB2tgcg== } + engines: { node: '>=10' } cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.6.1': - resolution: {integrity: sha512-aDgipxhJTms8iH78emHVutFR2c16LNhO+NTRCdYi+X4PyIn58/DyYTH6VDZ0AeEcS5f132ZFldU5AEgExwihXA==} - engines: {node: '>=10'} + '@swc/core-linux-arm-gnueabihf@1.6.5': + resolution: + { integrity: sha512-B0g/dROCE747RRegs/jPHuKJgwXLracDhnqQa80kFdgWEMjlcb7OMCgs5OX86yJGRS4qcYbiMGD0Pp7Kbqn3yw== } + engines: { node: '>=10' } cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.6.1': - resolution: {integrity: sha512-XkJ+eO4zUKG5g458RyhmKPyBGxI0FwfWFgpfIj5eDybxYJ6s4HBT5MoxyBLorB5kMlZ0XoY/usUMobPVY3nL0g==} - engines: {node: '>=10'} + '@swc/core-linux-arm64-gnu@1.6.5': + resolution: + { integrity: sha512-W8meapgXTq8AOtSvDG4yKR8ant2WWD++yOjgzAleB5VAC+oC+aa8YJROGxj8HepurU8kurqzcialwoMeq5SZZQ== } + engines: { node: '>=10' } cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.6.1': - resolution: {integrity: sha512-dr6YbLBg/SsNxs1hDqJhxdcrS8dGMlOXJwXIrUvACiA8jAd6S5BxYCaqsCefLYXtaOmu0bbx1FB/evfodqB70Q==} - engines: {node: '>=10'} + '@swc/core-linux-arm64-musl@1.6.5': + resolution: + { integrity: sha512-jyCKqoX50Fg8rJUQqh4u5PqnE7nqYKXHjVH2WcYr114/MU21zlsI+YL6aOQU1XP8bJQ2gPQ1rnlnGJdEHiKS/w== } + engines: { node: '>=10' } cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.6.1': - resolution: {integrity: sha512-A0b/3V+yFy4LXh3O9umIE7LXPC7NBWdjl6AQYqymSMcMu0EOb1/iygA6s6uWhz9y3e172Hpb9b/CGsuD8Px/bg==} - engines: {node: '>=10'} + '@swc/core-linux-x64-gnu@1.6.5': + resolution: + { integrity: sha512-G6HmUn/RRIlXC0YYFfBz2qh6OZkHS/KUPkhoG4X9ADcgWXXjOFh6JrefwsYj8VBAJEnr5iewzjNfj+nztwHaeA== } + engines: { node: '>=10' } cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.6.1': - resolution: {integrity: sha512-5dJjlzZXhC87nZZZWbpiDP8kBIO0ibis893F/rtPIQBI5poH+iJuA32EU3wN4/WFHeK4et8z6SGSVghPtWyk4g==} - engines: {node: '>=10'} + '@swc/core-linux-x64-musl@1.6.5': + resolution: + { integrity: sha512-AQpBjBnelQDSbeTJA50AXdS6+CP66LsXIMNTwhPSgUfE7Bx1ggZV11Fsi4Q5SGcs6a8Qw1cuYKN57ZfZC5QOuA== } + engines: { node: '>=10' } cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.6.1': - resolution: {integrity: sha512-HBi1ZlwvfcUibLtT3g/lP57FaDPC799AD6InolB2KSgkqyBbZJ9wAXM8/CcH67GLIP0tZ7FqblrJTzGXxetTJQ==} - engines: {node: '>=10'} + '@swc/core-win32-arm64-msvc@1.6.5': + resolution: + { integrity: sha512-MZTWM8kUwS30pVrtbzSGEXtek46aXNb/mT9D6rsS7NvOuv2w+qZhjR1rzf4LNbbn5f8VnR4Nac1WIOYZmfC5ng== } + engines: { node: '>=10' } cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.6.1': - resolution: {integrity: sha512-AKqHohlWERclexar5y6ux4sQ8yaMejEXNxeKXm7xPhXrp13/1p4/I3E5bPVX/jMnvpm4HpcKSP0ee2WsqmhhPw==} - engines: {node: '>=10'} + '@swc/core-win32-ia32-msvc@1.6.5': + resolution: + { integrity: sha512-WZdu4gISAr3yOm1fVwKhhk6+MrP7kVX0KMP7+ZQFTN5zXQEiDSDunEJKVgjMVj3vlR+6mnAqa/L0V9Qa8+zKlQ== } + engines: { node: '>=10' } cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.6.1': - resolution: {integrity: sha512-0dLdTLd+ONve8kgC5T6VQ2Y5G+OZ7y0ujjapnK66wpvCBM6BKYGdT/OKhZKZydrC5gUKaxFN6Y5oOt9JOFUrOQ==} - engines: {node: '>=10'} + '@swc/core-win32-x64-msvc@1.6.5': + resolution: + { integrity: sha512-ezXgucnMTzlFIxQZw7ls/5r2hseFaRoDL04cuXUOs97E8r+nJSmFsRQm/ygH5jBeXNo59nyZCalrjJAjwfgACA== } + engines: { node: '>=10' } cpu: [x64] os: [win32] - '@swc/core@1.6.1': - resolution: {integrity: sha512-Yz5uj5hNZpS5brLtBvKY0L4s2tBAbQ4TjmW8xF1EC3YLFxQRrUjMP49Zm1kp/KYyYvTkSaG48Ffj2YWLu9nChw==} - engines: {node: '>=10'} + '@swc/core@1.6.5': + resolution: + { integrity: sha512-tyVvUK/HDOUUsK6/GmWvnqUtD9oDpPUA4f7f7JCOV8hXxtfjMtAZeBKf93yrB1XZet69TDR7EN0hFC6i4MF0Ig== } + engines: { node: '>=10' } peerDependencies: '@swc/helpers': '*' peerDependenciesMeta: @@ -84,61 +671,2840 @@ packages: optional: true '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + resolution: + { integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== } - '@swc/types@0.1.8': - resolution: {integrity: sha512-RNFA3+7OJFNYY78x0FYwi1Ow+iF1eF5WvmfY1nXPOEH4R2p/D4Cr1vzje7dNAI2aLFqpv8Wyz4oKSWqIZArpQA==} + '@swc/types@0.1.9': + resolution: + { integrity: sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg== } -snapshots: + '@taplo/cli@0.7.0': + resolution: + { integrity: sha512-Ck3zFhQhIhi02Hl6T4ZmJsXdnJE+wXcJz5f8klxd4keRYgenMnip3JDPMGDRLbnC/2iGd8P0sBIQqI3KxfVjBg== } + hasBin: true - '@swc/core-darwin-arm64@1.6.1': - optional: true + '@tybys/wasm-util@0.9.0': + resolution: + { integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw== } - '@swc/core-darwin-x64@1.6.1': - optional: true + '@vercel/nft@0.26.5': + resolution: + { integrity: sha512-NHxohEqad6Ra/r4lGknO52uc/GrWILXAMs1BB4401GTqww0fw1bAqzpG1XHuDO+dprg4GvsD9ZLLSsdo78p9hQ== } + engines: { node: '>=16' } + hasBin: true - '@swc/core-linux-arm-gnueabihf@1.6.1': - optional: true + abbrev@1.1.1: + resolution: + { integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== } - '@swc/core-linux-arm64-gnu@1.6.1': - optional: true + acorn-import-attributes@1.9.5: + resolution: + { integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== } + peerDependencies: + acorn: ^8 - '@swc/core-linux-arm64-musl@1.6.1': - optional: true + acorn-walk@8.3.3: + resolution: + { integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== } + engines: { node: '>=0.4.0' } - '@swc/core-linux-x64-gnu@1.6.1': - optional: true + acorn@8.12.0: + resolution: + { integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== } + engines: { node: '>=0.4.0' } + hasBin: true - '@swc/core-linux-x64-musl@1.6.1': - optional: true + agent-base@6.0.2: + resolution: + { integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== } + engines: { node: '>= 6.0.0' } - '@swc/core-win32-arm64-msvc@1.6.1': - optional: true + ansi-escapes@4.3.2: + resolution: + { integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== } + engines: { node: '>=8' } - '@swc/core-win32-ia32-msvc@1.6.1': - optional: true + ansi-escapes@6.2.1: + resolution: + { integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig== } + engines: { node: '>=14.16' } - '@swc/core-win32-x64-msvc@1.6.1': - optional: true + ansi-regex@5.0.1: + resolution: + { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } + engines: { node: '>=8' } - '@swc/core@1.6.1': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.8 - optionalDependencies: - '@swc/core-darwin-arm64': 1.6.1 - '@swc/core-darwin-x64': 1.6.1 - '@swc/core-linux-arm-gnueabihf': 1.6.1 - '@swc/core-linux-arm64-gnu': 1.6.1 - '@swc/core-linux-arm64-musl': 1.6.1 - '@swc/core-linux-x64-gnu': 1.6.1 - '@swc/core-linux-x64-musl': 1.6.1 - '@swc/core-win32-arm64-msvc': 1.6.1 - '@swc/core-win32-ia32-msvc': 1.6.1 - '@swc/core-win32-x64-msvc': 1.6.1 + ansi-regex@6.0.1: + resolution: + { integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== } + engines: { node: '>=12' } - '@swc/counter@0.1.3': {} + ansi-styles@4.3.0: + resolution: + { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } + engines: { node: '>=8' } - '@swc/types@0.1.8': - dependencies: - '@swc/counter': 0.1.3 + ansi-styles@6.2.1: + resolution: + { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== } + engines: { node: '>=12' } + + aproba@2.0.0: + resolution: + { integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== } + + are-we-there-yet@2.0.0: + resolution: + { integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== } + engines: { node: '>=10' } + deprecated: This package is no longer supported. + + argparse@1.0.10: + resolution: + { integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== } + + argparse@2.0.1: + resolution: + { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } + + array-find-index@1.0.2: + resolution: + { integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== } + engines: { node: '>=0.10.0' } + + arrgv@1.0.2: + resolution: + { integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw== } + engines: { node: '>=8.0.0' } + + arrify@3.0.0: + resolution: + { integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== } + engines: { node: '>=12' } + + astral-regex@2.0.0: + resolution: + { integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== } + engines: { node: '>=8' } + + async-sema@3.1.1: + resolution: + { integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg== } + + ava@6.1.3: + resolution: + { integrity: sha512-tkKbpF1pIiC+q09wNU9OfyTDYZa8yuWvU2up3+lFJ3lr1RmnYh2GBpPwzYUEB0wvTPIUysGjcZLNZr7STDviRA== } + engines: { node: ^18.18 || ^20.8 || ^21 || ^22 } + hasBin: true + peerDependencies: + '@ava/typescript': '*' + peerDependenciesMeta: + '@ava/typescript': + optional: true + + balanced-match@1.0.2: + resolution: + { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + + base64-js@1.5.1: + resolution: + { integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== } + + before-after-hook@2.2.3: + resolution: + { integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== } + + benchmark@2.1.4: + resolution: + { integrity: sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ== } + + benny@3.7.1: + resolution: + { integrity: sha512-USzYxODdVfOS7JuQq/L0naxB788dWCiUgUTxvN+WLPt/JfcDURNNj8kN/N+uK6PDvuR67/9/55cVKGPleFQINA== } + engines: { node: '>=12' } + + bindings@1.5.0: + resolution: + { integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== } + + bl@4.1.0: + resolution: + { integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== } + + blueimp-md5@2.19.0: + resolution: + { integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== } + + brace-expansion@1.1.11: + resolution: + { integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== } + + brace-expansion@2.0.1: + resolution: + { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== } + + braces@3.0.3: + resolution: + { integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== } + engines: { node: '>=8' } + + buffer-from@1.1.2: + resolution: + { integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== } + + buffer@5.7.1: + resolution: + { integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== } + + callsites@4.1.0: + resolution: + { integrity: sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw== } + engines: { node: '>=12.20' } + + cbor@9.0.2: + resolution: + { integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ== } + engines: { node: '>=16' } + + chalk@4.1.2: + resolution: + { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } + engines: { node: '>=10' } + + chalk@5.3.0: + resolution: + { integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + + chardet@0.7.0: + resolution: + { integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== } + + chownr@2.0.0: + resolution: + { integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== } + engines: { node: '>=10' } + + chunkd@2.0.1: + resolution: + { integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ== } + + ci-info@4.0.0: + resolution: + { integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== } + engines: { node: '>=8' } + + ci-parallel-vars@1.0.1: + resolution: + { integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg== } + + cli-cursor@3.1.0: + resolution: + { integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== } + engines: { node: '>=8' } + + cli-cursor@4.0.0: + resolution: + { integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + cli-spinners@2.9.2: + resolution: + { integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== } + engines: { node: '>=6' } + + cli-truncate@4.0.0: + resolution: + { integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== } + engines: { node: '>=18' } + + cli-width@4.1.0: + resolution: + { integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== } + engines: { node: '>= 12' } + + clipanion@3.2.1: + resolution: + { integrity: sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA== } + peerDependencies: + typanion: '*' + + cliui@8.0.1: + resolution: + { integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== } + engines: { node: '>=12' } + + clone@1.0.4: + resolution: + { integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== } + engines: { node: '>=0.8' } + + code-excerpt@4.0.0: + resolution: + { integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + color-convert@2.0.1: + resolution: + { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } + engines: { node: '>=7.0.0' } + + color-name@1.1.4: + resolution: + { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } + + color-support@1.1.3: + resolution: + { integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== } + hasBin: true + + colorette@2.0.20: + resolution: + { integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== } + + commander@12.1.0: + resolution: + { integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== } + engines: { node: '>=18' } + + commander@6.2.1: + resolution: + { integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== } + engines: { node: '>= 6' } + + common-path-prefix@3.0.0: + resolution: + { integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== } + + common-tags@1.8.2: + resolution: + { integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== } + engines: { node: '>=4.0.0' } + + concat-map@0.0.1: + resolution: + { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } + + concordance@5.0.4: + resolution: + { integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== } + engines: { node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14' } + + console-control-strings@1.1.0: + resolution: + { integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== } + + convert-to-spaces@2.0.1: + resolution: + { integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + cross-spawn@7.0.3: + resolution: + { integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== } + engines: { node: '>= 8' } + + currently-unhandled@0.4.1: + resolution: + { integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng== } + engines: { node: '>=0.10.0' } + + date-time@3.1.0: + resolution: + { integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== } + engines: { node: '>=6' } + + debug@4.3.5: + resolution: + { integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== } + engines: { node: '>=6.0' } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + defaults@1.0.4: + resolution: + { integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== } + + delegates@1.0.0: + resolution: + { integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== } + + deprecation@2.3.1: + resolution: + { integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== } + + detect-libc@2.0.3: + resolution: + { integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== } + engines: { node: '>=8' } + + emittery@1.0.3: + resolution: + { integrity: sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA== } + engines: { node: '>=14.16' } + + emnapi@1.2.0: + resolution: + { integrity: sha512-rcq+dJCcfr08I0XM/57LPRqaUokGfni/+SvhO7NaJthTTjRdohhIy0FQwyC5rR1enAsjkldQg83th8J5hURv0Q== } + peerDependencies: + node-addon-api: '>= 6.1.0' + peerDependenciesMeta: + node-addon-api: + optional: true + + emoji-regex@10.3.0: + resolution: + { integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== } + + emoji-regex@8.0.0: + resolution: + { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } + + escalade@3.1.2: + resolution: + { integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== } + engines: { node: '>=6' } + + escape-string-regexp@2.0.0: + resolution: + { integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== } + engines: { node: '>=8' } + + escape-string-regexp@5.0.0: + resolution: + { integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== } + engines: { node: '>=12' } + + esprima@4.0.1: + resolution: + { integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== } + engines: { node: '>=4' } + hasBin: true + + estree-walker@2.0.2: + resolution: + { integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== } + + esutils@2.0.3: + resolution: + { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } + engines: { node: '>=0.10.0' } + + eventemitter3@5.0.1: + resolution: + { integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== } + + execa@8.0.1: + resolution: + { integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== } + engines: { node: '>=16.17' } + + external-editor@3.1.0: + resolution: + { integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== } + engines: { node: '>=4' } + + fast-deep-equal@3.1.3: + resolution: + { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } + + fast-diff@1.3.0: + resolution: + { integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== } + + fast-glob@3.3.2: + resolution: + { integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== } + engines: { node: '>=8.6.0' } + + fastq@1.17.1: + resolution: + { integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== } + + figures@6.1.0: + resolution: + { integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg== } + engines: { node: '>=18' } + + file-uri-to-path@1.0.0: + resolution: + { integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== } + + fill-range@7.1.1: + resolution: + { integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== } + engines: { node: '>=8' } + + find-up-simple@1.0.0: + resolution: + { integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw== } + engines: { node: '>=18' } + + fs-extra@10.1.0: + resolution: + { integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== } + engines: { node: '>=12' } + + fs-minipass@2.1.0: + resolution: + { integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== } + engines: { node: '>= 8' } + + fs.realpath@1.0.0: + resolution: + { integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== } + + gauge@3.0.2: + resolution: + { integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== } + engines: { node: '>=10' } + deprecated: This package is no longer supported. + + get-caller-file@2.0.5: + resolution: + { integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== } + engines: { node: 6.* || 8.* || >= 10.* } + + get-east-asian-width@1.2.0: + resolution: + { integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== } + engines: { node: '>=18' } + + get-stream@8.0.1: + resolution: + { integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== } + engines: { node: '>=16' } + + glob-parent@5.1.2: + resolution: + { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } + engines: { node: '>= 6' } + + glob@7.2.3: + resolution: + { integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== } + deprecated: Glob versions prior to v9 are no longer supported + + globby@14.0.1: + resolution: + { integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ== } + engines: { node: '>=18' } + + graceful-fs@4.2.11: + resolution: + { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } + + has-flag@4.0.0: + resolution: + { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } + engines: { node: '>=8' } + + has-unicode@2.0.1: + resolution: + { integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== } + + https-proxy-agent@5.0.1: + resolution: + { integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== } + engines: { node: '>= 6' } + + human-signals@5.0.0: + resolution: + { integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== } + engines: { node: '>=16.17.0' } + + husky@9.0.11: + resolution: + { integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== } + engines: { node: '>=18' } + hasBin: true + + iconv-lite@0.4.24: + resolution: + { integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== } + engines: { node: '>=0.10.0' } + + ieee754@1.2.1: + resolution: + { integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== } + + ignore-by-default@2.1.0: + resolution: + { integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw== } + engines: { node: '>=10 <11 || >=12 <13 || >=14' } + + ignore@5.3.1: + resolution: + { integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== } + engines: { node: '>= 4' } + + imurmurhash@0.1.4: + resolution: + { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } + engines: { node: '>=0.8.19' } + + indent-string@5.0.0: + resolution: + { integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== } + engines: { node: '>=12' } + + inflight@1.0.6: + resolution: + { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== } + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: + { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } + + inquirer@9.3.1: + resolution: + { integrity: sha512-A5IdVr1I04XqPlwrGgTJMKmzRg5ropqNpSeqo0vj1ZmluSCNSFaPZz4eazdPrhVcZfej7fCEYvD2NYa1KjkTJA== } + engines: { node: '>=18' } + + irregular-plurals@3.5.0: + resolution: + { integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ== } + engines: { node: '>=8' } + + is-extglob@2.1.1: + resolution: + { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } + engines: { node: '>=0.10.0' } + + is-fullwidth-code-point@3.0.0: + resolution: + { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } + engines: { node: '>=8' } + + is-fullwidth-code-point@4.0.0: + resolution: + { integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== } + engines: { node: '>=12' } + + is-fullwidth-code-point@5.0.0: + resolution: + { integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== } + engines: { node: '>=18' } + + is-glob@4.0.3: + resolution: + { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } + engines: { node: '>=0.10.0' } + + is-interactive@1.0.0: + resolution: + { integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== } + engines: { node: '>=8' } + + is-number@7.0.0: + resolution: + { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } + engines: { node: '>=0.12.0' } + + is-plain-object@5.0.0: + resolution: + { integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== } + engines: { node: '>=0.10.0' } + + is-promise@4.0.0: + resolution: + { integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== } + + is-stream@3.0.0: + resolution: + { integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + is-unicode-supported@0.1.0: + resolution: + { integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== } + engines: { node: '>=10' } + + is-unicode-supported@2.0.0: + resolution: + { integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q== } + engines: { node: '>=18' } + + isexe@2.0.0: + resolution: + { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } + + js-string-escape@1.0.1: + resolution: + { integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== } + engines: { node: '>= 0.8' } + + js-yaml@3.14.1: + resolution: + { integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== } + hasBin: true + + js-yaml@4.1.0: + resolution: + { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } + hasBin: true + + json-parse-even-better-errors@3.0.2: + resolution: + { integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + json2csv@5.0.7: + resolution: + { integrity: sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA== } + engines: { node: '>= 10', npm: '>= 6.13.0' } + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + hasBin: true + + jsonfile@6.1.0: + resolution: + { integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== } + + jsonparse@1.3.1: + resolution: + { integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== } + engines: { '0': node >= 0.2.0 } + + kleur@4.1.5: + resolution: + { integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== } + engines: { node: '>=6' } + + lilconfig@3.1.2: + resolution: + { integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== } + engines: { node: '>=14' } + + lint-staged@15.2.7: + resolution: + { integrity: sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw== } + engines: { node: '>=18.12.0' } + hasBin: true + + listr2@8.2.3: + resolution: + { integrity: sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw== } + engines: { node: '>=18.0.0' } + + load-json-file@7.0.1: + resolution: + { integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + lodash-es@4.17.21: + resolution: + { integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== } + + lodash.get@4.4.2: + resolution: + { integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== } + + lodash@4.17.21: + resolution: + { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== } + + log-symbols@4.1.0: + resolution: + { integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== } + engines: { node: '>=10' } + + log-update@4.0.0: + resolution: + { integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== } + engines: { node: '>=10' } + + log-update@6.0.0: + resolution: + { integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw== } + engines: { node: '>=18' } + + make-dir@3.1.0: + resolution: + { integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== } + engines: { node: '>=8' } + + matcher@5.0.0: + resolution: + { integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + md5-hex@3.0.1: + resolution: + { integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== } + engines: { node: '>=8' } + + memoize@10.0.0: + resolution: + { integrity: sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA== } + engines: { node: '>=18' } + + memorystream@0.3.1: + resolution: + { integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== } + engines: { node: '>= 0.10.0' } + + merge-stream@2.0.0: + resolution: + { integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== } + + merge2@1.4.1: + resolution: + { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } + engines: { node: '>= 8' } + + micromatch@4.0.7: + resolution: + { integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== } + engines: { node: '>=8.6' } + + mimic-fn@2.1.0: + resolution: + { integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== } + engines: { node: '>=6' } + + mimic-fn@4.0.0: + resolution: + { integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== } + engines: { node: '>=12' } + + mimic-function@5.0.1: + resolution: + { integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== } + engines: { node: '>=18' } + + minimatch@3.1.2: + resolution: + { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } + + minimatch@9.0.5: + resolution: + { integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== } + engines: { node: '>=16 || 14 >=14.17' } + + minipass@3.3.6: + resolution: + { integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== } + engines: { node: '>=8' } + + minipass@5.0.0: + resolution: + { integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== } + engines: { node: '>=8' } + + minizlib@2.1.2: + resolution: + { integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== } + engines: { node: '>= 8' } + + mkdirp@1.0.4: + resolution: + { integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== } + engines: { node: '>=10' } + hasBin: true + + ms@2.1.2: + resolution: + { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== } + + ms@2.1.3: + resolution: + { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } + + mute-stream@1.0.0: + resolution: + { integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + node-fetch@2.7.0: + resolution: + { integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.1: + resolution: + { integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== } + hasBin: true + + nofilter@3.1.0: + resolution: + { integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== } + engines: { node: '>=12.19' } + + nopt@5.0.0: + resolution: + { integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== } + engines: { node: '>=6' } + hasBin: true + + npm-normalize-package-bin@3.0.1: + resolution: + { integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + npm-run-all2@6.2.0: + resolution: + { integrity: sha512-wA7yVIkthe6qJBfiJ2g6aweaaRlw72itsFGF6HuwCHKwtwAx/4BY1vVpk6bw6lS8RLMsexoasOkd0aYOmsFG7Q== } + engines: { node: ^14.18.0 || >=16.0.0, npm: '>= 8' } + hasBin: true + + npm-run-path@5.3.0: + resolution: + { integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + npmlog@5.0.1: + resolution: + { integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== } + deprecated: This package is no longer supported. + + object-assign@4.1.1: + resolution: + { integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== } + engines: { node: '>=0.10.0' } + + once@1.4.0: + resolution: + { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } + + onetime@5.1.2: + resolution: + { integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== } + engines: { node: '>=6' } + + onetime@6.0.0: + resolution: + { integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== } + engines: { node: '>=12' } + + ora@5.4.1: + resolution: + { integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== } + engines: { node: '>=10' } + + os-tmpdir@1.0.2: + resolution: + { integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== } + engines: { node: '>=0.10.0' } + + oxlint@0.5.0: + resolution: + { integrity: sha512-eb8ba12zrwnQatTvM1OzO4dWrjeDvsTlFPwLlfBEA5wOOdB+0pnY02FOe6uO3MMmzJLvHfyQlDNTp2Iq4yr1Hw== } + engines: { node: '>=14.*' } + hasBin: true + + p-map@7.0.2: + resolution: + { integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q== } + engines: { node: '>=18' } + + package-config@5.0.0: + resolution: + { integrity: sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg== } + engines: { node: '>=18' } + + parse-ms@4.0.0: + resolution: + { integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw== } + engines: { node: '>=18' } + + path-is-absolute@1.0.1: + resolution: + { integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== } + engines: { node: '>=0.10.0' } + + path-key@3.1.1: + resolution: + { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } + engines: { node: '>=8' } + + path-key@4.0.0: + resolution: + { integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== } + engines: { node: '>=12' } + + path-type@5.0.0: + resolution: + { integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== } + engines: { node: '>=12' } + + picocolors@1.0.1: + resolution: + { integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== } + + picomatch@2.3.1: + resolution: + { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } + engines: { node: '>=8.6' } + + picomatch@3.0.1: + resolution: + { integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== } + engines: { node: '>=10' } + + pidtree@0.6.0: + resolution: + { integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== } + engines: { node: '>=0.10' } + hasBin: true + + pirates@4.0.6: + resolution: + { integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== } + engines: { node: '>= 6' } + + platform@1.3.6: + resolution: + { integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== } + + plur@5.1.0: + resolution: + { integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + prettier@3.3.2: + resolution: + { integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== } + engines: { node: '>=14' } + hasBin: true + + pretty-ms@9.0.0: + resolution: + { integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng== } + engines: { node: '>=18' } + + queue-microtask@1.2.3: + resolution: + { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } + + read-package-json-fast@3.0.2: + resolution: + { integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + readable-stream@3.6.2: + resolution: + { integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== } + engines: { node: '>= 6' } + + require-directory@2.1.1: + resolution: + { integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== } + engines: { node: '>=0.10.0' } + + resolve-cwd@3.0.0: + resolution: + { integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== } + engines: { node: '>=8' } + + resolve-from@5.0.0: + resolution: + { integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== } + engines: { node: '>=8' } + + restore-cursor@3.1.0: + resolution: + { integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== } + engines: { node: '>=8' } + + restore-cursor@4.0.0: + resolution: + { integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + reusify@1.0.4: + resolution: + { integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + + rfdc@1.4.1: + resolution: + { integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== } + + rimraf@3.0.2: + resolution: + { integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== } + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-async@3.0.0: + resolution: + { integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== } + engines: { node: '>=0.12.0' } + + run-parallel@1.2.0: + resolution: + { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } + + rxjs@7.8.1: + resolution: + { integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== } + + safe-buffer@5.2.1: + resolution: + { integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== } + + safer-buffer@2.1.2: + resolution: + { integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== } + + semver@6.3.1: + resolution: + { integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== } + hasBin: true + + semver@7.6.2: + resolution: + { integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== } + engines: { node: '>=10' } + hasBin: true + + serialize-error@7.0.1: + resolution: + { integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== } + engines: { node: '>=10' } + + set-blocking@2.0.0: + resolution: + { integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== } + + shebang-command@2.0.0: + resolution: + { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } + engines: { node: '>=8' } + + shebang-regex@3.0.0: + resolution: + { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } + engines: { node: '>=8' } + + shell-quote@1.8.1: + resolution: + { integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== } + + signal-exit@3.0.7: + resolution: + { integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== } + + signal-exit@4.1.0: + resolution: + { integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== } + engines: { node: '>=14' } + + slash@5.1.0: + resolution: + { integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== } + engines: { node: '>=14.16' } + + slice-ansi@4.0.0: + resolution: + { integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== } + engines: { node: '>=10' } + + slice-ansi@5.0.0: + resolution: + { integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== } + engines: { node: '>=12' } + + slice-ansi@7.1.0: + resolution: + { integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== } + engines: { node: '>=18' } + + source-map-support@0.5.21: + resolution: + { integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== } + + source-map@0.6.1: + resolution: + { integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== } + engines: { node: '>=0.10.0' } + + sprintf-js@1.0.3: + resolution: + { integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== } + + stack-utils@2.0.6: + resolution: + { integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== } + engines: { node: '>=10' } + + string-argv@0.3.2: + resolution: + { integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== } + engines: { node: '>=0.6.19' } + + string-width@4.2.3: + resolution: + { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } + engines: { node: '>=8' } + + string-width@7.1.0: + resolution: + { integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== } + engines: { node: '>=18' } + + string_decoder@1.3.0: + resolution: + { integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== } + + strip-ansi@6.0.1: + resolution: + { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } + engines: { node: '>=8' } + + strip-ansi@7.1.0: + resolution: + { integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== } + engines: { node: '>=12' } + + strip-final-newline@3.0.0: + resolution: + { integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== } + engines: { node: '>=12' } + + supertap@3.0.1: + resolution: + { integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + supports-color@7.2.0: + resolution: + { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } + engines: { node: '>=8' } + + tar@6.2.1: + resolution: + { integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== } + engines: { node: '>=10' } + + temp-dir@3.0.0: + resolution: + { integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw== } + engines: { node: '>=14.16' } + + time-zone@1.0.0: + resolution: + { integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA== } + engines: { node: '>=4' } + + tmp@0.0.33: + resolution: + { integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== } + engines: { node: '>=0.6.0' } + + to-regex-range@5.0.1: + resolution: + { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } + engines: { node: '>=8.0' } + + toml@3.0.0: + resolution: + { integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== } + + tr46@0.0.3: + resolution: + { integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== } + + tslib@2.6.3: + resolution: + { integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== } + + typanion@3.14.0: + resolution: + { integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug== } + + type-fest@0.13.1: + resolution: + { integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== } + engines: { node: '>=10' } + + type-fest@0.21.3: + resolution: + { integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== } + engines: { node: '>=10' } + + typescript@5.5.2: + resolution: + { integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== } + engines: { node: '>=14.17' } + hasBin: true + + unicorn-magic@0.1.0: + resolution: + { integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== } + engines: { node: '>=18' } + + universal-user-agent@6.0.1: + resolution: + { integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== } + + universalify@2.0.1: + resolution: + { integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== } + engines: { node: '>= 10.0.0' } + + util-deprecate@1.0.2: + resolution: + { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } + + wasm-sjlj@1.0.5: + resolution: + { integrity: sha512-Z/MHJeOkAvJJVWnGX3/YZGYldGaawZbYHX4ldYG9kLhcdB8H31F5x66M7Zc4BP/7pg0aLsusQj1629m2B3Rilg== } + + wcwidth@1.0.1: + resolution: + { integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== } + + webidl-conversions@3.0.1: + resolution: + { integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== } + + well-known-symbols@2.0.0: + resolution: + { integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== } + engines: { node: '>=6' } + + whatwg-url@5.0.0: + resolution: + { integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== } + + which@2.0.2: + resolution: + { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } + engines: { node: '>= 8' } + hasBin: true + + wide-align@1.1.5: + resolution: + { integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== } + + wrap-ansi@6.2.0: + resolution: + { integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== } + engines: { node: '>=8' } + + wrap-ansi@7.0.0: + resolution: + { integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== } + engines: { node: '>=10' } + + wrap-ansi@9.0.0: + resolution: + { integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== } + engines: { node: '>=18' } + + wrappy@1.0.2: + resolution: + { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } + + write-file-atomic@5.0.1: + resolution: + { integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + y18n@5.0.8: + resolution: + { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== } + engines: { node: '>=10' } + + yallist@4.0.0: + resolution: + { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } + + yaml@2.4.5: + resolution: + { integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== } + engines: { node: '>= 14' } + hasBin: true + + yargs-parser@21.1.1: + resolution: + { integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== } + engines: { node: '>=12' } + + yargs@17.7.2: + resolution: + { integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== } + engines: { node: '>=12' } + +snapshots: + '@arrows/array@1.4.1': + dependencies: + '@arrows/composition': 1.2.2 + + '@arrows/composition@1.2.2': {} + + '@arrows/dispatch@1.0.3': + dependencies: + '@arrows/composition': 1.2.2 + + '@arrows/error@1.0.2': {} + + '@arrows/multimethod@1.4.1': + dependencies: + '@arrows/array': 1.4.1 + '@arrows/composition': 1.2.2 + '@arrows/error': 1.0.2 + fast-deep-equal: 3.1.3 + + '@emnapi/core@1.2.0': + dependencies: + '@emnapi/wasi-threads': 1.0.1 + tslib: 2.6.3 + optional: true + + '@emnapi/runtime@1.2.0': + dependencies: + tslib: 2.6.3 + optional: true + + '@emnapi/wasi-threads@1.0.1': + dependencies: + tslib: 2.6.3 + optional: true + + '@inquirer/figures@1.0.3': {} + + '@mapbox/node-pre-gyp@1.0.11': + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.6.2 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@napi-rs/cli@3.0.0-alpha.55(@emnapi/runtime@1.2.0)(emnapi@1.2.0)': + dependencies: + '@napi-rs/cross-toolchain': 0.0.16 + '@napi-rs/wasm-tools': 0.0.2 + '@octokit/rest': 20.1.1 + clipanion: 3.2.1(typanion@3.14.0) + colorette: 2.0.20 + debug: 4.3.5 + inquirer: 9.3.1 + js-yaml: 4.1.0 + lodash-es: 4.17.21 + semver: 7.6.2 + toml: 3.0.0 + typanion: 3.14.0 + wasm-sjlj: 1.0.5 + optionalDependencies: + '@emnapi/runtime': 1.2.0 + emnapi: 1.2.0 + transitivePeerDependencies: + - '@napi-rs/cross-toolchain-arm64-target-aarch64' + - '@napi-rs/cross-toolchain-arm64-target-armv7' + - '@napi-rs/cross-toolchain-arm64-target-x86_64' + - '@napi-rs/cross-toolchain-x64-target-aarch64' + - '@napi-rs/cross-toolchain-x64-target-armv7' + - '@napi-rs/cross-toolchain-x64-target-x86_64' + - supports-color + + '@napi-rs/cross-toolchain@0.0.16': + dependencies: + '@napi-rs/lzma': 1.3.1 + '@napi-rs/tar': 0.1.1 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + '@napi-rs/lzma-android-arm-eabi@1.3.1': + optional: true + + '@napi-rs/lzma-android-arm64@1.3.1': + optional: true + + '@napi-rs/lzma-darwin-arm64@1.3.1': + optional: true + + '@napi-rs/lzma-darwin-x64@1.3.1': + optional: true + + '@napi-rs/lzma-freebsd-x64@1.3.1': + optional: true + + '@napi-rs/lzma-linux-arm-gnueabihf@1.3.1': + optional: true + + '@napi-rs/lzma-linux-arm64-gnu@1.3.1': + optional: true + + '@napi-rs/lzma-linux-arm64-musl@1.3.1': + optional: true + + '@napi-rs/lzma-linux-x64-gnu@1.3.1': + optional: true + + '@napi-rs/lzma-linux-x64-musl@1.3.1': + optional: true + + '@napi-rs/lzma-wasm32-wasi@1.3.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.4 + optional: true + + '@napi-rs/lzma-win32-arm64-msvc@1.3.1': + optional: true + + '@napi-rs/lzma-win32-ia32-msvc@1.3.1': + optional: true + + '@napi-rs/lzma-win32-x64-msvc@1.3.1': + optional: true + + '@napi-rs/lzma@1.3.1': + optionalDependencies: + '@napi-rs/lzma-android-arm-eabi': 1.3.1 + '@napi-rs/lzma-android-arm64': 1.3.1 + '@napi-rs/lzma-darwin-arm64': 1.3.1 + '@napi-rs/lzma-darwin-x64': 1.3.1 + '@napi-rs/lzma-freebsd-x64': 1.3.1 + '@napi-rs/lzma-linux-arm-gnueabihf': 1.3.1 + '@napi-rs/lzma-linux-arm64-gnu': 1.3.1 + '@napi-rs/lzma-linux-arm64-musl': 1.3.1 + '@napi-rs/lzma-linux-x64-gnu': 1.3.1 + '@napi-rs/lzma-linux-x64-musl': 1.3.1 + '@napi-rs/lzma-wasm32-wasi': 1.3.1 + '@napi-rs/lzma-win32-arm64-msvc': 1.3.1 + '@napi-rs/lzma-win32-ia32-msvc': 1.3.1 + '@napi-rs/lzma-win32-x64-msvc': 1.3.1 + + '@napi-rs/tar-android-arm-eabi@0.1.1': + optional: true + + '@napi-rs/tar-android-arm64@0.1.1': + optional: true + + '@napi-rs/tar-darwin-arm64@0.1.1': + optional: true + + '@napi-rs/tar-darwin-x64@0.1.1': + optional: true + + '@napi-rs/tar-freebsd-x64@0.1.1': + optional: true + + '@napi-rs/tar-linux-arm-gnueabihf@0.1.1': + optional: true + + '@napi-rs/tar-linux-arm64-gnu@0.1.1': + optional: true + + '@napi-rs/tar-linux-arm64-musl@0.1.1': + optional: true + + '@napi-rs/tar-linux-x64-gnu@0.1.1': + optional: true + + '@napi-rs/tar-linux-x64-musl@0.1.1': + optional: true + + '@napi-rs/tar-wasm32-wasi@0.1.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.4 + optional: true + + '@napi-rs/tar-win32-arm64-msvc@0.1.1': + optional: true + + '@napi-rs/tar-win32-ia32-msvc@0.1.1': + optional: true + + '@napi-rs/tar-win32-x64-msvc@0.1.1': + optional: true + + '@napi-rs/tar@0.1.1': + optionalDependencies: + '@napi-rs/tar-android-arm-eabi': 0.1.1 + '@napi-rs/tar-android-arm64': 0.1.1 + '@napi-rs/tar-darwin-arm64': 0.1.1 + '@napi-rs/tar-darwin-x64': 0.1.1 + '@napi-rs/tar-freebsd-x64': 0.1.1 + '@napi-rs/tar-linux-arm-gnueabihf': 0.1.1 + '@napi-rs/tar-linux-arm64-gnu': 0.1.1 + '@napi-rs/tar-linux-arm64-musl': 0.1.1 + '@napi-rs/tar-linux-x64-gnu': 0.1.1 + '@napi-rs/tar-linux-x64-musl': 0.1.1 + '@napi-rs/tar-wasm32-wasi': 0.1.1 + '@napi-rs/tar-win32-arm64-msvc': 0.1.1 + '@napi-rs/tar-win32-ia32-msvc': 0.1.1 + '@napi-rs/tar-win32-x64-msvc': 0.1.1 + + '@napi-rs/wasm-runtime@0.2.4': + dependencies: + '@emnapi/core': 1.2.0 + '@emnapi/runtime': 1.2.0 + '@tybys/wasm-util': 0.9.0 + optional: true + + '@napi-rs/wasm-tools-android-arm-eabi@0.0.2': + optional: true + + '@napi-rs/wasm-tools-android-arm64@0.0.2': + optional: true + + '@napi-rs/wasm-tools-darwin-arm64@0.0.2': + optional: true + + '@napi-rs/wasm-tools-darwin-x64@0.0.2': + optional: true + + '@napi-rs/wasm-tools-freebsd-x64@0.0.2': + optional: true + + '@napi-rs/wasm-tools-linux-arm64-gnu@0.0.2': + optional: true + + '@napi-rs/wasm-tools-linux-arm64-musl@0.0.2': + optional: true + + '@napi-rs/wasm-tools-linux-x64-gnu@0.0.2': + optional: true + + '@napi-rs/wasm-tools-linux-x64-musl@0.0.2': + optional: true + + '@napi-rs/wasm-tools-wasm32-wasi@0.0.2': + dependencies: + '@napi-rs/wasm-runtime': 0.2.4 + optional: true + + '@napi-rs/wasm-tools-win32-arm64-msvc@0.0.2': + optional: true + + '@napi-rs/wasm-tools-win32-ia32-msvc@0.0.2': + optional: true + + '@napi-rs/wasm-tools-win32-x64-msvc@0.0.2': + optional: true + + '@napi-rs/wasm-tools@0.0.2': + optionalDependencies: + '@napi-rs/wasm-tools-android-arm-eabi': 0.0.2 + '@napi-rs/wasm-tools-android-arm64': 0.0.2 + '@napi-rs/wasm-tools-darwin-arm64': 0.0.2 + '@napi-rs/wasm-tools-darwin-x64': 0.0.2 + '@napi-rs/wasm-tools-freebsd-x64': 0.0.2 + '@napi-rs/wasm-tools-linux-arm64-gnu': 0.0.2 + '@napi-rs/wasm-tools-linux-arm64-musl': 0.0.2 + '@napi-rs/wasm-tools-linux-x64-gnu': 0.0.2 + '@napi-rs/wasm-tools-linux-x64-musl': 0.0.2 + '@napi-rs/wasm-tools-wasm32-wasi': 0.0.2 + '@napi-rs/wasm-tools-win32-arm64-msvc': 0.0.2 + '@napi-rs/wasm-tools-win32-ia32-msvc': 0.0.2 + '@napi-rs/wasm-tools-win32-x64-msvc': 0.0.2 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@octokit/auth-token@4.0.0': {} + + '@octokit/core@5.2.0': + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.1.0 + '@octokit/request': 8.4.0 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.5.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + + '@octokit/endpoint@9.0.5': + dependencies: + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + + '@octokit/graphql@7.1.0': + dependencies: + '@octokit/request': 8.4.0 + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + + '@octokit/openapi-types@22.2.0': {} + + '@octokit/plugin-paginate-rest@11.3.1(@octokit/core@5.2.0)': + dependencies: + '@octokit/core': 5.2.0 + '@octokit/types': 13.5.0 + + '@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.0)': + dependencies: + '@octokit/core': 5.2.0 + + '@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@5.2.0)': + dependencies: + '@octokit/core': 5.2.0 + '@octokit/types': 13.5.0 + + '@octokit/request-error@5.1.0': + dependencies: + '@octokit/types': 13.5.0 + deprecation: 2.3.1 + once: 1.4.0 + + '@octokit/request@8.4.0': + dependencies: + '@octokit/endpoint': 9.0.5 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.5.0 + universal-user-agent: 6.0.1 + + '@octokit/rest@20.1.1': + dependencies: + '@octokit/core': 5.2.0 + '@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@5.2.0) + '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.0) + '@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@5.2.0) + + '@octokit/types@13.5.0': + dependencies: + '@octokit/openapi-types': 22.2.0 + + '@oxlint/darwin-arm64@0.5.0': + optional: true + + '@oxlint/darwin-x64@0.5.0': + optional: true + + '@oxlint/linux-arm64-gnu@0.5.0': + optional: true + + '@oxlint/linux-arm64-musl@0.5.0': + optional: true + + '@oxlint/linux-x64-gnu@0.5.0': + optional: true + + '@oxlint/linux-x64-musl@0.5.0': + optional: true + + '@oxlint/win32-arm64@0.5.0': + optional: true + + '@oxlint/win32-x64@0.5.0': + optional: true + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + + '@sindresorhus/merge-streams@2.3.0': {} + + '@swc-node/core@1.13.1(@swc/core@1.6.5)(@swc/types@0.1.9)': + dependencies: + '@swc/core': 1.6.5 + '@swc/types': 0.1.9 + + '@swc-node/register@1.10.0(@swc/core@1.6.5)(@swc/types@0.1.9)(typescript@5.5.2)': + dependencies: + '@swc-node/core': 1.13.1(@swc/core@1.6.5)(@swc/types@0.1.9) + '@swc-node/sourcemap-support': 0.5.0 + '@swc/core': 1.6.5 + colorette: 2.0.20 + debug: 4.3.5 + pirates: 4.0.6 + tslib: 2.6.3 + typescript: 5.5.2 + transitivePeerDependencies: + - '@swc/types' + - supports-color + + '@swc-node/sourcemap-support@0.5.0': + dependencies: + source-map-support: 0.5.21 + tslib: 2.6.3 + + '@swc/core-darwin-arm64@1.6.5': + optional: true + + '@swc/core-darwin-x64@1.6.5': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.6.5': + optional: true + + '@swc/core-linux-arm64-gnu@1.6.5': + optional: true + + '@swc/core-linux-arm64-musl@1.6.5': + optional: true + + '@swc/core-linux-x64-gnu@1.6.5': + optional: true + + '@swc/core-linux-x64-musl@1.6.5': + optional: true + + '@swc/core-win32-arm64-msvc@1.6.5': + optional: true + + '@swc/core-win32-ia32-msvc@1.6.5': + optional: true + + '@swc/core-win32-x64-msvc@1.6.5': + optional: true + + '@swc/core@1.6.5': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.9 + optionalDependencies: + '@swc/core-darwin-arm64': 1.6.5 + '@swc/core-darwin-x64': 1.6.5 + '@swc/core-linux-arm-gnueabihf': 1.6.5 + '@swc/core-linux-arm64-gnu': 1.6.5 + '@swc/core-linux-arm64-musl': 1.6.5 + '@swc/core-linux-x64-gnu': 1.6.5 + '@swc/core-linux-x64-musl': 1.6.5 + '@swc/core-win32-arm64-msvc': 1.6.5 + '@swc/core-win32-ia32-msvc': 1.6.5 + '@swc/core-win32-x64-msvc': 1.6.5 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.9': + dependencies: + '@swc/counter': 0.1.3 + + '@taplo/cli@0.7.0': {} + + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.6.3 + optional: true + + '@vercel/nft@0.26.5': + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + '@rollup/pluginutils': 4.2.1 + acorn: 8.12.0 + acorn-import-attributes: 1.9.5(acorn@8.12.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + micromatch: 4.0.7 + node-gyp-build: 4.8.1 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + abbrev@1.1.1: {} + + acorn-import-attributes@1.9.5(acorn@8.12.0): + dependencies: + acorn: 8.12.0 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.0 + + acorn@8.12.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@6.2.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + aproba@2.0.0: {} + + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-find-index@1.0.2: {} + + arrgv@1.0.2: {} + + arrify@3.0.0: {} + + astral-regex@2.0.0: {} + + async-sema@3.1.1: {} + + ava@6.1.3: + dependencies: + '@vercel/nft': 0.26.5 + acorn: 8.12.0 + acorn-walk: 8.3.3 + ansi-styles: 6.2.1 + arrgv: 1.0.2 + arrify: 3.0.0 + callsites: 4.1.0 + cbor: 9.0.2 + chalk: 5.3.0 + chunkd: 2.0.1 + ci-info: 4.0.0 + ci-parallel-vars: 1.0.1 + cli-truncate: 4.0.0 + code-excerpt: 4.0.0 + common-path-prefix: 3.0.0 + concordance: 5.0.4 + currently-unhandled: 0.4.1 + debug: 4.3.5 + emittery: 1.0.3 + figures: 6.1.0 + globby: 14.0.1 + ignore-by-default: 2.1.0 + indent-string: 5.0.0 + is-plain-object: 5.0.0 + is-promise: 4.0.0 + matcher: 5.0.0 + memoize: 10.0.0 + ms: 2.1.3 + p-map: 7.0.2 + package-config: 5.0.0 + picomatch: 3.0.1 + plur: 5.1.0 + pretty-ms: 9.0.0 + resolve-cwd: 3.0.0 + stack-utils: 2.0.6 + strip-ansi: 7.1.0 + supertap: 3.0.1 + temp-dir: 3.0.0 + write-file-atomic: 5.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + - supports-color + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + before-after-hook@2.2.3: {} + + benchmark@2.1.4: + dependencies: + lodash: 4.17.21 + platform: 1.3.6 + + benny@3.7.1: + dependencies: + '@arrows/composition': 1.2.2 + '@arrows/dispatch': 1.0.3 + '@arrows/multimethod': 1.4.1 + benchmark: 2.1.4 + common-tags: 1.8.2 + fs-extra: 10.1.0 + json2csv: 5.0.7 + kleur: 4.1.5 + log-update: 4.0.0 + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + blueimp-md5@2.19.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + callsites@4.1.0: {} + + cbor@9.0.2: + dependencies: + nofilter: 3.1.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + chardet@0.7.0: {} + + chownr@2.0.0: {} + + chunkd@2.0.1: {} + + ci-info@4.0.0: {} + + ci-parallel-vars@1.0.1: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-spinners@2.9.2: {} + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.1.0 + + cli-width@4.1.0: {} + + clipanion@3.2.1(typanion@3.14.0): + dependencies: + typanion: 3.14.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + code-excerpt@4.0.0: + dependencies: + convert-to-spaces: 2.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-support@1.1.3: {} + + colorette@2.0.20: {} + + commander@12.1.0: {} + + commander@6.2.1: {} + + common-path-prefix@3.0.0: {} + + common-tags@1.8.2: {} + + concat-map@0.0.1: {} + + concordance@5.0.4: + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.6.2 + well-known-symbols: 2.0.0 + + console-control-strings@1.1.0: {} + + convert-to-spaces@2.0.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + currently-unhandled@0.4.1: + dependencies: + array-find-index: 1.0.2 + + date-time@3.1.0: + dependencies: + time-zone: 1.0.0 + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + delegates@1.0.0: {} + + deprecation@2.3.1: {} + + detect-libc@2.0.3: {} + + emittery@1.0.3: {} + + emnapi@1.2.0: {} + + emoji-regex@10.3.0: {} + + emoji-regex@8.0.0: {} + + escalade@3.1.2: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@5.0.0: {} + + esprima@4.0.1: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + eventemitter3@5.0.1: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.0.0 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up-simple@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + gauge@3.0.2: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + get-stream@8.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globby@14.0.1: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 + ignore: 5.3.1 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + has-unicode@2.0.1: {} + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + human-signals@5.0.0: {} + + husky@9.0.11: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore-by-default@2.1.0: {} + + ignore@5.3.1: {} + + imurmurhash@0.1.4: {} + + indent-string@5.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + inquirer@9.3.1: + dependencies: + '@inquirer/figures': 1.0.3 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + external-editor: 3.1.0 + mute-stream: 1.0.0 + ora: 5.4.1 + picocolors: 1.0.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + irregular-plurals@3.5.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-interactive@1.0.0: {} + + is-number@7.0.0: {} + + is-plain-object@5.0.0: {} + + is-promise@4.0.0: {} + + is-stream@3.0.0: {} + + is-unicode-supported@0.1.0: {} + + is-unicode-supported@2.0.0: {} + + isexe@2.0.0: {} + + js-string-escape@1.0.1: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-parse-even-better-errors@3.0.2: {} + + json2csv@5.0.7: + dependencies: + commander: 6.2.1 + jsonparse: 1.3.1 + lodash.get: 4.4.2 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + kleur@4.1.5: {} + + lilconfig@3.1.2: {} + + lint-staged@15.2.7: + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.5 + execa: 8.0.1 + lilconfig: 3.1.2 + listr2: 8.2.3 + micromatch: 4.0.7 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.4.5 + transitivePeerDependencies: + - supports-color + + listr2@8.2.3: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.0.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + load-json-file@7.0.1: {} + + lodash-es@4.17.21: {} + + lodash.get@4.4.2: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-update@4.0.0: + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + + log-update@6.0.0: + dependencies: + ansi-escapes: 6.2.1 + cli-cursor: 4.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + matcher@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + + md5-hex@3.0.1: + dependencies: + blueimp-md5: 2.19.0 + + memoize@10.0.0: + dependencies: + mimic-function: 5.0.1 + + memorystream@0.3.1: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + mute-stream@1.0.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.1: {} + + nofilter@3.1.0: {} + + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + + npm-normalize-package-bin@3.0.1: {} + + npm-run-all2@6.2.0: + dependencies: + ansi-styles: 6.2.1 + cross-spawn: 7.0.3 + memorystream: 0.3.1 + minimatch: 9.0.5 + pidtree: 0.6.0 + read-package-json-fast: 3.0.2 + shell-quote: 1.8.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npmlog@5.0.1: + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + + object-assign@4.1.1: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + os-tmpdir@1.0.2: {} + + oxlint@0.5.0: + optionalDependencies: + '@oxlint/darwin-arm64': 0.5.0 + '@oxlint/darwin-x64': 0.5.0 + '@oxlint/linux-arm64-gnu': 0.5.0 + '@oxlint/linux-arm64-musl': 0.5.0 + '@oxlint/linux-x64-gnu': 0.5.0 + '@oxlint/linux-x64-musl': 0.5.0 + '@oxlint/win32-arm64': 0.5.0 + '@oxlint/win32-x64': 0.5.0 + + p-map@7.0.2: {} + + package-config@5.0.0: + dependencies: + find-up-simple: 1.0.0 + load-json-file: 7.0.1 + + parse-ms@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-type@5.0.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + picomatch@3.0.1: {} + + pidtree@0.6.0: {} + + pirates@4.0.6: {} + + platform@1.3.6: {} + + plur@5.1.0: + dependencies: + irregular-plurals: 3.5.0 + + prettier@3.3.2: {} + + pretty-ms@9.0.0: + dependencies: + parse-ms: 4.0.0 + + queue-microtask@1.2.3: {} + + read-package-json-fast@3.0.2: + dependencies: + json-parse-even-better-errors: 3.0.2 + npm-normalize-package-bin: 3.0.1 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + require-directory@2.1.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@5.0.0: {} + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-async@3.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.3 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@6.3.1: {} + + semver@7.6.2: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + + set-blocking@2.0.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.1: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@5.1.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.1.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-final-newline@3.0.0: {} + + supertap@3.0.1: + dependencies: + indent-string: 5.0.0 + js-yaml: 3.14.1 + serialize-error: 7.0.1 + strip-ansi: 7.1.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + temp-dir@3.0.0: {} + + time-zone@1.0.0: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toml@3.0.0: {} + + tr46@0.0.3: {} + + tslib@2.6.3: {} + + typanion@3.14.0: {} + + type-fest@0.13.1: {} + + type-fest@0.21.3: {} + + typescript@5.5.2: {} + + unicorn-magic@0.1.0: {} + + universal-user-agent@6.0.1: {} + + universalify@2.0.1: {} + + util-deprecate@1.0.2: {} + + wasm-sjlj@1.0.5: {} + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + webidl-conversions@3.0.1: {} + + well-known-symbols@2.0.0: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.1.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yaml@2.4.5: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..b196eaa --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1 @@ +tab_spaces = 2 diff --git a/src/lib.rs b/src/lib.rs index f792ae6..09f16f4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,45 +1,8 @@ -#![recursion_limit = "2048"] -#![feature(box_patterns)] -#![feature(arbitrary_self_types)] +#![deny(clippy::all)] +#[macro_use] +extern crate napi_derive; -use swc_core::common::FileName; -use swc_core::ecma::ast::Program; -use swc_core::ecma::visit::{FoldWith}; -use swc_core::plugin::{ - plugin_transform, proxies::TransformPluginProgramMetadata, -}; -use crate::transforms::react_actions::{Config, server_actions}; +mod transform; -pub mod transforms; - -impl Default for Config { - fn default() -> Self { - Config { - is_react_server_layer: true, - enabled: true, - } - } -} - -#[plugin_transform] -pub fn process_transform(program: Program, metadata: TransformPluginProgramMetadata) -> Program { - let plugin_config = metadata.get_transform_plugin_config(); - let config: Config = if let Some(plugin_config) = plugin_config { - serde_json::from_str(&plugin_config).unwrap_or_else(|f| { - println!("Could not deserialize instrumentation option"); - println!("{:#?}", f); - Default::default() - }) - } else { - Default::default() - }; - let mut actions = server_actions( - match metadata.source_map.source_file.get() { - Some(file) => &file.name, - None => &FileName::Anon, - }, - config, - metadata.comments.clone(), - ); - program.fold_with(&mut actions) -} \ No newline at end of file +pub use transform::validate; +pub use transform::react_server_action; diff --git a/src/transform/mod.rs b/src/transform/mod.rs new file mode 100644 index 0000000..eecb006 --- /dev/null +++ b/src/transform/mod.rs @@ -0,0 +1,5 @@ +mod validate; +mod react_server_action; + +pub use validate::validate; +pub use react_server_action::react_server_action; diff --git a/src/transform/react_server_action.rs b/src/transform/react_server_action.rs new file mode 100644 index 0000000..1f40c87 --- /dev/null +++ b/src/transform/react_server_action.rs @@ -0,0 +1,259 @@ +use std::cell::Cell; +use std::path::Path; +use napi::{Error, Status}; +use oxc_allocator::{Allocator, Box, Vec}; +use oxc_ast::ast::{Argument, BindingIdentifier, BindingPattern, BindingPatternKind, CallExpression, Declaration, ExportNamedDeclaration, Expression, ExpressionStatement, IdentifierReference, ImportOrExportKind, Program, Statement, StringLiteral, VariableDeclaration, VariableDeclarationKind, VariableDeclarator}; +use oxc_ast::visit::walk_mut; +use oxc_ast::{VisitMut}; + +use oxc_parser::Parser; +use oxc_codegen::CodeGenerator; +use oxc_span::{Atom, SourceType}; + +use tokio::fs; + +#[napi] +pub async fn react_server_action( + file_path: String, + action_export_prefix: String, + is_server_layer: bool, + is_action_file: bool, +) -> napi::Result { + let path = Path::new(&file_path); + let source_text = String::from_utf8( + fs::read(path) + .await + .map_err(|e| Error::new(Status::Unknown, format!("Failed to read file: {}", e)))? + ).unwrap(); + Ok(react_server_action_impl(source_text, file_path.as_str(), action_export_prefix, is_server_layer, is_action_file)) +} + +fn react_server_action_impl( + source_text: String, + action_export_prefix: &str, + file_path: String, + is_server_layer: bool, + is_action_file: bool, +) -> String { + let path = Path::new(&file_path); + let source_type = SourceType::from_path(path).unwrap(); + + let allocator = Allocator::default(); + let ret = Parser::new(&allocator, &source_text, source_type).parse(); + + let mut rsc = ReactServerAction { + file_name: &file_path, + action_export_prefix, + is_server_layer, + is_action_file, + allocator: &allocator, + names: vec![], + comments: vec![], + }; + + let mut program = ret.program; + rsc.visit_program(&mut program); + + CodeGenerator::new().build(&program).source_text +} + +#[derive(Debug)] +struct Comment { + start: u32, + end: u32, + text: String, +} + +struct ReactServerAction<'ast> { + file_name: &'ast String, + + action_export_prefix: &'ast str, + + is_server_layer: bool, + is_action_file: bool, + + names: std::vec::Vec, + + allocator: &'ast Allocator, + comments: std::vec::Vec, +} + +impl<'ast> VisitMut<'ast> for ReactServerAction<'ast> { + fn visit_program(&mut self, program: &mut Program<'ast>) { + let mut new_stat = Vec::new_in(self.allocator); + for stmt in &program.body { + match stmt { + Statement::FunctionDeclaration(func) => { + let func_name: &str = func.id.clone().map_or("UNKNOWN_NAME", |id| id.name.as_str()); + let mut is_server_action = false; + for stmt in &func.body { + for d in &stmt.directives { + if &d.expression.value == "use server" { + is_server_action = true; + } + } + } + + if self.is_server_layer { + // convert to `registerServerReference(fn, id);` + if is_server_action { + if !func.r#async { + self.comments.push(Comment { + start: func.span.start, + end: func.span.end, + text: "Server actions must be async.".to_string(), + }); + // throw error; + } + let mut vec: Vec = Vec::new_in(self.allocator); + // func_name + vec.push( + Argument::Identifier( + Box::new_in( + IdentifierReference { + span: Default::default(), + name: Atom::from(func_name), + reference_id: Cell::new(None), + reference_flag: Default::default(), + }, + self.allocator, + ) + ) + ); + // file_name + vec.push( + Argument::StringLiteral( + Box::new_in( + StringLiteral { + span: Default::default(), + value: Atom::from(self.file_name.as_str()), + }, + self.allocator, + ) + ) + ); + + let mut var_dec = Vec::new_in(self.allocator); + let name = oxc_allocator::String::from_str_in( + format!("{}{}", self.action_export_prefix, func_name).as_str(), + self.allocator, + ); + self.names.push(String::from(name.as_str())); + + var_dec.push( + VariableDeclarator { + span: Default::default(), + kind: VariableDeclarationKind::Const, + id: BindingPattern { + kind: BindingPatternKind::BindingIdentifier( + Box::new_in( + BindingIdentifier { + span: Default::default(), + name: Atom::from( + name.into_bump_str(), + ), + symbol_id: Cell::new(None), + }, + self.allocator, + ) + ), + type_annotation: None, + optional: false, + }, + init: Some( + Expression::CallExpression( + Box::new_in( + CallExpression { + span: Default::default(), + callee: Expression::Identifier( + Box::new_in( + IdentifierReference { + span: Default::default(), + name: Atom::from("registerServerReference"), + reference_id: Cell::new(None), + reference_flag: Default::default(), + }, + self.allocator, + ) + ), + arguments: vec, + optional: false, + type_parameters: None, + }, + self.allocator, + ) + ) + ), + definite: false, + } + ); + new_stat.push( + Statement::ExportNamedDeclaration( + Box::new_in( + ExportNamedDeclaration { + span: Default::default(), + declaration: Some( + Declaration::VariableDeclaration( + Box::new_in( + VariableDeclaration { + span: Default::default(), + kind: VariableDeclarationKind::Const, + declarations: var_dec, + declare: false, + }, self.allocator, + ) + ) + ), + specifiers: Vec::new_in(self.allocator), + source: None, + export_kind: ImportOrExportKind::Value, + with_clause: None, + } + , self.allocator) + ) + ); + } + } else { + // convert to `registerClientReference(fn, id);` + } + } + _ => {} + } + } + + for stmt in new_stat { + program.body.push(stmt); + } + walk_mut::walk_program_mut(self, program); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_react_server_action() { + let file_path = "./react_server_action.ts".to_string(); + let is_server_layer = true; + let is_action_file = true; + let parsed_code = react_server_action_impl( + r#" +async function test() { + "use server" + return 0; +} +"#.to_string(), + "__waku__server__", + file_path, + is_server_layer, + is_action_file, + ); + assert_eq!(parsed_code, r#"async function test() { + 'use server'; + return 0; +} +export const __waku__server__test = registerServerReference(test, './react_server_action.ts'); +"#) + } +} \ No newline at end of file diff --git a/src/transform/validate.rs b/src/transform/validate.rs new file mode 100644 index 0000000..90155f7 --- /dev/null +++ b/src/transform/validate.rs @@ -0,0 +1,226 @@ +use std::path::Path; +use napi::{Error, Status}; +use oxc_allocator::Allocator; +use oxc_ast::ast::{Function, ImportDeclaration, Program}; +use oxc_ast::{Visit}; +use oxc_ast::visit::walk; +use oxc_parser::Parser; +use oxc_span::SourceType; +use oxc_syntax::scope::ScopeFlags; +use tokio::fs; + +#[napi(object)] +pub struct ValidateResult { + pub is_client_entry: bool, + pub is_server_action: bool, + pub error: Option, + pub imports: Vec, +} + +#[napi] +#[derive(Debug, PartialEq)] +pub enum RSCError { + CannotUseBothClientAndServer, + ServerActionMustBeAsync, +} + +#[napi(object)] +#[derive(Debug)] +pub struct ModuleImports { + pub name: String, +} + +#[napi] +pub async fn validate( + file_path: String, +) -> napi::Result { + let path = Path::new(&file_path); + let source_text = String::from_utf8( + fs::read(path) + .await + .map_err(|e| Error::new(Status::Unknown, format!("Failed to read file: {}", e)))? + ).unwrap(); + let source_type = SourceType::from_path(path).unwrap(); + validate_string(source_text, source_type) +} + +fn validate_string( + source_text: String, + source_type: SourceType, +) -> napi::Result { + let allocator = Allocator::default(); + let ret = Parser::new(&allocator, &source_text, source_type).parse(); + + let size = ret.errors.len(); + for error in ret.errors { + let error = error.with_source_code(source_text.clone()); + println!("{error:?}"); + } + + if size > 0 { + return Err(Error::new(Status::Unknown, "Failed to parse file")); + } + + let program = ret.program; + + let mut rsc = ReactServerComponent::default(); + rsc.visit_program(&program); + + let result = ValidateResult { + is_client_entry: rsc.has_use_client && !rsc.has_use_server, + is_server_action: rsc.is_server_action, + error: rsc.error, + imports: rsc.imports, + }; + + Ok(result) +} + +#[derive(Debug)] +pub struct ReactServerComponent { + pub is_server_action: bool, + pub error: Option, + pub imports: Vec, + + // has "use client" directive on top of the file + has_use_client: bool, + // has "use server" directive on top of the file + has_use_server: bool, +} + +impl<'a> Default for ReactServerComponent { + fn default() -> Self { + ReactServerComponent { + is_server_action: false, + error: None, + + has_use_client: false, + has_use_server: false, + + imports: vec![], + } + } +} + +impl<'a> Visit<'a> for ReactServerComponent { + fn visit_program(&mut self, program: &Program<'a>) { + program.directives.iter().for_each(|d| { + if &d.expression.value == "use server" { + self.has_use_server = true; + } else if &d.expression.value == "use client" { + self.has_use_client = true; + } + }); + if self.has_use_server && self.has_use_client { + self.error = Some(RSCError::CannotUseBothClientAndServer); + } else { + walk::walk_program(self, program); + if self.has_use_server && self.has_use_client { + self.error = Some(RSCError::CannotUseBothClientAndServer); + } + } + } + + fn visit_function(&mut self, func: &Function<'a>, flags: Option) { + let mut is_server_action = false; + for stmt in &func.body { + stmt.directives.iter().for_each(|d| { + if &d.expression.value == "use server" { + self.is_server_action = true; + is_server_action = true; + } + }); + } + // check if server action is valid + if !func.r#async && is_server_action { + self.error = Some(RSCError::ServerActionMustBeAsync); + return; + } + + walk::walk_function(self, func, flags); + } + + fn visit_import_declaration(&mut self, decl: &ImportDeclaration<'a>) { + if decl.source.value == "client-only" { + self.has_use_client = true; + } else if decl.source.value == "server-only" { + self.has_use_server = true; + } + self.imports.push( + ModuleImports { + name: decl.source.value.to_string() + } + ); + walk::walk_import_declaration(self, decl); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_use_server() { + let source_text = r#" + "use server" + "#; + let rsc = validate_string(source_text.to_string(), SourceType::from_path("test.js").unwrap()).unwrap(); + assert_eq!(rsc.is_server_action, false); + assert_eq!(rsc.error, None); + } + + #[test] + fn test_use_client() { + let source_text = r#" + "use client" + "#; + let rsc = validate_string(source_text.to_string(), SourceType::from_path("test.js").unwrap()).unwrap(); + assert_eq!(rsc.is_server_action, false); + assert_eq!(rsc.error, None); + } + + #[test] + fn test_use_server_and_client() { + let source_text = r#" + "use server" + "use client" + "#; + let rsc = validate_string(source_text.to_string(), SourceType::from_path("test.js").unwrap()).unwrap(); + assert_eq!(rsc.is_server_action, false); + assert_eq!(rsc.error, Some(RSCError::CannotUseBothClientAndServer)); + } + + #[test] + fn test_use_client_and_server_action() { + let source_text = r#" + "use client" + + async function foo() { + "use server" + } + "#; + let rsc = validate_string(source_text.to_string(), SourceType::from_path("test.js").unwrap()).unwrap(); + assert_eq!(rsc.is_server_action, true); + assert_eq!(rsc.error, None); + } + + #[test] + fn test_use_server_and_server_action_without_directive() { + let source_text = r#" + "use server" + + export async function foo() { + // no directive + return 0 + } + + export default function () { + return 1 + } + "#; + let rsc = validate_string(source_text.to_string(), SourceType::from_path("test.js").unwrap()).unwrap(); + // cannot tell if 'foo' is a server action, depends on if there's a Server component that uses it + assert_eq!(rsc.is_server_action, false); + assert_eq!(rsc.error, None); + } +} diff --git a/src/transforms/mod.rs b/src/transforms/mod.rs deleted file mode 100644 index 8fa804e..0000000 --- a/src/transforms/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod react_actions; diff --git a/src/transforms/react_actions.rs b/src/transforms/react_actions.rs deleted file mode 100644 index 4699a85..0000000 --- a/src/transforms/react_actions.rs +++ /dev/null @@ -1,1767 +0,0 @@ -use std::{ - collections::BTreeMap, - convert::{TryFrom, TryInto}, - mem::take, -}; - -use hex::encode as hex_encode; -use serde::Deserialize; -use sha1::{Digest, Sha1}; -use swc_core::{ - common::{ - comments::{Comment, CommentKind, Comments}, - errors::HANDLER, - util::take::Take, - BytePos, FileName, DUMMY_SP, - }, - ecma::{ - ast::*, - atoms::JsWord, - utils::{private_ident, quote_ident, ExprFactory}, - visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith}, - }, -}; -use swc_core::common::Span; - - -#[derive(Clone, Debug, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct Config { - pub is_react_server_layer: bool, - pub enabled: bool, -} - -/// A mapping of hashed action id to the action's exported function name. -// Using BTreeMap to ensure the order of the actions is deterministic. -pub type ActionsMap = BTreeMap; - -#[tracing::instrument(level = tracing::Level::TRACE, skip_all)] -pub fn server_actions( - file_name: &FileName, - config: Config, - comments: C, -) -> impl VisitMut + Fold { - as_folder(ServerActions { - config, - comments, - file_name: file_name.to_string(), - start_pos: BytePos(0), - in_action_file: false, - in_export_decl: false, - in_default_export_decl: false, - in_callee: false, - has_action: false, - - reference_index: 0, - in_module_level: true, - should_track_names: false, - - names: Default::default(), - declared_idents: Default::default(), - - exported_idents: Default::default(), - - // This flag allows us to rewrite `function foo() {}` to `const foo = createProxy(...)`. - rewrite_fn_decl_to_proxy_decl: None, - rewrite_default_fn_expr_to_proxy_expr: None, - rewrite_expr_to_proxy_expr: None, - - annotations: Default::default(), - extra_items: Default::default(), - export_actions: Default::default(), - }) -} - -/// Serializes the Server Actions into a magic comment prefixed by -/// `__next_internal_action_entry_do_not_use__`. -fn generate_server_actions_comment(actions: ActionsMap) -> String { - format!( - " __next_internal_action_entry_do_not_use__ {} ", - serde_json::to_string(&actions).unwrap() - ) -} - -struct ServerActions { - #[allow(unused)] - config: Config, - file_name: String, - comments: C, - - start_pos: BytePos, - in_action_file: bool, - in_export_decl: bool, - in_default_export_decl: bool, - in_callee: bool, - has_action: bool, - - reference_index: u32, - in_module_level: bool, - should_track_names: bool, - - names: Vec, - declared_idents: Vec, - - // This flag allows us to rewrite `function foo() {}` to `const foo = createProxy(...)`. - rewrite_fn_decl_to_proxy_decl: Option, - rewrite_default_fn_expr_to_proxy_expr: Option>, - rewrite_expr_to_proxy_expr: Option>, - - // (ident, export name) - exported_idents: Vec<(Id, String)>, - - annotations: Vec, - extra_items: Vec, - export_actions: Vec, -} - -impl ServerActions { - // Check if the function or arrow function is an action function - fn get_action_info( - &mut self, - maybe_body: Option<&mut BlockStmt>, - remove_directive: bool, - ) -> bool { - let mut is_action_fn = false; - - if self.in_action_file && self.in_export_decl { - // All export functions in a server file are actions - is_action_fn = true; - } else { - // Check if the function has `"use server"` - if let Some(body) = maybe_body { - let mut action_span = None; - remove_server_directive_index_in_fn( - &mut body.stmts, - remove_directive, - &mut is_action_fn, - &mut action_span, - self.config.enabled, - ); - - if is_action_fn && !self.config.is_react_server_layer && !self.in_action_file { - HANDLER.with(|handler| { - handler - .struct_span_err( - action_span.unwrap_or(body.span), - "It is not allowed to define inline \"use server\" annotated Server Actions in Client Components.\nTo use Server Actions in a Client Component, you can either export them from a separate file with \"use server\" at the top, or pass them down through props from a Server Component.\n\nRead more: https://nextjs.org/docs/app/api-reference/functions/server-actions#with-client-components\n", - ) - .emit() - }); - } - } - } - - is_action_fn - } - - fn maybe_hoist_and_create_proxy( - &mut self, - ids_from_closure: Vec, - function: Option<&mut Box>, - arrow: Option<&mut ArrowExpr>, - ) -> Option> { - let action_name: JsWord = gen_ident(&mut self.reference_index); - let action_ident = private_ident!(action_name.clone()); - let export_name: JsWord = action_name; - - self.has_action = true; - self.export_actions.push(export_name.to_string()); - - if let Some(a) = arrow { - let register_action_expr = annotate_ident_as_action( - action_ident.clone(), - ids_from_closure - .iter() - .cloned() - .map(|id| Some(id.as_arg())) - .collect(), - &self.file_name, - export_name.to_string(), - ); - - if let BlockStmtOrExpr::BlockStmt(block) = &mut *a.body { - block.visit_mut_with(&mut ClosureReplacer { - used_ids: &ids_from_closure, - }); - } - - // export const $ACTION_myAction = async () => {} - let mut new_params: Vec = vec![]; - let mut new_body: BlockStmtOrExpr = *a.body.clone(); - - if !ids_from_closure.is_empty() { - // First argument is the encrypted closure variables - new_params.push(Param { - span: DUMMY_SP, - decorators: vec![], - pat: Pat::Ident(Ident::new("$$ACTION_CLOSURE_BOUND".into(), DUMMY_SP).into()), - }); - - // Also prepend the decryption decl into the body. - // var [arg1, arg2, arg3] = await decryptActionBoundArgs(actionId, - // $$ACTION_CLOSURE_BOUND) - let mut pats = vec![]; - for i in 0..ids_from_closure.len() { - pats.push(Some(Pat::Ident( - Ident::new(format!("$$ACTION_ARG_{}", i).into(), DUMMY_SP).into(), - ))); - } - let decryption_decl = VarDecl { - span: DUMMY_SP, - kind: VarDeclKind::Var, - declare: false, - decls: vec![VarDeclarator { - span: DUMMY_SP, - name: Pat::Array(ArrayPat { - span: DUMMY_SP, - elems: pats, - optional: false, - type_ann: None, - }), - init: Some(Box::new(Expr::Await(AwaitExpr { - span: DUMMY_SP, - arg: Box::new(Expr::Call(CallExpr { - span: DUMMY_SP, - callee: quote_ident!("decryptActionBoundArgs").as_callee(), - args: vec![ - generate_action_id(&self.file_name, &export_name).as_arg(), - quote_ident!("$$ACTION_CLOSURE_BOUND").as_arg(), - ], - type_args: None, - })), - }))), - definite: Default::default(), - }], - }; - - match &mut new_body { - BlockStmtOrExpr::BlockStmt(body) => { - body.stmts.insert(0, decryption_decl.into()); - } - BlockStmtOrExpr::Expr(body_expr) => { - new_body = BlockStmtOrExpr::BlockStmt(BlockStmt { - span: DUMMY_SP, - stmts: vec![ - decryption_decl.into(), - Stmt::Return(ReturnStmt { - span: DUMMY_SP, - arg: Some(body_expr.take()), - }), - ], - }); - } - } - } - - for p in a.params.iter() { - new_params.push(Param { - span: DUMMY_SP, - decorators: vec![], - pat: p.clone(), - }); - } - - // Create the action export decl from the arrow function - self.extra_items - .push(ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { - span: DUMMY_SP, - decl: FnDecl { - ident: action_ident.clone(), - function: Box::new(Function { - params: new_params, - body: match new_body { - BlockStmtOrExpr::BlockStmt(body) => Some(body), - BlockStmtOrExpr::Expr(expr) => Some(BlockStmt { - span: DUMMY_SP, - stmts: vec![Stmt::Return(ReturnStmt { - span: DUMMY_SP, - arg: Some(expr), - })], - }), - }, - decorators: vec![], - span: DUMMY_SP, - is_generator: false, - is_async: true, - type_params: None, - return_type: None, - }), - declare: Default::default(), - } - .into(), - }))); - - return Some(Box::new(register_action_expr.clone())); - } else if let Some(f) = function { - let register_action_expr = annotate_ident_as_action( - action_ident.clone(), - ids_from_closure - .iter() - .cloned() - .map(|id| Some(id.as_arg())) - .collect(), - &self.file_name, - export_name.to_string(), - ); - - f.body.visit_mut_with(&mut ClosureReplacer { - used_ids: &ids_from_closure, - }); - - // export async function $ACTION_myAction () {} - let mut new_params: Vec = vec![]; - let mut new_body: Option = f.body.clone(); - - // add params from closure collected ids - if !ids_from_closure.is_empty() { - // First argument is the encrypted closure variables - new_params.push(Param { - span: DUMMY_SP, - decorators: vec![], - pat: Pat::Ident(Ident::new("$$ACTION_CLOSURE_BOUND".into(), DUMMY_SP).into()), - }); - - // Also prepend the decryption decl into the body. - // var [arg1, arg2, arg3] = await decryptActionBoundArgs(actionId, - // $$ACTION_CLOSURE_BOUND) - let mut pats = vec![]; - for i in 0..ids_from_closure.len() { - pats.push(Some(Pat::Ident( - Ident::new(format!("$$ACTION_ARG_{}", i).into(), DUMMY_SP).into(), - ))); - } - let decryption_decl = VarDecl { - span: DUMMY_SP, - kind: VarDeclKind::Var, - declare: false, - decls: vec![VarDeclarator { - span: DUMMY_SP, - name: Pat::Array(ArrayPat { - span: DUMMY_SP, - elems: pats, - optional: false, - type_ann: None, - }), - init: Some(Box::new(Expr::Await(AwaitExpr { - span: DUMMY_SP, - arg: Box::new(Expr::Call(CallExpr { - span: DUMMY_SP, - callee: quote_ident!("decryptActionBoundArgs").as_callee(), - args: vec![ - generate_action_id(&self.file_name, &export_name).as_arg(), - quote_ident!("$$ACTION_CLOSURE_BOUND").as_arg(), - ], - type_args: None, - })), - }))), - definite: Default::default(), - }], - }; - - if let Some(body) = &mut new_body { - body.stmts.insert(0, decryption_decl.into()); - } else { - new_body = Some(BlockStmt { - span: DUMMY_SP, - stmts: vec![decryption_decl.into()], - }); - } - } - - for p in f.params.iter() { - new_params.push(p.clone()); - } - - self.extra_items - .push(ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { - span: DUMMY_SP, - decl: FnDecl { - ident: action_ident.clone(), - function: Box::new(Function { - params: new_params, - body: new_body, - ..*f.take() - }), - declare: Default::default(), - } - .into(), - }))); - - return Some(Box::new(register_action_expr)); - } - - None - } -} - -impl VisitMut for ServerActions { - fn visit_mut_export_decl(&mut self, decl: &mut ExportDecl) { - let old = self.in_export_decl; - self.in_export_decl = true; - decl.decl.visit_mut_with(self); - self.in_export_decl = old; - } - - fn visit_mut_export_default_decl(&mut self, decl: &mut ExportDefaultDecl) { - let old = self.in_export_decl; - let old_default = self.in_default_export_decl; - self.in_export_decl = true; - self.in_default_export_decl = true; - self.rewrite_default_fn_expr_to_proxy_expr = None; - decl.decl.visit_mut_with(self); - self.in_export_decl = old; - self.in_default_export_decl = old_default; - } - - fn visit_mut_export_default_expr(&mut self, expr: &mut ExportDefaultExpr) { - let old = self.in_export_decl; - let old_default = self.in_default_export_decl; - self.in_export_decl = true; - self.in_default_export_decl = true; - expr.expr.visit_mut_with(self); - self.in_export_decl = old; - self.in_default_export_decl = old_default; - } - - fn visit_mut_fn_expr(&mut self, f: &mut FnExpr) { - let is_action_fn = self.get_action_info(f.function.body.as_mut(), true); - - let declared_idents_until = self.declared_idents.len(); - let current_names = take(&mut self.names); - - // Visit children - { - let old_in_module = self.in_module_level; - let old_should_track_names = self.should_track_names; - let old_in_export_decl = self.in_export_decl; - let old_in_default_export_decl = self.in_default_export_decl; - self.in_module_level = false; - self.should_track_names = is_action_fn || self.should_track_names; - self.in_export_decl = false; - self.in_default_export_decl = false; - f.visit_mut_children_with(self); - self.in_module_level = old_in_module; - self.should_track_names = old_should_track_names; - self.in_export_decl = old_in_export_decl; - self.in_default_export_decl = old_in_default_export_decl; - } - - let mut child_names = if self.should_track_names { - let names = take(&mut self.names); - self.names = current_names; - self.names.extend(names.iter().cloned()); - names - } else { - take(&mut self.names) - }; - - if !is_action_fn { - return; - } - - if !f.function.is_async { - HANDLER.with(|handler| { - handler - .struct_span_err(f.function.span, "Server actions must be async functions") - .emit(); - }); - } - - if !(self.in_action_file && self.in_export_decl) { - // It's an action function. If it doesn't have a name, give it one. - match f.ident.as_mut() { - None => { - let action_name = gen_ident(&mut self.reference_index); - let ident = Ident::new(action_name, DUMMY_SP); - f.ident.insert(ident) - } - Some(i) => i, - }; - - // Collect all the identifiers defined inside the closure and used - // in the action function. With deduplication. - retain_names_from_declared_idents( - &mut child_names, - &self.declared_idents[..declared_idents_until], - ); - - let maybe_new_expr = - self.maybe_hoist_and_create_proxy(child_names, Some(&mut f.function), None); - - if self.in_default_export_decl { - // This function expression is also the default export: - // `export default async function() {}` - // This specific case (default export) isn't handled by `visit_mut_expr`. - // Replace the original function expr with a action proxy expr. - self.rewrite_default_fn_expr_to_proxy_expr = maybe_new_expr; - } else { - self.rewrite_expr_to_proxy_expr = maybe_new_expr; - } - } - } - - fn visit_mut_decl(&mut self, d: &mut Decl) { - self.rewrite_fn_decl_to_proxy_decl = None; - d.visit_mut_children_with(self); - - if let Some(decl) = &self.rewrite_fn_decl_to_proxy_decl { - *d = (*decl).clone().into(); - } - - self.rewrite_fn_decl_to_proxy_decl = None; - } - - fn visit_mut_fn_decl(&mut self, f: &mut FnDecl) { - let is_action_fn = self.get_action_info(f.function.body.as_mut(), true); - - let declared_idents_until = self.declared_idents.len(); - let current_names = take(&mut self.names); - - { - // Visit children - let old_in_module = self.in_module_level; - let old_should_track_names = self.should_track_names; - let old_in_export_decl = self.in_export_decl; - let old_in_default_export_decl = self.in_default_export_decl; - self.in_module_level = false; - self.should_track_names = is_action_fn || self.should_track_names; - self.in_export_decl = false; - self.in_default_export_decl = false; - f.visit_mut_children_with(self); - self.in_module_level = old_in_module; - self.should_track_names = old_should_track_names; - self.in_export_decl = old_in_export_decl; - self.in_default_export_decl = old_in_default_export_decl; - } - - let mut child_names = if self.should_track_names { - let names = take(&mut self.names); - self.names = current_names; - self.names.extend(names.iter().cloned()); - names - } else { - take(&mut self.names) - }; - - if !is_action_fn { - return; - } - - if !f.function.is_async { - HANDLER.with(|handler| { - handler - .struct_span_err(f.ident.span, "Server actions must be async functions") - .emit(); - }); - } - - if !(self.in_action_file && self.in_export_decl) { - // Collect all the identifiers defined inside the closure and used - // in the action function. With deduplication. - retain_names_from_declared_idents( - &mut child_names, - &self.declared_idents[..declared_idents_until], - ); - - let maybe_new_expr = - self.maybe_hoist_and_create_proxy(child_names, Some(&mut f.function), None); - - // Replace the original function declaration with a action proxy declaration - // expr. - self.rewrite_fn_decl_to_proxy_decl = Some(VarDecl { - span: DUMMY_SP, - kind: VarDeclKind::Var, - declare: false, - decls: vec![VarDeclarator { - span: DUMMY_SP, - name: Pat::Ident(f.ident.clone().into()), - init: maybe_new_expr, - definite: false, - }], - }); - } - } - - fn visit_mut_method_prop(&mut self, m: &mut MethodProp) { - let old_in_export_decl = self.in_export_decl; - let old_in_default_export_decl = self.in_default_export_decl; - self.in_export_decl = false; - self.in_default_export_decl = false; - m.visit_mut_children_with(self); - self.in_export_decl = old_in_export_decl; - self.in_default_export_decl = old_in_default_export_decl; - } - - fn visit_mut_class_method(&mut self, m: &mut ClassMethod) { - let old_in_export_decl = self.in_export_decl; - let old_in_default_export_decl = self.in_default_export_decl; - self.in_export_decl = false; - self.in_default_export_decl = false; - m.visit_mut_children_with(self); - self.in_export_decl = old_in_export_decl; - self.in_default_export_decl = old_in_default_export_decl; - } - - fn visit_mut_arrow_expr(&mut self, a: &mut ArrowExpr) { - // Arrow expressions need to be visited in prepass to determine if it's - // an action function or not. - let is_action_fn = self.get_action_info( - if let BlockStmtOrExpr::BlockStmt(block) = &mut *a.body { - Some(block) - } else { - None - }, - true, - ); - - let declared_idents_until = self.declared_idents.len(); - let current_names = take(&mut self.names); - - { - // Visit children - let old_in_module = self.in_module_level; - let old_should_track_names = self.should_track_names; - let old_in_export_decl = self.in_export_decl; - let old_in_default_export_decl = self.in_default_export_decl; - self.in_module_level = false; - self.should_track_names = is_action_fn || self.should_track_names; - self.in_export_decl = false; - self.in_default_export_decl = false; - { - for n in &mut a.params { - collect_idents_in_pat(n, &mut self.declared_idents); - } - } - a.visit_mut_children_with(self); - self.in_module_level = old_in_module; - self.should_track_names = old_should_track_names; - self.in_export_decl = old_in_export_decl; - self.in_default_export_decl = old_in_default_export_decl; - } - - let mut child_names = if self.should_track_names { - let names = take(&mut self.names); - self.names = current_names; - self.names.extend(names.iter().cloned()); - names - } else { - take(&mut self.names) - }; - - if !is_action_fn { - return; - } - - if !a.is_async && !self.in_action_file { - HANDLER.with(|handler| { - handler - .struct_span_err(a.span, "Server actions must be async functions") - .emit(); - }); - } - - // Collect all the identifiers defined inside the closure and used - // in the action function. With deduplication. - retain_names_from_declared_idents( - &mut child_names, - &self.declared_idents[..declared_idents_until], - ); - - let maybe_new_expr = self.maybe_hoist_and_create_proxy(child_names, None, Some(a)); - self.rewrite_expr_to_proxy_expr = maybe_new_expr; - } - - fn visit_mut_module(&mut self, m: &mut Module) { - self.start_pos = m.span.lo; - m.visit_mut_children_with(self); - } - - fn visit_mut_stmt(&mut self, n: &mut Stmt) { - n.visit_mut_children_with(self); - - if self.in_module_level { - return; - } - - // If it's a closure (not in the module level), we need to collect - // identifiers defined in the closure. - collect_decl_idents_in_stmt(n, &mut self.declared_idents); - } - - fn visit_mut_param(&mut self, n: &mut Param) { - n.visit_mut_children_with(self); - - if self.in_module_level { - return; - } - - collect_idents_in_pat(&n.pat, &mut self.declared_idents); - } - - fn visit_mut_prop_or_spread(&mut self, n: &mut PropOrSpread) { - if !self.in_module_level && self.should_track_names { - if let PropOrSpread::Prop(box Prop::Shorthand(i)) = n { - self.names.push(Name::from(&*i)); - self.should_track_names = false; - n.visit_mut_children_with(self); - self.should_track_names = true; - return; - } - } - - n.visit_mut_children_with(self); - } - - fn visit_mut_callee(&mut self, n: &mut Callee) { - let old_in_callee = self.in_callee; - self.in_callee = true; - n.visit_mut_children_with(self); - self.in_callee = old_in_callee; - } - - fn visit_mut_expr(&mut self, n: &mut Expr) { - if !self.in_module_level && self.should_track_names { - if let Ok(mut name) = Name::try_from(&*n) { - if self.in_callee { - // This is a callee i.e. `foo.bar()`, - // we need to track the actual value instead of the method name. - if !name.1.is_empty() { - name.1.pop(); - } - } - - self.names.push(name); - self.should_track_names = false; - n.visit_mut_children_with(self); - self.should_track_names = true; - return; - } - } - - self.rewrite_expr_to_proxy_expr = None; - n.visit_mut_children_with(self); - if let Some(expr) = &self.rewrite_expr_to_proxy_expr { - *n = (**expr).clone(); - self.rewrite_expr_to_proxy_expr = None; - } - } - - fn visit_mut_module_items(&mut self, stmts: &mut Vec) { - remove_server_directive_index_in_module( - stmts, - &mut self.in_action_file, - &mut self.has_action, - self.config.enabled, - ); - - let old_annotations = self.annotations.take(); - let mut new = Vec::with_capacity(stmts.len()); - - for mut stmt in stmts.take() { - // For action file, it's not allowed to export things other than async - // functions. - if self.in_action_file { - let mut disallowed_export_span = DUMMY_SP; - - // Currrently only function exports are allowed. - match &mut stmt { - ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { decl, span })) => { - match decl { - Decl::Fn(f) => { - // export function foo() {} - self.exported_idents - .push((f.ident.to_id(), f.ident.sym.to_string())); - } - Decl::Var(var) => { - // export const foo = 1 - let mut ids: Vec = Vec::new(); - collect_idents_in_var_decls(&var.decls, &mut ids); - self.exported_idents.extend( - ids.into_iter().map(|id| (id.clone(), id.0.to_string())), - ); - - for decl in &mut var.decls { - if let Some(init) = &decl.init { - if let Expr::Lit(_) = &**init { - // It's not allowed to export any literal. - disallowed_export_span = *span; - } - } - } - } - _ => { - disallowed_export_span = *span; - } - } - } - ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(named)) => { - if named.src.is_some() { - disallowed_export_span = named.span; - } else { - for spec in &mut named.specifiers { - if let ExportSpecifier::Named(ExportNamedSpecifier { - orig: ModuleExportName::Ident(ident), - exported, - .. - }) = spec - { - if let Some(export_name) = exported { - if let ModuleExportName::Ident(Ident { sym, .. }) = - export_name - { - // export { foo as bar } - self.exported_idents - .push((ident.to_id(), sym.to_string())); - } else if let ModuleExportName::Str(str) = export_name { - // export { foo as "bar" } - self.exported_idents - .push((ident.to_id(), str.value.to_string())); - } - } else { - // export { foo } - self.exported_idents - .push((ident.to_id(), ident.sym.to_string())); - } - } else { - disallowed_export_span = named.span; - } - } - } - } - ModuleItem::ModuleDecl(ModuleDecl::ExportDefaultDecl(ExportDefaultDecl { - decl, - span, - .. - })) => match decl { - DefaultDecl::Fn(f) => { - if let Some(ident) = &f.ident { - // export default function foo() {} - self.exported_idents.push((ident.to_id(), "default".into())); - } else { - // export default function() {} - let new_ident = - Ident::new(gen_ident(&mut self.reference_index), DUMMY_SP); - f.ident = Some(new_ident.clone()); - self.exported_idents - .push((new_ident.to_id(), "default".into())); - } - } - _ => { - disallowed_export_span = *span; - } - }, - ModuleItem::ModuleDecl(ModuleDecl::ExportDefaultExpr(default_expr)) => { - match &mut *default_expr.expr { - Expr::Fn(_f) => {} - Expr::Arrow(arrow) => { - if !arrow.is_async { - disallowed_export_span = default_expr.span; - } else { - // export default async () => {} - let new_ident = - Ident::new(gen_ident(&mut self.reference_index), DUMMY_SP); - - self.exported_idents - .push((new_ident.to_id(), "default".into())); - - *default_expr.expr = attach_name_to_expr( - new_ident, - Expr::Arrow(arrow.clone()), - &mut self.extra_items, - ); - } - } - Expr::Ident(ident) => { - // export default foo - self.exported_idents.push((ident.to_id(), "default".into())); - } - Expr::Call(call) => { - // export default fn() - let new_ident = - Ident::new(gen_ident(&mut self.reference_index), DUMMY_SP); - - self.exported_idents - .push((new_ident.to_id(), "default".into())); - - *default_expr.expr = attach_name_to_expr( - new_ident, - Expr::Call(call.clone()), - &mut self.extra_items, - ); - } - _ => { - disallowed_export_span = default_expr.span; - } - } - } - ModuleItem::ModuleDecl(ModuleDecl::ExportAll(ExportAll { span, .. })) => { - disallowed_export_span = *span; - } - _ => {} - } - - if disallowed_export_span != DUMMY_SP { - HANDLER.with(|handler| { - handler - .struct_span_err( - disallowed_export_span, - "Only async functions are allowed to be exported in a \"use \ - server\" file.", - ) - .emit(); - }); - } - } - - stmt.visit_mut_with(self); - - let mut new_stmt = stmt; - - if let Some(expr) = &self.rewrite_default_fn_expr_to_proxy_expr { - // If this happens, we need to replace the statement with a default export expr. - new_stmt = - ModuleItem::ModuleDecl(ModuleDecl::ExportDefaultExpr(ExportDefaultExpr { - span: DUMMY_SP, - expr: expr.clone(), - })); - self.rewrite_default_fn_expr_to_proxy_expr = None; - } - - if self.config.is_react_server_layer || !self.in_action_file { - new.push(new_stmt); - new.extend(self.annotations.drain(..).map(ModuleItem::Stmt)); - new.append(&mut self.extra_items); - } - } - - // If it's a "use server" file, all exports need to be annotated as actions. - if self.in_action_file { - // If it's compiled in the client layer, each export field needs to be - // wrapped by a reference creation call. - let create_ref_ident = private_ident!("createServerReference"); - if !self.config.is_react_server_layer { - // import { createServerReference } from - // 'private-next-rsc-action-client-wrapper' - // createServerReference("action_id") - new.push(ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl { - span: DUMMY_SP, - specifiers: vec![ImportSpecifier::Named(ImportNamedSpecifier { - span: DUMMY_SP, - local: create_ref_ident.clone(), - imported: None, - is_type_only: false, - })], - src: Box::new(Str { - span: DUMMY_SP, - value: "private-next-rsc-action-client-wrapper".into(), - raw: None, - }), - type_only: false, - with: None, - phase: Default::default(), - }))); - } - - for (id, export_name) in self.exported_idents.iter() { - let ident = Ident::new(id.0.clone(), DUMMY_SP.with_ctxt(id.1)); - - if !self.config.is_react_server_layer { - let action_id = generate_action_id(&self.file_name, export_name); - - if export_name == "default" { - let export_expr = ModuleItem::ModuleDecl(ModuleDecl::ExportDefaultExpr( - ExportDefaultExpr { - span: DUMMY_SP, - expr: Box::new(Expr::Call(CallExpr { - span: DUMMY_SP, - callee: Callee::Expr(Box::new(Expr::Ident( - create_ref_ident.clone(), - ))), - args: vec![action_id.as_arg()], - type_args: None, - })), - }, - )); - new.push(export_expr); - } else { - let export_expr = - ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { - span: DUMMY_SP, - decl: Decl::Var(Box::new(VarDecl { - span: DUMMY_SP, - kind: VarDeclKind::Var, - declare: false, - decls: vec![VarDeclarator { - span: DUMMY_SP, - name: Pat::Ident( - Ident::new(export_name.clone().into(), DUMMY_SP).into(), - ), - init: Some(Box::new(Expr::Call(CallExpr { - span: DUMMY_SP, - callee: Callee::Expr(Box::new(Expr::Ident( - create_ref_ident.clone(), - ))), - args: vec![action_id.as_arg()], - type_args: None, - }))), - definite: false, - }], - })), - })); - new.push(export_expr); - } - } else { - self.annotations.push(Stmt::Expr(ExprStmt { - span: DUMMY_SP, - expr: Box::new(annotate_ident_as_action( - ident.clone(), - Vec::new(), - &self.file_name, - export_name.to_string(), - )), - })); - } - } - - if self.config.is_react_server_layer { - new.append(&mut self.extra_items); - - // Ensure that the exports are valid by appending a check - // import { ensureServerEntryExports } from 'private-next-rsc-action-validate' - // ensureServerEntryExports([action1, action2, ...]) - let ensure_ident = private_ident!("ensureServerEntryExports"); - new.push(ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl { - span: DUMMY_SP, - specifiers: vec![ImportSpecifier::Named(ImportNamedSpecifier { - span: DUMMY_SP, - local: ensure_ident.clone(), - imported: None, - is_type_only: false, - })], - src: Box::new(Str { - span: DUMMY_SP, - value: "swc-plugin-react-server/rsc".into(), - raw: None, - }), - type_only: false, - with: None, - phase: Default::default(), - }))); - new.push(ModuleItem::Stmt(Stmt::Expr(ExprStmt { - span: DUMMY_SP, - expr: Box::new(Expr::Call(CallExpr { - span: DUMMY_SP, - callee: Callee::Expr(Box::new(Expr::Ident(ensure_ident))), - args: vec![ExprOrSpread { - spread: None, - expr: Box::new(Expr::Array(ArrayLit { - span: DUMMY_SP, - elems: self - .exported_idents - .iter() - .map(|e| { - Some(ExprOrSpread { - spread: None, - expr: Box::new(Expr::Ident(Ident::new( - e.0 .0.clone(), - DUMMY_SP.with_ctxt(e.0 .1), - ))), - }) - }) - .collect(), - })), - }], - type_args: None, - })), - }))); - - // Append annotations to the end of the file. - new.extend(self.annotations.drain(..).map(ModuleItem::Stmt)); - } - } - - if self.has_action { - let mut actions = self.export_actions.clone(); - - // All exported values are considered as actions if the file is an action file. - if self.in_action_file { - actions.extend(self.exported_idents.iter().map(|e| e.1.clone())); - }; - - let actions = actions - .into_iter() - .map(|name| (generate_action_id(&self.file_name, &name), name)) - .collect::(); - // Prepend a special comment to the top of the file. - self.comments.add_leading( - self.start_pos, - Comment { - span: DUMMY_SP, - kind: CommentKind::Block, - text: generate_server_actions_comment(actions).into(), - }, - ); - - if self.config.is_react_server_layer { - // Inlined actions are only allowed on the server layer. - // import { registerServerReference } from 'private-next-rsc-server-reference' - // registerServerReference("action_id") - new.push(ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl { - span: DUMMY_SP, - specifiers: vec![ImportSpecifier::Named(ImportNamedSpecifier { - span: DUMMY_SP, - local: quote_ident!("registerServerReference"), - imported: None, - is_type_only: false, - })], - src: Box::new(Str { - span: DUMMY_SP, - value: "swc-plugin-react-server/rsc".into(), - raw: None, - }), - type_only: false, - with: None, - phase: Default::default(), - }))); - - // Encryption and decryption only happens on the server layer. - // import { encryptActionBoundArgs, decryptActionBoundArgs } from - // 'private-next-rsc-action-encryption' - new.push(ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl { - span: DUMMY_SP, - specifiers: vec![ - ImportSpecifier::Named(ImportNamedSpecifier { - span: DUMMY_SP, - local: quote_ident!("encryptActionBoundArgs"), - imported: None, - is_type_only: false, - }), - ImportSpecifier::Named(ImportNamedSpecifier { - span: DUMMY_SP, - local: quote_ident!("decryptActionBoundArgs"), - imported: None, - is_type_only: false, - }), - ], - src: Box::new(Str { - span: DUMMY_SP, - value: "swc-plugin-react-server/rsc".into(), - raw: None, - }), - type_only: false, - with: None, - phase: Default::default(), - }))); - - // Make it the first item - new.rotate_right(2); - } else { - // Make it the first item - new.rotate_right(1); - } - } - - *stmts = new; - - self.annotations = old_annotations; - } - - fn visit_mut_stmts(&mut self, stmts: &mut Vec) { - let old_annotations = self.annotations.take(); - - let mut new = Vec::with_capacity(stmts.len()); - for mut stmt in stmts.take() { - stmt.visit_mut_with(self); - - new.push(stmt); - new.append(&mut self.annotations); - } - - *stmts = new; - - self.annotations = old_annotations; - } - - noop_visit_mut_type!(); -} - -fn retain_names_from_declared_idents(child_names: &mut Vec, current_declared_idents: &[Id]) { - // Collect the names to retain in a separate vector - let mut retained_names = Vec::new(); - - for name in child_names.iter() { - let mut should_retain = true; - - // Merge child_names. For example if both `foo.bar` and `foo.bar.baz` are used, - // we only need to keep `foo.bar` as it covers the other. - - // Currently this is O(n^2) and we can potentially improve this to O(n log n) - // by sorting or using a hashset. - for another_name in child_names.iter() { - if name != another_name - && name.0 == another_name.0 - && name.1.len() >= another_name.1.len() - { - let mut is_prefix = true; - for i in 0..another_name.1.len() { - if name.1[i] != another_name.1[i] { - is_prefix = false; - break; - } - } - if is_prefix { - should_retain = false; - break; - } - } - } - - if should_retain - && current_declared_idents.contains(&name.0) - && !retained_names.contains(name) - { - retained_names.push(name.clone()); - } - } - - // Replace the original child_names with the retained names - *child_names = retained_names; -} - -fn gen_ident(cnt: &mut u32) -> JsWord { - let id: JsWord = format!("$$ACTION_{}", cnt).into(); - *cnt += 1; - id -} - -fn attach_name_to_expr(ident: Ident, expr: Expr, extra_items: &mut Vec) -> Expr { - // Create the variable `var $$ACTION_0;` - extra_items.push(ModuleItem::Stmt(Stmt::Decl(Decl::Var(Box::new(VarDecl { - span: DUMMY_SP, - kind: VarDeclKind::Var, - declare: Default::default(), - decls: vec![VarDeclarator { - span: DUMMY_SP, - name: ident.clone().into(), - init: None, - definite: Default::default(), - }], - }))))); - - if let Expr::Paren(_paren) = &expr { - expr - } else { - // Create the assignment `($$ACTION_0 = arrow)` - Expr::Paren(ParenExpr { - span: DUMMY_SP, - expr: Box::new(Expr::Assign(AssignExpr { - span: DUMMY_SP, - left: ident.into(), - op: op!("="), - right: Box::new(expr), - })), - }) - } -} - -fn generate_action_id(file_name: &str, export_name: &str) -> String { - // Attach a checksum to the action using sha1: - // $$id = sha1('file_name' + ':' + 'export_name'); - let mut hasher = Sha1::new(); - hasher.update(file_name.as_bytes()); - hasher.update(b":"); - hasher.update(export_name.as_bytes()); - let result = hasher.finalize(); - - hex_encode(result) -} - -fn annotate_ident_as_action( - ident: Ident, - bound: Vec>, - file_name: &str, - export_name: String, -) -> Expr { - // Add the proxy wrapper call `registerServerReference($$id, $$bound, myAction, - // maybe_orig_action)`. - let action_id = generate_action_id(file_name, &export_name); - - let proxy_expr = Expr::Call(CallExpr { - span: DUMMY_SP, - callee: quote_ident!("registerServerReference").as_callee(), - args: vec![ - // $$id - ExprOrSpread { - spread: None, - expr: Box::new(action_id.clone().into()), - }, - ExprOrSpread { - spread: None, - expr: Box::new(Expr::Ident(ident)), - }, - ], - type_args: Default::default(), - }); - - if bound.is_empty() { - proxy_expr - } else { - // proxy_expr.bind(null, [encryptActionBoundArgs("id", [arg1, ...])]) - Expr::Call(CallExpr { - span: DUMMY_SP, - callee: Expr::Member(MemberExpr { - span: DUMMY_SP, - obj: Box::new(proxy_expr), - prop: MemberProp::Ident(quote_ident!("bind")), - }) - .as_callee(), - args: vec![ - ExprOrSpread { - spread: None, - expr: Box::new(Expr::Lit(Lit::Null(Null { span: DUMMY_SP }))), - }, - ExprOrSpread { - spread: None, - expr: Box::new(Expr::Call(CallExpr { - span: DUMMY_SP, - callee: quote_ident!("encryptActionBoundArgs").as_callee(), - args: vec![ - ExprOrSpread { - spread: None, - expr: Box::new(action_id.into()), - }, - ExprOrSpread { - spread: None, - expr: Box::new(Expr::Array(ArrayLit { - span: DUMMY_SP, - elems: bound, - })), - }, - ], - type_args: None, - })), - }, - ], - type_args: Default::default(), - }) - } -} - -const DIRECTIVE_TYPOS: &[&str] = &[ - "use servers", - "use-server", - "use sevrer", - "use srever", - "use servre", - "user server", -]; - -fn remove_server_directive_index_in_module( - stmts: &mut Vec, - in_action_file: &mut bool, - has_action: &mut bool, - enabled: bool, -) { - let mut is_directive = true; - - stmts.retain(|stmt| { - match stmt { - ModuleItem::Stmt(Stmt::Expr(ExprStmt { - expr: box Expr::Lit(Lit::Str(Str { value, span, .. })), - .. - })) => { - if value == "use server" { - if is_directive { - *in_action_file = true; - *has_action = true; - if !enabled { - HANDLER.with(|handler| { - handler - .struct_span_err( - *span, - "To use Server Actions, please enable the feature flag in your Next.js config. Read more: https://nextjs.org/docs/app/building-your-application/data-fetching/forms-and-mutations#convention", - ) - .emit() - }); - } - return false; - } else { - HANDLER.with(|handler| { - handler - .struct_span_err( - *span, - "The \"use server\" directive must be at the top of the file.", - ) - .emit(); - }); - } - } else { - // Detect typo of "use server" - if DIRECTIVE_TYPOS.iter().any(|&s| s == value) { - HANDLER.with(|handler| { - handler - .struct_span_err( - *span, - format!( - "Did you mean \"use server\"? \"{}\" is not a supported \ - directive name.", - value - ) - .as_str(), - ) - .emit(); - }); - } - } - } - ModuleItem::Stmt(Stmt::Expr(ExprStmt { - expr: - box Expr::Paren(ParenExpr { - expr: box Expr::Lit(Lit::Str(Str { value, .. })), - .. - }), - span, - .. - })) => { - // Match `("use server")`. - if value == "use server" || DIRECTIVE_TYPOS.iter().any(|&s| s == value) { - if is_directive { - HANDLER.with(|handler| { - handler - .struct_span_err( - *span, - "The \"use server\" directive cannot be wrapped in \ - parentheses.", - ) - .emit(); - }) - } else { - HANDLER.with(|handler| { - handler - .struct_span_err( - *span, - "The \"use server\" directive must be at the top of the file, \ - and cannot be wrapped in parentheses.", - ) - .emit(); - }) - } - } - } - _ => { - is_directive = false; - } - } - true - }); -} - -fn remove_server_directive_index_in_fn( - stmts: &mut Vec, - remove_directive: bool, - is_action_fn: &mut bool, - action_span: &mut Option, - enabled: bool, -) { - let mut is_directive = true; - - stmts.retain(|stmt| { - if let Stmt::Expr(ExprStmt { - expr: box Expr::Lit(Lit::Str(Str { value, span, .. })), - .. - }) = stmt - { - if value == "use server" { - *action_span = Some(*span); - - if is_directive { - *is_action_fn = true; - if !enabled { - HANDLER.with(|handler| { - handler - .struct_span_err( - *span, - "To use Server Actions, please enable the feature flag in your Next.js config. Read more: https://nextjs.org/docs/app/building-your-application/data-fetching/forms-and-mutations#convention", - ) - .emit() - }); - } - if remove_directive { - return false; - } - } else { - HANDLER.with(|handler| { - handler - .struct_span_err( - *span, - "The \"use server\" directive must be at the top of the function \ - body.", - ) - .emit(); - }); - } - } else { - // Detect typo of "use server" - if DIRECTIVE_TYPOS.iter().any(|&s| s == value) { - HANDLER.with(|handler| { - handler - .struct_span_err( - *span, - format!( - "Did you mean \"use server\"? \"{}\" is not a supported \ - directive name.", - value - ) - .as_str(), - ) - .emit(); - }); - } - } - } else { - is_directive = false; - } - true - }); -} - -fn collect_idents_in_array_pat(elems: &[Option], ids: &mut Vec) { - for elem in elems.iter().flatten() { - match elem { - Pat::Ident(ident) => { - ids.push(ident.id.to_id()); - } - Pat::Array(array) => { - collect_idents_in_array_pat(&array.elems, ids); - } - Pat::Object(object) => { - collect_idents_in_object_pat(&object.props, ids); - } - Pat::Rest(rest) => { - if let Pat::Ident(ident) = &*rest.arg { - ids.push(ident.id.to_id()); - } - } - Pat::Assign(AssignPat { left, .. }) => { - collect_idents_in_pat(left, ids); - } - Pat::Expr(..) | Pat::Invalid(..) => {} - } - } -} - -fn collect_idents_in_object_pat(props: &[ObjectPatProp], ids: &mut Vec) { - for prop in props { - match prop { - ObjectPatProp::KeyValue(KeyValuePatProp { key, value }) => { - if let PropName::Ident(ident) = key { - ids.push(ident.to_id()); - } - - match &**value { - Pat::Ident(ident) => { - ids.push(ident.id.to_id()); - } - Pat::Array(array) => { - collect_idents_in_array_pat(&array.elems, ids); - } - Pat::Object(object) => { - collect_idents_in_object_pat(&object.props, ids); - } - _ => {} - } - } - ObjectPatProp::Assign(AssignPatProp { key, .. }) => { - ids.push(key.to_id()); - } - ObjectPatProp::Rest(RestPat { arg, .. }) => { - if let Pat::Ident(ident) = &**arg { - ids.push(ident.id.to_id()); - } - } - } - } -} - -fn collect_idents_in_var_decls(decls: &[VarDeclarator], ids: &mut Vec) { - for decl in decls { - collect_idents_in_pat(&decl.name, ids); - } -} - -fn collect_idents_in_pat(pat: &Pat, ids: &mut Vec) { - match pat { - Pat::Ident(ident) => { - ids.push(ident.id.to_id()); - } - Pat::Array(array) => { - collect_idents_in_array_pat(&array.elems, ids); - } - Pat::Object(object) => { - collect_idents_in_object_pat(&object.props, ids); - } - Pat::Assign(AssignPat { left, .. }) => { - collect_idents_in_pat(left, ids); - } - Pat::Rest(RestPat { arg, .. }) => { - if let Pat::Ident(ident) = &**arg { - ids.push(ident.id.to_id()); - } - } - Pat::Expr(..) | Pat::Invalid(..) => {} - } -} - -fn collect_decl_idents_in_stmt(stmt: &Stmt, ids: &mut Vec) { - if let Stmt::Decl(Decl::Var(var)) = &stmt { - collect_idents_in_var_decls(&var.decls, ids); - } -} - -pub(crate) struct ClosureReplacer<'a> { - used_ids: &'a [Name], -} - -impl ClosureReplacer<'_> { - fn index(&self, e: &Expr) -> Option { - let name = Name::try_from(e).ok()?; - self.used_ids.iter().position(|used_id| *used_id == name) - } -} - -impl VisitMut for ClosureReplacer<'_> { - fn visit_mut_expr(&mut self, e: &mut Expr) { - e.visit_mut_children_with(self); - - if let Some(index) = self.index(e) { - *e = Expr::Ident(Ident::new( - // $$ACTION_ARG_0 - format!("$$ACTION_ARG_{}", index).into(), - DUMMY_SP, - )); - } - } - - fn visit_mut_prop_or_spread(&mut self, n: &mut PropOrSpread) { - n.visit_mut_children_with(self); - - if let PropOrSpread::Prop(box Prop::Shorthand(i)) = n { - let name = Name::from(&*i); - if let Some(index) = self.used_ids.iter().position(|used_id| *used_id == name) { - *n = PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { - key: PropName::Ident(i.clone()), - value: Box::new(Expr::Ident(Ident::new( - // $$ACTION_ARG_0 - format!("$$ACTION_ARG_{}", index).into(), - DUMMY_SP, - ))), - }))); - } - } - } - - noop_visit_mut_type!(); -} - -#[derive(Debug, Clone, PartialEq, Eq)] -struct NamePart { - prop: JsWord, - is_member: bool, - optional: bool, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -struct Name(Id, Vec); - -impl From<&'_ Ident> for Name { - fn from(value: &Ident) -> Self { - Name(value.to_id(), vec![]) - } -} - -impl TryFrom<&'_ Expr> for Name { - type Error = (); - - fn try_from(value: &Expr) -> Result { - match value { - Expr::Ident(i) => Ok(Name(i.to_id(), vec![])), - Expr::Member(e) => e.try_into(), - Expr::OptChain(e) => e.try_into(), - _ => Err(()), - } - } -} - -impl TryFrom<&'_ MemberExpr> for Name { - type Error = (); - - fn try_from(value: &MemberExpr) -> Result { - match &value.prop { - MemberProp::Ident(prop) => { - let mut obj: Name = value.obj.as_ref().try_into()?; - obj.1.push(NamePart { - prop: prop.sym.clone(), - is_member: true, - optional: false, - }); - Ok(obj) - } - _ => Err(()), - } - } -} - -impl TryFrom<&'_ OptChainExpr> for Name { - type Error = (); - - fn try_from(value: &OptChainExpr) -> Result { - match &*value.base { - OptChainBase::Member(m) => match &m.prop { - MemberProp::Ident(prop) => { - let mut obj: Name = m.obj.as_ref().try_into()?; - obj.1.push(NamePart { - prop: prop.sym.clone(), - is_member: false, - optional: value.optional, - }); - Ok(obj) - } - _ => Err(()), - }, - OptChainBase::Call(_) => Err(()), - } - } -} - -impl From for Box { - fn from(value: Name) -> Self { - let mut expr = Box::new(Expr::Ident(value.0.into())); - - for NamePart { - prop, - is_member, - optional, - } in value.1.into_iter() - { - if is_member { - expr = Box::new(Expr::Member(MemberExpr { - span: DUMMY_SP, - obj: expr, - prop: MemberProp::Ident(Ident::new(prop, DUMMY_SP)), - })); - } else { - expr = Box::new(Expr::OptChain(OptChainExpr { - span: DUMMY_SP, - base: Box::new(OptChainBase::Member(MemberExpr { - span: DUMMY_SP, - obj: expr, - prop: MemberProp::Ident(Ident::new(prop, DUMMY_SP)), - })), - optional, - })); - } - } - - expr - } -} diff --git a/tests/index.unit.ts b/tests/index.unit.ts new file mode 100644 index 0000000..1660f9c --- /dev/null +++ b/tests/index.unit.ts @@ -0,0 +1,7 @@ +import test from 'ava' +import { validate, reactServerAction } from '..' + +test('function exist', async (t) => { + t.is(typeof validate, 'function') + t.is(typeof reactServerAction, 'function') +}) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b9f182d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ESNext", + "moduleResolution": "Bundler" + } +}