From 1dec677eaf0d1773bc08f460693636f418f51547 Mon Sep 17 00:00:00 2001 From: Renato Date: Fri, 9 Aug 2024 17:31:08 -0300 Subject: [PATCH] feat: initial commit --- .github/assets/diagram-dark.png | Bin 0 -> 55663 bytes .github/assets/diagram-light.png | Bin 0 -> 56167 bytes .github/assets/ts-stub-dark-logo.svg | 12 + .github/assets/ts-stub-light-logo.svg | 12 + .github/workflows/release.yml | 34 + .gitignore | 18 + LICENSE | 21 + README.md | 253 +++ docs/alternatives.md | 68 + package.json | 55 + pnpm-lock.yaml | 2035 +++++++++++++++++++++++++ scripts/enhance-readme.ts | 6 + src/cli.ts | 5 + src/command.ts | 48 + src/exports.ts | 193 +++ src/index.ts | 1 + src/resolve.ts | 45 + src/stub.ts | 164 ++ src/tests/entry/anon.ts | 1 + src/tests/entry/index.ts | 8 + src/tests/entry/src/index.ts | 1 + src/tests/exports.test.ts | 72 + src/tests/stub.test.ts | 184 +++ tsconfig.json | 18 + tsup.config.ts | 15 + 25 files changed, 3269 insertions(+) create mode 100644 .github/assets/diagram-dark.png create mode 100644 .github/assets/diagram-light.png create mode 100644 .github/assets/ts-stub-dark-logo.svg create mode 100644 .github/assets/ts-stub-light-logo.svg create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docs/alternatives.md create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 scripts/enhance-readme.ts create mode 100644 src/cli.ts create mode 100755 src/command.ts create mode 100644 src/exports.ts create mode 100644 src/index.ts create mode 100644 src/resolve.ts create mode 100644 src/stub.ts create mode 100644 src/tests/entry/anon.ts create mode 100644 src/tests/entry/index.ts create mode 100644 src/tests/entry/src/index.ts create mode 100644 src/tests/exports.test.ts create mode 100644 src/tests/stub.test.ts create mode 100644 tsconfig.json create mode 100644 tsup.config.ts diff --git a/.github/assets/diagram-dark.png b/.github/assets/diagram-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3427403a26775c7423b99e9e7ac93012f5ea04 GIT binary patch literal 55663 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�!`-`5r?!=l}fZn~MFzDx}StQHuZ#4_kpI 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%0AwfJV=?dPaZl%Xp--=WFvuH)xxSTW8jX( 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 + + + + + + + + + + + diff --git a/.github/assets/ts-stub-light-logo.svg b/.github/assets/ts-stub-light-logo.svg new file mode 100644 index 0000000..ef7eaaf --- /dev/null +++ b/.github/assets/ts-stub-light-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..0d15380 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,34 @@ +name: Release +on: + push: + branches: + - main + +permissions: + contents: read + +jobs: + release: + name: Release + runs-on: ubuntu-latest + permissions: + contents: write # to be able to publish a GitHub release + issues: write # to be able to comment on released issues + pull-requests: write # to be able to comment on released pull requests + id-token: write # to enable use of OIDC for npm provenance + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + - name: Install dependencies + run: pnpm install + - name: Tests + run: pnpm test + - name: Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: pnpm semantic-release diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..74f688c --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +node_modules +build +dist + +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +*.tsbuildinfo + +.temp +.cache + +.env \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..30dfac8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Renato Ribeiro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8866084 --- /dev/null +++ b/README.md @@ -0,0 +1,253 @@ +

