diff --git a/.changeset/config.json b/.changeset/config.json index 1a3720ed..9b336d8b 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,15 +1,11 @@ { - "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", - "changelog": "@changesets/cli/changelog", - "commit": false, - "fixed": [], - "linked": [], - "access": "restricted", - "baseBranch": "main", - "updateInternalDependencies": "patch", - "ignore": [ - "@godot-js/jsb-runtime", - "@godot-js/jsb-editor", - "@godot-js/web-bridge" - ] + "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": ["@godot-js/godotjs", "@godot-js/jsb-runtime", "@godot-js/jsb-editor", "@godot-js/web-bridge"] } diff --git a/.github/actions/pnpm-build/action.yml b/.github/actions/pnpm-build/action.yml index 8609e1d5..de4a8711 100644 --- a/.github/actions/pnpm-build/action.yml +++ b/.github/actions/pnpm-build/action.yml @@ -4,13 +4,7 @@ runs: using: composite steps: - name: 🛫 Setup pnpm - uses: pnpm/action-setup@v4 - - - name: 🦕❌ Setup node.js - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: "pnpm" + uses: ./.github/actions/pnpm-setup - name: 🛠️ Install dependencies & build run: | diff --git a/.github/actions/pnpm-setup/action.yml b/.github/actions/pnpm-setup/action.yml new file mode 100644 index 00000000..1855f6c4 --- /dev/null +++ b/.github/actions/pnpm-setup/action.yml @@ -0,0 +1,14 @@ +name: PNPM Setup +description: Setup pnpm and node.js +runs: + using: composite + steps: + - name: 🛫 Setup pnpm + uses: pnpm/action-setup@v4 + + - name: 🦕❌ Setup node.js + uses: actions/setup-node@v4 + with: + node-version: 24 + registry-url: 'https://registry.npmjs.org' + cache: "pnpm" diff --git a/.github/workflows/misc_changesets.yml b/.github/workflows/misc_changesets.yml index d5ea8320..181cba0a 100644 --- a/.github/workflows/misc_changesets.yml +++ b/.github/workflows/misc_changesets.yml @@ -21,13 +21,7 @@ jobs: uses: actions/checkout@v4 - name: 🛫 Setup pnpm - uses: pnpm/action-setup@v4 - - - name: 🦕❌ Setup node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: "pnpm" + uses: ./.github/actions/pnpm-setup - name: 🛠️ Install dependencies run: | diff --git a/.github/workflows/misc_environment.yml b/.github/workflows/misc_environment.yml index 840ad3d2..c135de6f 100644 --- a/.github/workflows/misc_environment.yml +++ b/.github/workflows/misc_environment.yml @@ -27,6 +27,13 @@ jobs: path: ${{github.workspace}}/tests/project/.godot/GodotJS retention-days: 10 + - name: ⬆️ Upload editor/dist + uses: actions/upload-artifact@v4 + with: + name: editor-dist + path: ${{github.workspace}}/scripts/editor/dist + retention-days: 10 + - name: ⬆️ Upload impl/web/js uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/misc_publish_editor.yml b/.github/workflows/misc_publish_editor.yml new file mode 100644 index 00000000..5783423d --- /dev/null +++ b/.github/workflows/misc_publish_editor.yml @@ -0,0 +1,38 @@ +name: 📨 Publish editor +on: + workflow_call: + +jobs: + publis-editor: + runs-on: ubuntu-latest + steps: + - name: ⏬ Checkout repo + uses: actions/checkout@v4 + + - name: 🛫 Setup pnpm + uses: ./.github/actions/pnpm-setup + + - name: 🔄️ Install dependencies + run: pnpm install + + - name: ⏬ Download build + uses: actions/download-artifact@v4 + with: + name: editor-dist + path: ${{github.workspace}}/scripts/editor/dist + + - name: 📝 Update version for prerelease + if: github.event.release.prerelease + run: | + cd ${{github.workspace}}/scripts/editor + pnpm version ${{ github.event.release.tag_name }} --no-git-tag-version --allow-same-version + pnpm build + + - name: 🚢 Publish release + run: | + cd ${{github.workspace}}/scripts/editor + if [ "${{ github.event.release.prerelease }}" = "true" ]; then + pnpm publish --tag next --no-git-checks + else + pnpm publish --no-git-checks + fi diff --git a/.github/workflows/runner.yml b/.github/workflows/runner.yml index c4dfcaa7..8af0ba34 100644 --- a/.github/workflows/runner.yml +++ b/.github/workflows/runner.yml @@ -3,94 +3,108 @@ name: 🔗 GHA # Only run pipeline on open pull_requests and main + releases # we don't need it on every push and some parameters are not available for push only on: - pull_request: - push: - branches: - - "main" - release: - types: [ published ] + pull_request: + push: + branches: + - "main" + release: + types: [published] concurrency: - group: ${{ github.workflow }}|${{ github.ref_name }} - cancel-in-progress: true + group: ${{ github.workflow }}|${{ github.ref_name }} + cancel-in-progress: true + +permissions: + id-token: write # Required for OIDC + contents: read jobs: - environment: - name: 🌳 Set Environment - uses: ./.github/workflows/misc_environment.yml + environment: + name: 🌳 Set Environment + uses: ./.github/workflows/misc_environment.yml + + changesets: + if: github.event_name != 'release' && github.event_name != 'pull_request' + permissions: + contents: write + pull-requests: write + name: 🔄 Changesets + uses: ./.github/workflows/misc_changesets.yml + + test-editor: + name: 🔬 Test editor + uses: ./.github/workflows/test_editor.yml - changesets: - if: github.event_name != 'release' && github.event_name != 'pull_request' - permissions: - contents: write - pull-requests: write - name: 🔄 Changesets - uses: ./.github/workflows/misc_changesets.yml + engine-version-build: + name: ⚙️ Build Godot Version with GodotJS + needs: [environment] + strategy: + fail-fast: false + matrix: + include: + - version: 4.4 + version_ref: 4.4 + - version: 4.5 + version_ref: 4.5 + uses: ./.github/workflows/build_engine_version.yml + with: + version: ${{ matrix.version }} + version_ref: ${{ matrix.version_ref }} + release: ${{ github.event_name == 'release' }} - engine-version-build: - name: ⚙️ Build Godot Version with GodotJS - needs: [environment] - strategy: - fail-fast: false - matrix: - include: - - version: 4.4 - version_ref: 4.4 - - version: 4.5 - version_ref: 4.5 - uses: ./.github/workflows/build_engine_version.yml - with: - version: ${{ matrix.version }} - version_ref: ${{ matrix.version_ref }} - release: ${{ github.event_name == 'release' }} + test-project: + name: 🔬 Test project + needs: [engine-version-build] + uses: ./.github/workflows/test_project.yml + strategy: + fail-fast: false + matrix: + include: + - version: 4.4 + - version: 4.5 + with: + version: ${{ matrix.version }} - test-project: - name: 🔬 Test project - needs: [engine-version-build] - uses: ./.github/workflows/test_project.yml - strategy: - fail-fast: false - matrix: - include: - - version: 4.4 - - version: 4.5 - with: - version: ${{ matrix.version }} + builds-done: + name: 🏁 Builds Done + needs: [test-project, test-editor] + runs-on: ubuntu-latest + steps: + - name: 🏁 Check if all builds are done + run: | + echo "🏁 All builds done" + shell: bash - builds-done: - name: 🏁 Builds Done - needs: [test-project] - runs-on: ubuntu-latest - steps: - - name: 🏁 Check if all builds are done - run: | - echo "🏁 All builds done" - shell: bash + release: + name: 🦅 Release + needs: [changesets, builds-done] + if: needs.changesets.outputs.publish == 'true' + permissions: + contents: write + uses: ./.github/workflows/misc_release.yml + secrets: inherit + with: + versions: "4.4, 4.5" - release: - name: 🦅 Release - needs: [changesets, builds-done] - if: needs.changesets.outputs.publish == 'true' - permissions: - contents: write - uses: ./.github/workflows/misc_release.yml - secrets: inherit - with: - versions: '4.4, 4.5' + upload-assets: + name: 📁 Upload Assets + needs: [builds-done] + if: github.event_name == 'release' + permissions: + contents: write + uses: ./.github/workflows/misc_upload_assets.yml + secrets: inherit + strategy: + fail-fast: true + matrix: + include: + - version: 4.4 + - version: 4.5 + with: + version: ${{ matrix.version }} - upload-assets: - name: 📁 Upload Assets - needs: [builds-done] - if: github.event_name == 'release' - permissions: - contents: write - uses: ./.github/workflows/misc_upload_assets.yml - secrets: inherit - strategy: - fail-fast: true - matrix: - include: - - version: 4.4 - - version: 4.5 - with: - version: ${{ matrix.version }} + publish-editor: + name: 📦 Publish Editor + needs: [upload-assets] + if: github.event_name == 'release' + uses: ./.github/workflows/misc_publish_editor.yml diff --git a/.github/workflows/test_editor.yml b/.github/workflows/test_editor.yml new file mode 100644 index 00000000..b3a62a42 --- /dev/null +++ b/.github/workflows/test_editor.yml @@ -0,0 +1,20 @@ +name: 🔬 Test editor +on: + workflow_call: + + +jobs: + test-editor: + name: 🔬 Test editor + runs-on: ubuntu-latest + steps: + - name: ⏬ Checkout repository + uses: actions/checkout@v4 + + - name: 🛫 Setup pnpm + uses: ./.github/actions/pnpm-setup + + - name: 🛠️ Install dependencies + run: | + pnpm install + pnpm test diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index f251f468..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,55 +0,0 @@ -# @godot-js/editor - -## 1.0.0 - -### Major Changes -* Implement a [*Monitor*](https://github.com/godotjs/GodotJS/wiki/Statistics) of the runtime statistics of a running project -* Implement *console.time/console.timeEnd* -* Refactor [*Worker*](https://github.com/godotjs/GodotJS/wiki/Worker) to support *Godot Object* transfer - -### Minor Changes -* Add *worker.onready* callback -* Add threading support for *InstanceBindingCallback* -* Improve multi-threading support for *IConsoleOutput* -* Refactor *GodotJSScript* to support loading in *Worker* -* Add a setting entry for *Exporter* to manually include source files -* More strict type check for native object bindings -* *TypeConvert* returns *true* and *nullptr* for dead object pointers -* Ignore *Thread* class in d.ts codegen - -### Patch Changes -* Fix a godot profiler crash on *GodotJSScriptLanguage::profiling_get_* -* Fix a possible crash in *Worker::finish()* -* Fix an access violation issue in *Worker* - -## 0.9.9 - -### Minor Changes - -* Add prebuilt libs of lws/v8 for Windows/Linux on ARM64 -* Add support for hooking godot typeloader -* Add support for JavaScriptCore - -### Patch Changes -* Minor bugfix - -## 0.9.8 - -### Patch Changes - -* Fix a crash issue in `jsb::Buffer` destructor when using *quickjs-ng* as runtime -* Support for pure JavaScript projects (still with typings) -* Refactor annotations and helper functions in `jsb.core` - -### Breaking Changes -* All annotations are moved into `godot.annotations` module (from `jsb.core`). -* `GLOBAL_GET` and `EDITOR_GET` are moved into `godot` module (from `jsb.core`). -* `callable()` is removed from `jsb.core`, use `Callable.create` in `godot` module instead. -* `to_array_buffer()` is removed from `jsb.core`, use `PackedByteArray.to_array_buffer()` instead. -* `$wait` is removed from `jsb.core`, use `SignalN<...>.as_promise()` instead. - -> [!NOTE] -> Regenerating `.d.ts` files in your project will help you a lot to fix most errors caused by the breaking changes below. -> *VSCode* (or `tsc`) will report all relevant changes as errors. -> Old annotations still work temporarily in this version but will be removed in a future version. Please update your codes. - diff --git a/package.json b/package.json index 37114aff..5f4ed23d 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,18 @@ { - "name": "@godot-js/editor", - "version": "1.0.0", - "private": true, - "type": "module", - "packageManager": "pnpm@10.11.0+sha1.4048eeefd564ff1ab248fac3e2854d38245fe2f1", - "scripts": { - "build": "pnpm -r build", - "changeset": "changeset", - "ci:should-publish": "node scripts/release/should-publish.js", - "ci:publish": "node scripts/release/publish.js", - "ci:test-project": "node scripts/release/test-project.js", - "ci:version": "changeset version && node scripts/release/version.js" - }, - "devDependencies": { - "@changesets/cli": "^2.29.4" - } + "name": "@godot-js/godotjs", + "private": true, + "type": "module", + "packageManager": "pnpm@10.11.0+sha1.4048eeefd564ff1ab248fac3e2854d38245fe2f1", + "scripts": { + "build": "pnpm -r build", + "changeset": "changeset", + "ci:publish": "node scripts/release/publish.js", + "ci:should-publish": "node scripts/release/should-publish.js", + "ci:test-project": "node scripts/release/test-project.js", + "ci:version": "changeset version && node scripts/release/version.js", + "test": "pnpm -r test" + }, + "devDependencies": { + "@changesets/cli": "^2.29.4" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ad91c4d..fdd824a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,34 +16,104 @@ importers: devDependencies: typescript: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.3 - scripts/jsb.editor: + scripts/editor: + dependencies: + '@inquirer/prompts': + specifier: ^7.0.0 + version: 7.10.1(@types/node@25.0.3) + adm-zip: + specifier: 0.5.16 + version: 0.5.16 + commander: + specifier: ^14.0.0 + version: 14.0.2 + cosmiconfig: + specifier: ^9.0.0 + version: 9.0.0(typescript@5.9.3) + glob: + specifier: ^13.0.0 + version: 13.0.0 + rimraf: + specifier: ^6.0.1 + version: 6.1.2 devDependencies: + '@eslint/js': + specifier: ^9.39.2 + version: 9.39.2 + '@types/adm-zip': + specifier: 0.5.7 + version: 0.5.7 + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 '@types/node': - specifier: ^20.11.30 - version: 20.17.57 + specifier: ^25.0.0 + version: 25.0.3 + '@typescript-eslint/eslint-plugin': + specifier: ^8.0.0 + version: 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.0.0 + version: 8.50.0(eslint@9.39.2)(typescript@5.9.3) + esbuild: + specifier: 0.27.2 + version: 0.27.2 + eslint: + specifier: 9.39.2 + version: 9.39.2 + find-versions-cli: + specifier: ^5.0.0 + version: 5.0.0 + globals: + specifier: ^16.5.0 + version: 16.5.0 + markdown-table: + specifier: ^3.0.3 + version: 3.0.4 + prettier: + specifier: ^3.0.3 + version: 3.7.4 + tsx: + specifier: 4.21.0 + version: 4.21.0 typescript: - specifier: ^5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.50.0 + version: 8.50.0(eslint@9.39.2)(typescript@5.9.3) + vite: + specifier: ^7.0.0 + version: 7.3.0(@types/node@25.0.3)(tsx@4.21.0) + vitest: + specifier: ^3.0.1 + version: 3.2.4(@types/node@25.0.3)(tsx@4.21.0) + + scripts/editor/test: + devDependencies: + tsx: + specifier: ^4.21.0 + version: 4.21.0 - scripts/jsb.runtime: + scripts/jsb.editor: devDependencies: '@types/node': specifier: ^20.11.30 version: 20.17.57 typescript: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.3 - scripts/jsb.static: + scripts/jsb.runtime: devDependencies: '@types/node': specifier: ^20.11.30 version: 20.17.57 typescript: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.3 tests/project: dependencies: @@ -62,10 +132,18 @@ importers: version: 5.5.1 typescript: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.3 packages: + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.27.4': resolution: {integrity: sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==} engines: {node: '>=6.9.0'} @@ -125,6 +203,361 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -143,19 +576,258 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@rollup/rollup-android-arm-eabi@4.54.0': + resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.54.0': + resolution: {integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.54.0': + resolution: {integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.54.0': + resolution: {integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.54.0': + resolution: {integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.54.0': + resolution: {integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.54.0': + resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.54.0': + resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.54.0': + resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.54.0': + resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.54.0': + resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.54.0': + resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.54.0': + resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.54.0': + resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.54.0': + resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.54.0': + resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.54.0': + resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.54.0': + resolution: {integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.54.0': + resolution: {integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.54.0': + resolution: {integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.54.0': + resolution: {integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==} + cpu: [x64] + os: [win32] + + '@types/adm-zip@0.5.7': + resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} '@types/node@20.17.57': resolution: {integrity: sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==} + '@types/node@25.0.3': + resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + '@types/papaparse@5.5.1': resolution: {integrity: sha512-esEO+VISsLIyE+JZBmb89NzsYYbpwV8lmv2rPo6oX5y9KhBaIP7hhHgjuTut54qjdKVMufTEcrh5fUl9+58huw==} + '@typescript-eslint/eslint-plugin@8.50.0': + resolution: {integrity: sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.50.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.50.0': + resolution: {integrity: sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.50.0': + resolution: {integrity: sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.50.0': + resolution: {integrity: sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.50.0': + resolution: {integrity: sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.50.0': + resolution: {integrity: sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.50.0': + resolution: {integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.50.0': + resolution: {integrity: sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.50.0': + resolution: {integrity: sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.50.0': + resolution: {integrity: sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + adler-32@1.3.1: resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} engines: {node: '>=0.8'} + adm-zip@0.5.16: + resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} + engines: {node: '>=12.0'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -164,36 +836,110 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + 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'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + cfb@1.2.2: resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} engines: {node: '>=0.8'} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + codepage@1.15.0: resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} engines: {node: '>=0.8'} + 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@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} @@ -203,6 +949,22 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + 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'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -211,15 +973,86 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -227,13 +1060,35 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -242,6 +1097,26 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-versions-cli@5.0.0: + resolution: {integrity: sha512-VYUyGJzyCwjMlhaslkNYMWA5lbuE0Ig4B8O2dK2MSD190z17HFgemrJcA1K4GKEI2CsIl1JXDXYH2Vzd8QZcOQ==} + engines: {node: '>=18'} + hasBin: true + + find-versions@6.0.0: + resolution: {integrity: sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==} + engines: {node: '>=18'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + frac@1.1.2: resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} engines: {node: '>=0.8'} @@ -254,10 +1129,38 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -265,6 +1168,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + human-id@4.1.1: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true @@ -273,14 +1180,37 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.1: + resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==} + engines: {node: '>=0.10.0'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + 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'} @@ -300,20 +1230,80 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-asynchronous@1.0.1: + resolution: {integrity: sha512-T9BPOmEOhp6SmV25SwLVcHK4E6JyG/coH3C6F1NjNXSziv/fd4GmsqMk8YR6qpPOswfaOCApSNkZv6fxoaYFcQ==} + engines: {node: '>=18'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -322,10 +1312,44 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -333,6 +1357,10 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -341,24 +1369,47 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} papaparse@5.5.3: resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -367,10 +1418,21 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -378,15 +1440,36 @@ packages: 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'} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} @@ -397,20 +1480,41 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + 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.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@6.1.2: + resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} + engines: {node: 20 || >=22} + hasBin: true + + rollup@4.54.0: + resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + semver-regex@4.0.5: + resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} + engines: {node: '>=12'} + semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} @@ -424,6 +1528,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -432,6 +1539,10 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -442,6 +1553,16 @@ packages: resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} engines: {node: '>=0.8'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -450,10 +1571,51 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -462,38 +1624,175 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript-eslint@8.50.0: + resolution: {integrity: sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.3.0: + resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + web-worker@1.2.0: + resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + 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 + wmf@1.0.2: resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} engines: {node: '>=0.8'} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + word@0.3.0: resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} engines: {node: '>=0.8'} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + xlsx@0.18.5: resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} engines: {node: '>=0.8'} hasBin: true + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + snapshots: + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/runtime@7.27.4': {} '@changesets/apply-release-plan@7.0.12': @@ -638,75 +1937,648 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 - '@manypkg/find-root@1.1.0': - dependencies: - '@babel/runtime': 7.27.4 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 + '@esbuild/aix-ppc64@0.27.2': + optional: true - '@manypkg/get-packages@1.1.3': - dependencies: - '@babel/runtime': 7.27.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 + '@esbuild/android-arm64@0.27.2': + optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@esbuild/android-arm@0.27.2': + optional: true - '@nodelib/fs.stat@2.0.5': {} + '@esbuild/android-x64@0.27.2': + optional: true - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + '@esbuild/darwin-arm64@0.27.2': + optional: true - '@types/node@12.20.55': {} + '@esbuild/darwin-x64@0.27.2': + optional: true - '@types/node@20.17.57': - dependencies: - undici-types: 6.19.8 + '@esbuild/freebsd-arm64@0.27.2': + optional: true - '@types/papaparse@5.5.1': + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2)': + dependencies: + eslint: 9.39.2 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.2': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@inquirer/ansi@1.0.2': {} + + '@inquirer/checkbox@4.3.2(@types/node@25.0.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@25.0.3) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.0.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/confirm@5.1.21(@types/node@25.0.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.0.3) + '@inquirer/type': 3.0.10(@types/node@25.0.3) + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/core@10.3.2(@types/node@25.0.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.0.3) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/editor@4.2.23(@types/node@25.0.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.0.3) + '@inquirer/external-editor': 1.0.3(@types/node@25.0.3) + '@inquirer/type': 3.0.10(@types/node@25.0.3) + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/expand@4.0.23(@types/node@25.0.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.0.3) + '@inquirer/type': 3.0.10(@types/node@25.0.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/external-editor@1.0.3(@types/node@25.0.3)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.1 + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@4.3.1(@types/node@25.0.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.0.3) + '@inquirer/type': 3.0.10(@types/node@25.0.3) + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/number@3.0.23(@types/node@25.0.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.0.3) + '@inquirer/type': 3.0.10(@types/node@25.0.3) + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/password@4.0.23(@types/node@25.0.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@25.0.3) + '@inquirer/type': 3.0.10(@types/node@25.0.3) + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/prompts@7.10.1(@types/node@25.0.3)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@25.0.3) + '@inquirer/confirm': 5.1.21(@types/node@25.0.3) + '@inquirer/editor': 4.2.23(@types/node@25.0.3) + '@inquirer/expand': 4.0.23(@types/node@25.0.3) + '@inquirer/input': 4.3.1(@types/node@25.0.3) + '@inquirer/number': 3.0.23(@types/node@25.0.3) + '@inquirer/password': 4.0.23(@types/node@25.0.3) + '@inquirer/rawlist': 4.1.11(@types/node@25.0.3) + '@inquirer/search': 3.2.2(@types/node@25.0.3) + '@inquirer/select': 4.4.2(@types/node@25.0.3) + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/rawlist@4.1.11(@types/node@25.0.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.0.3) + '@inquirer/type': 3.0.10(@types/node@25.0.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/search@3.2.2(@types/node@25.0.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.0.3) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.0.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/select@4.4.2(@types/node@25.0.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@25.0.3) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.0.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.0.3 + + '@inquirer/type@3.0.10(@types/node@25.0.3)': + optionalDependencies: + '@types/node': 25.0.3 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.27.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.27.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 + + '@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 + + '@rollup/rollup-android-arm-eabi@4.54.0': + optional: true + + '@rollup/rollup-android-arm64@4.54.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.54.0': + optional: true + + '@rollup/rollup-darwin-x64@4.54.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.54.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.54.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.54.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.54.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.54.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.54.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.54.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.54.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.54.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.54.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.54.0': + optional: true + + '@types/adm-zip@0.5.7': + dependencies: + '@types/node': 25.0.3 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 25.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 25.0.3 + + '@types/node@12.20.55': {} + + '@types/node@20.17.57': + dependencies: + undici-types: 6.19.8 + + '@types/node@25.0.3': + dependencies: + undici-types: 7.16.0 + + '@types/papaparse@5.5.1': dependencies: '@types/node': 20.17.57 + '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.0 + eslint: 9.39.2 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.0 + debug: 4.4.3 + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.50.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) + '@typescript-eslint/types': 8.50.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.50.0': + dependencies: + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/visitor-keys': 8.50.0 + + '@typescript-eslint/tsconfig-utils@8.50.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.50.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.50.0': {} + + '@typescript-eslint/typescript-estree@8.50.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.50.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/visitor-keys': 8.50.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.2 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.50.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.50.0': + dependencies: + '@typescript-eslint/types': 8.50.0 + eslint-visitor-keys: 4.2.1 + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@7.3.0(@types/node@25.0.3)(tsx@4.21.0))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.0(@types/node@25.0.3)(tsx@4.21.0) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + adler-32@1.3.1: {} + adm-zip@0.5.16: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 + argparse@2.0.1: {} + array-union@2.1.0: {} + assertion-error@2.0.1: {} + + balanced-match@1.0.2: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 + cac@6.7.14: {} + + callsites@3.1.0: {} + cfb@1.2.2: dependencies: adler-32: 1.3.1 crc-32: 1.2.2 + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chardet@0.7.0: {} + chardet@2.1.1: {} + + check-error@2.1.1: {} + ci-info@3.9.0: {} + cli-width@4.1.0: {} + codepage@1.15.0: {} + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@14.0.2: {} + + concat-map@0.0.1: {} + + convert-hrtime@5.0.0: {} + + cosmiconfig@9.0.0(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + crc-32@1.2.2: {} cross-spawn@7.0.6: @@ -715,19 +2587,140 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + detect-indent@6.1.0: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 + emoji-regex@8.0.0: {} + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + env-paths@2.2.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-module-lexer@1.7.0: {} + + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + + escape-string-regexp@4.0.0: {} + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.2: + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + esprima@4.0.1: {} + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + expect-type@1.3.0: {} + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -736,6 +2729,8 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 + fast-deep-equal@3.1.3: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -744,10 +2739,22 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -757,6 +2764,28 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-versions-cli@5.0.0: + dependencies: + find-versions: 6.0.0 + meow: 13.2.0 + + find-versions@6.0.0: + dependencies: + semver-regex: 4.0.5 + super-regex: 1.1.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + frac@1.1.2: {} fs-extra@7.0.1: @@ -771,10 +2800,33 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fsevents@2.3.3: + optional: true + + function-timeout@1.0.2: {} + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.1 + + globals@14.0.0: {} + + globals@16.5.0: {} + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -786,16 +2838,35 @@ snapshots: graceful-fs@4.2.11: {} + has-flag@4.0.0: {} + human-id@4.1.1: {} iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.1: + dependencies: + safer-buffer: 2.1.2 + ignore@5.3.2: {} + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + is-arrayish@0.2.1: {} + is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -810,21 +2881,72 @@ snapshots: isexe@2.0.0: {} + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + lodash.startcase@4.4.0: {} + loupe@3.2.1: {} + + lru-cache@11.2.4: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-asynchronous@1.0.1: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.2.0 + + markdown-table@3.0.4: {} + + meow@13.2.0: {} + merge2@1.4.1: {} micromatch@4.0.8: @@ -832,12 +2954,47 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + mri@1.2.0: {} + ms@2.1.3: {} + + mute-stream@2.0.0: {} + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + os-tmpdir@1.0.2: {} outdent@0.5.0: {} + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -846,34 +3003,80 @@ snapshots: dependencies: p-try: 2.2.0 + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + p-map@2.1.0: {} + p-timeout@6.1.4: {} + p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.11: dependencies: quansync: 0.2.10 papaparse@5.5.3: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + path-exists@4.0.0: {} path-key@3.1.1: {} + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.4 + minipass: 7.1.2 + path-type@4.0.0: {} + pathe@2.0.3: {} + + pathval@2.0.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} + picomatch@4.0.3: {} + pify@4.0.1: {} + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + prettier@2.8.8: {} + prettier@3.7.4: {} + + punycode@2.3.1: {} + quansync@0.2.10: {} queue-microtask@1.2.3: {} @@ -885,16 +3088,55 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + reusify@1.1.0: {} + rimraf@6.1.2: + dependencies: + glob: 13.0.0 + package-json-from-dist: 1.0.1 + + rollup@4.54.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.54.0 + '@rollup/rollup-android-arm64': 4.54.0 + '@rollup/rollup-darwin-arm64': 4.54.0 + '@rollup/rollup-darwin-x64': 4.54.0 + '@rollup/rollup-freebsd-arm64': 4.54.0 + '@rollup/rollup-freebsd-x64': 4.54.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.54.0 + '@rollup/rollup-linux-arm-musleabihf': 4.54.0 + '@rollup/rollup-linux-arm64-gnu': 4.54.0 + '@rollup/rollup-linux-arm64-musl': 4.54.0 + '@rollup/rollup-linux-loong64-gnu': 4.54.0 + '@rollup/rollup-linux-ppc64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-musl': 4.54.0 + '@rollup/rollup-linux-s390x-gnu': 4.54.0 + '@rollup/rollup-linux-x64-gnu': 4.54.0 + '@rollup/rollup-linux-x64-musl': 4.54.0 + '@rollup/rollup-openharmony-arm64': 4.54.0 + '@rollup/rollup-win32-arm64-msvc': 4.54.0 + '@rollup/rollup-win32-ia32-msvc': 4.54.0 + '@rollup/rollup-win32-x64-gnu': 4.54.0 + '@rollup/rollup-win32-x64-msvc': 4.54.0 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 safer-buffer@2.1.2: {} + semver-regex@4.0.5: {} + semver@7.7.2: {} shebang-command@2.0.0: @@ -903,10 +3145,14 @@ snapshots: shebang-regex@3.0.0: {} + siginfo@2.0.0: {} + signal-exit@4.1.0: {} slash@3.0.0: {} + source-map-js@1.2.1: {} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -918,14 +3164,59 @@ snapshots: dependencies: frac: 1.1.2 + stackback@0.0.2: {} + + std-env@3.10.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 strip-bom@3.0.0: {} + strip-json-comments@3.1.1: {} + + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + super-regex@1.1.0: + dependencies: + function-timeout: 1.0.2 + make-asynchronous: 1.0.1 + time-span: 5.1.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + term-size@2.2.1: {} + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -934,20 +3225,144 @@ snapshots: dependencies: is-number: 7.0.0 - typescript@5.9.2: {} + ts-api-utils@2.1.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + tsx@4.21.0: + dependencies: + esbuild: 0.27.2 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@4.41.0: {} + + typescript-eslint@8.50.0(eslint@9.39.2)(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} undici-types@6.19.8: {} + undici-types@7.16.0: {} + universalify@0.1.2: {} + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vite-node@3.2.4(@types/node@25.0.3)(tsx@4.21.0): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.3.0(@types/node@25.0.3)(tsx@4.21.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.3.0(@types/node@25.0.3)(tsx@4.21.0): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.54.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.0.3 + fsevents: 2.3.3 + tsx: 4.21.0 + + vitest@3.2.4(@types/node@25.0.3)(tsx@4.21.0): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.3.0(@types/node@25.0.3)(tsx@4.21.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.3.0(@types/node@25.0.3)(tsx@4.21.0) + vite-node: 3.2.4(@types/node@25.0.3)(tsx@4.21.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 25.0.3 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + web-worker@1.2.0: {} + 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 + wmf@1.0.2: {} + word-wrap@1.2.5: {} + word@0.3.0: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + xlsx@0.18.5: dependencies: adler-32: 1.3.1 @@ -957,3 +3372,7 @@ snapshots: ssf: 0.11.2 wmf: 1.0.2 word: 0.3.0 + + yocto-queue@0.1.0: {} + + yoctocolors-cjs@2.1.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 22d89521..79df0f29 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - . + - scripts/editor/test - scripts/* - impl/web/bridge - tests/project diff --git a/scripts/editor/.gitignore b/scripts/editor/.gitignore new file mode 100644 index 00000000..9fb257af --- /dev/null +++ b/scripts/editor/.gitignore @@ -0,0 +1,20 @@ +# Dependency directory +node_modules +bower_components + +# Editors +.idea +*.iml + +# Ignore built ts files +dist/**/* + +# ignore yarn.lock +yarn.lock + +## Genrated files +test/**/*.mjs +test/**/*.js +test/generate/**/*.ts +test/all/game +/src/commands/init/generated.ts diff --git a/scripts/editor/.nvmrc b/scripts/editor/.nvmrc new file mode 100644 index 00000000..a45fd52c --- /dev/null +++ b/scripts/editor/.nvmrc @@ -0,0 +1 @@ +24 diff --git a/scripts/editor/CHANGELOG.md b/scripts/editor/CHANGELOG.md new file mode 100644 index 00000000..f1199839 --- /dev/null +++ b/scripts/editor/CHANGELOG.md @@ -0,0 +1,59 @@ +# @godot-js/editor + +## 1.0.0 + +### Major Changes + +- Implement a [_Monitor_](https://github.com/godotjs/GodotJS/wiki/Statistics) of the runtime statistics of a running project +- Implement _console.time/console.timeEnd_ +- Refactor [_Worker_](https://github.com/godotjs/GodotJS/wiki/Worker) to support _Godot Object_ transfer + +### Minor Changes + +- Add _worker.onready_ callback +- Add threading support for _InstanceBindingCallback_ +- Improve multi-threading support for _IConsoleOutput_ +- Refactor _GodotJSScript_ to support loading in _Worker_ +- Add a setting entry for _Exporter_ to manually include source files +- More strict type check for native object bindings +- _TypeConvert_ returns _true_ and _nullptr_ for dead object pointers +- Ignore _Thread_ class in d.ts codegen + +### Patch Changes + +- Fix a godot profiler crash on _GodotJSScriptLanguage::profiling*get*_ +- Fix a possible crash in _Worker::finish()_ +- Fix an access violation issue in _Worker_ + +## 0.9.9 + +### Minor Changes + +- Add prebuilt libs of lws/v8 for Windows/Linux on ARM64 +- Add support for hooking godot typeloader +- Add support for JavaScriptCore + +### Patch Changes + +- Minor bugfix + +## 0.9.8 + +### Patch Changes + +- Fix a crash issue in `jsb::Buffer` destructor when using _quickjs-ng_ as runtime +- Support for pure JavaScript projects (still with typings) +- Refactor annotations and helper functions in `jsb.core` + +### Breaking Changes + +- All annotations are moved into `godot.annotations` module (from `jsb.core`). +- `GLOBAL_GET` and `EDITOR_GET` are moved into `godot` module (from `jsb.core`). +- `callable()` is removed from `jsb.core`, use `Callable.create` in `godot` module instead. +- `to_array_buffer()` is removed from `jsb.core`, use `PackedByteArray.to_array_buffer()` instead. +- `$wait` is removed from `jsb.core`, use `SignalN<...>.as_promise()` instead. + +> [!NOTE] +> Regenerating `.d.ts` files in your project will help you a lot to fix most errors caused by the breaking changes below. +> _VSCode_ (or `tsc`) will report all relevant changes as errors. +> Old annotations still work temporarily in this version but will be removed in a future version. Please update your codes. diff --git a/scripts/editor/LICENSE b/scripts/editor/LICENSE new file mode 100644 index 00000000..e3206766 --- /dev/null +++ b/scripts/editor/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 GodotJS + +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. \ No newline at end of file diff --git a/scripts/editor/README.md b/scripts/editor/README.md new file mode 100644 index 00000000..5b6b3f7c --- /dev/null +++ b/scripts/editor/README.md @@ -0,0 +1,55 @@ +# GodotJS Editor CLI + +Command-line tool for [GodotJS](https://github.com/godotjs/GodotJS) project management. + +## Contents + +- [Overview](#overview) +- [Commands](#commands) +- [Use](#use) +- [API](#api) + +## Overview + +The GodotJS editor CLI tool helps you initialize new GodotJS projects, download required editor and export templates, start the development process, and build your game. + +## Commands + +- `init` - Initialize a new GodotJS project +- `prepare` - Download Godot editor and export templates +- `dev` - Start the development process +- `build` - Build the game for distribution + +## Use + +### Initialize a New Project + +```bash +npx @godot-js/editor init my-game +cd my-game +``` + +### Download Editor and Templates + +```bash +npm install @godot-js/editor +godot-js prepare +``` + +### Start Development + +```bash +npm install @godot-js/editor +godot-js dev +``` + +### Build Game + +```bash +npm install @godot-js/editor +godot-js build +``` + +## API + +For detailed API documentation, see [API.md](./docs/API.md). diff --git a/scripts/editor/docs/API.md b/scripts/editor/docs/API.md new file mode 100644 index 00000000..71240805 --- /dev/null +++ b/scripts/editor/docs/API.md @@ -0,0 +1,61 @@ +# API - @godot-js/editor + +Manages GodotJS editor + +> You can use `godot-js.json` as a config file. + By default it tries to search for the configuration otherwise use a correct path by passing `--config=./godot-js.json`. + +## build + +Build game with export templates + +| long | short | description | required | defaultValue | +| :--------------- | :---: | :--------------------------------------------------------------- | :------: | :------------ | +| `--tsConfigPath` | | Relative path where tsconfig.json is located | `❌` | `"."` | +| `--dry` | | Do a dry run with this command - prints/returns output | `❌` | | +| `--rootPath` | | Root path for your project | `❌` | `"."` | +| `--editorPath` | | Relative path from root where editor is downloaded | `❌` | `"./.editor"` | +| `--buildPath` | | Relative path from root where build is written | `❌` | `"./build"` | +| `--buildType` | | If the export should use the debug or release template | `❌` | `"release"` | +| `--preset` | | The name of the preset which should be build otherwise build all | `❌` | | + +## dev + +Start TypeScript compilation and opens editor + +| long | short | description | required | defaultValue | +| :--------------- | :---: | :----------------------------------------------------- | :------: | :------------ | +| `--tsConfigPath` | | Relative path where tsconfig.json is located | `❌` | `"."` | +| `--dry` | | Do a dry run with this command - prints/returns output | `❌` | | +| `--rootPath` | | Root path for your project | `❌` | `"."` | +| `--editorPath` | | Relative path from root where editor is downloaded | `❌` | `"./.editor"` | + +## init + +Creates a new GodotJS project with TypeScript support + +| long | short | description | required | defaultValue | +| :---------------- | :---: | :------------------------------------------------------------ | :------: | :---------------------- | +| `--name` | | The name of your project | `✅` | `"my-game"` | +| `--out` | | Relative path where project is written | `❌` | `"."` | +| `--forceDelete` | | Removes project dir if it's already there | `❌` | | +| `--dry` | | Do a dry run with this command - prints/returns output | `❌` | | +| `--buildPath` | | Relative path from root where build is written | `❌` | `"./build"` | +| `--editorPath` | | Relative path from root where editor is downloaded | `❌` | `"./.editor"` | +| `--templatesPath` | | Relative path from root where export templates are downloaded | `❌` | `"./.editor/templates"` | + +## prepare + +Downloads editor and export templates + +| long | short | description | required | defaultValue | +| :------------------ | :---: | :------------------------------------------------------------ | :------: | :---------------------- | +| `--dry` | | Do a dry run with this command - prints/returns output | `❌` | | +| `--godotVersion` | | The version for the Godot editor | `❌` | `"4.5"` | +| `--editorJSEngine` | | The version for the JavaScript engine | `❌` | `"v8"` | +| `--exportTemplates` | | An array of export templates to download | `❌` | | +| `--gitTag` | | Change to another gitTag for download | `❌` | | +| `--editorPath` | | Relative path from root where editor is downloaded | `❌` | `"./.editor"` | +| `--templatesPath` | | Relative path from root where export templates are downloaded | `❌` | `"./.editor/templates"` | +| `--rootPath` | | Root path for your project | `❌` | `"."` | + diff --git a/scripts/editor/esbuild.js b/scripts/editor/esbuild.js new file mode 100644 index 00000000..5dfb97ff --- /dev/null +++ b/scripts/editor/esbuild.js @@ -0,0 +1,11 @@ +import { build } from "esbuild"; + +await build({ + entryPoints: ["./src/cli.ts"], + bundle: true, + outfile: "./dist/index.js", + platform: "node", + format: "esm", + packages: "external", + // minify: true, +}); diff --git a/scripts/editor/eslint.config.ts b/scripts/editor/eslint.config.ts new file mode 100644 index 00000000..374104c4 --- /dev/null +++ b/scripts/editor/eslint.config.ts @@ -0,0 +1,14 @@ +import js from "@eslint/js"; +import globals from "globals"; +import tseslint from "typescript-eslint"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + { + files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], + plugins: { js }, + extends: ["js/recommended"], + languageOptions: { globals: globals.browser }, + }, + tseslint.configs.recommended, +]); diff --git a/scripts/editor/package.json b/scripts/editor/package.json new file mode 100644 index 00000000..74157a28 --- /dev/null +++ b/scripts/editor/package.json @@ -0,0 +1,70 @@ +{ + "name": "@godot-js/editor", + "version": "1.0.0", + "description": "Manages GodotJS editor", + "type": "module", + "repository": { + "type": "git", + "url": "https://github.com/godotjs/GodotJS" + }, + "license": "MIT", + "bin": { + "godot-js": "dist/index.js" + }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "files": [ + "dist/", + "CHANGELOG.md", + "README.md", + "LICENSE", + "docs" + ], + "scripts": { + "build": "node esbuild.js", + "postbuild": "tsc --emitDeclarationOnly", + "generate:api-docs": "tsx src/api-docs.ts", + "lint": "eslint *.ts", + "prebuild": "node src/utils/prepare.ts", + "pretest": "node src/utils/prepare.ts", + "test": "vitest run --no-file-parallelism" + }, + "dependencies": { + "adm-zip": "0.5.16", + "@inquirer/prompts": "^7.0.0", + "commander": "^14.0.0", + "cosmiconfig": "^9.0.0", + "glob": "^13.0.0", + "rimraf": "^6.0.1" + }, + "devDependencies": { + "@types/adm-zip": "0.5.7", + "@eslint/js": "^9.39.2", + "@types/fs-extra": "^11.0.4", + "@types/node": "^25.0.0", + "@typescript-eslint/eslint-plugin": "^8.0.0", + "@typescript-eslint/parser": "^8.0.0", + "esbuild": "0.27.2", + "eslint": "9.39.2", + "find-versions-cli": "^5.0.0", + "globals": "^16.5.0", + "markdown-table": "^3.0.3", + "prettier": "^3.0.3", + "tsx": "4.21.0", + "typescript": "5.9.3", + "typescript-eslint": "^8.50.0", + "vite": "^7.0.0", + "vitest": "^3.0.1" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public", + "provenance": true + } +} diff --git a/scripts/editor/src/api-docs.ts b/scripts/editor/src/api-docs.ts new file mode 100644 index 00000000..2271cb54 --- /dev/null +++ b/scripts/editor/src/api-docs.ts @@ -0,0 +1,51 @@ +import { getProgram } from "./program"; +import { CONFIG_NAME, programDescription, programName } from "./data"; +import { markdownTable } from "markdown-table"; +import { existsSync, writeFileSync, mkdirSync } from "node:fs"; + +const docsDirectory = "./docs"; + +const getBooleanValue = (value: unknown): string => { + if (String(value) === "true") { + return "✅"; + } else if (String(value) === "false") { + return "❌"; + } + + return String(value); +}; + +export const generateApiDocs = (name: string, programDescription: string) => { + const mProgram = getProgram(name, programDescription); + let result = `# API - ${mProgram.name()}\n\n`; + result += `${mProgram.description()}\n\n`; + result += `> You can use \`${CONFIG_NAME}.json\` as a config file. + By default it tries to search for the configuration otherwise use a correct path by passing \`--config=./${CONFIG_NAME}.json\`.\n\n`; + + for (const command of mProgram.commands.slice().sort((a, b) => a.name().localeCompare(b.name()))) { + result += `## ${command.name()}\n\n`; + result += `${command.description()}\n\n`; + + const mTable: string[][] = [["long", "short", "description", "required", "defaultValue"]]; + for (const { description, required, short, long, defaultValue } of command.options + .slice() + .sort((a, b) => (a.required === b.required ? 0 : a.required ? -1 : 1))) { + mTable.push([ + `\`${long}\``, + short && short?.length > 0 ? `\`${short}\`` : "", + description, + `\`${getBooleanValue(required)}\``, + defaultValue ? `\`${JSON.stringify(defaultValue)}\`` : "", + ]); + } + result += `${markdownTable(mTable, { align: ["l", "c", "l", "c", "l"] })}\n\n`; + } + + if (!existsSync(docsDirectory)) { + mkdirSync(docsDirectory, { recursive: true }); + } + + writeFileSync(`${docsDirectory}/API.md`, result); +}; + +generateApiDocs(programName, programDescription); diff --git a/scripts/editor/src/cli.ts b/scripts/editor/src/cli.ts new file mode 100644 index 00000000..79858167 --- /dev/null +++ b/scripts/editor/src/cli.ts @@ -0,0 +1,6 @@ +#!/usr/bin/env node + +import { startProgram } from "./program"; +import {programDescription, programName} from "./data"; + +startProgram(programName, programDescription); diff --git a/scripts/editor/src/commands/build/data.ts b/scripts/editor/src/commands/build/data.ts new file mode 100644 index 00000000..8d612cf0 --- /dev/null +++ b/scripts/editor/src/commands/build/data.ts @@ -0,0 +1,23 @@ +import { ProgramOptionsType } from "../../data"; +import { DevConfigType, devOptions } from "../dev/data"; +import { BuildPathConfigType, buildPathOption, OutConfigType } from "../../utils/shared"; + +export type BuildConfigType = { + buildType: "debug" | "release"; + preset?: string; +} & DevConfigType & + BuildPathConfigType; + +export const buildOptions: ProgramOptionsType[] = [ + ...devOptions, + buildPathOption, + { + name: "buildType", + defaultValue: "release", + description: "If the export should use the debug or release template", + }, + { + name: "preset", + description: "The name of the preset which should be build otherwise build all", + }, +]; diff --git a/scripts/editor/src/commands/build/index.ts b/scripts/editor/src/commands/build/index.ts new file mode 100644 index 00000000..541b18ab --- /dev/null +++ b/scripts/editor/src/commands/build/index.ts @@ -0,0 +1,90 @@ +import { BuildConfigType } from "./data"; +import { startConfigProcess } from "../../utils/config-process"; +import { CONFIG_NAME } from "../../data"; +import { getEditorPath, osMap } from "../../utils/os"; +import { platform } from "os"; +import { spawn } from "child_process"; +import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs"; +import { dirname, join } from "node:path"; + +const buildPreset = ({ + resolvedEditorPath, + buildType, + rootPath, + preset, +}: { + resolvedEditorPath: string; + rootPath: string; + buildType: string; + preset: string; +}) => { + spawn(resolvedEditorPath, ["--editor", "--headless", "--path", rootPath, `--export-${buildType}`, preset], { + stdio: "inherit", + }); +}; + +export const buildAction = async (passedConfig: BuildConfigType) => { + const config = await startConfigProcess(CONFIG_NAME, passedConfig); + const { dry, rootPath, tsConfigPath, buildPath, editorPath, buildType, preset } = config; + + const os = osMap[platform()]; + if (!os) throw new Error(`Unsupported platform: ${platform()}`); + + const resolvedEditorPath = getEditorPath(os, rootPath, editorPath); + const resolvedBuildPath = join(rootPath, buildPath); + const resolvedTSCPath = join(rootPath, "node_modules/typescript/bin/tsc"); + + if (dry) { + const result = { config, resolvedEditorPath, resolvedBuildPath }; + console.log(result); + return result; + } else { + const tsc = spawn(os === "windows" ? "node.exe" : "node", [resolvedTSCPath, "--project", tsConfigPath], { + stdio: "inherit", + }); + tsc.on("error", (err) => { + console.error(`Failed to start tsc: ${err.message}`); + }); + tsc.on("close", () => { + console.log("tsc done"); + if (platform() !== "win32") { + chmodSync(resolvedEditorPath, 0o755); + } + + if (!existsSync(resolvedBuildPath)) { + mkdirSync(resolvedBuildPath); + } + + if (preset) { + buildPreset({ resolvedEditorPath, buildType, rootPath, preset }); + } else { + const resolvedExportPresetConfig = join(rootPath, "export_presets.cfg"); + + if (!existsSync(resolvedExportPresetConfig)) { + throw new Error(`No export_presets.cfg found in ${rootPath}`); + } + + const content = readFileSync(resolvedExportPresetConfig, "utf-8"); + const presets = + content + .match(/name="([^"]+)"/g) + ?.map((m) => m.match(/name="([^"]+)"/)?.[1]) + .filter(Boolean) || []; + const exportPaths = + content + .match(/export_path="([^"]+)"/g) + ?.map((m) => m.match(/export_path="([^"]+)"/)?.[1]) + .filter(Boolean) || []; + exportPaths.forEach((path) => { + const resolvedPath = join(rootPath, dirname(path)); + if (!existsSync(resolvedPath)) { + mkdirSync(resolvedPath, { recursive: true }); + } + }); + presets.forEach((preset) => { + buildPreset({ resolvedEditorPath, buildType, rootPath, preset }); + }); + } + }); + } +}; diff --git a/scripts/editor/src/commands/dev/data.ts b/scripts/editor/src/commands/dev/data.ts new file mode 100644 index 00000000..14bf4d6b --- /dev/null +++ b/scripts/editor/src/commands/dev/data.ts @@ -0,0 +1,29 @@ +import { ProgramOptionsType } from "../../data"; +import { + ConfigType, + DryConfigType, + dryRunOption, + editorPathOption, + EditorPathConfigType, + OutConfigType, + RootPathConfigType, + rootPathOption, +} from "../../utils/shared"; + +export type DevConfigType = { + tsConfigPath?: string; +} & DryConfigType & + ConfigType & + RootPathConfigType & + EditorPathConfigType; + +export const devOptions: ProgramOptionsType[] = [ + { + name: "tsConfigPath", + defaultValue: ".", + description: "Relative path where tsconfig.json is located", + }, + dryRunOption, + rootPathOption, + editorPathOption, +]; diff --git a/scripts/editor/src/commands/dev/index.ts b/scripts/editor/src/commands/dev/index.ts new file mode 100644 index 00000000..a6cdd54c --- /dev/null +++ b/scripts/editor/src/commands/dev/index.ts @@ -0,0 +1,48 @@ +import { DevConfigType } from "./data"; +import { startConfigProcess } from "../../utils/config-process"; +import { CONFIG_NAME } from "../../data"; + +import { spawn } from "child_process"; +import { platform } from "node:os"; +import { getEditorPath, osMap } from "../../utils/os"; +import { join } from "node:path"; +import { chmodSync } from "node:fs"; + +export const devAction = async (passedConfig: DevConfigType) => { + const config = await startConfigProcess(CONFIG_NAME, passedConfig); + const { dry, rootPath, tsConfigPath, editorPath } = config; + + const os = osMap[platform()]; + if (!os) throw new Error(`Unsupported platform: ${platform()}`); + + const resolvedEditorPath = getEditorPath(os, rootPath, editorPath); + const resolvedTSCPath = join(rootPath, "node_modules/typescript/bin/tsc"); + + if (dry) { + const result = { config, editorPath }; + console.log(result); + return result; + } else { + const tsc = spawn( + os === "windows" ? "node.exe" : "node", + [resolvedTSCPath, "--watch", "--project", tsConfigPath], + { + stdio: "inherit", + }, + ); + tsc.on("error", (err) => { + console.error(`Failed to start tsc: ${err.message}`); + }); + + + if (platform() !== "win32") { + chmodSync(resolvedEditorPath, 0o755); + } + const editor = spawn(resolvedEditorPath, ["--editor", "--path", rootPath], { + stdio: "inherit", + }); + editor.on("error", (err) => { + console.error(`Failed to start editor: ${err.message}`); + }); + } +}; diff --git a/scripts/editor/src/commands/init/copy/.gitignore b/scripts/editor/src/commands/init/copy/.gitignore new file mode 100644 index 00000000..c39a988f --- /dev/null +++ b/scripts/editor/src/commands/init/copy/.gitignore @@ -0,0 +1,34 @@ +# Godot 4+ specific ignores +.godot/ + +# Godot-specific ignores +.import/ +export.cfg +export_presets.cfg + +# GodotJS-specific ignores +!**/.gdignore +!**/.gitkeep +.editor +build +dist/ + + +# Imported translations (automatically generated from CSV files) +*.translation + +# Mono-specific ignores +.mono/ +data_*/ +mono_crash.*.json + +# Dependency directory +node_modules +bower_components + +# Editors +.idea +*.iml + +# ignore yarn.lock +yarn.lock \ No newline at end of file diff --git a/scripts/editor/src/commands/init/copy/example.ts b/scripts/editor/src/commands/init/copy/example.ts new file mode 100644 index 00000000..ca83dd28 --- /dev/null +++ b/scripts/editor/src/commands/init/copy/example.ts @@ -0,0 +1,7 @@ +import { Node } from "godot"; + +export default class Example extends Node { + _ready(): void { + console.log("GodotTS works"); + } +} diff --git a/scripts/editor/src/commands/init/copy/tsconfig.json b/scripts/editor/src/commands/init/copy/tsconfig.json new file mode 100644 index 00000000..77aacda8 --- /dev/null +++ b/scripts/editor/src/commands/init/copy/tsconfig.json @@ -0,0 +1,113 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + "incremental": true /* Save .tsbuildinfo files to allow for incremental compilation of projects. */, + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + "tsBuildInfoFile": ".godot/.tsbuildinfo" /* Specify the path to .tsbuildinfo incremental compilation file. */, + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2022" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "CommonJS" /* Specify what module code is generated. */, + "rootDir": "./" /* Specify the root folder within your source files. */, + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + "typeRoots": [ + /* Specify multiple folders that act like './node_modules/@types'. */ + "./node_modules/@types", + "./typings" + ], + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": ".godot/GodotJS" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + "sourceRoot": "../../../" /* Specify the root path for debuggers to find the reference source code. */, + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + "newLine": "crlf" /* Set the newline character for emitting files. */, + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + "noEmitOnError": false /* Disable emitting files if any type checking errors are reported. */, + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/scripts/editor/src/commands/init/create/godot-js.ts b/scripts/editor/src/commands/init/create/godot-js.ts new file mode 100644 index 00000000..51561232 --- /dev/null +++ b/scripts/editor/src/commands/init/create/godot-js.ts @@ -0,0 +1,23 @@ +import { InitConfigType } from "../data"; + +export const getGodotJSConfig = ({ + buildPath, + editorPath, + templatesPath, +}: Pick) => + `import type { GodotJsConfig } from "@godot-js/editor"; + +const config: GodotJsConfig = { + buildType: "release", + tsConfigPath: ".", + rootPath: ".", + buildPath: "${buildPath}", + godotVersion: "4.5", + editorJSEngine: "v8", + editorPath: "${editorPath}", + templatesPath: "${templatesPath}", + exportTemplates: [], +}; + +export default config; +`; diff --git a/scripts/editor/src/commands/init/create/package.json.ts b/scripts/editor/src/commands/init/create/package.json.ts new file mode 100644 index 00000000..a9660a5c --- /dev/null +++ b/scripts/editor/src/commands/init/create/package.json.ts @@ -0,0 +1,19 @@ +export const getPackageJson = (name: string, version: string, typescript: string) => + JSON.stringify( + { + name: `${name.replaceAll(" ", "-").toLowerCase()}`, + version: "0.0.0", + type: "module", + scripts: { + build: "godot-js build", + dev: "godot-js dev", + postinstall: "godot-js prepare", + }, + devDependencies: { + "@godot-js/editor": `${version}`, + typescript: `${typescript}`, + }, + }, + undefined, + 2, + ); diff --git a/scripts/editor/src/commands/init/create/project.godot.ts b/scripts/editor/src/commands/init/create/project.godot.ts new file mode 100644 index 00000000..14ef20cc --- /dev/null +++ b/scripts/editor/src/commands/init/create/project.godot.ts @@ -0,0 +1,13 @@ +export const getGodotProject = (name: string) => `; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="${name}"`; diff --git a/scripts/editor/src/commands/init/data.ts b/scripts/editor/src/commands/init/data.ts new file mode 100644 index 00000000..903fe8fc --- /dev/null +++ b/scripts/editor/src/commands/init/data.ts @@ -0,0 +1,54 @@ +import { ProgramOptionsType } from "../../data"; +import { + BuildPathConfigType, + buildPathOption, + DryConfigType, + dryRunOption, + EditorPathConfigType, + editorPathOption, + OutConfigType, + TemplatesPathConfigType, + templatesPathOption, +} from "../../utils/shared"; + +export type InitConfigType = { + name?: string; + forceDelete?: boolean; +} & DryConfigType & + OutConfigType & + BuildPathConfigType & + EditorPathConfigType & + TemplatesPathConfigType; + +export const initOptions: ProgramOptionsType[] = [ + { + name: "name", + defaultValue: "my-game", + description: "The name of your project", + required: true, + inquirer: { + input: { message: "Enter the name of your Game" }, + }, + }, + { + name: "out", + defaultValue: ".", + description: "Relative path where project is written", + }, + { + name: "forceDelete", + defaultValue: false, + description: "Removes project dir if it's already there", + }, + dryRunOption, + buildPathOption, + editorPathOption, + templatesPathOption, +]; + +export const EXAMPLE_FILE = "example.ts"; +export const GITIGNORE = ".gitignore"; +export const TS_CONFIG_FILE = "tsconfig.json"; +export const PACKAGE_JSON_FILE = "package.json"; +export const GODOT_JS_CONFIG_FILE = ".config/godot-js.ts"; +export const GODOT_PROJECT_FILE: string = "project.godot"; diff --git a/scripts/editor/src/commands/init/index.ts b/scripts/editor/src/commands/init/index.ts new file mode 100644 index 00000000..50dd6ade --- /dev/null +++ b/scripts/editor/src/commands/init/index.ts @@ -0,0 +1,142 @@ +import { + EXAMPLE_FILE, + GITIGNORE, + GODOT_JS_CONFIG_FILE, + GODOT_PROJECT_FILE, + InitConfigType, + initOptions, + PACKAGE_JSON_FILE, + TS_CONFIG_FILE, +} from "./data"; +import { startInquirerProcess } from "../../utils/inquirer-process"; +import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs"; +import { getGodotProject } from "./create/project.godot"; +import { getPackageJson } from "./create/package.json"; +import { devDependencies, version } from "package.json"; + +import { _GITIGNORE, EXAMPLE_TS, TSCONFIG_JSON } from "./generated"; +import { rimrafSync } from "rimraf"; +import { basename, join, resolve } from "node:path"; +import { startConfigProcess } from "../../utils/config-process"; +import { CONFIG_NAME } from "../../data"; +import { getGodotJSConfig } from "./create/godot-js"; + +const writeIgnoreFolders = (projectDir: string, buildPath: string, editorPath: string, templatesPath: string) => { + const ignoreFolders = [ + "node_modules", + "gen/godot", + "typings", + ".config", + ".godot/GodotJS", + buildPath, + editorPath, + templatesPath, + ]; + + for (const folder of ignoreFolders) { + const path = join(projectDir, folder); + if (!existsSync(path)) { + mkdirSync(path, { recursive: true }); + } + const gdIgnoreNodeModulesPath = join(path, ".gdignore"); + if (!existsSync(gdIgnoreNodeModulesPath)) { + writeFileSync(gdIgnoreNodeModulesPath, ""); + } + } +}; + +const generateFiles = ({ + createNewProject, + root, + forceDelete, + filesToCreate, + buildPath, + editorPath, + templatesPath, +}: { + createNewProject: boolean; + root: string; + forceDelete: boolean; + filesToCreate: Record; + buildPath: string; + editorPath: string; + templatesPath: string; +}) => { + if (createNewProject) { + if (existsSync(root)) { + if (forceDelete) { + rimrafSync(root); + mkdirSync(root, { recursive: true }); + } + } else { + mkdirSync(root, { recursive: true }); + } + } + + writeIgnoreFolders(root, buildPath, editorPath, templatesPath); + + for (const [fileName, content] of Object.entries(filesToCreate)) { + try { + const path = join(root, fileName); + if (!existsSync(path)) { + writeFileSync(path, content, "utf8"); + } + } catch (e: unknown) { + console.warn(e); + } + } + + console.log("Generated files done, start by running:"); + if (createNewProject) { + console.log(`cd ${root}`); + } + console.log("npm install"); + console.log("npm run dev"); +}; + +const byteArrayAsString = (array: number[]): string => String.fromCharCode.apply(null, array); + +export const initAction = async (initConfig: InitConfigType) => { + const readConfig = await startConfigProcess(CONFIG_NAME, initConfig); + const config = await startInquirerProcess(readConfig, initOptions); + const { name, dry, out, forceDelete, buildPath, editorPath, templatesPath } = config; + + const filesToCreate: Record = {}; + let root = out.endsWith("/") ? out.slice(0, out.length - 1) : out; + if (!root.endsWith(name)) { + root = join(root, name); + } + let createNewProject = basename(resolve(root)) !== name; + + if (existsSync(root) && readdirSync(root).includes(GODOT_PROJECT_FILE)) { + createNewProject = false; + } else { + filesToCreate[GODOT_PROJECT_FILE] = getGodotProject(name); + } + + filesToCreate[PACKAGE_JSON_FILE] = getPackageJson(name, version, devDependencies.typescript); + filesToCreate[TS_CONFIG_FILE] = byteArrayAsString(TSCONFIG_JSON); + filesToCreate[GODOT_JS_CONFIG_FILE] = getGodotJSConfig({ buildPath, editorPath, templatesPath }); + filesToCreate[EXAMPLE_FILE] = byteArrayAsString(EXAMPLE_TS); + filesToCreate[GITIGNORE] = byteArrayAsString(_GITIGNORE); + + if (dry) { + const result = { + config, + createNewProject, + filesToCreate: Object.keys(filesToCreate), + }; + console.log(result); + return result; + } else { + generateFiles({ + createNewProject, + root, + forceDelete, + filesToCreate, + buildPath, + editorPath, + templatesPath, + }); + } +}; diff --git a/scripts/editor/src/commands/prepare/data.ts b/scripts/editor/src/commands/prepare/data.ts new file mode 100644 index 00000000..245ed3df --- /dev/null +++ b/scripts/editor/src/commands/prepare/data.ts @@ -0,0 +1,69 @@ +import { ProgramOptionsType } from "../../data"; +import { + ConfigType, + DryConfigType, + dryRunOption, + editorPathOption, + EditorPathConfigType, + RootPathConfigType, + templatesPathOption, + TemplatesPathConfigType, + rootPathOption, +} from "../../utils/shared"; + +export type ExportTemplateType = { + target: + | "web" + | "web-dlink" + | "web-nothreads" + | "web-dlink-nothreads" + | "macos" + | "android" + | "ios" + | "windows" + | "linux"; + engine: "v8" | "qjs-ng" | "browser"; +}; + +export type PrepareDownloadType = { + godotVersion?: "4.4" | "4.5"; + editorJSEngine?: "v8" | "qjs_ng"; + exportTemplates?: ExportTemplateType[]; + gitTag?: string; + generateInitialTypings?: boolean; +} & EditorPathConfigType & + TemplatesPathConfigType & + RootPathConfigType; + +export type PrepareConfigType = {} & DryConfigType & ConfigType & PrepareDownloadType; + +export const prepareOptions: ProgramOptionsType[] = [ + dryRunOption, + { + name: "godotVersion", + defaultValue: "4.5", + description: "The version for the Godot editor", + }, + { + name: "editorJSEngine", + defaultValue: "v8", + description: "The version for the JavaScript engine", + }, + { + name: "generateInitialTypings", + defaultValue: true, + description: "Enable initial typings generation", + }, + { + name: "exportTemplates", + array: true, + description: "An array of export templates to download", + }, + { + name: "gitTag", + description: "Change to another gitTag for download", + }, + editorPathOption, + templatesPathOption, + rootPathOption, +]; diff --git a/scripts/editor/src/commands/prepare/downloads.ts b/scripts/editor/src/commands/prepare/downloads.ts new file mode 100644 index 00000000..07c4aea8 --- /dev/null +++ b/scripts/editor/src/commands/prepare/downloads.ts @@ -0,0 +1,51 @@ +import { ExportTemplateType, PrepareDownloadType } from "./data"; +import { version } from "package.json"; + +const releaseUrl = "https://github.com/godotjs/GodotJS/releases/download"; + +export const getDownloads = ({ + os, + editorPath, + templatesPath, + editorJSEngine, + godotVersion, + exportTemplates, + gitTag, +}: { + os: string; + exportTemplates?: ExportTemplateType[]; +} & PrepareDownloadType) => { + let downloadVersion = gitTag ?? version; + if (!downloadVersion.startsWith("v")) downloadVersion = `v${downloadVersion}`; + + const downloads = [ + { + name: "editor", + url: `${releaseUrl}/${downloadVersion}/${os}-${os === "macos" ? "editor-app" : "editor"}-${godotVersion}-${editorJSEngine}.zip`, + marker: + os === "macos" + ? "Godot.app" + : os === "windows" + ? "godot.windows.editor.x86_64.exe" + : "godot.linuxbsd.editor.x86_64", + targetDir: editorPath, + }, + ]; + + for (const { target, engine } of exportTemplates ?? []) { + // TODO: Do we need the app here? + // const types = target === "macos" ? ["-app"] : ["_debug", "_release"]; + const types = ["_debug", "_release"]; + + for (const type of types) { + downloads.push({ + name: `${target}-template${type}-${engine}`, + url: `${releaseUrl}/${downloadVersion}/${target}-template${type}-${godotVersion}-${engine}.zip`, + marker: `${target}-template${type}-${godotVersion}-${engine}`, + targetDir: templatesPath, + }); + } + } + + return downloads; +}; diff --git a/scripts/editor/src/commands/prepare/generate-types.ts b/scripts/editor/src/commands/prepare/generate-types.ts new file mode 100644 index 00000000..fdb16652 --- /dev/null +++ b/scripts/editor/src/commands/prepare/generate-types.ts @@ -0,0 +1,14 @@ +export const getGenerateTypesFile = () => { + return `Object.defineProperty(exports, "__esModule", { value: true }); +const godot_1 = require("godot"); +const mod = require("jsb.editor.codegen"); +class GenerateTypes extends godot_1.SceneTree { + async _initialize() { + const codeGen = new mod.TSDCodeGen("./typings", true); + await codeGen.emit(false); + this.quit(); + } +} +exports.default = GenerateTypes; +`; +}; diff --git a/scripts/editor/src/commands/prepare/index.ts b/scripts/editor/src/commands/prepare/index.ts new file mode 100644 index 00000000..ffd456c2 --- /dev/null +++ b/scripts/editor/src/commands/prepare/index.ts @@ -0,0 +1,151 @@ +import { PrepareConfigType } from "./data"; +import { startConfigProcess } from "../../utils/config-process"; +import { CONFIG_NAME } from "../../data"; +import { osMap } from "../../utils/os"; +import { platform } from "os"; +import { createWriteStream, existsSync, mkdirSync, unlinkSync, readdirSync, writeFileSync, chmodSync } from "node:fs"; +import { get } from "node:https"; +import AdmZip from "adm-zip"; +import { getDownloads } from "./downloads"; +import { join } from "node:path"; +import type { IncomingMessage } from "node:http"; +import { execSync } from "node:child_process"; +import { getGenerateTypesFile } from "./generate-types"; + +const downloadWithProgress = ( + response: IncomingMessage, + output: string, + resolve: () => void, + reject: (err: Error) => void, +) => { + if (response.statusCode !== 200) { + reject(new Error(`Failed to download: ${response.statusCode} ${response.statusMessage}`)); + return; + } + + const totalSize = parseInt(response.headers["content-length"] || "0"); + let downloaded = 0; + const fileStream = createWriteStream(output); + + response.on("data", (chunk) => { + downloaded += chunk.length; + const percent = totalSize ? ((downloaded / totalSize) * 100).toFixed(1) : "?"; + process.stdout.write(`\rProgress: ${percent}% (${(downloaded / 1024 / 1024).toFixed(2)} MB)`); + }); + + response.pipe(fileStream); + fileStream.on("finish", () => { + fileStream.close(); + resolve(); + }); + fileStream.on("error", reject); +}; + +export const prepareAction = async (passedConfig: PrepareConfigType) => { + const config = await startConfigProcess(CONFIG_NAME, passedConfig); + const { + dry, + editorPath, + templatesPath, + editorJSEngine, + godotVersion, + rootPath, + exportTemplates, + gitTag, + generateInitialTypings, + } = config; + + const os = osMap[platform()]; + if (!os) throw new Error(`Unsupported platform: ${platform()}`); + + const resolvedEditorPath = join(rootPath, editorPath); + const resolvedTemplatesPath = join(rootPath, templatesPath); + + if (dry) { + const result = { config, resolvedEditorPath, resolvedTemplatesPath }; + console.log(result); + return result; + } else { + if (!existsSync(resolvedEditorPath)) mkdirSync(resolvedEditorPath, { recursive: true }); + if (!existsSync(resolvedTemplatesPath)) mkdirSync(resolvedTemplatesPath, { recursive: true }); + + const downloads = getDownloads({ + os, + editorPath: resolvedEditorPath, + templatesPath: resolvedTemplatesPath, + editorJSEngine, + godotVersion, + exportTemplates, + gitTag, + }); + + for (const { name, url, marker, targetDir } of downloads) { + const markerPath = join(targetDir, marker); + + if (existsSync(markerPath)) { + console.log(`Skipping ${name}: already exists`); + } else { + const output = join(targetDir, `${name}.zip`); + + console.log(`Downloading ${name}: ${url}`); + + await new Promise((resolve, reject) => { + get(url, (response) => { + if (response.statusCode === 302 || response.statusCode === 301) { + get(response.headers.location!, (redirectResponse) => { + downloadWithProgress(redirectResponse, output, resolve, reject); + }); + } else { + downloadWithProgress(response, output, resolve, reject); + } + }).on("error", reject); + }); + + console.log(); // New line after progress + + console.log(`Extracting: ${output}`); + + const zip = new AdmZip(output); + + if (name === "editor") { + const entries = zip.getEntries(); + const rootDir = entries[0]?.entryName.split("/")[0]; + + for (const entry of entries) { + if (entry.isDirectory) continue; + const relativePath = rootDir ? entry.entryName.substring(rootDir.length + 1) : entry.entryName; + if (relativePath) { + zip.extractEntryTo(entry, targetDir, false, true, false, relativePath); + } + } + } else { + zip.extractAllTo(targetDir, true); + } + + unlinkSync(output); + } + + if (name === "editor" && generateInitialTypings) { + const typingsPath = join(rootPath, "typings"); + const hasGenFiles = + existsSync(typingsPath) && readdirSync(typingsPath).some((f) => f.endsWith(".gen.d.ts")); + + if (!hasGenFiles) { + const generateTypesPath = join(rootPath, "generate-types.js"); + writeFileSync(generateTypesPath, getGenerateTypesFile()); + + console.log("Generating types..."); + if (platform() !== "win32") { + chmodSync(markerPath, 0o755); + } + execSync(`"${markerPath}" -s generate-types.js --headless --path "${rootPath}"`, { + stdio: "inherit", + }); + unlinkSync(generateTypesPath); + } + } + } + + console.log("Done: All files extracted"); + } +}; diff --git a/scripts/editor/src/data.ts b/scripts/editor/src/data.ts new file mode 100644 index 00000000..2992cc52 --- /dev/null +++ b/scripts/editor/src/data.ts @@ -0,0 +1,60 @@ +import { devOptions } from "./commands/dev/data"; +import { devAction } from "./commands/dev"; +import { buildOptions } from "./commands/build/data"; +import { buildAction } from "./commands/build"; +import { initOptions } from "./commands/init/data"; +import { initAction } from "./commands/init"; +import { prepareOptions } from "./commands/prepare/data"; +import { prepareAction } from "./commands/prepare"; + +export const CONFIG_NAME = "godot-js"; +export const programName = "@godot-js/editor"; +export const programDescription = "Manages GodotJS editor"; + +export type Command = { + name: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + action: (...args: any[]) => void | Promise; + description?: string; + options?: ProgramOptionsType[]; +}; + +export type ProgramOptionsType = { + name: string; + short?: string; + long?: string; + array?: boolean; + required?: boolean; + description?: string; + defaultValue?: string | boolean | string[]; + inquirer?: { + input?: { message: string }; + }; +}; + +export const godotJS: Command[] = [ + { + name: "init", + description: "Creates a new GodotJS project with TypeScript support", + options: initOptions, + action: initAction, + }, + { + name: "build", + description: "Build game with export templates", + options: buildOptions, + action: buildAction, + }, + { + name: "dev", + description: "Start TypeScript compilation and opens editor", + options: devOptions, + action: devAction, + }, + { + name: "prepare", + description: "Downloads editor and export templates", + options: prepareOptions, + action: prepareAction, + }, +]; diff --git a/scripts/editor/src/index.ts b/scripts/editor/src/index.ts new file mode 100644 index 00000000..b4b7de4c --- /dev/null +++ b/scripts/editor/src/index.ts @@ -0,0 +1,6 @@ +import { InitConfigType } from "./commands/init/data"; +import { BuildConfigType } from "./commands/build/data"; +import { DevConfigType } from "./commands/dev/data"; +import { PrepareConfigType } from "./commands/prepare/data"; + +export type GodotJsConfig = Partial; diff --git a/scripts/editor/src/program.ts b/scripts/editor/src/program.ts new file mode 100644 index 00000000..4dd5eb0c --- /dev/null +++ b/scripts/editor/src/program.ts @@ -0,0 +1,57 @@ +import { Command, program } from "commander"; +import { godotJS } from "./data"; + +export const getProgram = (name: string, description: string) => { + const mProgram = program.name(name).description(description); + + for (const command of godotJS) { + const pCommand = new Command(command.name); + pCommand.description(); + + if (command.description) { + pCommand.description(command.description); + } + + if (command.options) { + for (const option of command.options) { + const short: string | undefined = + option.short && + (option.short?.startsWith("-") ? option.short : `-${option.short}`); + + const isBoolean = typeof option.defaultValue == "boolean"; + const pre = option.array + ? "[" + : isBoolean + ? "" + : option.required + ? "<" + : "["; + const post = option.array + ? "s...]" + : isBoolean + ? "" + : option.required + ? ">" + : "]"; + + const long = + option.long || `--${option.name} ${pre}${option.name}${post}`; + + pCommand.option( + short ? `${short}, ${long}` : `${long}`, + option.description || "", + option.defaultValue, + ); + } + } + + pCommand.action(command.action); + mProgram.addCommand(pCommand); + } + + return mProgram; +}; + +export const startProgram = (name: string, description: string) => { + getProgram(name, description).parse(); +}; diff --git a/scripts/editor/src/utils/config-process.ts b/scripts/editor/src/utils/config-process.ts new file mode 100644 index 00000000..6ffd3136 --- /dev/null +++ b/scripts/editor/src/utils/config-process.ts @@ -0,0 +1,34 @@ +import { cosmiconfig, CosmiconfigResult } from "cosmiconfig"; + +export const startConfigProcess = async (moduleName: string, config: T): Promise => { + const explorerSync = cosmiconfig(moduleName, { + searchPlaces: [ + "package.json", + `.${moduleName}`, + `.${moduleName}.json`, + `.${moduleName}.yaml`, + `.${moduleName}.yml`, + `.${moduleName}.js`, + `.${moduleName}.ts`, + `.${moduleName}.mjs`, + `.${moduleName}.cjs`, + `.config/${moduleName}`, + `.config/${moduleName}.json`, + `.config/${moduleName}.yaml`, + `.config/${moduleName}.yml`, + `.config/${moduleName}.js`, + `.config/${moduleName}.ts`, + `.config/${moduleName}.mjs`, + `.config/${moduleName}.cjs`, + ], + }); + + const configPath = config["config"]; + const configResult: CosmiconfigResult = await (configPath ? explorerSync.load(configPath) : explorerSync.search()); + + if (configResult && !configResult.isEmpty) { + return { ...config, ...configResult.config }; + } + + return config; +}; diff --git a/scripts/editor/src/utils/inquirer-process.ts b/scripts/editor/src/utils/inquirer-process.ts new file mode 100644 index 00000000..6367e9c3 --- /dev/null +++ b/scripts/editor/src/utils/inquirer-process.ts @@ -0,0 +1,27 @@ +import { ProgramOptionsType } from "../data"; +import { input } from "@inquirer/prompts"; + +export const startInquirerProcess = async ( + config: T, + options: ProgramOptionsType[], +): Promise => { + const copyConfig: T = { ...config }; + + const optionsWithInquirer = options.filter((option) => option.inquirer); + + for (const option of optionsWithInquirer) { + const { inquirer } = option; + if ( + inquirer?.input && + (!config[option.name] || config[option.name] === option.defaultValue) + ) { + copyConfig[option.name] = await input({ + message: inquirer.input.message, + default: option.defaultValue?.toString(), + required: option.required, + }); + } + } + + return copyConfig; +}; diff --git a/scripts/editor/src/utils/os.ts b/scripts/editor/src/utils/os.ts new file mode 100644 index 00000000..cbf969ad --- /dev/null +++ b/scripts/editor/src/utils/os.ts @@ -0,0 +1,15 @@ +import { join } from "node:path"; + +export const osMap: Record = { + win32: "windows", + darwin: "macos", + linux: "linux", +}; + +export const getEditorPath = (os: string, rootPath: string, editorPath: string): string => { + return os === "macos" + ? join(rootPath, editorPath, "Godot.app/Contents/MacOS/Godot") + : os === "windows" + ? join(rootPath, editorPath, "godot.windows.editor.x86_64.exe") + : join(rootPath, editorPath, "godot.linuxbsd.editor.x86_64"); +}; diff --git a/scripts/editor/src/utils/prepare.ts b/scripts/editor/src/utils/prepare.ts new file mode 100644 index 00000000..299aec05 --- /dev/null +++ b/scripts/editor/src/utils/prepare.ts @@ -0,0 +1,17 @@ +import { readdirSync, readFileSync, writeFileSync } from "node:fs"; + +const initPath = "src/commands/init"; +const copyPath = `${initPath}/copy`; + +const prepare = () => { + const files = readdirSync(`${initPath}/copy`); + let result = ""; + for (const file of files) { + const content = readFileSync(`${copyPath}/${file}`); + result += `export const ${file.replaceAll(".", "_").toUpperCase()} = [${Uint8Array.from(content)}];\n\n`; + } + + writeFileSync(`${initPath}/generated.ts`, result); +}; + +prepare(); diff --git a/scripts/editor/src/utils/shared.ts b/scripts/editor/src/utils/shared.ts new file mode 100644 index 00000000..7ab2d120 --- /dev/null +++ b/scripts/editor/src/utils/shared.ts @@ -0,0 +1,54 @@ +import { ProgramOptionsType } from "../data"; + +export type OutConfigType = { + out?: string; +}; +export type BuildPathConfigType = { + buildPath?: string; +}; + +export type DryConfigType = { + dry?: boolean; +}; + +export type ConfigType = { + config?: string; +}; +export type RootPathConfigType = { + rootPath?: string; +}; +export type EditorPathConfigType = { + editorPath?: string; +}; +export type TemplatesPathConfigType = { + templatesPath?: string; +}; + +export const dryRunOption: ProgramOptionsType = { + name: "dry", + description: "Do a dry run with this command - prints/returns output", + defaultValue: false, +}; + +export const rootPathOption: ProgramOptionsType = { + name: "rootPath", + defaultValue: ".", + description: "Root path for your project", +}; +export const buildPathOption: ProgramOptionsType = { + name: "buildPath", + defaultValue: "./build", + description: "Relative path from root where build is written", +}; + +export const editorPathOption: ProgramOptionsType = { + name: "editorPath", + defaultValue: "./.editor", + description: "Relative path from root where editor is downloaded", +}; + +export const templatesPathOption: ProgramOptionsType = { + name: "templatesPath", + defaultValue: "./.editor/templates", + description: "Relative path from root where export templates are downloaded", +}; diff --git a/scripts/editor/test/.godot-js.json b/scripts/editor/test/.godot-js.json new file mode 100644 index 00000000..ce53a1ab --- /dev/null +++ b/scripts/editor/test/.godot-js.json @@ -0,0 +1,5 @@ +{ + "tsConfigPath": ".", + "rootPath": ".", + "buildPath": "./test-build" +} diff --git a/scripts/editor/test/all/all.test.ts b/scripts/editor/test/all/all.test.ts new file mode 100644 index 00000000..ebbef15d --- /dev/null +++ b/scripts/editor/test/all/all.test.ts @@ -0,0 +1,71 @@ +import { describe, expect, test } from "vitest"; +import { readdirSync } from "node:fs"; +import { initAction } from "../../src/commands/init"; +import { prepareAction } from "../../src/commands/prepare"; +import { platform } from "node:os"; + +const gameName = "game"; +const root = `./test/all/${gameName}`; + +const expectedFiles = [ + "node_modules", + "example.ts", + ".gitignore", + "package.json", + "project.godot", + "tsconfig.json", + "build", + "gen", + "typings", + ".editor", + ".godot", +]; + +describe("all", () => { + test( + `test init and prepare`, + async () => { + await initAction({ + name: gameName, + out: root, + forceDelete: true, + editorPath: "./.editor", + templatesPath: "./.editor/templates", + dry: false, + buildPath: "./build", + }); + const files: string[] = readdirSync(root); + expect(files).toHaveLength(12); + for (const file of expectedFiles) { + expect(files).toContain(file); + } + + await prepareAction({ + rootPath: root, + gitTag: "v1.1.0-generate-typings", + editorPath: ".editor", + templatesPath: ".editor/templates", + dry: false, + editorJSEngine: "v8", + godotVersion: "4.5", + generateInitialTypings: true, + exportTemplates: [ + { + target: "web", + engine: "qjs-ng", + }, + ], + }); + const editorFiles: string[] = readdirSync(`${root}/.editor`); + const os = platform(); + editorFiles.includes( + os === "darwin" + ? "Godot.app" + : os === "win32" + ? "godot.windows.editor.x86_64.exe" + : "godot.linuxbsd.editor.x86_64", + ); + }, + { timeout: 10 * 60 * 1000 }, + ); +}); diff --git a/scripts/editor/test/package.json b/scripts/editor/test/package.json new file mode 100644 index 00000000..90913872 --- /dev/null +++ b/scripts/editor/test/package.json @@ -0,0 +1,17 @@ +{ + "name": "@godot-js/editor-test", + "scripts": { + "cli:help": "tsx ../src/cli.ts --help", + "cli:init": "tsx ../src/cli.ts init --name test --dry", + "cli:prepare": "tsx ../src/cli.ts prepare --rootPath ./game --dry", + "cli:build": "tsx ../src/cli.ts build --buildPath ./abc --rootPath ./game --dry", + "cli:dev": "tsx ../src/cli.ts dev --tsConfigPath ./xyz/tsconfig.json --rootPath ./game --dry", + "cli:build-test": "tsx ../src/cli.ts build --tsConfigPath ./all/game/tsconfig.json --rootPath ./all/game", + "cli:dev-test": "tsx ../src/cli.ts dev --tsConfigPath ./all/game/tsconfig.json --rootPath ./all/game", + "cli:build-config": "tsx ../src/cli.ts build --dry", + "cli:dev-config": "tsx ../src/cli.ts dev --dry" + }, + "devDependencies": { + "tsx": "^4.21.0" + } +} diff --git a/scripts/editor/tsconfig.json b/scripts/editor/tsconfig.json new file mode 100644 index 00000000..3fd2171c --- /dev/null +++ b/scripts/editor/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["./src/index.ts"], + "exclude": ["./src/commands/init/copy/example.ts"], + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "lib": ["ESNext"], + "rootDir": "./src", + "outDir": "./dist", + "declaration": true, + "isolatedModules": true, + "skipLibCheck": true, + "moduleResolution": "bundler", + "experimentalDecorators": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "paths": { + "package.json": ["./package.json"] + } + } +} diff --git a/scripts/editor/vitest.config.ts b/scripts/editor/vitest.config.ts new file mode 100644 index 00000000..77a73cf2 --- /dev/null +++ b/scripts/editor/vitest.config.ts @@ -0,0 +1,5 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: {}, +}); diff --git a/scripts/release/get-version.js b/scripts/release/get-version.js index d49c2093..41f4fcf4 100644 --- a/scripts/release/get-version.js +++ b/scripts/release/get-version.js @@ -1,4 +1,11 @@ -import { execSync } from "child_process"; +import { dirname, join } from "path"; +import { readFileSync } from "fs"; +import { fileURLToPath } from "url"; -export const getVersion = () => - `v${JSON.parse(execSync("pnpm pkg get version").toString().trim())}`; +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export const getPackageJsonVersion = () => { + const packagePath = join(__dirname, "../editor/package.json"); + return JSON.parse(readFileSync(packagePath, "utf8")).version; +}; +export const getVersion = () => `v${getPackageJsonVersion()}`; diff --git a/scripts/release/publish.js b/scripts/release/publish.js index 7f462d03..d1def8e7 100644 --- a/scripts/release/publish.js +++ b/scripts/release/publish.js @@ -1,57 +1,59 @@ import { writeFileSync, readFileSync } from "node:fs"; import { execSync } from "child_process"; import { getVersion } from "./get-version.js"; +import { dirname, join } from "path"; +import { fileURLToPath } from "url"; -const releaseNotesPath = "release-notes.md"; +const __dirname = dirname(fileURLToPath(import.meta.url)); -function extractChangelogContent(filePath) { - const changelog = readFileSync(filePath, "utf-8"); - const lines = changelog.split(/\r?\n/); // Split by line endings for different OS - let content = ""; - let capture = false; - - for (const line of lines) { - let firstCapture = false; - if (line.startsWith("## ")) { - if (capture) break; // Stop capturing if another "## " is found - capture = true; // Start capturing - firstCapture = true; - } +const releaseNotesPath = "release-notes.md"; - if (!firstCapture && capture) { - content += line + "\n"; // Add the line to the content +function extractChangelogContent() { + const changelogPath = join(__dirname, "../editor/CHANGELOG.md"); + const changelog = readFileSync(changelogPath, "utf-8"); + const lines = changelog.split(/\r?\n/); // Split by line endings for different OS + let content = ""; + let capture = false; + + for (const line of lines) { + let firstCapture = false; + if (line.startsWith("## ")) { + if (capture) break; // Stop capturing if another "## " is found + capture = true; // Start capturing + firstCapture = true; + } + + if (!firstCapture && capture) { + content += line + "\n"; // Add the line to the content + } } - } - return content.trim().replaceAll("###", "##"); // Remove trailing whitespace + return content.trim().replaceAll("###", "##"); // Remove trailing whitespace } function publishRelease(godotVersions) { - const content = extractChangelogContent("CHANGELOG.md"); - - writeFileSync( - releaseNotesPath, - `Godot version: ${godotVersions}\n\n` + content, - ); - - const version = getVersion(); - console.log(`Found version:`, version); - - const releaseCommand = `gh release create "${version}" --target main --title "${version}" --notes-file "${releaseNotesPath}"`; - if (process.env.CI) { - console.log(execSync(releaseCommand).toString()); - } else { - console.log( - "process.env.CI not set would run command:\n", - releaseCommand, - "\n\nContent for changelog:\n", - content, - ); - } + const content = extractChangelogContent(); + + writeFileSync(releaseNotesPath, `Godot version: ${godotVersions}\n\n` + content); + + const version = getVersion(); + console.log(`Found version:`, version); + + const releaseCommand = `gh release create "${version}" --target main --title "${version}" --notes-file "${releaseNotesPath}"`; + if (process.env.CI) { + console.log(execSync(releaseCommand).toString()); + } else { + console.log( + "process.env.CI not set would run command:\n", + releaseCommand, + "\n\nContent for changelog:\n", + content, + ); + } } const [, , godotVersions] = process.argv; if (!godotVersions) { - console.error("Cannot find Godot versions"); - process.exit(1); + console.error("Cannot find Godot versions"); + process.exit(1); } publishRelease(godotVersions); diff --git a/scripts/release/version.js b/scripts/release/version.js index 69e26e38..1c29f2ab 100644 --- a/scripts/release/version.js +++ b/scripts/release/version.js @@ -1,10 +1,10 @@ import { writeFileSync } from "fs"; -import { execSync } from "child_process"; +import { getPackageJsonVersion } from "./get-version.js"; function updateVersion() { - const version = `${JSON.parse(execSync("pnpm pkg get version").toString().trim())}`; - const [major, minor, patch] = version.split("."); - const newContent = `#ifndef GODOTJS_VERSION_H + const version = getPackageJsonVersion(); + const [major, minor, patch] = version.split("."); + const newContent = `#ifndef GODOTJS_VERSION_H #define GODOTJS_VERSION_H #include "jsb.gen.h" @@ -14,7 +14,7 @@ function updateVersion() { #define JSB_PATCH_VERSION ${patch} #endif`; - writeFileSync("jsb_version.h", newContent, "utf8"); + writeFileSync("jsb_version.h", newContent, "utf8"); } updateVersion();