diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..e5b6d8d --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..2be13d4 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml deleted file mode 100644 index e2feeaa..0000000 --- a/.github/workflows/check.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: check - -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - lint: - runs-on: ubuntu-latest - name: check code style and build - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - run: bun install - - run: bun run prettier - - run: bun run build - - run: bun run sort --check - - run: bun run semver-check diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..4c4d9f2 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +name: CI + +on: + pull_request: + branches: + - main + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + ci: + name: CI Checks + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Format check + run: bun run format + + - name: Type check + run: bun run type-check + + - name: Lint + run: bun run lint + + - name: Build + run: bun run build diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 2d28b82..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: deploy - -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - build: - runs-on: ubuntu-latest - name: build and deploy - strategy: - matrix: - platform: [darwin, linux] - arch: [x64, arm64] - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - uses: pnpm/action-setup@v2 - with: - version: 8 - - run: bun install - - run: bun build . --target="bun-${{ matrix.platform }}-${{ matrix.arch }}" --outfile="bin/${{ matrix.platform }}-${{ matrix.arch }}" --compile - # upload the build artifact - - uses: actions/upload-artifact@v4 - with: - path: bin - name: ${{ matrix.platform }}-${{ matrix.arch }} - deploy: - runs-on: ubuntu-latest - name: deploy - needs: build - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - uses: pnpm/action-setup@v2 - with: - version: 8 - - uses: actions/cache/restore@v4 - with: - path: | - **/node_modules - key: ${{ runner.os }}-node-${{ hashFiles('**/bun.lockb') }} - - uses: actions/download-artifact@v4 - with: - path: bin - - run: pnpm version prepatch --preid="pr-$GITHUB_RUN_ID" --no-git-tag-version - if: github.event_name == 'pull_request' - - name: authenticate with npm - run: echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: publish prerelease - run: pnpm publish --access public --no-git-checks --tag="pr-${{ github.event.number }}" - if: github.event_name == 'pull_request' - - name: publish - run: pnpm publish --access public --no-git-checks - if: github.event_name == 'push' && github.ref == 'refs/heads/main' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..3d241d6 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,109 @@ +name: Release + +on: + push: + tags: + - "v*.*.*" + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + build: + name: Build binaries + runs-on: ubuntu-latest + strategy: + matrix: + platform: [darwin, linux] + arch: [x64, arm64] + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build binary + run: bun build src/index.ts --target="bun-${{ matrix.platform }}-${{ matrix.arch }}" --outfile="bin/${{ matrix.platform }}-${{ matrix.arch }}" --compile + + - name: Upload build artifact + uses: actions/upload-artifact@v4 + with: + path: bin + name: ${{ matrix.platform }}-${{ matrix.arch }} + + release: + name: Release + runs-on: ubuntu-latest + needs: build + permissions: + contents: write + id-token: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + run_install: false + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + registry-url: "https://registry.npmjs.org" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Format check + run: pnpm run format + + - name: Type check + run: pnpm run type-check + + - name: Lint + run: pnpm run lint + + - name: Publish to npm + run: pnpm publish --no-git-checks --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: bin + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + generate_release_notes: true + files: | + bin/darwin-x64/darwin-x64 + bin/darwin-arm64/darwin-arm64 + bin/linux-x64/linux-x64 + bin/linux-arm64/linux-arm64 + body: | + ## Installation + + ```bash + npm install @maastrich/moonx@${{ github.ref_name }} + ``` + + The platform-specific binaries will be automatically downloaded during installation. + + See [CHANGELOG.md](https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md) for full details. + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 6b07e52..f71c070 100644 --- a/.gitignore +++ b/.gitignore @@ -233,6 +233,4 @@ $RECYCLE.BIN/ *.lnk # End of https://www.toptal.com/developers/gitignore/api/node,git,macos,windows,visualstudiocode - -# moonx binary -bin +bin/moonx-dev diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..16720db --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +engine-strict=true +auto-install-peers=false diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..be22c12 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,7 @@ +dist +node_modules +*.d.ts +pnpm-lock.yaml +coverage +.git +bin diff --git a/.prototools b/.prototools new file mode 100644 index 0000000..02690a7 --- /dev/null +++ b/.prototools @@ -0,0 +1,2 @@ +[plugins] +moon = "https://raw.githubusercontent.com/moonrepo/moon/master/proto-plugin.toml" diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..54347e2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# @maastrich/moonx + +## <= 0.1.8 + +- Initial release diff --git a/bin/moonx b/bin/moonx new file mode 100755 index 0000000..92c93bb --- /dev/null +++ b/bin/moonx @@ -0,0 +1,3 @@ +#! /usr/bin/env bash + +echo "Binary not installed, you may need to run approve-build" diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index abda2e2..0000000 Binary files a/bun.lockb and /dev/null differ diff --git a/configs/.prettierrc.json b/configs/.prettierrc.json new file mode 100644 index 0000000..3b70b2e --- /dev/null +++ b/configs/.prettierrc.json @@ -0,0 +1,10 @@ +{ + "semi": true, + "singleQuote": false, + "tabWidth": 2, + "useTabs": false, + "trailingComma": "es5", + "printWidth": 80, + "arrowParens": "always", + "plugins": ["@prettier/plugin-oxc"] +} diff --git a/configs/knip.json b/configs/knip.json new file mode 100644 index 0000000..9d22e91 --- /dev/null +++ b/configs/knip.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://unpkg.com/knip@5/schema.json", + "prettier": { + "config": "./configs/.prettierrc.json" + } +} diff --git a/configs/oxlint.json b/configs/oxlint.json new file mode 100644 index 0000000..c7ae9fb --- /dev/null +++ b/configs/oxlint.json @@ -0,0 +1,15 @@ +{ + "rules": { + "typescript": "error", + "unicorn": "error", + "import": "error" + }, + "env": { + "node": true, + "es2024": true + }, + "globals": { + "NodeJS": "readonly" + }, + "ignorePatterns": ["dist", "node_modules", "*.d.ts"] +} diff --git a/package.json b/package.json index e801301..afef233 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@maastrich/moonx", - "version": "0.1.6", + "version": "0.1.8", "description": "A CLI tool to help you with moon syntax", "keywords": [ "moon", @@ -11,36 +11,52 @@ "license": "MIT", "author": "Maastrich @maastrich", "type": "module", - "main": "src/index.ts", "bin": { "moonx": "bin/moonx", "mx": "bin/moonx" }, "files": [ - "bin", + "bin/moonx", "scripts/setup-binary.js" ], "scripts": { - "build": "bun build --compile . --outfile=\"bin/moonx\"", + "build": "bun build --compile src/index.ts --outfile=\"bin/moonx-dev\"", + "changeset": "changeset", + "format": "prettier --check . --config ./configs/.prettierrc.json", + "format:fix": "prettier --write . --config ./configs/.prettierrc.json", "postinstall": "node scripts/setup-binary.js", - "prettier": "prettier --write .", - "semver-check": "bun run scripts/semver-check.ts", - "sort": "bun x sort-package-json" + "lint": "pnpm run lint:knip && pnpm run lint:oxlint", + "lint:fix": "pnpm run lint:knip:fix && pnpm run lint:oxlint:fix", + "lint:knip": "knip --config ./configs/knip.json", + "lint:knip:fix": "knip --config ./configs/knip.json --fix", + "lint:oxlint": "oxlint src scripts --config ./configs/oxlint.json", + "lint:oxlint:fix": "oxlint src scripts --config ./configs/oxlint.json --fix", + "release": "pnpm run build && changeset publish", + "sort": "pnpm sort-package-json", + "type-check": "tsc --noEmit", + "version": "changeset version" }, "devDependencies": { + "@changesets/cli": "^2.29.7", "@moonrepo/types": "^1.21.3", - "@trivago/prettier-plugin-sort-imports": "^4.2.1", + "@prettier/plugin-oxc": "^0.0.4", + "@types/bun": "^1.3.0", + "@types/node": "^24.9.1", "@types/nunjucks": "^3.2.6", - "@types/semver": "^7.5.5", - "@withfig/autocomplete-types": "^1.29.0", - "bun-types": "^1.0.11", "cac": "^6.7.14", "chalk": "^5.3.0", + "knip": "^5.66.2", "node-emoji": "^2.1.0", "nunjucks": "^3.2.4", - "prettier": "^3.0.3", - "semver": "^7.6.3", + "oxlint": "^1.23.0", + "prettier": "^3.6.2", "sort-package-json": "^2.6.0", + "typescript": "^5.9.3", "yaml": "^2.3.4" + }, + "packageManager": "pnpm@10.8.1", + "engines": { + "node": ">=18", + "pnpm": ">=9" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..d2aeb10 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1655 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: false + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@changesets/cli': + specifier: ^2.29.7 + version: 2.29.7(@types/node@24.9.1) + '@moonrepo/types': + specifier: ^1.21.3 + version: 1.33.3 + '@prettier/plugin-oxc': + specifier: ^0.0.4 + version: 0.0.4 + '@types/bun': + specifier: ^1.3.0 + version: 1.3.0 + '@types/node': + specifier: ^24.9.1 + version: 24.9.1 + '@types/nunjucks': + specifier: ^3.2.6 + version: 3.2.6 + cac: + specifier: ^6.7.14 + version: 6.7.14 + chalk: + specifier: ^5.3.0 + version: 5.6.2 + knip: + specifier: ^5.66.2 + version: 5.66.2(@types/node@24.9.1)(typescript@5.9.3) + node-emoji: + specifier: ^2.1.0 + version: 2.2.0 + nunjucks: + specifier: ^3.2.4 + version: 3.2.4 + oxlint: + specifier: ^1.23.0 + version: 1.23.0 + prettier: + specifier: ^3.6.2 + version: 3.6.2 + sort-package-json: + specifier: ^2.6.0 + version: 2.15.1 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + yaml: + specifier: ^2.3.4 + version: 2.8.1 + +packages: + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.0.13': + resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} + + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.29.7': + resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} + hasBin: true + + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + + '@emnapi/core@1.6.0': + resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} + + '@emnapi/runtime@1.6.0': + resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@moonrepo/types@1.33.3': + resolution: {integrity: sha512-MSwSPsGR4P/879/FlGeKFYzZKjfI4eqPvALiAyjrbEjWoZ83nDlXNywf3eGBxJHox2VUHW4hb13dr5TcULhq9A==} + engines: {node: '>=18.12.0'} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@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'} + + '@oxc-parser/binding-android-arm64@0.74.0': + resolution: {integrity: sha512-lgq8TJq22eyfojfa2jBFy2m66ckAo7iNRYDdyn9reXYA3I6Wx7tgGWVx1JAp1lO+aUiqdqP/uPlDaETL9tqRcg==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.74.0': + resolution: {integrity: sha512-xbY/io/hkARggbpYEMFX6CwFzb7f4iS6WuBoBeZtdqRWfIEi7sm/uYWXfyVeB8uqOATvJ07WRFC2upI8PSI83g==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.74.0': + resolution: {integrity: sha512-FIj2gAGtFaW0Zk+TnGyenMUoRu1ju+kJ/h71D77xc1owOItbFZFGa+4WSVck1H8rTtceeJlK+kux+vCjGFCl9Q==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.74.0': + resolution: {integrity: sha512-W1I+g5TJg0TRRMHgEWNWsTIfe782V3QuaPgZxnfPNmDMywYdtlzllzclBgaDq6qzvZCCQc/UhvNb37KWTCTj8A==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.74.0': + resolution: {integrity: sha512-gxqkyRGApeVI8dgvJ19SYe59XASW3uVxF1YUgkE7peW/XIg5QRAOVTFKyTjI9acYuK1MF6OJHqx30cmxmZLtiQ==} + engines: {node: '>=20.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.74.0': + resolution: {integrity: sha512-jpnAUP4Fa93VdPPDzxxBguJmldj/Gpz7wTXKFzpAueqBMfZsy9KNC+0qT2uZ9HGUDMzNuKw0Se3bPCpL/gfD2Q==} + engines: {node: '>=20.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.74.0': + resolution: {integrity: sha512-fcWyM7BNfCkHqIf3kll8fJctbR/PseL4RnS2isD9Y3FFBhp4efGAzhDaxIUK5GK7kIcFh1P+puIRig8WJ6IMVQ==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.74.0': + resolution: {integrity: sha512-AMY30z/C77HgiRRJX7YtVUaelKq1ex0aaj28XoJu4SCezdS8i0IftUNTtGS1UzGjGZB8zQz5SFwVy4dRu4GLwg==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.74.0': + resolution: {integrity: sha512-/RZAP24TgZo4vV/01TBlzRqs0R7E6xvatww4LnmZEBBulQBU/SkypDywfriFqWuFoa61WFXPV7sLcTjJGjim/w==} + engines: {node: '>=20.0.0'} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.74.0': + resolution: {integrity: sha512-620J1beNAlGSPBD+Msb3ptvrwxu04B8iULCH03zlf0JSLy/5sqlD6qBs0XUVkUJv1vbakUw1gfVnUQqv0UTuEg==} + engines: {node: '>=20.0.0'} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.74.0': + resolution: {integrity: sha512-WBFgQmGtFnPNzHyLKbC1wkYGaRIBxXGofO0+hz1xrrkPgbxbJS1Ukva1EB8sPaVBBQ52Bdc2GjLSp721NWRvww==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.74.0': + resolution: {integrity: sha512-y4mapxi0RGqlp3t6Sm+knJlAEqdKDYrEue2LlXOka/F2i4sRN0XhEMPiSOB3ppHmvK4I2zY2XBYTsX1Fel0fAg==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-wasm32-wasi@0.74.0': + resolution: {integrity: sha512-yDS9bRDh5ymobiS2xBmjlrGdUuU61IZoJBaJC5fELdYT5LJNBXlbr3Yc6m2PWfRJwkH6Aq5fRvxAZ4wCbkGa8w==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.74.0': + resolution: {integrity: sha512-XFWY52Rfb4N5wEbMCTSBMxRkDLGbAI9CBSL24BIDywwDJMl31gHEVlmHdCDRoXAmanCI6gwbXYTrWe0HvXJ7Aw==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.74.0': + resolution: {integrity: sha512-1D3x6iU2apLyfTQHygbdaNbX3nZaHu4yaXpD7ilYpoLo7f0MX0tUuoDrqJyJrVGqvyXgc0uz4yXz9tH9ZZhvvg==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.74.0': + resolution: {integrity: sha512-KOw/RZrVlHGhCXh1RufBFF7Nuo7HdY5w1lRJukM/igIl6x9qtz8QycDvZdzb4qnHO7znrPyo2sJrFJK2eKHgfQ==} + + '@oxc-resolver/binding-android-arm-eabi@11.11.1': + resolution: {integrity: sha512-v5rtczLD5d8lasBdP6GXoM7VQ1Av9pZyWGXF5afQawRZcWTVvncrIzu9nhKpvIhhmC4C6MYdXA3CNZc60LvUig==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.11.1': + resolution: {integrity: sha512-0QqKsM8/XRNDGZy1/rxys53U/aCLVBKV2jgGFr3msypTZtNH/d4qao7QULM++H4hcaXghfXaB4xVCPDg3tHCvQ==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.11.1': + resolution: {integrity: sha512-xdHj8Mn3WB+dTGWcMzC07pZiSvQfKxcCEIlmDGrwwLmS4MgyJcraDDykFg4NXwd8dJNKOLqEfV3RMLRYgE2f8w==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.11.1': + resolution: {integrity: sha512-t9ImHoJXhFimPx3u0UMbQzADUBq/xnQY1eGc3bfOu5l4h0k/3rlsO16Fe8dheG8Iuvc3j2lh8H8dFg/Los4WeQ==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.11.1': + resolution: {integrity: sha512-aK7b1Yr2VkC2efK0w63v7gZkCqYmhR4XTCCYgA5KbtpJVg1OwFXVRjO1vfWNn5osk9dNpaIdeo3C1IfWPhW68w==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.11.1': + resolution: {integrity: sha512-9wHEYo+1VLoCjX4iI29ZR2ExdcGbG8JlmSR0aRW/A/NuzKxFB+bfiPkwUrvdSv7syXS8CrixvLdqAkBoXgk/rQ==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.11.1': + resolution: {integrity: sha512-Mf8wZJEeGAQ1WAwp6nvtxucYAQDDtj9Qhv1BaQS8SbeR3na203RUFdEm6F5ptWzF8cuY+ye+FsGKr8lKG3pvWg==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.11.1': + resolution: {integrity: sha512-Fk8BrFBfKzUveCEAXZ6kDhyc5RLWIWOI0+UZGp1G3WQIFo9HDEqnYtsOtUbzLtjifbyMhtaTteElRSGNKTJ3nA==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-musl@11.11.1': + resolution: {integrity: sha512-jbsO1/VTDRb5FAvWnxEIFOnFHA7dALBn5HPdxdoAbnuvjgjIPYMVvTFEBPNLz3BSFxWdounZasZDYYFhBhFzmQ==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.11.1': + resolution: {integrity: sha512-+aY2AjUQkByiOtKUU0RyqB7VV7HIh3SMBh54/9nzUbHN5RiF0As5DApV/IwbQjB2oKc0VywQZzE+/Wj/Ijvd/Q==} + cpu: [ppc64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.11.1': + resolution: {integrity: sha512-HqBogCmIl344en3EAhC9vSm/h52fb5BA0eFxsgsH9HgwYY6qH4th4msBqBAiMRCKcC6hVwjh0fmzHgST2rx4Cw==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-musl@11.11.1': + resolution: {integrity: sha512-9dXyIMQMrh76WyMtNDJhsRYqc6KDsQe3/ja9fAPBk28p7kltEvZvHpivq1Xa8Ca/JCa8QgTROgLInChNEF27bQ==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-s390x-gnu@11.11.1': + resolution: {integrity: sha512-Ybp/bSJmnl0sr8zh+nIz0cpU077tDZDYRYDhZiWN+f7rcWF7D8Z/pKD9zPxRocvJieZGfzrIwmHiHf9eY47P9w==} + cpu: [s390x] + os: [linux] + + '@oxc-resolver/binding-linux-x64-gnu@11.11.1': + resolution: {integrity: sha512-uVWj/UI6+l5/CeV2d4XpjycJNDkk/JfxNzQLAFCsVl5ZbrIfWQ9TzEzAi7xsDgVZYLBuL7iSowQ7YYRp1LQZlA==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-musl@11.11.1': + resolution: {integrity: sha512-Q9kQmiZn4bNnCOqPHvdF4bHdKXBa7Ow6yfeKTWPNOHyoZXdyxIu5C+3jSjo+SJiFNhmnh0hEAN8om6GEuJEYCA==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-wasm32-wasi@11.11.1': + resolution: {integrity: sha512-skGIwjoRwEh2qFIaG/wwa74i5KcoWNTEy1ycB6qdRV+OOSlkosVFIzXPYzjcuwtIL1M6pC7+M+56TgQQEzOUmw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.11.1': + resolution: {integrity: sha512-5R2GVH44JXGoI+gVlR4+O3ql6KZICQlCmIB0ZbpiYbEHNxaB47v3aSMVxcCuwhYKndJUJZwRXnYzoCfMEu4o0g==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-ia32-msvc@11.11.1': + resolution: {integrity: sha512-iB/ljDyPJCMIO7WPx2bj8fRCB1TxmHSv/t3oyUwOiz79Q0A33QbwZWhdx+ZXdazGPer71mYZfr3eb0hAnmlgrg==} + cpu: [ia32] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.11.1': + resolution: {integrity: sha512-OtUpzpStS5bgVGXV7eaBr7Spot9lXu/wyd0yWEyoG2tyzm/bwdRKCwJQzxWIhlecRxMDGA+qlLRRicTNOejkSQ==} + cpu: [x64] + os: [win32] + + '@oxlint/darwin-arm64@1.23.0': + resolution: {integrity: sha512-sbxoftgEMKmZQO7O4wHR9Rs7MfiHa2UH2x4QJDoc4LXqSCsI4lUIJbFQ05vX+zOUbt7CQMPdxEzExd4DqeKY2w==} + cpu: [arm64] + os: [darwin] + + '@oxlint/darwin-x64@1.23.0': + resolution: {integrity: sha512-PjByWr1TlwHQiOqEc8CPyXCT4wnujSK3n9l1m4un0Eh0uLJEDG5WM9tyDWOGuakC0Ika9/SMp0HDRg3ySchRRA==} + cpu: [x64] + os: [darwin] + + '@oxlint/linux-arm64-gnu@1.23.0': + resolution: {integrity: sha512-sWlCwQ6xKeKC08qU3SfozqpRGCLJiO/onPYFJKEHbjzHkFp+OubOacFaT4ePcka28jCU1TvQ7Gi5BVQRncr0Xg==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-arm64-musl@1.23.0': + resolution: {integrity: sha512-MPkmSiezuVgjMbzDSkRhENdnb038JOI+OTpBrOho2crbCAuqSRvyFwkMRhncJGZskzo1yeKxrKXB8T83ofmSXw==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-x64-gnu@1.23.0': + resolution: {integrity: sha512-F6H9wmLfjBoNqtsgyg3P9abLnkVjNbCAnISKdRtDl7HvkMs4s/eU8np9+tSnqPeKOTBhkS+h/VSWgPGZTqIWQA==} + cpu: [x64] + os: [linux] + + '@oxlint/linux-x64-musl@1.23.0': + resolution: {integrity: sha512-Xra0Cow35mAku8mbUbviPRalTU4Ct6MXQ1Eue8GmN4HFkjosrNa5qfy7QkJBqzjiI+JdnHxPXwackGn92/XOQw==} + cpu: [x64] + os: [linux] + + '@oxlint/win32-arm64@1.23.0': + resolution: {integrity: sha512-FR+I+uGD3eFzTfBw87QRr+Y1jBYil3TqPM0wkSvuf3gOJTEXAfSkh9QHCgQqrseW3HDW7YJJ8ty1+sU31H/N4g==} + cpu: [arm64] + os: [win32] + + '@oxlint/win32-x64@1.23.0': + resolution: {integrity: sha512-/oX0b26YIC1OgS5B+G8Ux1Vs/PIjOP4CBRzsPpYr0T+RoboJ3ZuV32bztLRggJKQqIlozcqiRo9fl/UMOMp8kQ==} + cpu: [x64] + os: [win32] + + '@prettier/plugin-oxc@0.0.4': + resolution: {integrity: sha512-UGXe+g/rSRbglL0FOJiar+a+nUrst7KaFmsg05wYbKiInGWP6eAj/f8A2Uobgo5KxEtb2X10zeflNH6RK2xeIQ==} + engines: {node: '>=14'} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/bun@1.3.0': + resolution: {integrity: sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@24.9.1': + resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==} + + '@types/nunjucks@3.2.6': + resolution: {integrity: sha512-pHiGtf83na1nCzliuAdq8GowYiXvH5l931xZ0YEHaLMNFgynpEqx+IPStlu7UaDkehfvl01e4x/9Tpwhy7Ue3w==} + + a-sync-waterfall@1.0.1: + resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bun-types@1.3.0: + resolution: {integrity: sha512-u8X0thhx+yJ0KmkxuEo9HAtdfgCBaM/aI9K90VQcQioAmkVp3SG3FkwWGibUFz3WdXAdcsqOcbU40lK7tbHdkQ==} + peerDependencies: + '@types/react': ^19 + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} + + detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + formatly@0.3.0: + resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} + engines: {node: '>=18.3.0'} + hasBin: true + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + git-hooks-list@3.2.0: + resolution: {integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + human-id@4.1.2: + resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} + hasBin: true + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + 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-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + knip@5.66.2: + resolution: {integrity: sha512-5wvsdc17C5bMxjuGfN9KVS/tW5KIvzP1RClfpTMdLYm8IXIsfWsiHlFkTvZIca9skwoVDyTyXmbRq4w1Poim+A==} + engines: {node: '>=18.18.0'} + hasBin: true + peerDependencies: + '@types/node': '>=18' + typescript: '>=5.0.4 <7' + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + node-emoji@2.2.0: + resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} + engines: {node: '>=18'} + + nunjucks@3.2.4: + resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==} + engines: {node: '>= 6.9.0'} + hasBin: true + peerDependencies: + chokidar: ^3.3.0 + peerDependenciesMeta: + chokidar: + optional: true + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + oxc-parser@0.74.0: + resolution: {integrity: sha512-2tDN/ttU8WE6oFh8EzKNam7KE7ZXSG5uXmvX85iNzxdJfMssDWcj3gpYzZi1E04XuE7m3v1dVWl/8BE886vPGw==} + engines: {node: '>=20.0.0'} + + oxc-resolver@11.11.1: + resolution: {integrity: sha512-4Z86u4xQAxl2IC1OAAdHjk/S9GNbE2ewALQVOpBk9F8NkfqXlglY6R2ts+HEgY/Q3T9m/H8W0G4id71muw/Nng==} + + oxlint@1.23.0: + resolution: {integrity: sha512-cLVdSE7Bza8npm+PffU0oufs15+M5uSMbQn0k2fJCayWU0xqQ3dyA3w9tEk8lgNOk1j1VJEdYctz64Vik8VG1w==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.2.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + 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'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + smol-toml@1.4.2: + resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==} + engines: {node: '>= 18'} + + sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + + sort-package-json@2.15.1: + resolution: {integrity: sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==} + hasBin: true + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@5.0.2: + resolution: {integrity: sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==} + engines: {node: '>=14.16'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + +snapshots: + + '@babel/runtime@7.28.4': {} + + '@changesets/apply-release-plan@7.0.13': + dependencies: + '@changesets/config': 3.1.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.3 + + '@changesets/assemble-release-plan@6.0.9': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.3 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.29.7(@types/node@24.9.1)': + dependencies: + '@changesets/apply-release-plan': 7.0.13 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.13 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.2(@types/node@24.9.1) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.3 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.3 + + '@changesets/get-release-plan@4.0.13': + dependencies: + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.1': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.5': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.2 + prettier: 2.8.8 + + '@emnapi/core@1.6.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.6.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@inquirer/external-editor@1.0.2(@types/node@24.9.1)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 24.9.1 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.4 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.4 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@moonrepo/types@1.33.3': {} + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@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.19.1 + + '@oxc-parser/binding-android-arm64@0.74.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.74.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.74.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.74.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.74.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.74.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.74.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.74.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.74.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.74.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.74.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.74.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.74.0': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.74.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.74.0': + optional: true + + '@oxc-project/types@0.74.0': {} + + '@oxc-resolver/binding-android-arm-eabi@11.11.1': + optional: true + + '@oxc-resolver/binding-android-arm64@11.11.1': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.11.1': + optional: true + + '@oxc-resolver/binding-darwin-x64@11.11.1': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.11.1': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.11.1': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@11.11.1': + optional: true + + '@oxc-resolver/binding-win32-ia32-msvc@11.11.1': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.11.1': + optional: true + + '@oxlint/darwin-arm64@1.23.0': + optional: true + + '@oxlint/darwin-x64@1.23.0': + optional: true + + '@oxlint/linux-arm64-gnu@1.23.0': + optional: true + + '@oxlint/linux-arm64-musl@1.23.0': + optional: true + + '@oxlint/linux-x64-gnu@1.23.0': + optional: true + + '@oxlint/linux-x64-musl@1.23.0': + optional: true + + '@oxlint/win32-arm64@1.23.0': + optional: true + + '@oxlint/win32-x64@1.23.0': + optional: true + + '@prettier/plugin-oxc@0.0.4': + dependencies: + oxc-parser: 0.74.0 + + '@sindresorhus/is@4.6.0': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/bun@1.3.0': + dependencies: + bun-types: 1.3.0 + transitivePeerDependencies: + - '@types/react' + + '@types/node@12.20.55': {} + + '@types/node@24.9.1': + dependencies: + undici-types: 7.16.0 + + '@types/nunjucks@3.2.6': {} + + a-sync-waterfall@1.0.1: {} + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + asap@2.0.6: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bun-types@1.3.0: + dependencies: + '@types/node': 24.9.1 + + cac@6.7.14: {} + + chalk@5.6.2: {} + + char-regex@1.0.2: {} + + chardet@2.1.0: {} + + ci-info@3.9.0: {} + + commander@5.1.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + detect-indent@6.1.0: {} + + detect-indent@7.0.2: {} + + detect-newline@4.0.1: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + emojilib@2.4.0: {} + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + esprima@4.0.1: {} + + extendable-error@0.1.7: {} + + fast-glob@3.3.3: + 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.8 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + formatly@0.3.0: + dependencies: + fd-package-json: 2.0.0 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + get-stdin@9.0.0: {} + + git-hooks-list@3.2.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + graceful-fs@4.2.11: {} + + human-id@4.1.2: {} + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + + isexe@2.0.0: {} + + jiti@2.6.1: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + knip@5.66.2(@types/node@24.9.1)(typescript@5.9.3): + dependencies: + '@nodelib/fs.walk': 1.2.8 + '@types/node': 24.9.1 + fast-glob: 3.3.3 + formatly: 0.3.0 + jiti: 2.6.1 + js-yaml: 4.1.0 + minimist: 1.2.8 + oxc-resolver: 11.11.1 + picocolors: 1.1.1 + picomatch: 4.0.3 + smol-toml: 1.4.2 + strip-json-comments: 5.0.2 + typescript: 5.9.3 + zod: 4.1.12 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.startcase@4.4.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minimist@1.2.8: {} + + mri@1.2.0: {} + + node-emoji@2.2.0: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + + nunjucks@3.2.4: + dependencies: + a-sync-waterfall: 1.0.1 + asap: 2.0.6 + commander: 5.1.0 + + outdent@0.5.0: {} + + oxc-parser@0.74.0: + dependencies: + '@oxc-project/types': 0.74.0 + optionalDependencies: + '@oxc-parser/binding-android-arm64': 0.74.0 + '@oxc-parser/binding-darwin-arm64': 0.74.0 + '@oxc-parser/binding-darwin-x64': 0.74.0 + '@oxc-parser/binding-freebsd-x64': 0.74.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.74.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.74.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.74.0 + '@oxc-parser/binding-linux-arm64-musl': 0.74.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.74.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.74.0 + '@oxc-parser/binding-linux-x64-gnu': 0.74.0 + '@oxc-parser/binding-linux-x64-musl': 0.74.0 + '@oxc-parser/binding-wasm32-wasi': 0.74.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.74.0 + '@oxc-parser/binding-win32-x64-msvc': 0.74.0 + + oxc-resolver@11.11.1: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.11.1 + '@oxc-resolver/binding-android-arm64': 11.11.1 + '@oxc-resolver/binding-darwin-arm64': 11.11.1 + '@oxc-resolver/binding-darwin-x64': 11.11.1 + '@oxc-resolver/binding-freebsd-x64': 11.11.1 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.11.1 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.11.1 + '@oxc-resolver/binding-linux-arm64-gnu': 11.11.1 + '@oxc-resolver/binding-linux-arm64-musl': 11.11.1 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.11.1 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.11.1 + '@oxc-resolver/binding-linux-riscv64-musl': 11.11.1 + '@oxc-resolver/binding-linux-s390x-gnu': 11.11.1 + '@oxc-resolver/binding-linux-x64-gnu': 11.11.1 + '@oxc-resolver/binding-linux-x64-musl': 11.11.1 + '@oxc-resolver/binding-wasm32-wasi': 11.11.1 + '@oxc-resolver/binding-win32-arm64-msvc': 11.11.1 + '@oxc-resolver/binding-win32-ia32-msvc': 11.11.1 + '@oxc-resolver/binding-win32-x64-msvc': 11.11.1 + + oxlint@1.23.0: + optionalDependencies: + '@oxlint/darwin-arm64': 1.23.0 + '@oxlint/darwin-x64': 1.23.0 + '@oxlint/linux-arm64-gnu': 1.23.0 + '@oxlint/linux-arm64-musl': 1.23.0 + '@oxlint/linux-x64-gnu': 1.23.0 + '@oxlint/linux-x64-musl': 1.23.0 + '@oxlint/win32-arm64': 1.23.0 + '@oxlint/win32-x64': 1.23.0 + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@4.0.1: {} + + prettier@2.8.8: {} + + prettier@3.6.2: {} + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + resolve-from@5.0.0: {} + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + semver@7.7.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + + slash@3.0.0: {} + + smol-toml@1.4.2: {} + + sort-object-keys@1.1.3: {} + + sort-package-json@2.15.1: + dependencies: + detect-indent: 7.0.2 + detect-newline: 4.0.1 + get-stdin: 9.0.0 + git-hooks-list: 3.2.0 + is-plain-obj: 4.1.0 + semver: 7.7.3 + sort-object-keys: 1.1.3 + tinyglobby: 0.2.15 + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + sprintf-js@1.0.3: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-json-comments@5.0.2: {} + + term-size@2.2.1: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tslib@2.8.1: + optional: true + + typescript@5.9.3: {} + + undici-types@7.16.0: {} + + unicode-emoji-modifier-base@1.0.0: {} + + universalify@0.1.2: {} + + walk-up-path@4.0.0: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + yaml@2.8.1: {} + + zod@4.1.12: {} diff --git a/scripts/fig.ts b/scripts/fig.ts deleted file mode 100644 index f900f6f..0000000 --- a/scripts/fig.ts +++ /dev/null @@ -1,29 +0,0 @@ -const generator: Fig.Generator = { - script(args) { - return [ - "moonx", - "_moonx_list", - ...args.filter( - (arg) => !arg.startsWith("-") && arg.length && "moonx" !== arg, - ), - ]; - }, - trigger: "moonx", - postProcess(out) { - const lines = out.split("\n"); - return lines.map((line) => { - return { - name: line, - }; - }); - }, -}; - -const completionSpec: Fig.Spec = { - name: "moonx", - args: { - isVariadic: true, - generators: generator, - }, -}; -export default completionSpec; diff --git a/scripts/semver-check.ts b/scripts/semver-check.ts deleted file mode 100644 index 54333ac..0000000 --- a/scripts/semver-check.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { gt, valid } from "semver"; - -import pkg from "../package.json"; - -try { - const response = await fetch( - "https://raw.githubusercontent.com/maastrich/moonx/main/package.json", - { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }, - ); - const infos = await response.json(); - - const current = pkg.version; - const previous = infos.version; - - if (!previous || !valid(previous) || !valid(current)) { - console.error( - "Could not compare versions, got: previous=%s, current=%s", - previous, - current, - ); - process.exit(1); - } - - if (!gt(current, previous)) { - console.error( - "Current version %s is not greater than previous version %s", - current, - previous, - ); - process.exit(1); - } -} catch (error) { - console.error("Could not resolve previous version:\n\t%s", error); - process.exit(0); -} diff --git a/scripts/setup-binary.js b/scripts/setup-binary.js index f118238..ac0b328 100644 --- a/scripts/setup-binary.js +++ b/scripts/setup-binary.js @@ -1,20 +1,90 @@ -import { chmodSync, existsSync, renameSync } from "node:fs"; -import { join } from "node:path"; +import { + chmodSync, + createWriteStream, + existsSync, + mkdirSync, + readFileSync, + renameSync, +} from "node:fs"; +import { get } from "node:https"; +import { join, dirname } from "node:path"; +import { pipeline } from "node:stream/promises"; +import { fileURLToPath } from "node:url"; const { platform, arch } = process; -const src = join( - process.cwd(), - "bin", - `${platform}-${arch}`, - `${platform}-${arch}`, -); +console.log(process.env.INIT_CWD, process.cwd()); + +// Skip installation in development workspace +// INIT_CWD is the directory where npm install was initiated +// If it differs from cwd, we're in a workspace install +if (process.env.INIT_CWD && process.env.INIT_CWD === process.cwd()) { + console.log("Skipping binary download in workspace install"); + process.exit(0); +} + +// Get package version from package.json +const __dirname = dirname(fileURLToPath(import.meta.url)); +const packageJsonPath = join(__dirname, "..", "package.json"); +const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); +const version = packageJson.version; + +const binaryName = `${platform}-${arch}`; +const src = join(process.cwd(), "bin", binaryName, binaryName); const dest = join(process.cwd(), "bin", "moonx"); -if (!existsSync(src)) { - console.error(`Binary not found: ${src}`); +// If binary already exists locally (from build), use it +if (existsSync(src)) { + renameSync(src, dest); + chmodSync(dest, 0o755); + console.log(`Binary installed successfully from local build`); process.exit(0); } -renameSync(src, dest); -chmodSync(dest, 0o755); +// Download from GitHub releases +console.log(`Downloading binary for ${platform}-${arch}...`); + +const downloadUrl = `https://github.com/maastrich/moonx/releases/download/v${version}/${binaryName}`; + +async function downloadBinary(url, destPath) { + return new Promise((resolve, reject) => { + get(url, (response) => { + // Handle redirects + if (response.statusCode === 301 || response.statusCode === 302) { + downloadBinary(response.headers.location, destPath) + .then(resolve) + .catch(reject); + return; + } + + if (response.statusCode !== 200) { + reject( + new Error(`Failed to download binary: HTTP ${response.statusCode}`) + ); + return; + } + + // Ensure directory exists + mkdirSync(dirname(destPath), { recursive: true }); + + const fileStream = createWriteStream(destPath); + pipeline(response, fileStream) + .then(() => { + chmodSync(destPath, 0o755); + resolve(); + }) + .catch(reject); + }).on("error", reject); + }); +} + +try { + await downloadBinary(downloadUrl, dest); + console.log(`Binary downloaded and installed successfully`); +} catch (error) { + console.error(`Failed to download binary: ${error.message}`); + console.error(`Tried to download from: ${downloadUrl}`); + console.error(`Please ensure the release v${version} exists on GitHub`); + console.error(`\tsee: https://github.com/maastrich/moonx/releases`); + process.exit(1); +} diff --git a/src/cli/completion.ts b/src/cli/completion.ts new file mode 100644 index 0000000..ef5db03 --- /dev/null +++ b/src/cli/completion.ts @@ -0,0 +1,102 @@ +export type Shell = "bash" | "zsh" | "fish"; + +/** + * Generate shell completion script for moonx + * + * The completion scripts use `moonx _moonx_list` which automatically caches results + * for 5 minutes (configurable via MOONX_CACHE_TTL env var in milliseconds). + * + * Cache management: + * - `moonx cache:info` - Show cache status and location + * - `moonx cache:clear` - Clear the cache + */ +export function generateCompletion(shell: Shell): string { + switch (shell) { + case "bash": + return generateBashCompletion(); + case "zsh": + return generateZshCompletion(); + case "fish": + return generateFishCompletion(); + default: + throw new Error(`Unknown shell: ${shell}`); + } +} + +function generateBashCompletion(): string { + return `# moonx completion script for bash +# Add this to your ~/.bashrc or ~/.bash_profile: +# eval "$(moonx completion bash)" + +_moonx_completion() { + local cur prev words cword + _init_completion || return + + if [ $cword -eq 1 ]; then + # Complete commands + COMPREPLY=($(compgen -W "$(moonx _moonx_list)" -- "$cur")) + return 0 + fi + + if [ $cword -ge 2 ]; then + # Complete workspaces for the selected command + local command="\${words[1]}" + COMPREPLY=($(compgen -W "$(moonx _moonx_list "$command")" -- "$cur")) + return 0 + fi +} + +complete -F _moonx_completion moonx +complete -F _moonx_completion mx +`; +} + +function generateZshCompletion(): string { + return `# moonx completion script for zsh +# Add this to your ~/.zshrc: +# eval "$(moonx completion zsh)" + +_moonx_completion() { + local state line + + _arguments -C \\ + '1: :->command' \\ + '*: :->workspace' + + case $state in + command) + local commands + commands=("\${(@f)$(moonx _moonx_list)}") + _describe 'command' commands + ;; + workspace) + local workspaces + workspaces=("\${(@f)$(moonx _moonx_list $line[1])}") + _describe 'workspace' workspaces + ;; + esac +} + +compdef _moonx_completion moonx +compdef _moonx_completion mx +`; +} + +function generateFishCompletion(): string { + return `# moonx completion script for fish +# Add this to your ~/.config/fish/completions/moonx.fish: +# moonx completion fish > ~/.config/fish/completions/moonx.fish + +# Remove previous completions +complete -c moonx -e +complete -c mx -e + +# Complete commands +complete -c moonx -f -n "__fish_is_first_token" -a "(moonx _moonx_list)" +complete -c mx -f -n "__fish_is_first_token" -a "(moonx _moonx_list)" + +# Complete workspaces +complete -c moonx -f -n "not __fish_is_first_token" -a "(moonx _moonx_list (commandline -opc)[2])" +complete -c mx -f -n "not __fish_is_first_token" -a "(moonx _moonx_list (commandline -opc)[2])" +`; +} diff --git a/src/cli/list.ts b/src/cli/list.ts index 14e4165..80e0d5b 100644 --- a/src/cli/list.ts +++ b/src/cli/list.ts @@ -1,6 +1,6 @@ export function list( [command, ...wss]: Array, - commands: Map, + commands: Map ) { if (!commands.has(command) && wss.length) { console.log(`task ${command} does not exist`); diff --git a/src/index.ts b/src/index.ts index 94febb2..58bd233 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,9 @@ import { cac } from "cac"; -import pkg from "../package.json"; +import pkg from "../package.json" with { type: "json" }; +import { clearCache, getCacheInfo } from "./utils/cache.js"; +import { generateCompletion, type Shell } from "./cli/completion.js"; import { list } from "./cli/list.js"; import { help } from "./utils/help.js"; import { logReport } from "./utils/log-report.js"; @@ -9,10 +11,14 @@ import { logger } from "./utils/logger.js"; import { scan } from "./utils/scan-moon.js"; import { moon } from "./utils/utils.js"; -const commands = await scan(); - const cli = cac("moonx"); +// Check if this is a completion or cache command - skip scanning if so +const skipScanCommands = ["completion", "cache:clear", "cache:info"]; +const shouldSkipScan = Bun.argv.some((arg) => skipScanCommands.includes(arg)); + +const commands = shouldSkipScan ? new Map() : await scan(); + cli.option("cache", ""); cli.option("color", ""); cli.option("concurrency", ""); @@ -38,6 +44,40 @@ cli stdout.end(); }); +cli + .command("completion ", "Generate shell completion script") + .action((shell: string) => { + const validShells = ["bash", "zsh", "fish"]; + if (!validShells.includes(shell)) { + logger.error( + `Invalid shell: ${shell}. Must be one of: ${validShells.join(", ")}` + ); + process.exit(1); + } + const completionScript = generateCompletion(shell as Shell); + const stdout = Bun.stdout.writer(); + stdout.write(completionScript); + stdout.end(); + }); + +cli.command("cache:clear", "Clear the completion cache").action(() => { + clearCache(); + logger.info("Cache cleared successfully"); +}); + +cli.command("cache:info", "Show cache information").action(async () => { + const info = await getCacheInfo(); + if (!info.exists) { + logger.info("No cache found"); + logger.info(`Cache path: ${info.path}`); + } else { + const ageInSeconds = Math.floor((info.age ?? 0) / 1000); + const ageInMinutes = Math.floor(ageInSeconds / 60); + logger.info(`Cache age: ${ageInMinutes}m ${ageInSeconds % 60}s`); + logger.info(`Cache path: ${info.path}`); + } +}); + for (const [name, workspaces] of commands) { cli .command(`${name} [...workspaces]`, workspaces.join(), { diff --git a/src/utils/assertions.ts b/src/utils/assertions.ts deleted file mode 100644 index 85ac088..0000000 --- a/src/utils/assertions.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { - PartialWorkspaceProjects, - PartialWorkspaceProjectsConfig, -} from "@moonrepo/types"; - -export function isWorkspaceProjectsConfig( - projects: PartialWorkspaceProjects, -): projects is PartialWorkspaceProjectsConfig { - if (projects instanceof Array) { - return false; - } - return Object.values(projects).some((v) => typeof v !== "string"); -} diff --git a/src/utils/cache.ts b/src/utils/cache.ts new file mode 100644 index 0000000..2d1b334 --- /dev/null +++ b/src/utils/cache.ts @@ -0,0 +1,99 @@ +import { existsSync, mkdirSync } from "node:fs"; +import { homedir } from "node:os"; +import { join } from "node:path"; + +type CacheData = { + commands: Array<[string, string[]]>; + timestamp: number; +}; + +// Cache TTL in milliseconds (default: 5 minutes) +const CACHE_TTL = Number(process.env.MOONX_CACHE_TTL) || 5 * 60 * 1000; + +function getCacheDir(): string { + const cacheDir = join(homedir(), ".cache", "moonx"); + if (!existsSync(cacheDir)) { + mkdirSync(cacheDir, { recursive: true }); + } + return cacheDir; +} + +function getCachePath(): string { + return join(getCacheDir(), "commands.json"); +} + +export async function readCache(): Promise | null> { + const cachePath = getCachePath(); + + if (!existsSync(cachePath)) { + return null; + } + + try { + const file = Bun.file(cachePath); + const text = await file.text(); + const data: CacheData = JSON.parse(text); + + // Check if cache is expired + const now = Date.now(); + if (now - data.timestamp > CACHE_TTL) { + return null; + } + + return new Map(data.commands); + } catch { + // If cache is corrupted, return null + return null; + } +} + +export function writeCache(commands: Map): void { + const cachePath = getCachePath(); + + const data: CacheData = { + commands: Array.from(commands.entries()), + timestamp: Date.now(), + }; + + try { + Bun.write(cachePath, JSON.stringify(data, null, 2)); + } catch { + // Silently fail if we can't write cache + // This shouldn't block the main functionality + } +} + +export function clearCache(): void { + const cachePath = getCachePath(); + + if (existsSync(cachePath)) { + try { + Bun.write(cachePath, ""); + } catch { + // Silently fail + } + } +} + +export async function getCacheInfo(): Promise<{ + exists: boolean; + age?: number; + path: string; +}> { + const cachePath = getCachePath(); + + if (!existsSync(cachePath)) { + return { exists: false, path: cachePath }; + } + + try { + const file = Bun.file(cachePath); + const text = await file.text(); + const data: CacheData = JSON.parse(text); + const age = Date.now() - data.timestamp; + + return { exists: true, age, path: cachePath }; + } catch { + return { exists: false, path: cachePath }; + } +} diff --git a/src/utils/help.ts b/src/utils/help.ts index d572fb2..f3dc634 100644 --- a/src/utils/help.ts +++ b/src/utils/help.ts @@ -3,8 +3,8 @@ import { renderString } from "nunjucks"; function style(text: string) { return text - .replace(/([\[\<][A-Z_]+[\]\>])/g, chalk.gray("$1")) - .replace(/(?:(\-[a-zA-Z]), )?(\-\-[a-zA-Z\-]+)/g, (_, short, long) => { + .replace(/([[<][A-Z_]+[\]>])/g, chalk.gray("$1")) + .replace(/(?:(-[a-zA-Z]), )?(--[a-zA-Z-]+)/g, (_, short, long) => { if (!short) { return chalk.blue(long); } @@ -16,11 +16,11 @@ const _moonx = style(` ${chalk.bold.blue("moonx")} ${chalk.bold.magenta("Usage:")} ${chalk.yellow( - "moonx", + "moonx" )} [...workspaces] [MOON_OPTIONS] -- [COMMAND_OPTIONS] ${chalk.bold( - "Info:", + "Info:" )} When no workspaces are specified, moonx will run the command on all available workspaces. ${chalk.bold("Commands:")} @@ -48,11 +48,32 @@ For more info, run any command with the --help flag `); function moonx(tasks: Array<[string, string[]]>) { + const max = Math.max(...tasks.map(([task]) => task.length), 29); + + const renderCommand = (commands: string[], max: number) => { + // join commands until length exceeds 50 + // if length exceeds 50, add "+N" at the end + const { extras, content } = commands.reduce( + (acc, current) => { + if (acc.content.length + current.length + 1 <= max) { + acc.content += (acc.content ? " " : "") + current; + } else { + acc.extras += 1; + } + return acc; + }, + { extras: 0, content: "" } + ); + return content + (extras > 0 ? ` ${chalk.magenta(`+${extras}`)}` : ""); + }; + + console.log(process.env.COLUMNS); + return renderString(_moonx, { tasks: tasks.map(([task, commands]) => ({ name: task, - spacing: " ".repeat(30 - task.length), - commands: commands.join(" "), + spacing: " ".repeat(max - task.length + 1), + commands: renderCommand(commands, process.stdout.columns - max - 10), })), }); } @@ -61,11 +82,11 @@ const _task = style(` ${chalk.bold.blue("moonx")} ${chalk.bold.magenta("Usage:")} ${chalk.yellow( - "moonx", + "moonx" )} {command} [...workspaces] [MOON_OPTIONS] -- [COMMAND_OPTIONS] ${chalk.bold( - "Info:", + "Info:" )} When no workspaces are specified, moonx will run the command on all available workspaces. ${chalk.bold("Available workspaces:")} diff --git a/src/utils/load-yaml.ts b/src/utils/load-yaml.ts index c0ca105..e56aad1 100644 --- a/src/utils/load-yaml.ts +++ b/src/utils/load-yaml.ts @@ -13,7 +13,7 @@ type LoadOptions = export async function load( path: string, - options?: LoadOptions, + options?: LoadOptions ): Promise { const file = Bun.file(path); diff --git a/src/utils/log-report.ts b/src/utils/log-report.ts index 70ffbc8..54cf61e 100644 --- a/src/utils/log-report.ts +++ b/src/utils/log-report.ts @@ -3,6 +3,9 @@ import type { RunReport } from "@moonrepo/types"; import { logger } from "./logger.js"; export async function logReport({ enabled }: { enabled: boolean }) { + if (!enabled) { + return; + } const report: RunReport = await Bun.file(".moon/cache/runReport.json").json(); const tasks = report.actions .map((action) => { @@ -28,12 +31,20 @@ export async function logReport({ enabled }: { enabled: boolean }) { const parts = [ task.target + " ".repeat(maxTargetLength + 4 - task.target.length), task.status + " ".repeat(maxStatusLength + 4 - task.status.length), - !task.duration - ? "unknown" - : `${task.duration.secs ? `${task.duration.secs}s ` : ""}${ - task.duration.nanos ? `${task.duration.nanos / 1000000}ms` : "" - }`.trim(), + !task.duration ? "unknown" : formatDuration(task.duration), ]; - logger.info(parts.join(" ")); + logger.info(" " + parts.join(" ")); } } + +function formatDuration(options: { secs: number; nanos: number }) { + const totalMs = options.secs * 1e3 + options.nanos / 1e6; + + if (totalMs < 1000) return `${totalMs.toFixed(2)} ms`; + if (totalMs < 60_000) return `${(totalMs / 1000).toFixed(2)} s`; + + const totalSec = totalMs / 1000; + const minutes = Math.floor(totalSec / 60); + const secondsRemainder = (totalSec % 60).toFixed(2); + return `${minutes}m ${secondsRemainder}s`; +} diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 0d31692..c2d3ace 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -4,7 +4,7 @@ class Logger { public dump( type: "log" | "info" | "warn" | "error", message: string, - prefix?: string, + prefix?: string ) { if (!prefix) { console[type](emojify(message)); diff --git a/src/utils/scan-moon.ts b/src/utils/scan-moon.ts index 229154f..a0cf832 100644 --- a/src/utils/scan-moon.ts +++ b/src/utils/scan-moon.ts @@ -1,5 +1,6 @@ import type { Task } from "@moonrepo/types"; +import { readCache, writeCache } from "./cache.js"; import { load } from "./load-yaml.js"; import { moon } from "./utils.js"; @@ -8,7 +9,15 @@ type QueryResult = { options: object; }; -export async function scan() { +export async function scan(options?: { skipCache?: boolean }) { + // Try to read from cache first unless skipCache is true + if (!options?.skipCache) { + const cached = await readCache(); + if (cached) { + return cached; + } + } + const moonxfig = await load<{ "ignore-tasks": string[]; }>("moonx.yml", { @@ -26,7 +35,7 @@ export async function scan() { const { tasks }: QueryResult = JSON.parse(res.stdout.toString()); const projects = Object.entries(tasks).map( - ([name, tasks]) => [name, Object.keys(tasks)] as const, + ([name, tasks]) => [name, Object.keys(tasks)] as const ); // Map> @@ -43,5 +52,8 @@ export async function scan() { } } + // Write to cache + writeCache(commands); + return commands; } diff --git a/src/utils/utils.ts b/src/utils/utils.ts index c1227a6..aee3e4f 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -2,7 +2,7 @@ import type { SpawnOptions } from "bun"; import { logger } from "./logger.js"; -export function getPackageManager() { +function getPackageManager() { const userAgent = process.env.npm_config_user_agent ?? "empty"; return ( ["pnpm", "yarn", "bun", "npm"].find((pm) => userAgent.includes(pm)) ?? null @@ -11,7 +11,7 @@ export function getPackageManager() { let installedGlobally: boolean | null = null; -export function isMoonInstalledGlobally() { +function isMoonInstalledGlobally() { if (installedGlobally !== null) { return installedGlobally; } @@ -40,20 +40,23 @@ function getBaseCommand() { return ["moon"]; } logger.error( - "Could not find a package manager to run moon and moon is not installed globally", + "Could not find a package manager to run moon and moon is not installed globally" ); process.exit(1); } } } -export function moon( +export function moon< + const In extends SpawnOptions.Writable = "ignore", + const Out extends SpawnOptions.Readable = "pipe", + const Err extends SpawnOptions.Readable = "pipe", +>( args: string[], - options: Omit = {}, + options: Omit, "cmd"> = {} ) { const baseCommand = getBaseCommand(); - return Bun.spawnSync({ - cmd: [...baseCommand, ...args], + return Bun.spawnSync([...baseCommand, ...args], { ...options, }); } diff --git a/tsconfig.json b/tsconfig.json index b8895a3..c53bf8f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,20 @@ { "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "lib": ["ES2020"], + "moduleResolution": "bundler", "strict": true, - "target": "ESNext", - "module": "NodeNext", "skipLibCheck": true, - "types": ["bun-types", "@withfig/autocomplete-types"], + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "moduleResolution": "NodeNext" + "outDir": "./dist", + "rootDir": "./src" }, - "include": ["src/**/*", "scripts/**/*"] + "include": ["src/**/*"], + "exclude": ["node_modules"] }