+ +![ts-stub](.github/assets/ts-stub-dark-logo.svg#gh-dark-mode-only) +![ts-stub](.github/assets/ts-stub-light-logo.svg#gh-light-mode-only) + +

+ +

+ + npm package + +

+ +

+ Stub your build and never watch & rebuild ever again. +

+ +

+ Getting Started  |  Documentation  |  Developer API +

+ +
+ +## Why? + +###### The "watch & rebuild" problem + +When working with workspaces _(ie multiple packages in a repository)_ even though you link a package from your local file system, the module resolution still depends on your `package.json` exports/main which usually points to the code's **bundled directory** _(eg `dist/`, `build/`, `lib/`, etc)_. + +This way you still need the source code to be bundled so that some other package can consume it, even locally. The most common way to get around this inconvenience is with _watch & rebuild_, triggering the build when some source file changes. You will need a background process to watch the file changes and might experience some delay to changes be applied _(including the types that depends on build .d.ts)_ + +###### The stubbing solution + +The ideia is to create a different build output on development that works like a **bridge** between your `package.json` exports/main resolution and your source file. +See the explained diagram below: + +

+ + + ts-stub + +

+ +

+ +

+ +--- + +## 🧑‍💻 Getting started + +> [!NOTE] +> `ts-stub` is made to be used in workspaces/multi-package repos (aka monorepos). +> Otherwise it will **not** bring any benefit, unless you do manual symlinks through your local repos. + +_**TL;DR:** Add `{ "stub": "ts-stub --clear" }` script to all pacakges and execute all at once._ + +--- + +### `1` Install `ts-stub` with your package manager + +``` +pnpm add -D ts-stub +# npm install --save-dev ts-stub +``` + +--- + +### `2` Add a separate build script to stubbing your pacakges + +> [!TIP] +> I recommend setting up a `prepack` or `prepublishOnly` build script to prevent publishing the stubbed build mistakenly + +`packages/a/package.json` + +```diff +{ + "name": "package-a", + "scripts": { + "build": "tsup", ++ "stub": "ts-stub --clear", ++ "prepack": "npm build" + } +} +``` + +`packages/b/package.json` + +```diff +{ + "name": "package-b", + "scripts": { + "build": "tsup", ++ "stub": "ts-stub --clear", ++ "prepack": "npm build" + } +} +``` + +--- + +### `3` Stub all at once + +Use your favorite tool to execute all packages stub script (like `pnpm -r`, `turbo`, `lerna`, `nx`, etc.) + +```sh +pnpm -r stub +``` + +```bash +packages/a stub$ ts-stub --clear +│ ✓ Cleaned …my-monorepo/packages/a/dist +│ ✓ Stubbed …e/packages/a/dist/index.mjs +│ ✓ Stubbed …/packages/a/dist/index.d.ts +└─ Done in 242ms +packages/b stub$ ts-stub --clear +│ ✓ Cleaned …my-monorepo/packages/b/dist +│ ✓ Stubbed …e/packages/b/dist/index.mjs +│ ✓ Stubbed …/packages/b/dist/index.d.ts +└─ Done in 233ms + +``` + +## 📖 Documentation + +By default `ts-stub` will use `src/index.ts` as entrypoint and `dist` as your build folder. +But everyting is configurable! + +**Input and output files** + +```sh +ts-stub --input=src/foo.ts --output=build +``` + +**Output format** + +```sh +ts-stub --format=cjs +``` + +**Output format extension** + +```sh +ts-stub --format=cjs:js +``` + +**Custom working directory** + +```sh +ts-stub packages/foo +# same as: ts-stub --input=packages/foo/src/index.ts --output=packages/foo/dist +``` + +### Options + +You can run `ts-stub --help` to see the following available options: + + + +``` +Usage: ts-stub [options] [cwd_directory] + +Stub your build to improve monorepo DX + +Options: + -V, --version output the version number + -i, --input [file] Input typescript file path (default: "src/index.ts") + -o, --output [dir] Output stub directory (default: "dist") + --noEmit Disable emitting declaration files (default: false) + -f, --format [format] Output format and extension. Can be "esm", "esm:js", "cjs" and "cjs:js" + Default extension for "esm" and "cjs" are ".mjs" and ".cjs" + -c, --clear Clear output folder before stubbing (default: false) + -q, --quiet Prevent any output to stdout (default: false) + --noEffects Disable any file system mutations (default: false) + -h, --help display help for command + +``` + + + +## 📃 Developer API + +**Single entry** + +```ts +import { stub } from "ts-stub"; + +stub({ + entry: { + input: "src/index.ts", + output: "dist", + format: "esm", + }, + cwd: path.join(process.cwd(), "/path/to/package"), + quiet: false, // default false + clear: true, // default false + noEffects: false, // default false +}); +``` + +**Multiple entries** + +```ts +import { stub } from "ts-stub"; + +stub({ + entry: [ + { + input: "src/index.ts", + output: "dist", + format: "esm", + }, + { + input: "src/server.ts", + output: "dist", + format: "esm", + }, + ], + cwd: path.join(process.cwd(), "/path/to/package"), + quiet: false, // default false + clear: true, // default false + noEffects: false, // default false +}); +``` + +## When `ts-stub` and `unbuild --stub` + +First of all: `unbuild` is amazing! +The first time I saw the concept was in [Anthony Fu's post](https://antfu.me/posts/publish-esm-and-cjs) and `ts-stub` was largely inspired by it. +If you don't know `unbuild` yet: it is an package bundler based on rollup made by the folks of unjs. + +### Reasons to prefer `unbuild --stub` + +**`1` convenience** + +If you already use `unbuild` to bundle your pacakges, there is **absolutely no reason** for you to use `ts-stub`. +Just go with `unbuild --stub`! + +**`2` esm** + +`ts-stub` is designed to typescript only. If you just bundle esm code and still need stubbing (there's better alternatives tho) just go with `unbuild --stub` + +### Reasons to prefer `ts-build` + +**`1` lighter** + +`unbuild` is a complete bundler, it's heavier because their scope is larger. +`ts-stub` is an lighter alternative if you already have a bundler setup and just want stubbing. + +**`2` may be faster** + +> `unbuild --stub` is powered by `jiti` (that uses `babel`) for runtime and `rullup` with plugins for the esm exports bundle +> `ts-stub` is powered by `tsx` (that uses `esbuild`) for runtime and static analysis for the esm exports bundle diff --git a/docs/alternatives.md b/docs/alternatives.md new file mode 100644 index 0000000..a800ace --- /dev/null +++ b/docs/alternatives.md @@ -0,0 +1,68 @@ +# You may not need stubbing + +There's some alternatives that can match your expectations without the need to stubbing your build + +## TypeScript + +### Conditions solution + +You can use node **conditional exports** to point your main to your source file in development. + +```json +{ + "name": "b", + "exports": { + "development": "./src/index.ts", + "default": { + "import": "./dist/index.mjs", + "require": "./dist/index.js" + } + } +} +``` + +While it work, you still need to enable typescript runtime though a loader (like ts-node, tsx, jiti, etc.), since node cannot handle typescript native _yet_. +You will also need to pass `--conditions=development` flag when running it. + +```bash +tsx --conditions=development packages/a/index.ts +``` + +### Alternate package.json + +You can make two different `package.json` for local and published, so you can change your exports accordingly. + +Local: + +```json +{ + "name": "b", + "exports": "./src/index.ts" +} +``` + +Generate for publishing: + +```json +{ + "name": "b", + "exports": { + "import": "./dist/index.mjs", + "require": "./dist/index.js" + } +} +``` + +You will still need a typescript runtime loader, but will not need conditions flag this time + +```bash +tsx packages/a/index.ts +``` + +### Stick to watch & rebuild + +If you don't mind some delaying, you could still stick to _watch & rebuild_ technique + +## ESM + +TODO diff --git a/package.json b/package.json new file mode 100644 index 0000000..d61d77b --- /dev/null +++ b/package.json @@ -0,0 +1,55 @@ +{ + "name": "ts-stub", + "version": "0.0.0-semantic-release", + "description": "Stub your build to improve monorepo DX", + "author": "Renato Ribeiro ", + "license": "MIT", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "bin": { + "ts-stub": "dist/cli.cjs" + }, + "exports": { + "import": "./dist/index.js", + "require": "./dist/index.cjs" + }, + "scripts": { + "type-check": "tsc --noEmit", + "test": "vitest run", + "readme": "tsx ./scripts/enhance-readme.ts", + "build": "rm -rf ./dist && tsup && pnpm readme", + "prepack": "vitest run && pnpm build" + }, + "peerDependencies": { + "typescript": ">=4.5.0" + }, + "dependencies": { + "@commander-js/extra-typings": "^12.1.0", + "commander": "^12.1.0", + "minimist": "^1.2.8", + "picocolors": "^1.0.1", + "tsx": "^4.16.5" + }, + "devDependencies": { + "@types/minimist": "^1.2.5", + "@types/node": "^22.1.0", + "comment-hole": "^0.1.1", + "import-meta-resolve": "^4.1.0", + "prettier": "^3.3.3", + "tsup": "^8.2.4", + "typescript": "^5.5.4", + "vitest": "^2.0.5" + }, + "prettier": { + "printWidth": 100 + }, + "keywords": [ + "tsx", + "stub", + "ts-stub", + "dx", + "typescript", + "dev" + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..0f3bd38 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2035 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@commander-js/extra-typings': + specifier: ^12.1.0 + version: 12.1.0(commander@12.1.0) + commander: + specifier: ^12.1.0 + version: 12.1.0 + minimist: + specifier: ^1.2.8 + version: 1.2.8 + picocolors: + specifier: ^1.0.1 + version: 1.0.1 + tsx: + specifier: ^4.16.5 + version: 4.16.5 + devDependencies: + '@types/minimist': + specifier: ^1.2.5 + version: 1.2.5 + '@types/node': + specifier: ^22.1.0 + version: 22.1.0 + comment-hole: + specifier: ^0.1.1 + version: 0.1.1 + import-meta-resolve: + specifier: ^4.1.0 + version: 4.1.0 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tsup: + specifier: ^8.2.4 + version: 8.2.4(postcss@8.4.41)(tsx@4.16.5)(typescript@5.5.4) + typescript: + specifier: ^5.5.4 + version: 5.5.4 + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.1.0) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@commander-js/extra-typings@12.1.0': + resolution: {integrity: sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==} + peerDependencies: + commander: ~12.1.0 + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.0': + resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.0': + resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.0': + resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.0': + resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.0': + resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.0': + resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.0': + resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.0': + resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.23.0': + resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.0': + resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.0': + resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.0': + resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.0': + resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.0': + resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.0': + resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.0': + resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.0': + resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.0': + resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.0': + resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.0': + resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.0': + resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.0': + resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.0': + resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.0': + resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@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'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/rollup-android-arm-eabi@4.20.0': + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.20.0': + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.20.0': + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.20.0': + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.20.0': + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.20.0': + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.20.0': + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.20.0': + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node@22.1.0': + resolution: {integrity: sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==} + + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + + '@vitest/runner@2.0.5': + resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} + + '@vitest/snapshot@2.0.5': + resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + 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'} + + bundle-require@5.0.0: + resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.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==} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + comment-hole@0.1.1: + resolution: {integrity: sha512-kQzxKy6GyX8i1WthWkIwJKHU5Sb2XbwiEsIdo56HML3gthkhsBHTvuwFDpx4rekpqFt9NAntr/ED4mmwWSlS4w==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.0: + resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + 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==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + 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-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + 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'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + 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'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + 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-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.20.0: + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + 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'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + 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@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + 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@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinypool@1.0.0: + resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsup@8.2.4: + resolution: {integrity: sha512-akpCPePnBnC/CXgRrcy72ZSntgIEUa1jN0oJbbvpALWKNOz1B7aM+UVDWGRGIO/T/PZugAESWDJUAb5FD48o8Q==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsx@4.16.5: + resolution: {integrity: sha512-ArsiAQHEW2iGaqZ8fTA1nX0a+lN5mNTyuGRRO6OW3H/Yno1y9/t1f9YOI1Cfoqz63VAthn++ZYcbDP7jPflc+A==} + engines: {node: '>=18.0.0'} + hasBin: true + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.13.0: + resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==} + + vite-node@2.0.5: + resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.3.5: + resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@2.0.5: + resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.0.5 + '@vitest/ui': 2.0.5 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@commander-js/extra-typings@12.1.0(commander@12.1.0)': + dependencies: + commander: 12.1.0 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.0': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.0': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.0': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.0': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.0': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.0': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.0': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.0': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.0': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.0': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.0': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.0': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.0': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.0': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.0': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.0': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.0': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.0': + optional: true + + '@esbuild/openbsd-arm64@0.23.0': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.0': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.0': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.0': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.0': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.0': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@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 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.20.0': + optional: true + + '@rollup/rollup-android-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-x64@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.20.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.20.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.20.0': + optional: true + + '@types/estree@1.0.5': {} + + '@types/minimist@1.2.5': {} + + '@types/node@22.1.0': + dependencies: + undici-types: 6.13.0 + + '@vitest/expect@2.0.5': + dependencies: + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.0.5': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.0.5': + dependencies: + '@vitest/utils': 2.0.5 + pathe: 1.1.2 + + '@vitest/snapshot@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + magic-string: 0.30.11 + pathe: 1.1.2 + + '@vitest/spy@2.0.5': + dependencies: + tinyspy: 3.0.0 + + '@vitest/utils@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + estree-walker: 3.0.3 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + + 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: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + array-union@2.1.0: {} + + assertion-error@2.0.1: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bundle-require@5.0.0(esbuild@0.23.0): + dependencies: + esbuild: 0.23.0 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + + check-error@2.1.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@12.1.0: {} + + commander@4.1.1: {} + + comment-hole@0.1.1: {} + + consola@3.2.3: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + deep-eql@5.0.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.0 + '@esbuild/android-arm': 0.23.0 + '@esbuild/android-arm64': 0.23.0 + '@esbuild/android-x64': 0.23.0 + '@esbuild/darwin-arm64': 0.23.0 + '@esbuild/darwin-x64': 0.23.0 + '@esbuild/freebsd-arm64': 0.23.0 + '@esbuild/freebsd-x64': 0.23.0 + '@esbuild/linux-arm': 0.23.0 + '@esbuild/linux-arm64': 0.23.0 + '@esbuild/linux-ia32': 0.23.0 + '@esbuild/linux-loong64': 0.23.0 + '@esbuild/linux-mips64el': 0.23.0 + '@esbuild/linux-ppc64': 0.23.0 + '@esbuild/linux-riscv64': 0.23.0 + '@esbuild/linux-s390x': 0.23.0 + '@esbuild/linux-x64': 0.23.0 + '@esbuild/netbsd-x64': 0.23.0 + '@esbuild/openbsd-arm64': 0.23.0 + '@esbuild/openbsd-x64': 0.23.0 + '@esbuild/sunos-x64': 0.23.0 + '@esbuild/win32-arm64': 0.23.0 + '@esbuild/win32-ia32': 0.23.0 + '@esbuild/win32-x64': 0.23.0 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + 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 + + 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 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + foreground-child@3.2.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fsevents@2.3.3: + optional: true + + get-func-name@2.0.2: {} + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-tsconfig@4.7.6: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.2.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + ignore@5.3.1: {} + + import-meta-resolve@4.1.0: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + joycon@3.1.1: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + lodash.sortby@4.7.0: {} + + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + + lru-cache@10.4.3: {} + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + 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: {} + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + ms@2.1.2: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-assign@4.1.1: {} + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + package-json-from-dist@1.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathval@2.0.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pirates@4.0.6: {} + + postcss-load-config@6.0.1(postcss@8.4.41)(tsx@4.16.5): + dependencies: + lilconfig: 3.1.2 + optionalDependencies: + postcss: 8.4.41 + tsx: 4.16.5 + + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prettier@3.3.3: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + reusify@1.0.4: {} + + rollup@4.20.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + source-map-js@1.2.0: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + stackback@0.0.2: {} + + std-env@3.7.0: {} + + 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@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + 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@2.0.0: {} + + strip-final-newline@3.0.0: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinybench@2.9.0: {} + + tinypool@1.0.0: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + ts-interface-checker@0.1.13: {} + + tsup@8.2.4(postcss@8.4.41)(tsx@4.16.5)(typescript@5.5.4): + dependencies: + bundle-require: 5.0.0(esbuild@0.23.0) + cac: 6.7.14 + chokidar: 3.6.0 + consola: 3.2.3 + debug: 4.3.6 + esbuild: 0.23.0 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + picocolors: 1.0.1 + postcss-load-config: 6.0.1(postcss@8.4.41)(tsx@4.16.5) + resolve-from: 5.0.0 + rollup: 4.20.0 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.4.41 + typescript: 5.5.4 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + tsx@4.16.5: + dependencies: + esbuild: 0.21.5 + get-tsconfig: 4.7.6 + optionalDependencies: + fsevents: 2.3.3 + + typescript@5.5.4: {} + + undici-types@6.13.0: {} + + vite-node@2.0.5(@types/node@22.1.0): + dependencies: + cac: 6.7.14 + debug: 4.3.6 + pathe: 1.1.2 + tinyrainbow: 1.2.0 + vite: 5.3.5(@types/node@22.1.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite@5.3.5(@types/node@22.1.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.41 + rollup: 4.20.0 + optionalDependencies: + '@types/node': 22.1.0 + fsevents: 2.3.3 + + vitest@2.0.5(@types/node@22.1.0): + dependencies: + '@ampproject/remapping': 2.3.0 + '@vitest/expect': 2.0.5 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.5 + '@vitest/snapshot': 2.0.5 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + debug: 4.3.6 + execa: 8.0.1 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinypool: 1.0.0 + tinyrainbow: 1.2.0 + vite: 5.3.5(@types/node@22.1.0) + vite-node: 2.0.5(@types/node@22.1.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.1.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + webidl-conversions@4.0.2: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 diff --git a/scripts/enhance-readme.ts b/scripts/enhance-readme.ts new file mode 100644 index 0000000..24e377f --- /dev/null +++ b/scripts/enhance-readme.ts @@ -0,0 +1,6 @@ +import { replaceTag } from "comment-hole"; +import { command } from "../src/command"; + +replaceTag("README.md", { + "auto:help": () => "```\n" + command.helpInformation() + "\n```", +}); diff --git a/src/cli.ts b/src/cli.ts new file mode 100644 index 0000000..d786b0a --- /dev/null +++ b/src/cli.ts @@ -0,0 +1,5 @@ +#!/bin/env node + +import { command } from "./command.js"; + +command.parse(); diff --git a/src/command.ts b/src/command.ts new file mode 100755 index 0000000..9385071 --- /dev/null +++ b/src/command.ts @@ -0,0 +1,48 @@ +import path from "path"; +import { program } from "@commander-js/extra-typings"; +import { stub } from "./stub.js"; +import { version } from "../package.json"; + +export const command = program + .name("ts-stub") + .description("Stub your build to improve monorepo DX") + .version(version) + .argument("[cwd_directory]") + .option("-i, --input [file]", "Input typescript file path", "src/index.ts") + .option("-o, --output [dir]", "Output stub directory", "dist") + .option("--noEmit", "Disable emitting declaration files", false) + .option( + "-f, --format [format]", + [ + 'Output format and extension. Can be "esm", "esm:js", "cjs" and "cjs:js"', + 'Default extension for "esm" and "cjs" are ".mjs" and ".cjs"', + ].join("\n"), + ) + .option("-c, --clear", "Clear output folder before stubbing", false) + .option("-q, --quiet", "Prevent any output to stdout", false) + .option("--noEffects", "Disable any file system mutations", false) + .addHelpText( + "after", + [ + "", + "Examples:", + " $ ts-stub --clear", + " $ ts-stub --clear --quiet", + " $ ts-stub --clear packages/a", + " $ ts-stub --clear --input=src/main.ts --output=build --format=cjs", + ].join("\n"), + ) + .action((dir, { input, output, format, noEmit, noEffects, quiet, clear }) => { + stub({ + entry: { + input: typeof input === "string" ? input : undefined, + output: typeof output === "string" ? output : undefined, + format: typeof format === "string" ? format : undefined, + noEmit: noEmit, + }, + cwd: typeof dir === "string" ? path.join(process.cwd(), dir) : undefined, + quiet, + clear, + noEffects, + }); + }); diff --git a/src/exports.ts b/src/exports.ts new file mode 100644 index 0000000..ee0bd2d --- /dev/null +++ b/src/exports.ts @@ -0,0 +1,193 @@ +import fs from "fs"; +import ts from "typescript"; +import { resolve } from "./resolve.js"; + +export function extractExportsIdentifiers(entry: string | URL) { + const ANONYMOUS_NAME = "_default"; + + const file = ts.createSourceFile( + "x.ts", + (entry instanceof URL ? fs.readFileSync(entry, "utf8") : entry) ?? "", + ts.ScriptTarget.Latest, + true, + ); + + // Cases where an identifier are both default and named are valid (and common) + // e.g: export const foo = "bar" + // export default foo + // The example file should be extracted as following: + // `Map(1) {"foo" => { isDefault: true, isNamed: true }}` + const identifiers = new Map(); + const add = (name: string, meta: ReturnType = {}) => + identifiers.set(name, { ...identifiers.get(name), ...meta }); + + function recursiveExtract(node: ts.Node) { + // Extract default export from ExportAssignment + // e.g: export default foo + // export default "foo" + // export default () => {} + if (ts.isExportAssignment(node)) { + const name = ts.isIdentifier(node.expression) + ? // ExportAssignment with an Identifier + // e.g: export default foo + // ^ this is an Identifier + node.expression.getText() + : // Any export assignment without an Identifier must be treated as anonymous export + // e.g: export default () => "foo" + // ^ this an ArrowFunction + // arrow functions is an expression and do not have identifier/name + // export default "foo" + // ^ this is a Literal (StringLiteral in this case but could be NumericLiteral etc) + // literals do not have identifier/name + // and so on... + ANONYMOUS_NAME; + + add(name, { default: true }); + } + + // Extract named exports from ExportSpecifier () + // e.g: export { foo, bar } + // ^^^ `foo` is an ExportSpecifier + // export { bar, baz } + // ^^^^^^^^^^^^ { bar, baz } is an NamedExports + // export { foo, bar } + // ^^^^^^^^^^^^^^^^^^^ export { foo, bar } is an ExportDeclaration + if ( + ts.isExportSpecifier(node) && + // Ignore explicit `type` from ExportSpecifier + // e.g: export { type foo } + // ^^^^ + node.isTypeOnly === false && + // Ignore explicit `type` exports from ExportDeclaration + // e.g: export type { foo, bar } + // ^^^^ + node.parent.parent.isTypeOnly === false + ) { + add(node.name.getText(), { named: true }); + } + + // Extract exports from reexporting another module + // e.g: export * from "./foo" + if ( + ts.isExportDeclaration(node) && + node.getChildren().some(isAsteriskToken) && + node.moduleSpecifier + ) { + // Unsupported when calling with code string as entry + if (typeof entry === "string") { + return; + } + + // Extract exports from the module and merge it to the current + try { + const moduleUrl = resolve(JSON.parse(node.moduleSpecifier.getText()), entry); + const moduleIds = extractExportsIdentifiers(moduleUrl); + for (const [name, meta] of moduleIds.entries()) { + identifiers.set(name, meta); + } + } catch (e) { + console.warn(`"${node.getFullStart()}" could not be followed: ${e}`); + } + } + + // Extract exports from ExportKeyword's parent. + // > There's some normal Declaration/Statemente nodes that contains `export` modifier. + // > Here we will search for any ExportKeyword token then work with its parent. + // + // e.g: export function foo() // -> FunctionDeclaration + // ⁽*⁾ export default function foo() {} // -> FunctionDeclaration (with default modifier) + // export class Bar() // -> ClassDeclaration + // ⁽*⁾ export default class Baz {} // -> ClassDeclaration (with default modifier) + // export const foo = "bar" // -> VariableStatement + // + // Note⁽*⁾: Not all `export default` syntax is treated as ExportAssigment node, e.g: + // + // export default foo + // └─ ExportAssigment + // └─ Identifier (foo) + // + // export default function foo() {} + // └─ FunctionDeclaration + // ├─ ExportKeyword (export) + // ├─ DefaultKeyword (default) + // ├─ Identifier (foo) + // └─ Block ({}) + // + if (isExportKeyword(node)) { + const parent = node.parent; + const hasDeclareModifier = + ts.canHaveModifiers(parent) && parent.modifiers?.some(isDeclareKeyword); + const hasDefaultModifier = + ts.canHaveModifiers(parent) && parent.modifiers?.some(isDefaultKeyword); + + // from VariableStatement + // e.g: export const foo = 'foo' + // export const bar = 'bar', baz = 'baz' + if (ts.isVariableStatement(parent) && !hasDeclareModifier) { + parent.declarationList.declarations.forEach((declaration) => { + add(declaration.name.getText(), { named: true }); + }); + } + + // from DeclarationStatement + // e.g: export function foo() {} + // export class Bar {} + if ( + ts.isDeclarationStatement(parent) && + // Ignore interfaces & types since it do not output runtime code + // e.g.: export interface Foo {} + // export type foo = {} + !ts.isInterfaceDeclaration(parent) && + !ts.isTypeAliasDeclaration(parent) && + // Ignore declare modifier since it do not output runtime code + // e.g.: export declare const foo: string + // export declare function Foo(): any + !hasDeclareModifier + ) { + if (parent.name && ts.isIdentifier(parent.name)) { + // This declaration *has* a name identifier + // This can be named or default depending on default modifier + // e.g: export (default?) function foo() + // export (default?) class Bar {} + add(parent.name.getText(), hasDefaultModifier ? { default: true } : { named: true }); + } else { + // This declaration *do not has* a name identifier + // This can only be default export + // e.g: export default function() // -> OK + // export default class {} // -> OK + // + // export class {} + // ^^^^^^ -------------> A class declaration without the 'default' + // modifier must have a name.(1211) + // export function() {} + // ^^ ---> Identifier expected.(1003) + if (hasDefaultModifier) { + add(ANONYMOUS_NAME, { default: true }); + } + } + } + } + + // Recursively visit children nodes + node.forEachChild(recursiveExtract); + } + + recursiveExtract(file); + return identifiers; +} + +function isExportKeyword(node: ts.Node): node is ts.ExportKeyword { + return node.kind === ts.SyntaxKind.ExportKeyword; +} + +function isDefaultKeyword(node: ts.Node): node is ts.DefaultKeyword { + return node.kind === ts.SyntaxKind.DefaultKeyword; +} + +function isDeclareKeyword(node: ts.Node): node is ts.DeclareKeyword { + return node.kind === ts.SyntaxKind.DeclareKeyword; +} + +function isAsteriskToken(node: ts.Node): node is ts.AsteriskToken { + return node.kind === ts.SyntaxKind.AsteriskToken; +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..cb587cf --- /dev/null +++ b/src/index.ts @@ -0,0 +1 @@ +export { stub, type Entry } from "./stub.js"; diff --git a/src/resolve.ts b/src/resolve.ts new file mode 100644 index 0000000..8916fa3 --- /dev/null +++ b/src/resolve.ts @@ -0,0 +1,45 @@ +import { moduleResolve, ErrnoException } from "import-meta-resolve"; + +class ModuleNotFoundError extends Error { + name = "ModuleNotFoundError"; + constructor(url?: string) { + super(`Module not found: ${url}`); + } +} + +export function resolve(specifier: string, parent: URL) { + let resolved: ModuleNotFoundError | URL | undefined; + let suffix = ["", ".ts", "/index.ts"]; + + while (!(resolved instanceof URL) && suffix.length > 0) { + resolved = tryResolve(specifier.replace(/\.js$/, "") + suffix.shift()!, parent); + } + + if (resolved instanceof ModuleNotFoundError) { + throw resolved; + } + + return resolved as URL; +} + +function tryResolve(specifier: string, parent: URL) { + try { + return moduleResolve(specifier, parent, new Set(["node", "import"])); + } catch (exception) { + if (exception instanceof Error && "code" in exception) { + const error = exception as ErrnoException; + if ( + [ + "ERR_MODULE_NOT_FOUND", + "ERR_UNSUPPORTED_DIR_IMPORT", + "MODULE_NOT_FOUND", + "ERR_PACKAGE_PATH_NOT_EXPORTED", + ].includes(error.code ?? "") + ) { + return new ModuleNotFoundError(error.url); + } + } + + throw exception; + } +} diff --git a/src/stub.ts b/src/stub.ts new file mode 100644 index 0000000..ae13826 --- /dev/null +++ b/src/stub.ts @@ -0,0 +1,164 @@ +import fs from "fs"; +import path from "path"; +import pc from "picocolors"; +import { extractExportsIdentifiers } from "./exports.js"; + +export type Entry = string | { input?: string; output?: string; format?: string; noEmit?: boolean }; + +const ENTRY_DEFAULTS = { + input: "src/index.ts", + output: "dist", + format: "esm:mjs", + noEmit: false, +}; + +export async function stub({ + entry, + cwd = process.cwd(), + quiet, + clear, + noEffects, +}: { + entry?: Entry | Entry[]; + cwd?: string; + quiet?: boolean; + clear?: boolean; + noEffects?: boolean; +}) { + const entries = Array.isArray(entry) ? entry : [entry]; + const result = await Promise.all( + entries.map(async (entry) => { + const normalizedEntry = + entry == null + ? ENTRY_DEFAULTS + : typeof entry === "string" + ? { ...ENTRY_DEFAULTS, input: entry } + : { ...ENTRY_DEFAULTS, ...filterUndefinedValues(entry) }; + + const { input, output, noEmit, format: _format } = normalizedEntry; + + const [format, rawExt = format == "esm" ? "mjs" : "cjs"] = _format.split(":"); + const ext = rawExt.startsWith(".") ? rawExt : `.${rawExt}`; + + if (path.extname(output) !== "") { + throw new TypeError("[ts-stub] entry output must be a directory"); + } + + if (!/(? `"${ext}"`) + .join(", ")}`, + ); + } + + const outputFile = path.join( + path.join(cwd, output), + path.basename(input, path.extname(input)) + ext, + ); + + const identifiers = extractExportsIdentifiers(new URL("file://" + path.join(cwd, input))); + + const files = new Map(); + + if (format === "esm") { + const esm = ["// This file was auto-generated by ts-stub"]; + if (identifiers.size > 0) { + const destructured = [...identifiers].map(([name, meta]) => + meta.default && !meta.named ? `default: ${name}` : name, + ); + const exportsSpecifiers = [...identifiers] + .flatMap(([name, meta]) => [meta.default && `${name} as default`, meta.named && name]) + .filter(Boolean); + + esm.push( + `import { require } from "tsx/cjs/api";`, + `const { ${destructured.join(", ")} } = require("../${input}", import.meta.url);`, + `export { ${exportsSpecifiers.join(", ")} };`, + ); + } + + files.set(outputFile, esm.join("\n")); + } + + if (format === "cjs") { + const cjs = [ + "// This file was auto-generated by ts-stub", + `const tsx = require("tsx/cjs/api");`, + `module.exports = require("../${input}", __dirnmame);`, + ]; + + files.set(outputFile, cjs.join("\n")); + } + + if (!noEmit) { + const hasNamed = [...identifiers.values()].some((m) => m.named); + const hasDefault = [...identifiers.values()].some((m) => m.default); + + const dts = [ + "// This file was auto-generated by ts-stub", + hasNamed && `export * from "../${input}";`, + hasDefault && `export { default } from "../${input}";`, + ].filter(Boolean); + + files.set(outputFile.slice(0, -path.extname(outputFile).length) + ".d.ts", dts.join("\n")); + } + + return files; + }), + ); + + const files = new Map(result.flatMap((files) => [...files.entries()])); + const uniqueDirs = [...new Set([...files.keys()].map(path.dirname))]; + + if (!noEffects) { + if (clear) { + await Promise.all( + uniqueDirs.map((dir) => + fs.promises.rm(dir, { force: true, recursive: true }).then(() => { + if (!quiet) { + console.log(pc.green("✓"), pc.dim("Cleaned"), pc.gray(truncateEnd(dir, 30, "…/"))); + } + }), + ), + ); + await Promise.all(uniqueDirs.map((dir) => fs.promises.mkdir(dir, { recursive: true }))); + } + + await Promise.all( + [...files].map(([file, content]) => + fs.promises.writeFile(file, content, "utf8").then(() => { + if (!quiet) { + console.log(pc.green("✓"), pc.blue("Stubbed"), pc.gray(truncateEnd(file, 30, "…"))); + } + }), + ), + ); + } + + return files; +} + +function truncateEnd(str: string, size: number, prefix: string = "") { + if (str.length < size - prefix.length) return str; + return prefix + str.slice(-(size - prefix.length)); +} + +function filterUndefinedValues(obj: object) { + return Object.fromEntries(Object.entries(obj).filter((entry) => entry[1] !== undefined)); +} diff --git a/src/tests/entry/anon.ts b/src/tests/entry/anon.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/src/tests/entry/anon.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/src/tests/entry/index.ts b/src/tests/entry/index.ts new file mode 100644 index 0000000..9629079 --- /dev/null +++ b/src/tests/entry/index.ts @@ -0,0 +1,8 @@ +export const bar = "bar"; +export const bar2 = "bar2", + bar3 = "bar3"; +export function Foo() {} +export class Bar {} +const foo = "foo"; +export { foo }; +export default foo; diff --git a/src/tests/entry/src/index.ts b/src/tests/entry/src/index.ts new file mode 100644 index 0000000..4391477 --- /dev/null +++ b/src/tests/entry/src/index.ts @@ -0,0 +1 @@ +export * from "../index.js"; diff --git a/src/tests/exports.test.ts b/src/tests/exports.test.ts new file mode 100644 index 0000000..0d03b47 --- /dev/null +++ b/src/tests/exports.test.ts @@ -0,0 +1,72 @@ +import { expect, test } from "vitest"; +import { extractExportsIdentifiers } from "../exports.js"; + +const map = (object: object) => new Map(Object.entries(object)); + +test("extract exports", () => { + expect( + extractExportsIdentifiers(new URL("file://" + process.cwd() + "/src/tests/entry/index.ts")), + ).toEqual( + map({ + bar: { named: true }, + bar2: { named: true }, + bar3: { named: true }, + Foo: { named: true }, + Bar: { named: true }, + foo: { default: true, named: true }, + }), + ); +}); + +test("extract exports star", () => { + expect( + extractExportsIdentifiers(new URL("file://" + process.cwd() + "/src/tests/entry/src/index.ts")), + ).toEqual( + map({ + bar: { named: true }, + bar2: { named: true }, + bar3: { named: true }, + Foo: { named: true }, + Bar: { named: true }, + foo: { default: true, named: true }, + }), + ); +}); + +test("extract anonymous", () => { + expect(extractExportsIdentifiers("export default 1")).toEqual( + map({ _default: { default: true } }), + ); + + expect(extractExportsIdentifiers(`export default "foo"`)).toEqual( + map({ _default: { default: true } }), + ); + + expect(extractExportsIdentifiers("export default () => {}")).toEqual( + map({ _default: { default: true } }), + ); + + expect(extractExportsIdentifiers("export default function() {}")).toEqual( + map({ _default: { default: true } }), + ); +}); + +test("extract default export declarations", () => { + expect(extractExportsIdentifiers(`export default function foo() {}`)).toEqual( + map({ foo: { default: true } }), + ); + + expect(extractExportsIdentifiers(`export default class Bar {}`)).toEqual( + map({ Bar: { default: true } }), + ); +}); + +test("ignore declare", () => { + expect( + extractExportsIdentifiers(` + export declare class Bar {}; + export declare function foo(): void; + export declare const bar: string; + `), + ).toEqual(map({})); +}); diff --git a/src/tests/stub.test.ts b/src/tests/stub.test.ts new file mode 100644 index 0000000..a9fd304 --- /dev/null +++ b/src/tests/stub.test.ts @@ -0,0 +1,184 @@ +import { expect, test } from "vitest"; +import { stub } from "../stub.js"; + +test("stub entry string", async () => { + const cwd = process.cwd(); + + expect( + await stub({ + entry: "src/tests/entry/index.ts", + cwd, + noEffects: true, + }), + ).toMatchInlineSnapshot(` + Map { + "${cwd}/dist/index.mjs" => "// This file was auto-generated by ts-stub + import { require } from "tsx/cjs/api"; + const { bar, bar2, bar3, Foo, Bar, foo } = require("../src/tests/entry/index.ts", import.meta.url); + export { bar, bar2, bar3, Foo, Bar, foo as default, foo };", + "${cwd}/dist/index.d.ts" => "// This file was auto-generated by ts-stub + export * from "../src/tests/entry/index.ts"; + export { default } from "../src/tests/entry/index.ts";", + } + `); +}); + +test("stub entry object", async () => { + const cwd = process.cwd(); + + expect( + await stub({ + entry: { + input: "src/tests/entry/index.ts", + output: "src/tests/dist", + format: undefined, + }, + cwd, + noEffects: true, + }), + ).toMatchInlineSnapshot(` + Map { + "${cwd}/src/tests/dist/index.mjs" => "// This file was auto-generated by ts-stub + import { require } from "tsx/cjs/api"; + const { bar, bar2, bar3, Foo, Bar, foo } = require("../src/tests/entry/index.ts", import.meta.url); + export { bar, bar2, bar3, Foo, Bar, foo as default, foo };", + "${cwd}/src/tests/dist/index.d.ts" => "// This file was auto-generated by ts-stub + export * from "../src/tests/entry/index.ts"; + export { default } from "../src/tests/entry/index.ts";", + } + `); +}); + +test("stub entry default", async () => { + const cwd = process.cwd() + "/src/tests/entry"; + + expect(await stub({ cwd, noEffects: true })).toMatchInlineSnapshot(` + Map { + "${cwd}/dist/index.mjs" => "// This file was auto-generated by ts-stub + import { require } from "tsx/cjs/api"; + const { bar, bar2, bar3, Foo, Bar, foo } = require("../src/index.ts", import.meta.url); + export { bar, bar2, bar3, Foo, Bar, foo as default, foo };", + "${cwd}/dist/index.d.ts" => "// This file was auto-generated by ts-stub + export * from "../src/index.ts"; + export { default } from "../src/index.ts";", + } + `); +}); + +test("stub format and extensions", async () => { + const cwd = process.cwd(); + + expect( + await stub({ + entry: { + input: "src/tests/entry/index.ts", + format: "esm:js", + }, + cwd, + noEffects: true, + }), + ).toMatchInlineSnapshot(` + Map { + "${cwd}/dist/index.js" => "// This file was auto-generated by ts-stub + import { require } from "tsx/cjs/api"; + const { bar, bar2, bar3, Foo, Bar, foo } = require("../src/tests/entry/index.ts", import.meta.url); + export { bar, bar2, bar3, Foo, Bar, foo as default, foo };", + "${cwd}/dist/index.d.ts" => "// This file was auto-generated by ts-stub + export * from "../src/tests/entry/index.ts"; + export { default } from "../src/tests/entry/index.ts";", + } + `); + + expect( + await stub({ + entry: { + input: "src/tests/entry/index.ts", + format: "cjs", + }, + cwd, + noEffects: true, + }), + ).toMatchInlineSnapshot(` + Map { + "${cwd}/dist/index.cjs" => "// This file was auto-generated by ts-stub + const tsx = require("tsx/cjs/api"); + module.exports = require("../src/tests/entry/index.ts", __dirnmame);", + "${cwd}/dist/index.d.ts" => "// This file was auto-generated by ts-stub + export * from "../src/tests/entry/index.ts"; + export { default } from "../src/tests/entry/index.ts";", + } + `); + + expect( + await stub({ + entry: { + input: "src/tests/entry/index.ts", + format: "cjs:cjs", + }, + cwd, + noEffects: true, + }), + ).toMatchInlineSnapshot(` + Map { + "${cwd}/dist/index.cjs" => "// This file was auto-generated by ts-stub + const tsx = require("tsx/cjs/api"); + module.exports = require("../src/tests/entry/index.ts", __dirnmame);", + "${cwd}/dist/index.d.ts" => "// This file was auto-generated by ts-stub + export * from "../src/tests/entry/index.ts"; + export { default } from "../src/tests/entry/index.ts";", + } + `); +}); + +test("stub should not emit", async () => { + const cwd = process.cwd(); + + expect( + await stub({ + entry: { + input: "src/tests/entry/index.ts", + noEmit: true, + }, + cwd, + noEffects: true, + }), + ).toMatchInlineSnapshot(` + Map { + "${cwd}/dist/index.mjs" => "// This file was auto-generated by ts-stub + import { require } from "tsx/cjs/api"; + const { bar, bar2, bar3, Foo, Bar, foo } = require("../src/tests/entry/index.ts", import.meta.url); + export { bar, bar2, bar3, Foo, Bar, foo as default, foo };", + } + `); +}); + +test("stub multiple entries", async () => { + const cwd = process.cwd(); + + expect( + await stub({ + entry: [ + { input: "src/tests/entry/index.ts", output: "src/tests/dist" }, + { input: "src/tests/entry/anon.ts", output: "src/tests/dist" }, + ], + cwd, + noEffects: true, + }), + ).toMatchInlineSnapshot(` + Map { + "${cwd}/src/tests/dist/index.mjs" => "// This file was auto-generated by ts-stub + import { require } from "tsx/cjs/api"; + const { bar, bar2, bar3, Foo, Bar, foo } = require("../src/tests/entry/index.ts", import.meta.url); + export { bar, bar2, bar3, Foo, Bar, foo as default, foo };", + "${cwd}/src/tests/dist/index.d.ts" => "// This file was auto-generated by ts-stub + export * from "../src/tests/entry/index.ts"; + export { default } from "../src/tests/entry/index.ts";", + "${cwd}/src/tests/dist/anon.mjs" => "// This file was auto-generated by ts-stub + import { require } from "tsx/cjs/api"; + const { default: _default } = require("../src/tests/entry/anon.ts", import.meta.url); + export { _default as default };", + "${cwd}/src/tests/dist/anon.d.ts" => "// This file was auto-generated by ts-stub + export { default } from "../src/tests/entry/anon.ts";", + } + `); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..2c2fbc1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "es2017", + "lib": ["esnext"], + "module": "esnext", + "declaration": true, + "moduleResolution": "node", + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "isolatedModules": true, + "outDir": "./dist", + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 0000000..2766238 --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from "tsup"; + +export default defineConfig([ + { + entry: ["src/index.ts"], + format: ["esm", "cjs"], + dts: true, + sourcemap: true, + splitting: true, + }, + { + entry: ["src/cli.ts"], + format: ["cjs"], + }, +]);