From 562e41e2dcf0eb8ea99cbd2c66824719e15d5e94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?He=CC=84sperus?= Date: Tue, 14 Jul 2026 12:54:14 +0800 Subject: [PATCH 1/4] refactor(inspector): re-architect type inspector --- .oxlintrc.json | 2 +- package.json | 18 +- pnpm-lock.yaml | 1175 ++++++++++++++++++++--------------- src/context.ts | 2 +- src/reactive.ts | 15 +- src/type-inspector.md | 126 ++++ src/type-inspector.ts | 673 +++++++++++++++----- test/type-inspector.test.ts | 272 +++++--- 8 files changed, 1520 insertions(+), 763 deletions(-) create mode 100644 src/type-inspector.md diff --git a/.oxlintrc.json b/.oxlintrc.json index c7ca800..e49e76a 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -56,7 +56,7 @@ "snakeCase": false, "pascalCase": true }, - "ignore": "zh-Hans.ts" + "ignore": ["zh-Hans.ts"] } ], "unicorn/consistent-function-scoping": "off", diff --git a/package.json b/package.json index acc697d..46991b8 100644 --- a/package.json +++ b/package.json @@ -42,17 +42,17 @@ "lint": "oxlint --fix --silent && oxfmt", "check": "oxlint --type-check --format agent && oxfmt --check" }, + "dependencies": { + "typescript": "6.0.3" + }, "devDependencies": { - "@types/node": "^25.9.1", - "oxfmt": "^0.52.0", - "oxlint": "^1.67.0", - "oxlint-tsgolint": "^0.23.0", - "tsdown": "^0.22.1", + "@types/node": "^26.1.1", + "oxfmt": "^0.58.0", + "oxlint": "^1.73.0", + "oxlint-tsgolint": "^0.24.0", + "tsdown": "^0.22.6", "tslab": "^1.0.22", - "vitest": "^4.1.7" - }, - "peerDependencies": { - "typescript": "^6.0.3" + "vitest": "^4.1.10" }, "devEngines": { "packageManager": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a33062e..093ee68 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -208,78 +208,56 @@ importers: .: dependencies: typescript: - specifier: ^6.0.3 + specifier: 6.0.3 version: 6.0.3 devDependencies: '@types/node': - specifier: ^25.9.1 - version: 25.9.1 + specifier: ^26.1.1 + version: 26.1.1 oxfmt: - specifier: ^0.52.0 - version: 0.52.0 + specifier: ^0.58.0 + version: 0.58.0 oxlint: - specifier: ^1.67.0 - version: 1.67.0(oxlint-tsgolint@0.23.0) + specifier: ^1.73.0 + version: 1.73.0(oxlint-tsgolint@0.24.0) oxlint-tsgolint: - specifier: ^0.23.0 - version: 0.23.0 + specifier: ^0.24.0 + version: 0.24.0 tsdown: - specifier: ^0.22.1 - version: 0.22.1(typescript@6.0.3) + specifier: ^0.22.6 + version: 0.22.6(typescript@6.0.3) tslab: specifier: ^1.0.22 version: 1.0.22 vitest: - specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)) + specifier: ^4.1.10 + version: 4.1.10(@types/node@26.1.1)(vite@8.0.14(@types/node@26.1.1)) packages: - '@babel/generator@8.0.0-rc.6': - resolution: {integrity: sha512-6mIzgVK8DgEzvIapoQwhXTMnnkuE4STQmVv9H03i/tZ2ml8oev3TRvZJgTenK2Bsq0YWNtzOrFdTyNzCMFtjJQ==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-string-parser@8.0.0-rc.6': - resolution: {integrity: sha512-BCkFy+zN6kXQed3YOT7aJl93NfDSzQc3pBfsvTVPs9gU9X3V0aefEF5kwBT0E+mDWH9QgKaZstYUQN9VdQZT4g==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-validator-identifier@8.0.0-rc.6': - resolution: {integrity: sha512-nVJ+1JcCgntv8d78rRo++o2wuODT0Irknx2BF8Np4Ft2CRgjLqIs4qzSZ8b66yGbBdMWGmZBO9WEZv1hhNiSpg==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/parser@8.0.0-rc.6': - resolution: {integrity: sha512-rOS8IpdO7mQELkTPlCsTgPejO0bFuZdEDCGQJouYbYf9e1FLTym7Fei2pEjq8q7MWbX0ravcd7QQYKs1TxOuog==} - engines: {node: ^22.18.0 || >=24.11.0} - hasBin: true - - '@babel/types@8.0.0-rc.6': - resolution: {integrity: sha512-p7/ABylAYlexb31wtRdIfH9L9A0Z2T/9H6zAqzqndkY2PLkvNNc580wGhp/gGKN4Sp9sQvSkhc6Oga8/O+wTyw==} - engines: {node: ^22.18.0 || >=24.11.0} - '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -287,279 +265,279 @@ packages: '@oxc-project/types@0.132.0': resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} - '@oxc-project/types@0.133.0': - resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.139.0': + resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} - '@oxfmt/binding-android-arm-eabi@0.52.0': - resolution: {integrity: sha512-17EMSJnQ9g+upVHrAUYDMfH5lvRKQ9Nvg8WtEoH72oDr1VpWz+7/o3tD97U1EToen2YAQ/68JmtDYkQUi20dfQ==} + '@oxfmt/binding-android-arm-eabi@0.58.0': + resolution: {integrity: sha512-Uz62sHduGGPftXtILGyxdSW4PX82rUg+rfdNqhsgxe881g4rIoXlIqmZQ6HVKcF4f+F8qMhdD03Bx5u7gmeTdg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.52.0': - resolution: {integrity: sha512-A2G1IdwGEW2lLJkIxcvuirRH1CzSl/e0NX11zTlW1gvxJThfwbI/BEoaKrTNpm7M2FchvIf6guvIQU7d5iz+OQ==} + '@oxfmt/binding-android-arm64@0.58.0': + resolution: {integrity: sha512-rD0lRaJp1b+9vw6X4A2dJWKukd6X8yxiicN4JxXcXayolmUypRZxk+lKR+fVOu5q/iYc0fh5fR4bgmfOfVlbaA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.52.0': - resolution: {integrity: sha512-f9+bLvOYxy7NttCLFTvQ7afmqDOWY4wIP9xdvfj5trQ1qj6f2UFAGwZESlfsMjvJNTyRpXfIlOanCI9FOvoeQA==} + '@oxfmt/binding-darwin-arm64@0.58.0': + resolution: {integrity: sha512-uzbPPk7O6M+w2K65vcQ1woga3wgP8zghjL1KOG5b6qJ8dvYHZJ1VShaslg2KOK6yQIwCQtcMCXqLBM6sqXUNTg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.52.0': - resolution: {integrity: sha512-YSTB9sJ5nnQd/Q0ddHkgof0ZCHPAnWZT1IW2SJ8omz7CP7KluJhO1fNHrpqdxCtpztJwSs4hY1uAee35wKxxaw==} + '@oxfmt/binding-darwin-x64@0.58.0': + resolution: {integrity: sha512-L0nKYDxU32oxeQqJj21W9SlIMnf81VZEhyah6iDvFhf5q0oynq498Fopth7blErUJVBpVtxQ98RMCfMPqpJX6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.52.0': - resolution: {integrity: sha512-NIrRNTTPCs4UbmVs0bxLSCDlLCtIRMJIXklNKaXa5Oj2/K1UIMBvgE8+uPVo01Io3N9HF0+GAX+aAHjUgZS7vA==} + '@oxfmt/binding-freebsd-x64@0.58.0': + resolution: {integrity: sha512-woNwfD58dC5PGS9LSLSD5JYfo/EFK5iG9vhDWkcCg3q78ag7KC8bpDqgvPHrMoXpx83OLXxoSOhu6z8FsVTHlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.52.0': - resolution: {integrity: sha512-JXUCde8mn3GpgQouz2PXUokgy/uT1QrRJBL2s983VWcSQp62wTFYiNXgTKdeo1Jgbr0IgUnKKvzIk/YBlj/nVQ==} + '@oxfmt/binding-linux-arm-gnueabihf@0.58.0': + resolution: {integrity: sha512-Sqs8nMLxuQpY21NKJ1u4stPDmO5hskBCNNh2E3AdCfI1QqWtf4m+Qn4mGEIUO4KGmuq3SWc/SZ80uy5IiwTCDw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.52.0': - resolution: {integrity: sha512-psbUXaRZ+V8DaXz10Qf7LSHtdtdKAmC8fxXgeU608jjzrmWK4quamZMOpl6sf+dikoFHA85uE93Q0BqxrCdQrQ==} + '@oxfmt/binding-linux-arm-musleabihf@0.58.0': + resolution: {integrity: sha512-Vd4exzBI5B5hB9m22JiTQzIL23WvHo/Pe+sNXPNeBLXSP9swCBPKCEBRwKpmpQzYhlgYaCgfPcGXPKAJBRIiZQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.52.0': - resolution: {integrity: sha512-Jw7MgWUU9lcLCcy82updISP3EthTlfvAwR6gWNxPzqly7+fLvOi2gHQE9xXQjpqaVLm/8P+gOzlv9ODuoVlaaw==} + '@oxfmt/binding-linux-arm64-gnu@0.58.0': + resolution: {integrity: sha512-bUWi5mHV+4Vi56RLHE1h6q/HHfwAIT3XoB9vJAVeRzfu5NriXM8y6eeJu0vlKa0C9kq2rq1sOWRClhdLHPocrg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.52.0': - resolution: {integrity: sha512-wZg6bLjDvh2KibyI3QFUYo8GTXneIFsd0JvehtvJiUmQ8WRPERgxd/VM4ctWb86U5FT1FkqgS8/wZKVB+AZScg==} + '@oxfmt/binding-linux-arm64-musl@0.58.0': + resolution: {integrity: sha512-2ZHxemzgHcjtktAuVUwSoyXmGo/t+aF5tS1ciPpPei4rhSyrz3JOqDosXXrmhN/yLUSzJjtuW7ToTWqfQpCj2w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.52.0': - resolution: {integrity: sha512-IngE8uxhNvxcMrLjZNDo9xNLY7rEK33AKnaMd2B46he1e/mz2CfcW6If/U1wUjdRZddm1QzQaciqZkuMkdh1FA==} + '@oxfmt/binding-linux-ppc64-gnu@0.58.0': + resolution: {integrity: sha512-AwKkVwjVmFQ3bcO7j0McGYAqCKH2a326fswfofng/E8VewCT/raeeGQr4huVhY704deK8AWASSTlxzMj0eZc6Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.52.0': - resolution: {integrity: sha512-H3+DdFMv/efN3Efmhsv18jDrpiWWqKG7wsfAlQBqAt6z/E2Bx+TwEj2Nowe51CPOWB8/mFBC2dAMSgVFLvvowA==} + '@oxfmt/binding-linux-riscv64-gnu@0.58.0': + resolution: {integrity: sha512-xsRpTxfUnJF8D3AUKko/qyWdjw4GZVHlCVFuGlzSCTeewLmykKINW8em1+wx+axsDVtJJcMtvsiaXggXxrlHgw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.52.0': - resolution: {integrity: sha512-zji+1kb7lJKohSDjzC1IsS+K/cKRs1hdVf0ZH0VbdbiakmtLvN9twBoXo/k8VdjFax7kfo+DyPxS7vv52br1aw==} + '@oxfmt/binding-linux-riscv64-musl@0.58.0': + resolution: {integrity: sha512-Z4AYOTcy7nYEIiXwD62PlerimyYRcfJOgUbQAEBjXz098kxKuERBlRntofGy69HHhe9E0TLVNMl1yspVNu+efw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.52.0': - resolution: {integrity: sha512-hcLBYedpCy7ToUvvBidWk7+11Yhg1oAZ4+6hKPic/mQI6NaqXJSXMps5nFlwUuX2ewhtLZZDPg63TI042qGKBg==} + '@oxfmt/binding-linux-s390x-gnu@0.58.0': + resolution: {integrity: sha512-A3nhhtZPC/TKVWOPj9q/H3p2znJDCcHWYlJBhWL8hGq/bFmBaNBHC8Np6E581yVq1w9Mi3rMDNzDalWvtUfJtQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.52.0': - resolution: {integrity: sha512-IDO2loXK2OtTOhSPchU9MW25mWL2QCDGdJbjN8MXKZVS80qXe5gMTwQWu/gMJ3juoBHbkuUZNB2N1LHzNT7DoA==} + '@oxfmt/binding-linux-x64-gnu@0.58.0': + resolution: {integrity: sha512-2g+tVkgwqphw8R4hgo+kF4oz8+P5RwVOtr9+irsC7uwEp0e9j7Crw8kDGKL20uYlLPD7g02DqA61mC/UNYx98A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.52.0': - resolution: {integrity: sha512-mAV2Hjn0SatJ+KoAzKUC3eJhdJ8wv+3m1KyuS0dTsbF0c5weq+QrCt/DRZZM+uj/XiKzCDEUKYsBF30e2qkcyw==} + '@oxfmt/binding-linux-x64-musl@0.58.0': + resolution: {integrity: sha512-rc15P6AbyyB7426aN8AakLd02Trb3a6ML/mmfAQeVHJEfVofWLcWIrBdy6zDEY+DIaL/s8E4GGPboVw+oP3+EA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.52.0': - resolution: {integrity: sha512-vd4npaUIwChxp7XzkqmepBWTT9YMcSe/NBApVGPC30/lLyOVaV3dvma1SKo03t8O73BPRAG7EyJzGlN5cJM5hQ==} + '@oxfmt/binding-openharmony-arm64@0.58.0': + resolution: {integrity: sha512-ZWoTM27/HYPOh9iq86DAbhPu9nXb8qKvvGU/h8OfliyVUFAMMNTLDkGsWDKKnDqIkqvZ9+dXlgUOsH1LYO3O7g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.52.0': - resolution: {integrity: sha512-k2sz6gWQdMfh5HPpIS+Bw/0UEV/kaK2xuqJRrWL233sEHx9WLlsmvlPFM4HUNThkYbSN0U0vPW7LVKZWDS8hPQ==} + '@oxfmt/binding-win32-arm64-msvc@0.58.0': + resolution: {integrity: sha512-LHZnqFXe2dEfkRI4XdZS/57nEOT/I4UCRX5IyM9v4GYW9XwQCjGe1IUK59SuKw3POwvcgWQ4pme2cYXmNqTNPg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.52.0': - resolution: {integrity: sha512-rhke69GTcArodLHpjMTfNnvjTEBryDeZcUCKK/VjXDMtfTULl6QRh0ymX5/hbCUv2WjYm9h/QbW++q2vE15gWQ==} + '@oxfmt/binding-win32-ia32-msvc@0.58.0': + resolution: {integrity: sha512-mZKpg20TpheCJym1rarcZCUJeW1sSruw8zAAaCYWvuVfwIUDN1CXdrPU/JgCWReXTCTrEfCB8Wyo3hh9jSZ2EA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.52.0': - resolution: {integrity: sha512-q5xL7oeXkZdEtNZWBdvehJcmt+GRu9l2bK40yJs1jJXlqq+r0Hygb1rTjq+FM2o/2xyt4cufH6KRplHp3Jjsvw==} + '@oxfmt/binding-win32-x64-msvc@0.58.0': + resolution: {integrity: sha512-N/wUU4N5PZ2orBtI+Ko7MnMfYLfE7K91UrGMY/c/pYyHR3lA9kwst1XugkZx+92YcRh/Eo+iv2eTESSWXfiZPA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint-tsgolint/darwin-arm64@0.23.0': - resolution: {integrity: sha512-gOs9PVr2wEg4ox9z0aJo+RKhhImW86YL5N6yav8BK/rgPsIrwN/igSZ+pbRr723NFvUNKde9fgMhRA6JrXAOZw==} + '@oxlint-tsgolint/darwin-arm64@0.24.0': + resolution: {integrity: sha512-C2uMmwK5Bc4ri4ysZ6sA8Rcu+A5zBQTp6ml2u0CLLbRZp4kMFPV3yWk8B5DK9Aw7y9bbjogIm75tUwGLFzlsYQ==} cpu: [arm64] os: [darwin] - '@oxlint-tsgolint/darwin-x64@0.23.0': - resolution: {integrity: sha512-kjJ8B+7n4tB9VJdxS5A9GdJt6/bYpzbu4lXp2uO1S3sRmCB5gDEABlGoiePNApRWaW+xqL4b4xgiE727jSLhuA==} + '@oxlint-tsgolint/darwin-x64@0.24.0': + resolution: {integrity: sha512-Wgvt/1lRbDxmoNqWQKKcL+UIiqLmdJ+EWLpQa1qzoNVAfNB0PJpa82/8dH1twT/3rSs4zrP5TXPWl4juB71WuQ==} cpu: [x64] os: [darwin] - '@oxlint-tsgolint/linux-arm64@0.23.0': - resolution: {integrity: sha512-6dCZuKNu135seMXilkRk9SpCx6i1XgmiipYGalLij5WVRX6ZYS8c4xI7preN/zv9fCXhsQclTIMDu2Y/cytTjw==} + '@oxlint-tsgolint/linux-arm64@0.24.0': + resolution: {integrity: sha512-PB1rxII7KV83+ASY4sSkXtqvpij6ME66+QCRL49uksi/ofs2Rf/UVboYr095n0Rkbl2wgvlsHGl6DHC361jQUQ==} cpu: [arm64] os: [linux] - '@oxlint-tsgolint/linux-x64@0.23.0': - resolution: {integrity: sha512-3bdilnyA7kmSTjK27rvjIjSxL5SIg3wt7vwNiRkouWB83ytssyKnuGvxSYJxgMEmFpSutzaBzcCUM2jDtPGcgA==} + '@oxlint-tsgolint/linux-x64@0.24.0': + resolution: {integrity: sha512-xcz3CxKmjTQLREtE/UShh+ruWmm9nAb7UM9zKcD65BStiuYgOakAKkPHl4YS5DztpVcDrE0+HqbOolTlRKYWmw==} cpu: [x64] os: [linux] - '@oxlint-tsgolint/win32-arm64@0.23.0': - resolution: {integrity: sha512-j+OEp44SVYiQ+ZD+uttsX7u6L9SvmbbQ77SO1pSFCcJlsVMeCk8qZsjhKfGKuT/jIA+ipOJMVs/+pqUfObBWNw==} + '@oxlint-tsgolint/win32-arm64@0.24.0': + resolution: {integrity: sha512-A2i6ZGBec3i20S7RaxkgHc6r3HYtD5Mn7j/mb22NkTz14u0JuudvTu6JggAnbGMcv8+dBKQI//EasxSPJLD8pw==} cpu: [arm64] os: [win32] - '@oxlint-tsgolint/win32-x64@0.23.0': - resolution: {integrity: sha512-5MyjFuqf+g8OUPJBSGWHJtmoWnzFJYyOg4To9WMQshZYEWig/vtu7JtJ03VWnzHv9LJkAUeApY0gVCOywFR/iQ==} + '@oxlint-tsgolint/win32-x64@0.24.0': + resolution: {integrity: sha512-0ZbGd9qRB6zs82moekaKdEvncRANq49EAwfNX62JpTS46feXUhKAuoyVDvZMj6Rywejylrmmu79Wo6faYCo4Ew==} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.67.0': - resolution: {integrity: sha512-VrSi571rDv1N8HaEDM+DEX8nmT0y9jJo8tzzW13vsOWTx59xQczCIJx68n2zWOXRT5YKZsOZXp4qkHN/10x4mw==} + '@oxlint/binding-android-arm-eabi@1.73.0': + resolution: {integrity: sha512-HZQRN/UMBu+Ut+/9MiAChkbP4qZqrNOWBcNI45vOT40GVhbGR0JgHB87L48D4iAqFQIdVmeQYtV9RF89AjTKkg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.67.0': - resolution: {integrity: sha512-l6+NdYxMoRohix5r5bbigW16LPicceCwGcQ6LKKuE1kUdjgFfQolJjrJsQYPFetIs78Gxj/G/f5TEGoTCwj9nQ==} + '@oxlint/binding-android-arm64@1.73.0': + resolution: {integrity: sha512-Gp+KJRylv2aW7thRpG5p1KTxZq4ZJFbWowrKzufNq9d3ssl3r3JviYV45/+p+7CN1Nv0zDd1e8Ex0b/HUDq4TQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.67.0': - resolution: {integrity: sha512-jOzXxS1AxFxhImLIRbtGIMrEwaXcgMw3gR57WB1cRk8ai+vpr6726kxXqVvlNsrXtJ/FrmOm8RxlC0m8SW24Qg==} + '@oxlint/binding-darwin-arm64@1.73.0': + resolution: {integrity: sha512-3de96NdtXhxERMjIz7wsp2HYMY6pMQycGxFWac2mFecAx6VeARF/IqFb1QIaqiCRIdfzBwzTed+pCTCoiS+CYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.67.0': - resolution: {integrity: sha512-3DFAVY94OqjIZHXIPz37yGRSWwOFTAqChQ64/M69GYLawzP0KiwdhDNfqdKKYT0bTR/DNxmMnQsj3ns+8+X/Lg==} + '@oxlint/binding-darwin-x64@1.73.0': + resolution: {integrity: sha512-5zx/uPW32TiaOeVY1dQ/H5iOf0K1HOdFKOJhLqGl4o63+i1fpzoqqu/mKtd7OFgFjNCdhlyTGgjVkQTZm1ELcg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.67.0': - resolution: {integrity: sha512-e4dDKZuLu8TR9DEBssWSDahlPgZBwojTTHZUvnjBRJfJJbpxYCjfjKfi0Z1+CSLMiJBwI2yCDtRM1XJQaARjmg==} + '@oxlint/binding-freebsd-x64@1.73.0': + resolution: {integrity: sha512-qNe4gKHaGnLuZJ8toUg90JAa0S2vTVvDw+0bRi3q1avXZXDT4u5mMeECf3nD4HYrbdn1O7dXqWut4onY/yx/Xg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.67.0': - resolution: {integrity: sha512-BKytFdcQzbITV3xlnzDUDTEDtbUMCCiC4EaNTDZ4FyT8gdNvBC4gfiLucXp/sQl0XU3p7syTlorUWVVVBZab2g==} + '@oxlint/binding-linux-arm-gnueabihf@1.73.0': + resolution: {integrity: sha512-cCehYh5hTbfShm/fxTD6wwrGUWIpvX+N5OxmAMhFhDeTGXvw+BeNj889tpxsFQ9ZLatQ6wImuY8tsKLZ+FMz7w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.67.0': - resolution: {integrity: sha512-XYAv0esBDX7BpTzRDjVX2Vdj+zndd8ll2dFQiaeQ6zTZr7A8GRDTN7fH3FP3jU+O0vCDx85oH/EtG7BzPgAXuw==} + '@oxlint/binding-linux-arm-musleabihf@1.73.0': + resolution: {integrity: sha512-d5j5GDU/2dMgjVhw7TQT9ITrsIr1Y02KEXKyVGIXUkD+KiaxE9TP65FS2ZdgTBemQvoRL+gSBdbrIm3cQIeacg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.67.0': - resolution: {integrity: sha512-zizRMjA0i6u/2B0evgda04iycu+MoNuf1pBy6Eh+1CjC5wMEG7qN5zdDKTCvFc0KSYSDM9QTG3gjZHirgtQuKg==} + '@oxlint/binding-linux-arm64-gnu@1.73.0': + resolution: {integrity: sha512-Eyf1SrP3+yR1DI3OJgOY2Pvrr9dWP9TK37xPaDYycwTtlGlI45erJAVIfH5/m/xosDt6BupJYEFi47bvbTuuyw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.67.0': - resolution: {integrity: sha512-zB/Tf6sUjmmvvbva9Gj3JTJ8rJ9t4I8/U0o6vSRtd0DRIsIuyegBwJAzhSUFQHdMijIRJkW0exs/yBhpw2S20w==} + '@oxlint/binding-linux-arm64-musl@1.73.0': + resolution: {integrity: sha512-IlT/OJApEDKaMmCooHuncgJZbbCe7T5QIWmTZBEtYscWvzPQuuEinVcid6kwQRVQOUdb7PUCz4jQHnaYXdfJXw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.67.0': - resolution: {integrity: sha512-kgU40Gt74CK0TCsF51KZymkIwN9U0BajKsMijB52zPqOeZU9NAHkA/NSQkZDHEaCakx42DxhXkODiAqf2b4Gug==} + '@oxlint/binding-linux-ppc64-gnu@1.73.0': + resolution: {integrity: sha512-L+JYcb/vdg5fmcH08V6o0YYLU28cTH1SPNulwJdvK9NK49aXSkYy6oNpKBmddArVOXYqNepriDGiZ04G54kh1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.67.0': - resolution: {integrity: sha512-tOYhkk/iaG9aD3FvGpBFd1Lrw0x0RaVoJBxjUkfNzS50rC5NS5BteNCwgr8A2zCdADrIIoze6D7u6U5Ic++/iQ==} + '@oxlint/binding-linux-riscv64-gnu@1.73.0': + resolution: {integrity: sha512-Qtk0g3bKV6OwWjIm7R8kQN1uOZRKQt/MODK2a8QfkwhTpXBD53ozx5XLVWLGDQAVyp2otLW4D2wB98XfAfMPGA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.67.0': - resolution: {integrity: sha512-sEtywrPb+0b+tHYl1SDCrw903fiC4eyKoNqzP3v+f2JT3Xcv4NEYG+P8rj+eEnX7IWhqV/xj8/JmcmVj21CXaA==} + '@oxlint/binding-linux-riscv64-musl@1.73.0': + resolution: {integrity: sha512-wX0NQKZVxltkAOVmzFcpOaMpdaUvsq1Eqpx9tkAfl71UdkTlSo1R4AdAnGccR1Fm2+TzFgZ22CyyGuZ41RDr/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.67.0': - resolution: {integrity: sha512-BvR8Moa0zCLxroOx4vZaZN9nUfwAUpSTwjZdxZyKy4bv3PrzrXrxKR/ZQ0L9wNSvlPhnMJeZfa3q5w6ZCTuN6Q==} + '@oxlint/binding-linux-s390x-gnu@1.73.0': + resolution: {integrity: sha512-vPe7UGBMWyiLTtnqS4xxgMQFSFGmtQwhwCxuiw6lXygaO6bVt0D8dFVg8Xv05eaiN3ybC0HXXHUAohFMFvqoCQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.67.0': - resolution: {integrity: sha512-mm2cxM6fksOpq6l0uFws8BUGKAR4dNa/cZCn37Npq7PFbhD5HDJqWfnoIvTaeRKMy5XdS2tO0MA0qbHDrnXAAA==} + '@oxlint/binding-linux-x64-gnu@1.73.0': + resolution: {integrity: sha512-2CwIWr9cemFC/CbRBWZvuk5mffz6ObmfFkfcC/9rTQ7f+icNhYr2kOjf9Rt8lLvugvkdGDOmkoVoFFHh6ClCTw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.67.0': - resolution: {integrity: sha512-WmbMuLapKyDlobMkXAaAL0Y+Uczh4LETfIfQsUpbId4Ip8Ai82/jqeYTOoUCkuuhBFapgqP253+d83tLKOksJg==} + '@oxlint/binding-linux-x64-musl@1.73.0': + resolution: {integrity: sha512-nDadfJgg7NBBxG0N560wOe7LLX5QiYp6qBaI7viuk5EUORFBktU/NfV0MbTqU3gTqQDCh4VyxKdo5VADxk9w8Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.67.0': - resolution: {integrity: sha512-9g/PqxYJelzzTAOR5Y+RiRqdeydhEuXv2KxNeFcAKQ7UsvnWSY1OP4MsuPMbTO2Pf70tz7mFhl1j13H3fyh+8g==} + '@oxlint/binding-openharmony-arm64@1.73.0': + resolution: {integrity: sha512-wGjJC+NLH9xP+IKGn9RDW94ojJR/wPbg5WCnQjj/oReaOtCQthr8ws1zICe77JFmo4ouUdeTHHZL/ESGiF6Pmw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.67.0': - resolution: {integrity: sha512-2VhwE6Gatb0vJGnN0TBuQMbKCOiZlSQ/zJvVWYLK4a9d4iDiJOen/yVQkGpmsJ90MuH66fzi0kEKI0jRQMDxGA==} + '@oxlint/binding-win32-arm64-msvc@1.73.0': + resolution: {integrity: sha512-I7X47GPGljw225YUQ5SbC/rb1Kkdrd0yQf0x+hYxeKS6DpfjMbo9ccQPQ6LNY6BoJQ1sHhgDUGuMn5Vg5gHT6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.67.0': - resolution: {integrity: sha512-EQ3VExXfeM1InbE5+JjufhZZTWy+kHUwgt3yZR7gQ47Je/mE0WspQPan0OJznh493L5anM210YNJtH1PXjTSFg==} + '@oxlint/binding-win32-ia32-msvc@1.73.0': + resolution: {integrity: sha512-5lWj+3h+74Fm1jYOO9qkJA4xkAlZA099DkXppuXsk7UpnpZLttsefrZU469vChGaG6hcSqrkKXQOvMTZtbjeNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.67.0': - resolution: {integrity: sha512-bw24y+/1MHS4QDkons3YyHkPT9uCMoLHHgQhb+mb8NOjTYwub1CZ+K9Ngr8aO5DMrDrkqHwTzlTwFP2vS8Y/ZQ==} + '@oxlint/binding-win32-x64-msvc@1.73.0': + resolution: {integrity: sha512-WaNRvh4f6zY9CvUQk2YoA1O90ieWrIklI84+HXFr9Isjz9CSESrdqo/RtIYt4Dll/cAchqGDMehfaZd0vqEFZw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -573,8 +551,8 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.0.3': - resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + '@rolldown/binding-android-arm64@1.1.5': + resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -585,8 +563,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.3': - resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + '@rolldown/binding-darwin-arm64@1.1.5': + resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -597,8 +575,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.3': - resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + '@rolldown/binding-darwin-x64@1.1.5': + resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -609,8 +587,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.3': - resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + '@rolldown/binding-freebsd-x64@1.1.5': + resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -621,8 +599,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': - resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -634,8 +612,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.0.3': - resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + '@rolldown/binding-linux-arm64-gnu@1.1.5': + resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -648,8 +626,8 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.0.3': - resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + '@rolldown/binding-linux-arm64-musl@1.1.5': + resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -662,8 +640,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-ppc64-gnu@1.0.3': - resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] @@ -676,8 +654,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.3': - resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + '@rolldown/binding-linux-s390x-gnu@1.1.5': + resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] @@ -690,8 +668,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.3': - resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + '@rolldown/binding-linux-x64-gnu@1.1.5': + resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -704,8 +682,8 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-musl@1.0.3': - resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + '@rolldown/binding-linux-x64-musl@1.1.5': + resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -717,8 +695,8 @@ packages: cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.0.3': - resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + '@rolldown/binding-openharmony-arm64@1.1.5': + resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -728,8 +706,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.3': - resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + '@rolldown/binding-wasm32-wasi@1.1.5': + resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] @@ -739,8 +717,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.3': - resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + '@rolldown/binding-win32-arm64-msvc@1.1.5': + resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -751,8 +729,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.3': - resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + '@rolldown/binding-win32-x64-msvc@1.1.5': + resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -791,8 +769,8 @@ packages: engines: {node: '>=12.20'} hasBin: true - '@tybys/wasm-util@0.10.2': - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -806,23 +784,20 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/jsesc@2.5.1': - resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} - '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@25.9.1': - resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + '@types/node@26.1.1': + resolution: {integrity: sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==} '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} - '@vitest/expect@4.1.7': - resolution: {integrity: sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==} + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} - '@vitest/mocker@4.1.7': - resolution: {integrity: sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==} + '@vitest/mocker@4.1.10': + resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -832,41 +807,159 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.7': - resolution: {integrity: sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==} + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} + + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} + + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} + + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} - '@vitest/runner@4.1.7': - resolution: {integrity: sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==} + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} - '@vitest/snapshot@4.1.7': - resolution: {integrity: sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==} + '@yuku-codegen/binding-darwin-arm64@0.6.1': + resolution: {integrity: sha512-LDJtpOKtcv9f3V0eDUwFmmy47t2VC+DAuN+gq80R1IA+fa0d408i6sHsVtt6n+g5rf8f86ySoPSAe94lHt6Ixw==} + cpu: [arm64] + os: [darwin] - '@vitest/spy@4.1.7': - resolution: {integrity: sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==} + '@yuku-codegen/binding-darwin-x64@0.6.1': + resolution: {integrity: sha512-fBwpBOh33W7N87F94SVNExwm2KUV3ROhk51okr3Oy2ost1/JJuBWINVjcgwd2WPKZEFzUXgCzj/03UR/G+WIrQ==} + cpu: [x64] + os: [darwin] - '@vitest/utils@4.1.7': - resolution: {integrity: sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==} + '@yuku-codegen/binding-freebsd-x64@0.6.1': + resolution: {integrity: sha512-UpMkskQV3a5oPnJV+GFFupIqnLwSBD4ZsZAVUZuNVkrqct433FHKqTwuG+P5JhHZbmhf+++3Ie/V2sgduyXrAQ==} + cpu: [x64] + os: [freebsd] + + '@yuku-codegen/binding-linux-arm-gnu@0.6.1': + resolution: {integrity: sha512-HICjDelfEDeD6TD8OEz/Dvt8KHxJiETR+paI/Fr7eVTQbjMfRrXJz8O1qV1qGH5SHZUGl2SAw2Rp+MLtXOjCrQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-arm-musl@0.6.1': + resolution: {integrity: sha512-pUswnwa+WOmtH2ZGOWL05kFLMNY7/TnEAryfIv1yVFzKQnmSy9TKYi3oIOxGZL3w+cdUKCZ6Q+jaD0oI10ztzA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@yuku-codegen/binding-linux-arm64-gnu@0.6.1': + resolution: {integrity: sha512-Zro0FOu9clLCmqCnUKzEWHAu30tss0iEfhs+KDXm9Dpm1FkIHAKu43tF6FQU2hsTA7a8xd93NGddzc2EOJFKUg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-arm64-musl@0.6.1': + resolution: {integrity: sha512-NZaT+mp9toqWuFEA4MYW5HMRxgIa8DCqnTTnM5SrrojZgm4QoMI/mJfifVet1ZHgl/Dly5m6H6GPpq43uXVj8g==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@yuku-codegen/binding-linux-x64-gnu@0.6.1': + resolution: {integrity: sha512-M5macseSCBPvJ4yfKNyQpMc7nBQBtj39MNfMt0r+8UkTnR5qJE00JJx06puHgPxT5hnGxMAuAWZ+3a9H2ngqAw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-x64-musl@0.6.1': + resolution: {integrity: sha512-liAyBZI5AbazZGeeNfWj0jCD/TE2L84hgVYh4KkjJA/N9bNzFQCDf4BvWP76nEO89r2tIGEUjbXdM4mM26riHg==} + cpu: [x64] + os: [linux] + libc: [musl] - ansis@4.3.0: - resolution: {integrity: sha512-44mvgtPvohuU/70DdY5Oz2AIrLJ9k6/5x4KmoSvPwO+5Moijo0+N9D0fKbbYZQWP1hNm5CpOf+E01jhxG/r8xg==} + '@yuku-codegen/binding-win32-arm64@0.6.1': + resolution: {integrity: sha512-qItzfH3x6MYChPeGfvh22rHD92WLgXQRSuwvspRVSnLvpnubEfZd+9REPRQVT2l9fIuETDCEkDNRqkDROQTkgA==} + cpu: [arm64] + os: [win32] + + '@yuku-codegen/binding-win32-x64@0.6.1': + resolution: {integrity: sha512-DFFkKROZ9ZAHmFMUFRtRTkosZds1KH8BOx5t3UpNULIjT3iuUmEx9V5pWR0xOi66sANY38Ap77nz1kOZraQxEg==} + cpu: [x64] + os: [win32] + + '@yuku-parser/binding-darwin-arm64@0.6.1': + resolution: {integrity: sha512-jORysyRZg5zGDgVw15LGMsjZDh7jwjpUIJRBHgFt0ir15O5pEazfvuF2dnwvrJiTF0IT1EgHAVbTAYJWwQLCjg==} + cpu: [arm64] + os: [darwin] + + '@yuku-parser/binding-darwin-x64@0.6.1': + resolution: {integrity: sha512-dTeYFkkFlbP/WCB2DtezXas3NApOPtFlXSdssB7wGtY9wpNp4HAkVo1KBwI5mcHK0e2joyUcqTSf44mFE+q7vg==} + cpu: [x64] + os: [darwin] + + '@yuku-parser/binding-freebsd-x64@0.6.1': + resolution: {integrity: sha512-GExDp3rebo28mt3EAjvKQs0ZC3gkznAErV0I9TUNDa9muuhvD35kft61Mpsc6+NWeE+BG+kUyKbm6iO5B6ZMMA==} + cpu: [x64] + os: [freebsd] + + '@yuku-parser/binding-linux-arm-gnu@0.6.1': + resolution: {integrity: sha512-a9MjABj4J0VE3Z2oROGhmeddZZrhwwrnl4ZWZOuHUhD/smDtDiNtr0LpCbKB7rEYaQ29snopOPdZ/0T3YgLglQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-arm-musl@0.6.1': + resolution: {integrity: sha512-ctuvXJgDRKKlmJfHxT4RsTvcAcHEFNJHTCsGbtt4rluQpVDc+ezk9JvQ534ehoIfZ9T0eIHSBgqYAZ4xCatNmQ==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-linux-arm64-gnu@0.6.1': + resolution: {integrity: sha512-vRtyoTtT0Ltowuh9LWOl/ZNU9h79J89ilOz5SEGspcw0jfhoUt19i07VNitll4jjfg5p2EN00q+MqX0pAobrFw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-arm64-musl@0.6.1': + resolution: {integrity: sha512-vCsc3GOe1ylmRyfo/WLjIhjiCmaTtJbWNF4ZtgjNegDjpsRsFuCcP9duXB41QcfnJK38repKVFqFh0LR3l48FA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-linux-x64-gnu@0.6.1': + resolution: {integrity: sha512-gw3d81RdUHSYwjDW2IG6gEtm4VDoPP4ZOqpuC6Nc8+UBfos+4gTWOgzmuxIOVhkSV2fJCcUDpSJIlPzEU0FLZw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-x64-musl@0.6.1': + resolution: {integrity: sha512-nzU+Doq9UgZvYYvald36lZJ2Neeyheije6WE/YpoFt/oJiNmnjArRgr2CMtb/7gWBl80YSMwcHK4Ju0E+7wfWg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-win32-arm64@0.6.1': + resolution: {integrity: sha512-r3tXFVDliWCPe7TL6DVxUkT4rkqnXyeFVSEDf+V9My6Gztq99/gIe3POQqFbshTRuSrpEYMGMbGxeFh+m+stxA==} + cpu: [arm64] + os: [win32] + + '@yuku-parser/binding-win32-x64@0.6.1': + resolution: {integrity: sha512-FqYMOqeCS2XTdn5yvaKlOhtSQ84mVO3aTXp6LGfMd9Zq8RsV4H8qLWv+sxJsgPCXfuBV64u8/f+CTr3uIwNLWA==} + cpu: [x64] + os: [win32] + + '@yuku-toolchain/types@0.5.43': + resolution: {integrity: sha512-kSpvPntnXw5+lYjO71ffBEnQ5ycQ74KGIYknh0TS4xeyCuBkOqxyJumxZkMhLBBUCLjDAbx2+Icnr3Zh4ftjpQ==} + + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-kit@3.0.0-beta.1: - resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} - engines: {node: '>=20.19.0'} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - birpc@4.0.0: - resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} - - brace-expansion@1.1.15: - resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} + brace-expansion@1.1.16: + resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} @@ -925,8 +1018,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@2.1.0: - resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} estree-walker@1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} @@ -934,8 +1027,8 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} fdir@6.5.0: @@ -994,11 +1087,6 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -1082,23 +1170,24 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - nanoid@3.3.12: - resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - node-addon-api@8.8.0: - resolution: {integrity: sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA==} + node-addon-api@8.9.0: + resolution: {integrity: sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==} engines: {node: ^18 || ^20 || >= 21} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.1.3: + resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + engines: {node: '>=12.20.0'} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - oxfmt@0.52.0: - resolution: {integrity: sha512-nJlYM35F64zTDMecCNhoHNkf+D/eHv7xcjj9XDSj+bFAVtN93m7v8DQMdHd6nDG6Akf/kEYYHmDUBs2Dz27Sug==} + oxfmt@0.58.0: + resolution: {integrity: sha512-8feG/7NVEHDVwc1OUpP6Pks+TnaDFUw2jLLFIMi5bcmmwxAX2wBQvjSzj62RRTYBf2Op1Wt8xbkmagmPTR5ETg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1110,16 +1199,16 @@ packages: vite-plus: optional: true - oxlint-tsgolint@0.23.0: - resolution: {integrity: sha512-3mBv3CoPbh8dFbzfDGIWa2ytZjn2v+3EX4aKRXjIhsoGFzG8GCjfRirz3rwZf1wYbZzsNLTSgpw8VjQuWdp/jA==} + oxlint-tsgolint@0.24.0: + resolution: {integrity: sha512-giCk5sEvG02d5tzPmFMX3hem8ndzEEu1xvGYS5OwNfO2WGl6ZVxt5LjE0yiMDoz94INI7XkXwgFAQiydPvVHDw==} hasBin: true - oxlint@1.67.0: - resolution: {integrity: sha512-blwwaHPdoH8piQ5/z0KHeoHFR7FZgl12WluKJfu4qFLPkZl6mK04PkLE45Fw1NxfBRSlh40Gu7MkxHUw++ociQ==} + oxlint@1.73.0: + resolution: {integrity: sha512-u91G9TJzU6yqKWNZUYprQB07W7YvntZXaRxQ6CkoytepYhLWUXWsr1M8zUJ34VatNPuUAr3Z8GH+O2A331CluQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=0.22.1' + oxlint-tsgolint: '>=0.24.0' vite-plus: '*' peerDependenciesMeta: oxlint-tsgolint: @@ -1144,12 +1233,12 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} - postcss@8.5.15: - resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + postcss@8.5.18: + resolution: {integrity: sha512-xdB1oSLHbz1vRWgCDalrCqEFTWzFlhqFC5tIHLMOSUIjhm3XXQ1qrFy8S/ESr1JYRRXqM3c1QFiMZUJdUTqyMQ==} engines: {node: ^10 || ^12 || >=14} quansync@1.0.0: @@ -1163,15 +1252,15 @@ packages: engines: {node: '>= 0.4'} hasBin: true - rolldown-plugin-dts@0.25.2: - resolution: {integrity: sha512-nMhN/R+vmR8GM45ZW1FWMSjRTSDDn/6w4GTf8RNrEFCBdl8B1kySWrU1ixPtbwzXoRlcO+R/S88VgXuJQwfdDg==} - engines: {node: ^22.18.0 || >=24.0.0} + rolldown-plugin-dts@0.27.8: + resolution: {integrity: sha512-IjBTFpkrYYJPRUmIjUJFsZdR1zeHskFcEwFDzSfFDoC2pZcSNgLrBUcDFY9K0Q+A1TZJR3q9MlVomxMDP8AuLQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: '@ts-macro/tsc': ^0.3.6 '@typescript/native-preview': '>=7.0.0-dev.20260325.1' rolldown: ^1.0.0 - typescript: ^5.0.0 || ^6.0.0 - vue-tsc: ~3.2.0 + typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 + vue-tsc: ~3.2.0 || ~3.3.0 peerDependenciesMeta: '@ts-macro/tsc': optional: true @@ -1187,8 +1276,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.0.3: - resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + rolldown@1.1.5: + resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -1197,8 +1286,8 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - semver@7.8.1: - resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -1216,8 +1305,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@4.1.0: - resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -1246,18 +1335,18 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - tsdown@0.22.1: - resolution: {integrity: sha512-Ldx1jLyDFEzsN/fMBi2TBVaZe4fuEJhIiHjQhX0pV7oa5uYz5Imdivs5mNzEXOrMEtFRR6C9BQ2YqLoroffB+Q==} - engines: {node: ^22.18.0 || >=24.0.0} + tsdown@0.22.6: + resolution: {integrity: sha512-RIsCLvtGAV+41juswItHrHaEbgcXr9sL6DI55ZrzP1nxeak5qC9/q/LaWZR0PG0drxro13qxJwvFK2GaiFrT5w==} + engines: {node: ^22.18.0 || >=24.11.0} hasBin: true peerDependencies: '@arethetypeswrong/core': ^0.18.1 - '@tsdown/css': 0.22.1 - '@tsdown/exe': 0.22.1 + '@tsdown/css': 0.22.6 + '@tsdown/exe': 0.22.6 '@vitejs/devtools': '*' publint: ^0.3.8 tsx: '*' - typescript: ^5.0.0 || ^6.0.0 + typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 unplugin-unused: ^0.5.0 unrun: '*' peerDependenciesMeta: @@ -1298,8 +1387,8 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@7.24.6: - resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} vite@8.0.14: resolution: {integrity: sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==} @@ -1344,20 +1433,20 @@ packages: yaml: optional: true - vitest@4.1.7: - resolution: {integrity: sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==} + vitest@4.1.10: + resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.7 - '@vitest/browser-preview': 4.1.7 - '@vitest/browser-webdriverio': 4.1.7 - '@vitest/coverage-istanbul': 4.1.7 - '@vitest/coverage-v8': 4.1.7 - '@vitest/ui': 4.1.7 + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-preview': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + '@vitest/coverage-istanbul': 4.1.10 + '@vitest/coverage-v8': 4.1.10 + '@vitest/ui': 4.1.10 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1393,41 +1482,39 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + yuku-ast@0.1.7: + resolution: {integrity: sha512-2RiMEWv500TixY5rJy6OZd4fSy9WYZKWh6gGbIJ7y7vAGcuCugWOWwOLGaQcRZrXcPUfqtLtvpaJ3SdXtWlhKA==} + + yuku-codegen@0.6.1: + resolution: {integrity: sha512-6RJqqON2xYhMEp/sZv5oOSI3uOpWwRwzAi2fc/rMcRFjcqedAC5Fyp4AD9Vn2b8SB7hf9ESqVW+YwbDs/KvyKA==} + + yuku-parser@0.6.1: + resolution: {integrity: sha512-dPE3/+H2VBw9LhjoIVeW/axKidYGd+XzNtrwGGseZ0325cQFl0Dpwyh0R74XWe/WqQn4M8CR5YApsv2KF2zN1A==} + zeromq@6.5.0: resolution: {integrity: sha512-vWOrt19lvcXTxu5tiHXfEGQuldSlU+qZn2TT+4EbRQzaciWGwNZ99QQTolQOmcwVgZLodv+1QfC6UZs2PX/6pQ==} engines: {node: '>= 12'} snapshots: - '@babel/generator@8.0.0-rc.6': - dependencies: - '@babel/parser': 8.0.0-rc.6 - '@babel/types': 8.0.0-rc.6 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@types/jsesc': 2.5.1 - jsesc: 3.1.0 - - '@babel/helper-string-parser@8.0.0-rc.6': {} - - '@babel/helper-validator-identifier@8.0.0-rc.6': {} - - '@babel/parser@8.0.0-rc.6': + '@emnapi/core@1.10.0': dependencies: - '@babel/types': 8.0.0-rc.6 + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true - '@babel/types@8.0.0-rc.6': + '@emnapi/core@1.11.1': dependencies: - '@babel/helper-string-parser': 8.0.0-rc.6 - '@babel/helper-validator-identifier': 8.0.0-rc.6 + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true - '@emnapi/core@1.10.0': + '@emnapi/runtime@1.10.0': dependencies: - '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.10.0': + '@emnapi/runtime@1.11.1': dependencies: tslib: 2.8.1 optional: true @@ -1437,161 +1524,161 @@ snapshots: tslib: 2.8.1 optional: true - '@jridgewell/gen-mapping@0.3.13': + '@emnapi/wasi-threads@1.2.2': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} + tslib: 2.8.1 + optional: true '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 optional: true '@oxc-project/types@0.132.0': {} - '@oxc-project/types@0.133.0': {} + '@oxc-project/types@0.139.0': {} - '@oxfmt/binding-android-arm-eabi@0.52.0': + '@oxfmt/binding-android-arm-eabi@0.58.0': optional: true - '@oxfmt/binding-android-arm64@0.52.0': + '@oxfmt/binding-android-arm64@0.58.0': optional: true - '@oxfmt/binding-darwin-arm64@0.52.0': + '@oxfmt/binding-darwin-arm64@0.58.0': optional: true - '@oxfmt/binding-darwin-x64@0.52.0': + '@oxfmt/binding-darwin-x64@0.58.0': optional: true - '@oxfmt/binding-freebsd-x64@0.52.0': + '@oxfmt/binding-freebsd-x64@0.58.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.52.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.58.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.52.0': + '@oxfmt/binding-linux-arm-musleabihf@0.58.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.52.0': + '@oxfmt/binding-linux-arm64-gnu@0.58.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.52.0': + '@oxfmt/binding-linux-arm64-musl@0.58.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.52.0': + '@oxfmt/binding-linux-ppc64-gnu@0.58.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.52.0': + '@oxfmt/binding-linux-riscv64-gnu@0.58.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.52.0': + '@oxfmt/binding-linux-riscv64-musl@0.58.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.52.0': + '@oxfmt/binding-linux-s390x-gnu@0.58.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.52.0': + '@oxfmt/binding-linux-x64-gnu@0.58.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.52.0': + '@oxfmt/binding-linux-x64-musl@0.58.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.52.0': + '@oxfmt/binding-openharmony-arm64@0.58.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.52.0': + '@oxfmt/binding-win32-arm64-msvc@0.58.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.52.0': + '@oxfmt/binding-win32-ia32-msvc@0.58.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.52.0': + '@oxfmt/binding-win32-x64-msvc@0.58.0': optional: true - '@oxlint-tsgolint/darwin-arm64@0.23.0': + '@oxlint-tsgolint/darwin-arm64@0.24.0': optional: true - '@oxlint-tsgolint/darwin-x64@0.23.0': + '@oxlint-tsgolint/darwin-x64@0.24.0': optional: true - '@oxlint-tsgolint/linux-arm64@0.23.0': + '@oxlint-tsgolint/linux-arm64@0.24.0': optional: true - '@oxlint-tsgolint/linux-x64@0.23.0': + '@oxlint-tsgolint/linux-x64@0.24.0': optional: true - '@oxlint-tsgolint/win32-arm64@0.23.0': + '@oxlint-tsgolint/win32-arm64@0.24.0': optional: true - '@oxlint-tsgolint/win32-x64@0.23.0': + '@oxlint-tsgolint/win32-x64@0.24.0': optional: true - '@oxlint/binding-android-arm-eabi@1.67.0': + '@oxlint/binding-android-arm-eabi@1.73.0': optional: true - '@oxlint/binding-android-arm64@1.67.0': + '@oxlint/binding-android-arm64@1.73.0': optional: true - '@oxlint/binding-darwin-arm64@1.67.0': + '@oxlint/binding-darwin-arm64@1.73.0': optional: true - '@oxlint/binding-darwin-x64@1.67.0': + '@oxlint/binding-darwin-x64@1.73.0': optional: true - '@oxlint/binding-freebsd-x64@1.67.0': + '@oxlint/binding-freebsd-x64@1.73.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.67.0': + '@oxlint/binding-linux-arm-gnueabihf@1.73.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.67.0': + '@oxlint/binding-linux-arm-musleabihf@1.73.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.67.0': + '@oxlint/binding-linux-arm64-gnu@1.73.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.67.0': + '@oxlint/binding-linux-arm64-musl@1.73.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.67.0': + '@oxlint/binding-linux-ppc64-gnu@1.73.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.67.0': + '@oxlint/binding-linux-riscv64-gnu@1.73.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.67.0': + '@oxlint/binding-linux-riscv64-musl@1.73.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.67.0': + '@oxlint/binding-linux-s390x-gnu@1.73.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.67.0': + '@oxlint/binding-linux-x64-gnu@1.73.0': optional: true - '@oxlint/binding-linux-x64-musl@1.67.0': + '@oxlint/binding-linux-x64-musl@1.73.0': optional: true - '@oxlint/binding-openharmony-arm64@1.67.0': + '@oxlint/binding-openharmony-arm64@1.73.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.67.0': + '@oxlint/binding-win32-arm64-msvc@1.73.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.67.0': + '@oxlint/binding-win32-ia32-msvc@1.73.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.67.0': + '@oxlint/binding-win32-x64-msvc@1.73.0': optional: true '@quansync/fs@1.0.0': @@ -1601,99 +1688,99 @@ snapshots: '@rolldown/binding-android-arm64@1.0.2': optional: true - '@rolldown/binding-android-arm64@1.0.3': + '@rolldown/binding-android-arm64@1.1.5': optional: true '@rolldown/binding-darwin-arm64@1.0.2': optional: true - '@rolldown/binding-darwin-arm64@1.0.3': + '@rolldown/binding-darwin-arm64@1.1.5': optional: true '@rolldown/binding-darwin-x64@1.0.2': optional: true - '@rolldown/binding-darwin-x64@1.0.3': + '@rolldown/binding-darwin-x64@1.1.5': optional: true '@rolldown/binding-freebsd-x64@1.0.2': optional: true - '@rolldown/binding-freebsd-x64@1.0.3': + '@rolldown/binding-freebsd-x64@1.1.5': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.2': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.2': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.3': + '@rolldown/binding-linux-arm64-gnu@1.1.5': optional: true '@rolldown/binding-linux-arm64-musl@1.0.2': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.3': + '@rolldown/binding-linux-arm64-musl@1.1.5': optional: true '@rolldown/binding-linux-ppc64-gnu@1.0.2': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.3': + '@rolldown/binding-linux-ppc64-gnu@1.1.5': optional: true '@rolldown/binding-linux-s390x-gnu@1.0.2': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.3': + '@rolldown/binding-linux-s390x-gnu@1.1.5': optional: true '@rolldown/binding-linux-x64-gnu@1.0.2': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.3': + '@rolldown/binding-linux-x64-gnu@1.1.5': optional: true '@rolldown/binding-linux-x64-musl@1.0.2': optional: true - '@rolldown/binding-linux-x64-musl@1.0.3': + '@rolldown/binding-linux-x64-musl@1.1.5': optional: true '@rolldown/binding-openharmony-arm64@1.0.2': optional: true - '@rolldown/binding-openharmony-arm64@1.0.3': + '@rolldown/binding-openharmony-arm64@1.1.5': optional: true '@rolldown/binding-wasm32-wasi@1.0.2': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-wasm32-wasi@1.0.3': + '@rolldown/binding-wasm32-wasi@1.1.5': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.2': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.3': + '@rolldown/binding-win32-arm64-msvc@1.1.5': optional: true '@rolldown/binding-win32-x64-msvc@1.0.2': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.3': + '@rolldown/binding-win32-x64-msvc@1.1.5': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -1736,7 +1823,7 @@ snapshots: '@tslab/typescript-for-tslab@5.0.4': {} - '@tybys/wasm-util@0.10.2': + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 optional: true @@ -1752,76 +1839,134 @@ snapshots: '@types/estree@1.0.9': {} - '@types/jsesc@2.5.1': {} - '@types/node@18.19.130': dependencies: undici-types: 5.26.5 - '@types/node@25.9.1': + '@types/node@26.1.1': dependencies: - undici-types: 7.24.6 + undici-types: 8.3.0 '@types/resolve@1.17.1': dependencies: - '@types/node': 25.9.1 + '@types/node': 26.1.1 - '@vitest/expect@4.1.7': + '@vitest/expect@4.1.10': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.7 - '@vitest/utils': 4.1.7 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@25.9.1))': + '@vitest/mocker@4.1.10(vite@8.0.14(@types/node@26.1.1))': dependencies: - '@vitest/spy': 4.1.7 + '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.14(@types/node@25.9.1) + vite: 8.0.14(@types/node@26.1.1) - '@vitest/pretty-format@4.1.7': + '@vitest/pretty-format@4.1.10': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.7': + '@vitest/runner@4.1.10': dependencies: - '@vitest/utils': 4.1.7 + '@vitest/utils': 4.1.10 pathe: 2.0.3 - '@vitest/snapshot@4.1.7': + '@vitest/snapshot@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.7 - '@vitest/utils': 4.1.7 + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.7': {} + '@vitest/spy@4.1.10': {} - '@vitest/utils@4.1.7': + '@vitest/utils@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.7 + '@vitest/pretty-format': 4.1.10 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - ansis@4.3.0: {} + '@yuku-codegen/binding-darwin-arm64@0.6.1': + optional: true - assertion-error@2.0.1: {} + '@yuku-codegen/binding-darwin-x64@0.6.1': + optional: true - ast-kit@3.0.0-beta.1: - dependencies: - '@babel/parser': 8.0.0-rc.6 - estree-walker: 3.0.3 - pathe: 2.0.3 + '@yuku-codegen/binding-freebsd-x64@0.6.1': + optional: true - balanced-match@1.0.2: {} + '@yuku-codegen/binding-linux-arm-gnu@0.6.1': + optional: true + + '@yuku-codegen/binding-linux-arm-musl@0.6.1': + optional: true + + '@yuku-codegen/binding-linux-arm64-gnu@0.6.1': + optional: true + + '@yuku-codegen/binding-linux-arm64-musl@0.6.1': + optional: true + + '@yuku-codegen/binding-linux-x64-gnu@0.6.1': + optional: true + + '@yuku-codegen/binding-linux-x64-musl@0.6.1': + optional: true + + '@yuku-codegen/binding-win32-arm64@0.6.1': + optional: true + + '@yuku-codegen/binding-win32-x64@0.6.1': + optional: true + + '@yuku-parser/binding-darwin-arm64@0.6.1': + optional: true + + '@yuku-parser/binding-darwin-x64@0.6.1': + optional: true + + '@yuku-parser/binding-freebsd-x64@0.6.1': + optional: true + + '@yuku-parser/binding-linux-arm-gnu@0.6.1': + optional: true + + '@yuku-parser/binding-linux-arm-musl@0.6.1': + optional: true + + '@yuku-parser/binding-linux-arm64-gnu@0.6.1': + optional: true + + '@yuku-parser/binding-linux-arm64-musl@0.6.1': + optional: true + + '@yuku-parser/binding-linux-x64-gnu@0.6.1': + optional: true + + '@yuku-parser/binding-linux-x64-musl@0.6.1': + optional: true + + '@yuku-parser/binding-win32-arm64@0.6.1': + optional: true + + '@yuku-parser/binding-win32-x64@0.6.1': + optional: true + + '@yuku-toolchain/types@0.5.43': {} - birpc@4.0.0: {} + ansis@4.3.1: {} - brace-expansion@1.1.15: + assertion-error@2.0.1: {} + + balanced-match@1.0.2: {} + + brace-expansion@1.1.16: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -1854,7 +1999,7 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@2.1.0: {} + es-module-lexer@2.3.1: {} estree-walker@1.0.1: {} @@ -1862,11 +2007,11 @@ snapshots: dependencies: '@types/estree': 1.0.9 - expect-type@1.3.0: {} + expect-type@1.4.0: {} - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 fs.realpath@1.0.0: {} @@ -1913,8 +2058,6 @@ snapshots: dependencies: '@types/estree': 1.0.9 - jsesc@3.1.0: {} - lightningcss-android-arm64@1.32.0: optional: true @@ -1974,73 +2117,73 @@ snapshots: minimatch@3.1.5: dependencies: - brace-expansion: 1.1.15 + brace-expansion: 1.1.16 - nanoid@3.3.12: {} + nanoid@3.3.16: {} - node-addon-api@8.8.0: {} + node-addon-api@8.9.0: {} - obug@2.1.1: {} + obug@2.1.3: {} once@1.4.0: dependencies: wrappy: 1.0.2 - oxfmt@0.52.0: + oxfmt@0.58.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.52.0 - '@oxfmt/binding-android-arm64': 0.52.0 - '@oxfmt/binding-darwin-arm64': 0.52.0 - '@oxfmt/binding-darwin-x64': 0.52.0 - '@oxfmt/binding-freebsd-x64': 0.52.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.52.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.52.0 - '@oxfmt/binding-linux-arm64-gnu': 0.52.0 - '@oxfmt/binding-linux-arm64-musl': 0.52.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.52.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.52.0 - '@oxfmt/binding-linux-riscv64-musl': 0.52.0 - '@oxfmt/binding-linux-s390x-gnu': 0.52.0 - '@oxfmt/binding-linux-x64-gnu': 0.52.0 - '@oxfmt/binding-linux-x64-musl': 0.52.0 - '@oxfmt/binding-openharmony-arm64': 0.52.0 - '@oxfmt/binding-win32-arm64-msvc': 0.52.0 - '@oxfmt/binding-win32-ia32-msvc': 0.52.0 - '@oxfmt/binding-win32-x64-msvc': 0.52.0 - - oxlint-tsgolint@0.23.0: + '@oxfmt/binding-android-arm-eabi': 0.58.0 + '@oxfmt/binding-android-arm64': 0.58.0 + '@oxfmt/binding-darwin-arm64': 0.58.0 + '@oxfmt/binding-darwin-x64': 0.58.0 + '@oxfmt/binding-freebsd-x64': 0.58.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.58.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.58.0 + '@oxfmt/binding-linux-arm64-gnu': 0.58.0 + '@oxfmt/binding-linux-arm64-musl': 0.58.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.58.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.58.0 + '@oxfmt/binding-linux-riscv64-musl': 0.58.0 + '@oxfmt/binding-linux-s390x-gnu': 0.58.0 + '@oxfmt/binding-linux-x64-gnu': 0.58.0 + '@oxfmt/binding-linux-x64-musl': 0.58.0 + '@oxfmt/binding-openharmony-arm64': 0.58.0 + '@oxfmt/binding-win32-arm64-msvc': 0.58.0 + '@oxfmt/binding-win32-ia32-msvc': 0.58.0 + '@oxfmt/binding-win32-x64-msvc': 0.58.0 + + oxlint-tsgolint@0.24.0: optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 0.23.0 - '@oxlint-tsgolint/darwin-x64': 0.23.0 - '@oxlint-tsgolint/linux-arm64': 0.23.0 - '@oxlint-tsgolint/linux-x64': 0.23.0 - '@oxlint-tsgolint/win32-arm64': 0.23.0 - '@oxlint-tsgolint/win32-x64': 0.23.0 - - oxlint@1.67.0(oxlint-tsgolint@0.23.0): + '@oxlint-tsgolint/darwin-arm64': 0.24.0 + '@oxlint-tsgolint/darwin-x64': 0.24.0 + '@oxlint-tsgolint/linux-arm64': 0.24.0 + '@oxlint-tsgolint/linux-x64': 0.24.0 + '@oxlint-tsgolint/win32-arm64': 0.24.0 + '@oxlint-tsgolint/win32-x64': 0.24.0 + + oxlint@1.73.0(oxlint-tsgolint@0.24.0): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.67.0 - '@oxlint/binding-android-arm64': 1.67.0 - '@oxlint/binding-darwin-arm64': 1.67.0 - '@oxlint/binding-darwin-x64': 1.67.0 - '@oxlint/binding-freebsd-x64': 1.67.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.67.0 - '@oxlint/binding-linux-arm-musleabihf': 1.67.0 - '@oxlint/binding-linux-arm64-gnu': 1.67.0 - '@oxlint/binding-linux-arm64-musl': 1.67.0 - '@oxlint/binding-linux-ppc64-gnu': 1.67.0 - '@oxlint/binding-linux-riscv64-gnu': 1.67.0 - '@oxlint/binding-linux-riscv64-musl': 1.67.0 - '@oxlint/binding-linux-s390x-gnu': 1.67.0 - '@oxlint/binding-linux-x64-gnu': 1.67.0 - '@oxlint/binding-linux-x64-musl': 1.67.0 - '@oxlint/binding-openharmony-arm64': 1.67.0 - '@oxlint/binding-win32-arm64-msvc': 1.67.0 - '@oxlint/binding-win32-ia32-msvc': 1.67.0 - '@oxlint/binding-win32-x64-msvc': 1.67.0 - oxlint-tsgolint: 0.23.0 + '@oxlint/binding-android-arm-eabi': 1.73.0 + '@oxlint/binding-android-arm64': 1.73.0 + '@oxlint/binding-darwin-arm64': 1.73.0 + '@oxlint/binding-darwin-x64': 1.73.0 + '@oxlint/binding-freebsd-x64': 1.73.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.73.0 + '@oxlint/binding-linux-arm-musleabihf': 1.73.0 + '@oxlint/binding-linux-arm64-gnu': 1.73.0 + '@oxlint/binding-linux-arm64-musl': 1.73.0 + '@oxlint/binding-linux-ppc64-gnu': 1.73.0 + '@oxlint/binding-linux-riscv64-gnu': 1.73.0 + '@oxlint/binding-linux-riscv64-musl': 1.73.0 + '@oxlint/binding-linux-s390x-gnu': 1.73.0 + '@oxlint/binding-linux-x64-gnu': 1.73.0 + '@oxlint/binding-linux-x64-musl': 1.73.0 + '@oxlint/binding-openharmony-arm64': 1.73.0 + '@oxlint/binding-win32-arm64-msvc': 1.73.0 + '@oxlint/binding-win32-ia32-msvc': 1.73.0 + '@oxlint/binding-win32-x64-msvc': 1.73.0 + oxlint-tsgolint: 0.24.0 path-is-absolute@1.0.1: {} @@ -2052,11 +2195,11 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} - postcss@8.5.15: + postcss@8.5.18: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.16 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -2071,17 +2214,15 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - rolldown-plugin-dts@0.25.2(rolldown@1.0.3)(typescript@6.0.3): + rolldown-plugin-dts@0.27.8(rolldown@1.1.5)(typescript@6.0.3): dependencies: - '@babel/generator': 8.0.0-rc.6 - '@babel/helper-validator-identifier': 8.0.0-rc.6 - '@babel/parser': 8.0.0-rc.6 - ast-kit: 3.0.0-beta.1 - birpc: 4.0.0 dts-resolver: 3.0.0 get-tsconfig: 5.0.0-beta.5 - obug: 2.1.1 - rolldown: 1.0.3 + obug: 2.1.3 + rolldown: 1.1.5 + yuku-ast: 0.1.7 + yuku-codegen: 0.6.1 + yuku-parser: 0.6.1 optionalDependencies: typescript: 6.0.3 transitivePeerDependencies: @@ -2108,32 +2249,32 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.2 '@rolldown/binding-win32-x64-msvc': 1.0.2 - rolldown@1.0.3: + rolldown@1.1.5: dependencies: - '@oxc-project/types': 0.133.0 + '@oxc-project/types': 0.139.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.3 - '@rolldown/binding-darwin-arm64': 1.0.3 - '@rolldown/binding-darwin-x64': 1.0.3 - '@rolldown/binding-freebsd-x64': 1.0.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 - '@rolldown/binding-linux-arm64-gnu': 1.0.3 - '@rolldown/binding-linux-arm64-musl': 1.0.3 - '@rolldown/binding-linux-ppc64-gnu': 1.0.3 - '@rolldown/binding-linux-s390x-gnu': 1.0.3 - '@rolldown/binding-linux-x64-gnu': 1.0.3 - '@rolldown/binding-linux-x64-musl': 1.0.3 - '@rolldown/binding-openharmony-arm64': 1.0.3 - '@rolldown/binding-wasm32-wasi': 1.0.3 - '@rolldown/binding-win32-arm64-msvc': 1.0.3 - '@rolldown/binding-win32-x64-msvc': 1.0.3 + '@rolldown/binding-android-arm64': 1.1.5 + '@rolldown/binding-darwin-arm64': 1.1.5 + '@rolldown/binding-darwin-x64': 1.1.5 + '@rolldown/binding-freebsd-x64': 1.1.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 + '@rolldown/binding-linux-arm64-gnu': 1.1.5 + '@rolldown/binding-linux-arm64-musl': 1.1.5 + '@rolldown/binding-linux-ppc64-gnu': 1.1.5 + '@rolldown/binding-linux-s390x-gnu': 1.1.5 + '@rolldown/binding-linux-x64-gnu': 1.1.5 + '@rolldown/binding-linux-x64-musl': 1.1.5 + '@rolldown/binding-openharmony-arm64': 1.1.5 + '@rolldown/binding-wasm32-wasi': 1.1.5 + '@rolldown/binding-win32-arm64-msvc': 1.1.5 + '@rolldown/binding-win32-x64-msvc': 1.1.5 rollup@2.80.0: optionalDependencies: fsevents: 2.3.3 - semver@7.8.1: {} + semver@7.8.5: {} siginfo@2.0.0: {} @@ -2143,7 +2284,7 @@ snapshots: stackback@0.0.2: {} - std-env@4.1.0: {} + std-env@4.2.0: {} supports-preserve-symlinks-flag@1.0.0: {} @@ -2153,8 +2294,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinypool@2.1.0: {} @@ -2162,19 +2303,19 @@ snapshots: tree-kill@1.2.2: {} - tsdown@0.22.1(typescript@6.0.3): + tsdown@0.22.6(typescript@6.0.3): dependencies: - ansis: 4.3.0 + ansis: 4.3.1 cac: 7.0.0 defu: 6.1.7 empathic: 2.0.1 hookable: 6.1.1 import-without-cache: 0.4.0 - obug: 2.1.1 - picomatch: 4.0.4 - rolldown: 1.0.3 - rolldown-plugin-dts: 0.25.2(rolldown@1.0.3)(typescript@6.0.3) - semver: 7.8.1 + obug: 2.1.3 + picomatch: 4.0.5 + rolldown: 1.1.5 + rolldown-plugin-dts: 0.27.8(rolldown@1.1.5)(typescript@6.0.3) + semver: 7.8.5 tinyexec: 1.2.4 tinyglobby: 0.2.17 tree-kill: 1.2.2 @@ -2196,7 +2337,7 @@ snapshots: '@types/node': 18.19.130 commander: 10.0.1 rollup: 2.80.0 - semver: 7.8.1 + semver: 7.8.5 zeromq: 6.5.0 tslib@2.8.1: @@ -2211,43 +2352,43 @@ snapshots: undici-types@5.26.5: {} - undici-types@7.24.6: {} + undici-types@8.3.0: {} - vite@8.0.14(@types/node@25.9.1): + vite@8.0.14(@types/node@26.1.1): dependencies: lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.15 + picomatch: 4.0.5 + postcss: 8.5.18 rolldown: 1.0.2 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.9.1 + '@types/node': 26.1.1 fsevents: 2.3.3 - vitest@4.1.7(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)): + vitest@4.1.10(@types/node@26.1.1)(vite@8.0.14(@types/node@26.1.1)): dependencies: - '@vitest/expect': 4.1.7 - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.9.1)) - '@vitest/pretty-format': 4.1.7 - '@vitest/runner': 4.1.7 - '@vitest/snapshot': 4.1.7 - '@vitest/spy': 4.1.7 - '@vitest/utils': 4.1.7 - es-module-lexer: 2.1.0 - expect-type: 1.3.0 + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.0.14(@types/node@26.1.1)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + es-module-lexer: 2.3.1 + expect-type: 1.4.0 magic-string: 0.30.21 - obug: 2.1.1 + obug: 2.1.3 pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 + picomatch: 4.0.5 + std-env: 4.2.0 tinybench: 2.9.0 tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.14(@types/node@25.9.1) + vite: 8.0.14(@types/node@26.1.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.9.1 + '@types/node': 26.1.1 transitivePeerDependencies: - msw @@ -2258,7 +2399,43 @@ snapshots: wrappy@1.0.2: {} + yuku-ast@0.1.7: + dependencies: + '@yuku-toolchain/types': 0.5.43 + + yuku-codegen@0.6.1: + dependencies: + '@yuku-toolchain/types': 0.5.43 + optionalDependencies: + '@yuku-codegen/binding-darwin-arm64': 0.6.1 + '@yuku-codegen/binding-darwin-x64': 0.6.1 + '@yuku-codegen/binding-freebsd-x64': 0.6.1 + '@yuku-codegen/binding-linux-arm-gnu': 0.6.1 + '@yuku-codegen/binding-linux-arm-musl': 0.6.1 + '@yuku-codegen/binding-linux-arm64-gnu': 0.6.1 + '@yuku-codegen/binding-linux-arm64-musl': 0.6.1 + '@yuku-codegen/binding-linux-x64-gnu': 0.6.1 + '@yuku-codegen/binding-linux-x64-musl': 0.6.1 + '@yuku-codegen/binding-win32-arm64': 0.6.1 + '@yuku-codegen/binding-win32-x64': 0.6.1 + + yuku-parser@0.6.1: + dependencies: + '@yuku-toolchain/types': 0.5.43 + optionalDependencies: + '@yuku-parser/binding-darwin-arm64': 0.6.1 + '@yuku-parser/binding-darwin-x64': 0.6.1 + '@yuku-parser/binding-freebsd-x64': 0.6.1 + '@yuku-parser/binding-linux-arm-gnu': 0.6.1 + '@yuku-parser/binding-linux-arm-musl': 0.6.1 + '@yuku-parser/binding-linux-arm64-gnu': 0.6.1 + '@yuku-parser/binding-linux-arm64-musl': 0.6.1 + '@yuku-parser/binding-linux-x64-gnu': 0.6.1 + '@yuku-parser/binding-linux-x64-musl': 0.6.1 + '@yuku-parser/binding-win32-arm64': 0.6.1 + '@yuku-parser/binding-win32-x64': 0.6.1 + zeromq@6.5.0: dependencies: cmake-ts: 1.0.2 - node-addon-api: 8.8.0 + node-addon-api: 8.9.0 diff --git a/src/context.ts b/src/context.ts index b184e5f..974e7a9 100644 --- a/src/context.ts +++ b/src/context.ts @@ -164,7 +164,7 @@ export default function createContext< }; const registerModule = >(Class: C) => { - const instance = new Class(context as Context); + const instance = new Class(context); const record = instance as Record; modules.set(Class, instance); instances.push(record); diff --git a/src/reactive.ts b/src/reactive.ts index 1c59c7f..39b2526 100644 --- a/src/reactive.ts +++ b/src/reactive.ts @@ -1,6 +1,7 @@ -// oxlint-disable unicorn/no-useless-spread : spread is needed to avoid mutating the set while iterating +// oxlint-disable unicorn/no-useless-spread typescript/method-signature-style -type RefMatchingFunc = (newValue: T, oldValue: T) => void; +// Return 'stop' to stop propagation +type RefMatchingFunc = (newValue: T, oldValue: T) => unknown; export type Ref = { (): T; (newValue: T): void; @@ -22,7 +23,7 @@ export function ref(initial: T, options?: RefOptions): Ref { if (equals(newValue, value)) return; const oldValue = value; value = newValue; - for (const callback of [...subs]) callback(newValue, oldValue); + for (const callback of [...subs]) if (callback(newValue, oldValue) === 'stop') break; }) as Ref; result.subscribe = (callback, ops) => { subs.add(callback); @@ -34,7 +35,7 @@ export function ref(initial: T, options?: RefOptions): Ref { return result; } -type HookMatchingFunc = (...args: Args) => void; +type HookMatchingFunc = (...args: Args) => unknown; type GeneralArray = ReadonlyArray; export type Hook = { (...args: Args): void; @@ -46,7 +47,7 @@ export type Hook = { export function hook(): Hook { const subs = new Set>(); const result: Hook = (...args: Args) => { - for (const callback of [...subs]) callback(...args); + for (const callback of [...subs]) if (callback(...args) === 'stop') break; }; result.subscribe = (callback) => { subs.add(callback); @@ -84,9 +85,7 @@ export function computed(getter: () => T, options?: ComputedOptions): Comp const newValue = getter(); if (equals(newValue, oldValue)) return; value = newValue; - // Spread is needed to avoid mutating the set while iterating - // oxlint-disable-next-line unicorn/no-useless-spread - for (const callback of [...subs]) callback(newValue, oldValue); + for (const callback of [...subs]) if (callback(newValue, oldValue) === 'stop') break; }; const deps: Array = []; if (_deps) { diff --git a/src/type-inspector.md b/src/type-inspector.md new file mode 100644 index 0000000..e0372fa --- /dev/null +++ b/src/type-inspector.md @@ -0,0 +1,126 @@ +# Type Inspector + +`synthkernel` resolves one TypeScript type alias from one TypeScript project and prints a standalone type-alias declaration. The executable uses TypeScript `6.0.3` at runtime. + +## Invocation + +```sh +synthkernel [--max-depth ] +``` + +During source development, use: + +```sh +bun src/type-inspector.ts [--max-depth ] +``` + +`` is resolved to an absolute path. `` is an unqualified identifier. The command accepts `--max-depth ` and `--max-depth=` in any argument position. The last supplied depth option wins. The default is `25`. Values must be non-negative safe integers. Unknown options, missing values, and any positional-argument count other than two are failures. + +## Project Resolution + +The inspector searches upward from the input file's directory for the nearest `tsconfig.json`. A config file is required. It loads that config with the TypeScript compiler API, so `extends` and all normal effective compiler options apply. + +The inspector creates a TypeScript program from the config's resolved file list. If the input file is absent from that list, it is added as an additional root file. The program is rejected when any of these diagnostics exist: + +- Config parsing diagnostics +- Compiler-option diagnostics +- Global diagnostics +- Syntactic diagnostics in the input file +- Semantic diagnostics in the input file + +The inspector only resolves names available in the input file's top-level TypeScript type scope. This includes aliases declared in that file and aliases imported into that file. A name resolving to an interface, class, namespace, value, or another non-alias declaration is rejected. + +## Alias Classes + +The inspector uses these exact classes: + +- **Generic alias**: a type alias that declares one or more type parameters. +- **Direct alias**: a non-generic alias whose complete alias-reference graph contains no array syntax, no type reference with type arguments, and no reference to a declaration that declares type parameters. +- **Synthetic alias**: every non-generic alias that is not direct. In practice, it contains an instantiated generic type directly or through another non-generic alias. +- **Recursive alias**: an alias whose alias-reference dependency graph can reach itself. Mutual recursion makes every alias in the cycle recursive. + +For example: + +```ts +type Serializer = (value: unknown) => string; // Direct +type Transformer = (input: T) => T; // Generic +type CacheTransformer = Transformer>>; // Synthetic +``` + +## Ambient Exemptions + +A symbol is ambient when at least one of its declarations is either: + +1. A TypeScript default-library source file selected by effective `compilerOptions.lib`; or +2. Inside the directory of a type-reference package resolved from effective `compilerOptions.types`. + +Ambient non-helper symbols are preserved as references. Their type arguments are still inspected and unfolded. This preserves containers such as `Map`, `ReadableStream`, `Uint8Array`, and configured Node or Bun type-package containers while resolving aliases inside their arguments. + +Only configured `compilerOptions.types` packages create this second exemption. An arbitrary declaration package imported by source code is not ambient merely because it is in `node_modules`. + +The following ambient helper symbols are never preserved. The inspector unfolds them with the TypeScript checker: + +```text +Awaited, Capitalize, ConstructorParameters, Exclude, Extract, InstanceType, +Lowercase, NoInfer, NonNullable, Omit, OmitThisParameter, Parameters, +Partial, Pick, Readonly, Record, Required, ReturnType, ThisParameterType, +ThisType, Uncapitalize, Uppercase +``` + +`ReadonlyArray` is also a helper. It is emitted as `readonly T[]` after recursively inspecting `T`. + +An application alias with the same name as a helper is not a helper unless its declaration is ambient under the rule above. + +## Unfolding and Folding + +For a local target alias, inspection starts from its written type expression. For an imported target alias, inspection starts from the TypeScript checker's resolved type expression because the imported declaration may refer to names unavailable in the input file. + +The inspector then performs at most `maxDepth` expansion passes. Each pass works on a temporary checked type alias and applies these rules to every type reference: + +1. Preserve a reference to the requested target alias. This prevents a target's written definition from expanding its own self-references. +2. Unfold a recursive alias in the first pass where it is eligible for unfolding, even when it would otherwise qualify as a direct alias. All eligible occurrences of that alias already present in that pass unfold. References to the same alias emitted by those expansions are preserved in every later pass. This unfolds the outer recursive construction once without recursively unfolding every `self` reference in its definition. +3. Preserve an ambient non-helper reference, while recursively inspecting its arguments. +4. Preserve a non-recursive direct alias. This is the folding step: the outermost direct alias encountered remains in output. +5. Unfold every other alias reference and every ambient helper reference with the TypeScript checker. +6. Preserve non-alias, non-helper references, such as interfaces and classes, while recursively inspecting their arguments. + +The TypeScript checker performs semantic normalization while unfolding a reference. Therefore, one expansion pass can resolve more than one syntactic alias layer. `--max-depth` limits inspector passes, not the internal normalization depth of the TypeScript checker. With `--max-depth=0`, the inspector performs no expansion passes. + +If the maximum pass count is reached, the current type expression is printed unchanged. Reaching the maximum is successful; it is not an error. + +## Output + +Successful output is exactly one declaration: + +```ts +type = ; +``` + +The output keeps target type parameters. It is printed by the TypeScript printer with line-feed newlines, no type truncation, structural fallback, and single-quoted string literal types. The command writes one trailing newline to stdout. + +Examples: + +```ts +type Transformer = (input: T) => T; +type CacheTransformer = Transformer>>; + +// Output +type CacheTransformer = ( + input: Map>, +) => Map>; +``` + +```ts +type Direct = { id: number }; +type Wrapper = { value: T }; +type Result = Wrapper; + +// Output +type Result = { + value: Direct; +}; +``` + +## Failures + +Every failure writes an error message followed by a newline to stderr and exits with status `1`. Failures include invalid CLI arguments, unreadable input files, absent or invalid `tsconfig.json`, rejected TypeScript diagnostics, inaccessible aliases, and accessible names that are not type aliases. diff --git a/src/type-inspector.ts b/src/type-inspector.ts index ce99f17..b9c4679 100644 --- a/src/type-inspector.ts +++ b/src/type-inspector.ts @@ -1,213 +1,558 @@ #!/usr/bin/env node + // oxlint-disable import/no-nodejs-modules -import fs from 'node:fs'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; + +import { dirname, isAbsolute, relative, resolve } from 'node:path'; import ts from 'typescript'; -const TYPE_FORMAT_FLAGS = ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.InTypeAlias; -const IDENTIFIER_RE = /^[$A-Z_a-z][$0-9A-Z_a-z]*$/; +const DEFAULT_MAX_DEPTH = 25; +const OUTPUT_ALIAS_BASE = '__SynthKernelResolvedType'; +const TYPE_NODE_FLAGS = + ts.NodeBuilderFlags.NoTruncation | + ts.NodeBuilderFlags.UseStructuralFallback | + ts.NodeBuilderFlags.UseSingleQuotesForStringLiteralType; + +const HELPER_TYPES = new Set([ + 'Awaited', + 'Capitalize', + 'ConstructorParameters', + 'Exclude', + 'Extract', + 'InstanceType', + 'Lowercase', + 'NoInfer', + 'NonNullable', + 'Omit', + 'OmitThisParameter', + 'Parameters', + 'Partial', + 'Pick', + 'Readonly', + 'ReadonlyArray', + 'Record', + 'Required', + 'ReturnType', + 'ThisParameterType', + 'ThisType', + 'Uncapitalize', + 'Uppercase', +]); + +type CliOptions = { + aliasName: string; + filePath: string; + maxDepth: number; +}; + +type ProjectConfig = { + fileNames: Array; + options: ts.CompilerOptions; +}; + +type ProjectView = { + checker: ts.TypeChecker; + program: ts.Program; + sourceFile: ts.SourceFile; +}; -function formatDiagnostic(error: ts.Diagnostic): string { - return ts.flattenDiagnosticMessageText(error.messageText, '\n'); +type ExpansionResult = { + changed: boolean; + type: ts.TypeNode; + unfoldedRecursiveAliases: Set; +}; + +function usage(): string { + return 'Usage: synthkernel [--max-depth ]'; } -function resolveFilePath(filePath: string): string { - const resolvedPath = path.resolve(process.cwd(), filePath); - if (!fs.existsSync(resolvedPath) || !fs.statSync(resolvedPath).isFile()) - throw new Error(`File not found: ${filePath}`); +function parseArguments(arguments_: Array): CliOptions { + const positional: Array = []; + let maxDepth = DEFAULT_MAX_DEPTH; + + for (let index = 0; index < arguments_.length; index += 1) { + const argument = arguments_[index]; + + if (argument === '--max-depth') { + const value = arguments_[index + 1]; + if (value === undefined) throw new Error(`Missing value for --max-depth.\n${usage()}`); + maxDepth = parseMaxDepth(value); + index += 1; + continue; + } + + if (argument.startsWith('--max-depth=')) { + maxDepth = parseMaxDepth(argument.slice('--max-depth='.length)); + continue; + } + + if (argument.startsWith('-')) throw new Error(`Unknown option: ${argument}\n${usage()}`); + positional.push(argument); + } + + if (positional.length !== 2) throw new Error(usage()); - return resolvedPath; + return { + aliasName: positional[1], + filePath: resolve(positional[0]), + maxDepth, + }; } -function loadProgram(filePath: string): ts.Program { - const configPath = ts.findConfigFile(path.dirname(filePath), ts.sys.fileExists); - if (!configPath) - return ts.createProgram([filePath], { - module: ts.ModuleKind.ESNext, - moduleResolution: ts.ModuleResolutionKind.Bundler, - strict: true, - target: ts.ScriptTarget.ESNext, - }); +function parseMaxDepth(value: string): number { + if (!/^\d+$/.test(value)) throw new Error('--max-depth must be a non-negative integer.'); + const depth = Number(value); + if (!Number.isSafeInteger(depth)) + throw new Error('--max-depth must be a non-negative safe integer.'); + return depth; +} + +function loadProjectConfig(filePath: string): ProjectConfig { + const configPath = ts.findConfigFile(dirname(filePath), ts.sys.fileExists, 'tsconfig.json'); + if (configPath === undefined) throw new Error(`No tsconfig.json found for ${filePath}.`); - const configFile = ts.readConfigFile(configPath, ts.sys.readFile); - if (configFile.error) throw new Error(formatDiagnostic(configFile.error)); + const config = ts.readConfigFile(configPath, ts.sys.readFile); + if (config.error !== undefined) throwDiagnostics([config.error]); const parsed = ts.parseJsonConfigFileContent( - configFile.config, + config.config, ts.sys, - path.dirname(configPath), + dirname(configPath), + undefined, + configPath, ); - const rootNames = new Set(parsed.fileNames.map((name) => path.resolve(name))); - rootNames.add(filePath); - return ts.createProgram([...rootNames], parsed.options); + if (parsed.errors.length > 0) throwDiagnostics(parsed.errors); + + const canonicalTarget = canonicalPath(filePath); + const fileNames = parsed.fileNames.some((name) => canonicalPath(name) === canonicalTarget) + ? parsed.fileNames + : [...parsed.fileNames, filePath]; + + return { fileNames, options: parsed.options }; } -function findTypeAlias(sourceFile: ts.SourceFile, aliasName: string): ts.TypeAliasDeclaration { - const alias = sourceFile.statements.find( - (statement): statement is ts.TypeAliasDeclaration => - ts.isTypeAliasDeclaration(statement) && statement.name.text === aliasName, - ); - if (!alias) throw new Error(`Type alias not found: ${aliasName}`); - return alias; +function createProjectView( + config: ProjectConfig, + filePath: string, + sourceText?: string, +): ProjectView { + const host = ts.createCompilerHost(config.options, true); + const originalGetSourceFile = host.getSourceFile.bind(host); + const originalReadFile = host.readFile.bind(host); + const canonicalTarget = canonicalPath(filePath); + + if (sourceText !== undefined) { + host.getSourceFile = (name, languageVersion, onError, shouldCreateNewSourceFile) => { + if (canonicalPath(name) === canonicalTarget) + return ts.createSourceFile(name, sourceText, languageVersion, true); + + return originalGetSourceFile(name, languageVersion, onError, shouldCreateNewSourceFile); + }; + host.readFile = (name) => + canonicalPath(name) === canonicalTarget ? sourceText : originalReadFile(name); + } + + const program = ts.createProgram(config.fileNames, config.options, host); + const sourceFile = program + .getSourceFiles() + .find((candidate) => canonicalPath(candidate.fileName) === canonicalTarget); + if (sourceFile === undefined) throw new Error(`Could not load source file: ${filePath}`); + + return { checker: program.getTypeChecker(), program, sourceFile }; +} + +function canonicalPath(filePath: string): string { + const absolute = isAbsolute(filePath) ? filePath : resolve(filePath); + return ts.sys.useCaseSensitiveFileNames ? absolute : absolute.toLowerCase(); +} + +function validateProject(view: ProjectView): void { + const diagnostics = [ + ...view.program.getConfigFileParsingDiagnostics(), + ...view.program.getOptionsDiagnostics(), + ...view.program.getGlobalDiagnostics(), + ...view.program.getSyntacticDiagnostics(view.sourceFile), + ...view.program.getSemanticDiagnostics(view.sourceFile), + ]; + if (diagnostics.length > 0) throwDiagnostics(diagnostics); } -function formatPropertyName(name: string): string { - return IDENTIFIER_RE.test(name) ? name : JSON.stringify(name); +function throwDiagnostics(diagnostics: ReadonlyArray): never { + const message = ts.formatDiagnostics(diagnostics, { + getCanonicalFileName: canonicalPath, + getCurrentDirectory: ts.sys.getCurrentDirectory, + getNewLine: () => ts.sys.newLine, + }); + throw new Error(message.trimEnd()); } -function formatType( - type: ts.Type, +function resolveAlias( checker: ts.TypeChecker, - node: ts.Node, - seen = new Set(), -): string { - if (seen.has(type)) return checker.typeToString(type, node, TYPE_FORMAT_FLAGS); - - if (type.flags & ts.TypeFlags.StringLiteral) - return JSON.stringify((type as ts.StringLiteralType).value); - if (type.flags & ts.TypeFlags.NumberLiteral) - return String((type as ts.NumberLiteralType).value); - if (type.flags & ts.TypeFlags.BigIntLiteral) - return checker.typeToString(type, node, TYPE_FORMAT_FLAGS); - if (type.flags & ts.TypeFlags.BooleanLiteral) - return checker.typeToString(type, node, TYPE_FORMAT_FLAGS); - if (type.flags & ts.TypeFlags.Undefined) return 'undefined'; - if (type.flags & ts.TypeFlags.Null) return 'null'; - if (type.flags & ts.TypeFlags.Never) return 'never'; - if (type.flags & ts.TypeFlags.Unknown) return 'unknown'; - if (type.flags & ts.TypeFlags.Any) return 'any'; - if (type.flags & ts.TypeFlags.Void) return 'void'; - if (type.flags & ts.TypeFlags.String) return 'string'; - if (type.flags & ts.TypeFlags.Number) return 'number'; - if (type.flags & ts.TypeFlags.Boolean) return 'boolean'; - if (type.flags & ts.TypeFlags.BigInt) return 'bigint'; - if (type.flags & ts.TypeFlags.ESSymbol) return 'symbol'; - - if (type.flags & ts.TypeFlags.Union) { - const members = (type as ts.UnionType).types; - const hasUndefined = members.some((member) => member.flags & ts.TypeFlags.Undefined); - const hasNull = members.some((member) => member.flags & ts.TypeFlags.Null); - const nonNullableMembers = members.filter( - (member) => - !(member.flags & ts.TypeFlags.Undefined) && !(member.flags & ts.TypeFlags.Null), - ); - const hasTrue = nonNullableMembers.some( - (member) => - member.flags & ts.TypeFlags.BooleanLiteral && - checker.typeToString(member, node, TYPE_FORMAT_FLAGS) === 'true', + sourceFile: ts.SourceFile, + aliasName: string, +): { declaration: ts.TypeAliasDeclaration; symbol: ts.Symbol } { + const localSymbol = checker.resolveName(aliasName, sourceFile, ts.SymbolFlags.Type, false); + if (localSymbol === undefined) + throw new Error( + `Type alias "${aliasName}" is not accessible at the top level of ${sourceFile.fileName}.`, ); - const hasFalse = nonNullableMembers.some( - (member) => - member.flags & ts.TypeFlags.BooleanLiteral && - checker.typeToString(member, node, TYPE_FORMAT_FLAGS) === 'false', + + const symbol = resolveSymbol(checker, localSymbol); + const declaration = symbol.declarations?.find(ts.isTypeAliasDeclaration); + if (declaration === undefined) + throw new Error( + `"${aliasName}" is not a type alias accessible at the top level of ${sourceFile.fileName}.`, ); - if ( - hasTrue && - hasFalse && - nonNullableMembers.every((member) => member.flags & ts.TypeFlags.BooleanLiteral) - ) { - const head = 'boolean'; - const tail = hasNull ? ['null'] : []; - if (hasUndefined) tail.push('undefined'); - return [head, ...tail].join(' | '); + + return { declaration, symbol }; +} + +function resolveSymbol(checker: ts.TypeChecker, symbol: ts.Symbol): ts.Symbol { + return symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : symbol; +} + +function findOutputAlias(sourceFile: ts.SourceFile, name: string): ts.TypeAliasDeclaration { + const declaration = sourceFile.statements.find( + (statement): statement is ts.TypeAliasDeclaration => + ts.isTypeAliasDeclaration(statement) && statement.name.text === name, + ); + if (declaration === undefined) + throw new Error('Internal error: generated output alias was not found.'); + return declaration; +} + +function createTargetTypeParameters( + checker: ts.TypeChecker, + declaration: ts.TypeAliasDeclaration, + sourceFile: ts.SourceFile, +): ReadonlyArray | undefined { + const parameters = declaration.typeParameters?.map((parameter) => { + const type = checker.getTypeAtLocation(parameter); + return checker.typeParameterToDeclaration(type, sourceFile, TYPE_NODE_FLAGS) ?? parameter; + }); + return parameters === undefined ? undefined : ts.factory.createNodeArray(parameters); +} + +function configuredTypeRoots(config: ProjectConfig, containingFile: string): Array { + return (config.options.types ?? []).flatMap((name) => { + const result = ts.resolveTypeReferenceDirective( + name, + containingFile, + config.options, + ts.sys, + ).resolvedTypeReferenceDirective; + return result?.resolvedFileName === undefined ? [] : [dirname(result.resolvedFileName)]; + }); +} + +function isInside(filePath: string, directory: string): boolean { + const path = relative(resolve(directory), resolve(filePath)); + return path === '' || (!path.startsWith('..') && !isAbsolute(path)); +} + +function isConfiguredAmbientSymbol( + program: ts.Program, + typeRoots: ReadonlyArray, + symbol: ts.Symbol, +): boolean { + return ( + symbol.declarations?.some((declaration) => { + const sourceFile = declaration.getSourceFile(); + return ( + program.isSourceFileDefaultLibrary(sourceFile) || + typeRoots.some((root) => isInside(sourceFile.fileName, root)) + ); + }) ?? false + ); +} + +function typeReferenceSymbol( + checker: ts.TypeChecker, + node: ts.TypeReferenceNode, +): ts.Symbol | undefined { + const type = checker.getTypeAtLocation(node); + const symbol = + checker.getSymbolAtLocation(node.typeName) ?? type.aliasSymbol ?? type.getSymbol(); + return symbol === undefined ? undefined : resolveSymbol(checker, symbol); +} + +function typeAliasDeclaration(symbol: ts.Symbol): ts.TypeAliasDeclaration | undefined { + return symbol.declarations?.find(ts.isTypeAliasDeclaration); +} + +function aliasIdentity(declaration: ts.TypeAliasDeclaration): string { + return `${canonicalPath(declaration.getSourceFile().fileName)}:${declaration.pos}:${declaration.end}`; +} + +function aliasDependencies( + checker: ts.TypeChecker, + declaration: ts.TypeAliasDeclaration, +): Set { + const dependencies = new Set(); + + function visit(node: ts.Node): void { + if (ts.isTypeReferenceNode(node)) { + const symbol = typeReferenceSymbol(checker, node); + if (symbol !== undefined && typeAliasDeclaration(symbol) !== undefined) + dependencies.add(symbol); + } + ts.forEachChild(node, visit); + } + + visit(declaration.type); + return dependencies; +} + +function createAliasClassifiers(checker: ts.TypeChecker): { + isDirectAlias: (symbol: ts.Symbol) => boolean; + isRecursiveAlias: (symbol: ts.Symbol) => boolean; +} { + const directCache = new Map(); + const recursiveCache = new Map(); + + function containsInstantiation(node: ts.Node, visiting: Set): boolean { + if (ts.isArrayTypeNode(node)) return true; + + if (ts.isTypeReferenceNode(node)) { + const symbol = typeReferenceSymbol(checker, node); + if (symbol !== undefined) { + const declaration = typeAliasDeclaration(symbol); + const genericDeclaration = symbol.declarations?.find( + ( + candidate, + ): candidate is ts.Declaration & { + typeParameters: ts.NodeArray; + } => 'typeParameters' in candidate && candidate.typeParameters !== undefined, + ); + + if (node.typeArguments !== undefined || genericDeclaration !== undefined) + return true; + if (declaration !== undefined && !visiting.has(symbol)) { + const nextVisiting = new Set(visiting).add(symbol); + if (containsInstantiation(declaration.type, nextVisiting)) return true; + } + } } - const parts = nonNullableMembers.map((subtype) => formatType(subtype, checker, node, seen)); - if (hasNull) parts.push('null'); - if (hasUndefined) parts.push('undefined'); - return parts.join(' | '); + return ts.forEachChild(node, (child) => containsInstantiation(child, visiting)) ?? false; } - if (checker.isTupleType(type)) { - const tuple = type as ts.TypeReference; - const elements = checker - .getTypeArguments(tuple) - .map((elementType) => formatType(elementType, checker, node, seen)); - return `[${elements.join(', ')}]`; + function isDirectAlias(symbol: ts.Symbol): boolean { + const cached = directCache.get(symbol); + if (cached !== undefined) return cached; + + const declaration = typeAliasDeclaration(symbol); + if (declaration === undefined || declaration.typeParameters !== undefined) return false; + + const direct = !containsInstantiation(declaration.type, new Set([symbol])); + directCache.set(symbol, direct); + return direct; } - if (checker.isArrayType(type)) { - const arrayType = type as ts.TypeReference; - const [elementType] = checker.getTypeArguments(arrayType); - if (elementType) return `${formatType(elementType, checker, node, seen)}[]`; + function reachesAlias( + current: ts.Symbol, + target: ts.Symbol, + visiting: Set, + ): boolean { + if (visiting.has(current)) return false; + const declaration = typeAliasDeclaration(current); + if (declaration === undefined) return false; + + const nextVisiting = new Set(visiting).add(current); + for (const dependency of aliasDependencies(checker, declaration)) + if (dependency === target || reachesAlias(dependency, target, nextVisiting)) + return true; + + return false; } - if (type.flags & ts.TypeFlags.Intersection) { - const props = checker.getPropertiesOfType(type); - if (props.length > 0) return formatObjectType(type, checker, node, seen); - return (type as ts.IntersectionType).types - .map((subtype) => formatType(subtype, checker, node, seen)) - .join(' & '); + function isRecursiveAlias(symbol: ts.Symbol): boolean { + const cached = recursiveCache.get(symbol); + if (cached !== undefined) return cached; + const recursive = reachesAlias(symbol, symbol, new Set()); + recursiveCache.set(symbol, recursive); + return recursive; } - const signatures = checker.getSignaturesOfType(type, ts.SignatureKind.Call); - const constructors = checker.getSignaturesOfType(type, ts.SignatureKind.Construct); - const props = checker.getPropertiesOfType(type); - if (props.length > 0 && signatures.length === 0 && constructors.length === 0) - return formatObjectType(type, checker, node, seen); + return { isDirectAlias, isRecursiveAlias }; +} + +function expandAliasOnce( + view: ProjectView, + declaration: ts.TypeAliasDeclaration, + targetSymbol: ts.Symbol, + typeRoots: ReadonlyArray, + previouslyUnfoldedRecursiveAliases: ReadonlySet, +): ExpansionResult { + const { checker, program } = view; + const { isDirectAlias, isRecursiveAlias } = createAliasClassifiers(checker); + let changed = false; + const unfoldedRecursiveAliases = new Set(); + + const transformation = ts.transform(declaration.type, [ + (context) => { + const visitor: ts.Visitor = (node) => { + if (ts.isIndexedAccessTypeNode(node)) { + const type = checker.getTypeAtLocation(node); + const expanded = checker.typeToTypeNode( + type, + declaration, + TYPE_NODE_FLAGS | ts.NodeBuilderFlags.InTypeAlias, + ); + if (expanded !== undefined) { + changed = true; + return expanded; + } + } + + if (!ts.isTypeReferenceNode(node)) return ts.visitEachChild(node, visitor, context); + + const symbol = typeReferenceSymbol(checker, node); + if (symbol === undefined) return ts.visitEachChild(node, visitor, context); - return checker.typeToString(type, node, TYPE_FORMAT_FLAGS); + const ambient = isConfiguredAmbientSymbol(program, typeRoots, symbol); + const helper = ambient && HELPER_TYPES.has(symbol.getName()); + if ( + helper && + symbol.getName() === 'ReadonlyArray' && + node.typeArguments?.length === 1 + ) { + changed = true; + const argument = + ts.visitNode(node.typeArguments[0], visitor, ts.isTypeNode) ?? + node.typeArguments[0]; + return ts.factory.createTypeOperatorNode( + ts.SyntaxKind.ReadonlyKeyword, + ts.factory.createArrayTypeNode(argument), + ); + } + + const alias = typeAliasDeclaration(symbol); + const recursive = alias !== undefined && isRecursiveAlias(symbol); + const recursiveIdentity = recursive ? aliasIdentity(alias) : undefined; + const preserve = + symbol === targetSymbol || + (recursiveIdentity !== undefined && + previouslyUnfoldedRecursiveAliases.has(recursiveIdentity)) || + (ambient && !helper) || + (alias !== undefined && !recursive && isDirectAlias(symbol)); + if (preserve || (alias === undefined && !helper)) + return ts.visitEachChild(node, visitor, context); + + const type = checker.getTypeAtLocation(node); + const expanded = checker.typeToTypeNode( + type, + declaration, + TYPE_NODE_FLAGS | ts.NodeBuilderFlags.InTypeAlias, + ); + if (expanded === undefined) return ts.visitEachChild(node, visitor, context); + + changed = true; + if (recursiveIdentity !== undefined) + unfoldedRecursiveAliases.add(recursiveIdentity); + return expanded; + }; + + return (root) => ts.visitNode(root, visitor, ts.isTypeNode) ?? root; + }, + ]); + + const type = transformation.transformed[0]; + transformation.dispose(); + return { changed, type, unfoldedRecursiveAliases }; } -function formatObjectType( - type: ts.Type, - checker: ts.TypeChecker, - node: ts.Node, - seen: Set, +function printAlias( + name: string, + typeParameters: ReadonlyArray | undefined, + type: ts.TypeNode, + sourceFile: ts.SourceFile, ): string { - seen.add(type); - try { - const lines = checker.getPropertiesOfType(type).map((symbol) => { - const optional = (symbol.flags & ts.SymbolFlags.Optional) !== 0; - const propType = checker.getTypeOfSymbolAtLocation(symbol, node); - return ` ${formatPropertyName(symbol.getName())}${optional ? '?' : ''}: ${formatType(propType, checker, node, seen)};`; - }); - if (lines.length === 0) return '{}'; - return `{ -${lines.join('\n')} -}`; - } finally { - seen.delete(type); + const declaration = ts.factory.createTypeAliasDeclaration( + undefined, + name, + typeParameters, + type, + ); + return ts + .createPrinter({ newLine: ts.NewLineKind.LineFeed }) + .printNode(ts.EmitHint.Unspecified, declaration, sourceFile); +} + +function uniqueOutputAlias(checker: ts.TypeChecker, sourceFile: ts.SourceFile): string { + let name = OUTPUT_ALIAS_BASE; + let suffix = 2; + while (checker.resolveName(name, sourceFile, ts.SymbolFlags.Type, false) !== undefined) { + name = `${OUTPUT_ALIAS_BASE}${suffix}`; + suffix += 1; } + return name; } -export function inspectTypeAlias(filePath: string, aliasName: string): string { - const resolvedFilePath = resolveFilePath(filePath); - const program = loadProgram(resolvedFilePath); - const sourceFile = program.getSourceFile(resolvedFilePath); - if (!sourceFile) throw new Error(`Source file not found in program: ${filePath}`); +function inspectType(options: CliOptions): string { + const sourceText = ts.sys.readFile(options.filePath); + if (sourceText === undefined) + throw new Error(`Could not read source file: ${options.filePath}`); - const alias = findTypeAlias(sourceFile, aliasName); - if (alias.typeParameters?.length) throw new Error(`Type alias is generic: ${aliasName}`); + const config = loadProjectConfig(options.filePath); + const initialView = createProjectView(config, options.filePath); + validateProject(initialView); - const checker = program.getTypeChecker(); - const type = checker.getTypeFromTypeNode(alias.type); - return formatType(type, checker, alias); -} + const target = resolveAlias(initialView.checker, initialView.sourceFile, options.aliasName); + const initialType = + canonicalPath(target.declaration.getSourceFile().fileName) === + canonicalPath(options.filePath) + ? target.declaration.type + : initialView.checker.typeToTypeNode( + initialView.checker.getDeclaredTypeOfSymbol(target.symbol), + initialView.sourceFile, + TYPE_NODE_FLAGS | ts.NodeBuilderFlags.InTypeAlias, + ); + if (initialType === undefined) + throw new Error(`Could not resolve type alias "${options.aliasName}".`); -export function main(argv: Array = process.argv.slice(2)): number { - if (argv.length !== 2) { - console.error('Usage: synthkernel '); - return 1; - } + const outputAlias = uniqueOutputAlias(initialView.checker, initialView.sourceFile); + let output = printAlias( + outputAlias, + createTargetTypeParameters(initialView.checker, target.declaration, initialView.sourceFile), + initialType, + initialView.sourceFile, + ); + const typeRoots = configuredTypeRoots(config, options.filePath); + const unfoldedRecursiveAliases = new Set(); - try { - console.log(inspectTypeAlias(argv[0], argv[1])); - return 0; - } catch (error) { - console.error(error instanceof Error ? error.message : String(error)); - return 1; + for (let depth = 0; depth < options.maxDepth; depth += 1) { + const overlayText = `${sourceText}\n${output}\n`; + const view = createProjectView(config, options.filePath, overlayText); + const declaration = findOutputAlias(view.sourceFile, outputAlias); + const targetSymbol = resolveAlias(view.checker, view.sourceFile, options.aliasName).symbol; + const result = expandAliasOnce( + view, + declaration, + targetSymbol, + typeRoots, + unfoldedRecursiveAliases, + ); + output = printAlias(outputAlias, declaration.typeParameters, result.type, view.sourceFile); + for (const identity of result.unfoldedRecursiveAliases) + unfoldedRecursiveAliases.add(identity); + if (!result.changed) break; } -} -function isMainEntryPoint() { - if (!process.argv[1]) return false; - try { - return fs.realpathSync(process.argv[1]) === fs.realpathSync(fileURLToPath(import.meta.url)); - } catch { - return path.resolve(process.argv[1]) === fileURLToPath(import.meta.url); - } + const finalView = createProjectView(config, options.filePath, `${sourceText}\n${output}\n`); + const finalDeclaration = findOutputAlias(finalView.sourceFile, outputAlias); + return printAlias( + options.aliasName, + finalDeclaration.typeParameters, + finalDeclaration.type, + finalView.sourceFile, + ); } -if (isMainEntryPoint()) process.exitCode = main(); +try { + const options = parseArguments(process.argv.slice(2)); + process.stdout.write(`${inspectType(options)}\n`); +} catch (error) { + const message = error instanceof Error ? error.message : String(error); + process.stderr.write(`${message}\n`); + process.exitCode = 1; +} diff --git a/test/type-inspector.test.ts b/test/type-inspector.test.ts index 568f408..97b598b 100644 --- a/test/type-inspector.test.ts +++ b/test/type-inspector.test.ts @@ -1,104 +1,214 @@ // oxlint-disable import/no-nodejs-modules -import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'; -import os from 'node:os'; -import path from 'node:path'; -import { expect, test, vi } from 'vitest'; -import { inspectTypeAlias, main } from '../src/type-inspector'; - -function createFixture(source: string) { - const dir = mkdtempSync(path.join(os.tmpdir(), 'synthkernel-type-inspector-')); - const filePath = path.join(dir, 'fixture.ts'); - writeFileSync( - path.join(dir, 'tsconfig.json'), - JSON.stringify( - { + +import { execFile } from 'node:child_process'; +import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { promisify } from 'node:util'; +import { expect, test } from 'vitest'; + +const executeFile = promisify(execFile); +const projectRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const inspectorPath = join(projectRoot, 'src/type-inspector.ts'); + +type InspectorResult = { + code: number; + stderr: string; + stdout: string; +}; + +async function inspect( + filePath: string, + aliasName: string, + arguments_: Array = [], +): Promise { + try { + const { stderr, stdout } = await executeFile( + 'bun', + [inspectorPath, filePath, aliasName, ...arguments_], + { cwd: projectRoot, encoding: 'utf8' }, + ); + return { code: 0, stderr, stdout }; + } catch (error) { + const failure = error as { code?: number; stderr?: string; stdout?: string }; + return { + code: typeof failure.code === 'number' ? failure.code : 1, + stderr: failure.stderr ?? '', + stdout: failure.stdout ?? '', + }; + } +} + +async function withProject( + source: string, + callback: (filePath: string) => Promise, + compilerOptions: Record = {}, + files: Record = {}, +): Promise { + const directory = await mkdtemp(join(tmpdir(), 'synthkernel-inspector-')); + const filePath = join(directory, 'fixture.ts'); + + try { + await writeFile( + join(directory, 'tsconfig.json'), + JSON.stringify({ compilerOptions: { + lib: ['ESNext', 'DOM'], module: 'ESNext', moduleResolution: 'bundler', strict: true, target: 'ESNext', + ...compilerOptions, }, - include: ['./*.ts'], - }, - null, - 2, - ), - ); - writeFileSync(filePath, source); - return { dir, filePath }; -} + include: ['**/*.ts'], + }), + ); + await writeFile(filePath, `export {};\n${source}`); -test('inspectTypeAlias resolves final type of alias', () => { - const fixture = createFixture('type Base = { count: number };\ntype Foo = Base;\n'); - try { - const result = inspectTypeAlias(fixture.filePath, 'Foo'); - expect(result).toContain('count: number'); - expect(result).not.toContain('Base'); + for (const [path, content] of Object.entries(files)) { + const file = join(directory, path); + await mkdir(dirname(file), { recursive: true }); + await writeFile(file, content); + } + + await callback(filePath); } finally { - rmSync(fixture.dir, { force: true, recursive: true }); + await rm(directory, { force: true, recursive: true }); } +} + +test('resolves generic aliases while preserving configured lib containers', async () => { + await withProject( + [ + 'type Transformer = (input: T) => T;', + 'type CacheTransformer = Transformer>>;', + ].join('\n'), + async (filePath) => { + const result = await inspect(filePath, 'CacheTransformer'); + expect(result).toStrictEqual({ + code: 0, + stderr: '', + stdout: 'type CacheTransformer = (input: Map>) => Map>;\n', + }); + }, + ); }); -test('inspectTypeAlias expands merged context alias in example file', () => { - const result = inspectTypeAlias(path.resolve('skill/example/index.ts'), 'AllOptions'); - expect(result).toBe(`{ - logLevel: "DEBUG" | "ERROR" | "INFO" | "WARN"; - maxLogs?: number | undefined; - appName: string; - debug?: boolean | undefined; - minMessageLength: number; - maxMessageLength: number; -}`); +test('folds nested direct aliases after expanding a synthetic alias', async () => { + await withProject( + [ + 'type Direct = { id: number };', + 'type Wrapper = { value: T };', + 'type Result = Wrapper;', + ].join('\n'), + async (filePath) => { + const result = await inspect(filePath, 'Result'); + expect(result.stdout).toBe('type Result = {\n value: Direct;\n};\n'); + }, + ); }); -test('inspectTypeAlias rejects generic aliases', () => { - const fixture = createFixture('type Box = T[];\n'); - try { - expect(() => inspectTypeAlias(fixture.filePath, 'Box')).toThrow(/generic/i); - } finally { - rmSync(fixture.dir, { force: true, recursive: true }); - } +test('unfolds helper aliases inside a generic target', async () => { + await withProject( + ['type Wrapper = { value: T };', 'type Generic = Readonly>;'].join('\n'), + async (filePath) => { + const result = await inspect(filePath, 'Generic'); + expect(result.stdout).toBe('type Generic = {\n readonly value: T;\n};\n'); + }, + ); }); -test('inspectTypeAlias fails when alias is missing', () => { - const fixture = createFixture('type Foo = number;\n'); - try { - expect(() => inspectTypeAlias(fixture.filePath, 'Missing')).toThrow( - 'Type alias not found: Missing', - ); - } finally { - rmSync(fixture.dir, { force: true, recursive: true }); - } +test('preserves types declared by compilerOptions.types', async () => { + await withProject( + ['type Wrapper = { value: T };', 'type Result = Container>;'].join('\n'), + async (filePath) => { + const result = await inspect(filePath, 'Result'); + expect(result.stdout).toBe('type Result = Container<{\n value: number;\n}>;\n'); + }, + { types: ['ambient'] }, + { + 'node_modules/@types/ambient/index.d.ts': + 'declare interface Container { item: T; }\n', + }, + ); }); -test('main prints resolved type and exits zero', () => { - const fixture = createFixture('type Foo = number;\n'); - const log = vi.spyOn(console, 'log').mockReturnValue(undefined); - const error = vi.spyOn(console, 'error').mockReturnValue(undefined); +test('preserves self-referential types', async () => { + await withProject('type Recursive = string | Recursive[];', async (filePath) => { + const result = await inspect(filePath, 'Recursive', ['--max-depth', '2']); + expect(result.stdout).toBe('type Recursive = string | Recursive[];\n'); + }); +}); - try { - const code = main([fixture.filePath, 'Foo']); - expect(code).toBe(0); - expect(log).toHaveBeenCalledWith('number'); - expect(error).not.toHaveBeenCalled(); - } finally { - log.mockRestore(); - error.mockRestore(); - rmSync(fixture.dir, { force: true, recursive: true }); - } +test('unfolds a recursive alias once and preserves generated self references', async () => { + await withProject( + [ + 'type Recursive = { value: T; next?: Recursive };', + 'type Result = Recursive;', + ].join('\n'), + async (filePath) => { + const result = await inspect(filePath, 'Result'); + expect(result.stdout).toBe( + 'type Result = {\n value: string;\n next?: Recursive | undefined;\n};\n', + ); + }, + ); }); -test('main writes stderr and exits non-zero for missing file', () => { - const error = vi.spyOn(console, 'error').mockReturnValue(undefined); - const log = vi.spyOn(console, 'log').mockReturnValue(undefined); +test('unfolds recursive context construction', async () => { + const filePath = join(projectRoot, 'skill/example/index.ts'); + const result = await inspect(filePath, 'Context'); + expect(result.stdout).toContain('type Context = {'); +}); - try { - const code = main(['missing.ts', 'Foo']); - expect(code).toBe(1); - expect(error).toHaveBeenCalledWith('File not found: missing.ts'); - expect(log).not.toHaveBeenCalled(); - } finally { - log.mockRestore(); - error.mockRestore(); - } +test('resolves indexed access aliases without expanding the source context', async () => { + const filePath = join(projectRoot, 'skill/example/index.ts'); + const result = await inspect(filePath, 'AllOptions'); + expect(result).toStrictEqual({ + code: 0, + stderr: '', + stdout: + 'type AllOptions = {\n' + + ' logLevel: Level;\n' + + ' maxLogs: number | undefined;\n' + + ' appName: string;\n' + + ' debug?: boolean | undefined;\n' + + ' minMessageLength: number;\n' + + ' maxMessageLength: number;\n' + + '};\n', + }); +}); + +test('stops before nested expansion at max depth zero', async () => { + await withProject( + ['type Wrapper = { value: T };', 'type Result = Readonly>;'].join('\n'), + async (filePath) => { + const result = await inspect(filePath, 'Result', ['--max-depth=0']); + expect(result.stdout).toBe('type Result = Readonly>;\n'); + }, + ); +}); + +test('resolves imported aliases accessible at file scope', async () => { + await withProject( + "import type { Shared } from './shared';", + async (filePath) => { + const result = await inspect(filePath, 'Shared'); + expect(result.stdout).toBe('type Shared = {\n value: T;\n};\n'); + }, + {}, + { 'shared.ts': 'export type Shared = { value: T };\n' }, + ); +}); + +test('reports inaccessible aliases with a non-zero exit status', async () => { + await withProject('type Present = string;', async (filePath) => { + const result = await inspect(filePath, 'Missing'); + expect(result).toStrictEqual({ + code: 1, + stderr: `Type alias "Missing" is not accessible at the top level of ${filePath}.\n`, + stdout: '', + }); + }); }); From 2cac2faa5b32ed5783135c9c598f7d5370a5ca98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?He=CC=84sperus?= Date: Tue, 14 Jul 2026 12:58:46 +0800 Subject: [PATCH 2/4] fix(tests): correct tests --- test/type-inspector.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/type-inspector.test.ts b/test/type-inspector.test.ts index 97b598b..fb20374 100644 --- a/test/type-inspector.test.ts +++ b/test/type-inspector.test.ts @@ -171,9 +171,10 @@ test('resolves indexed access aliases without expanding the source context', asy stdout: 'type AllOptions = {\n' + ' logLevel: Level;\n' + - ' maxLogs: number | undefined;\n' + + ' maxLogs?: number | undefined;\n' + ' appName: string;\n' + ' debug?: boolean | undefined;\n' + + '} & {\n' + ' minMessageLength: number;\n' + ' maxMessageLength: number;\n' + '};\n', From d29717f3e3ea98eaa9d4d29e9b61c70691f67450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?He=CC=84sperus?= Date: Tue, 14 Jul 2026 13:02:33 +0800 Subject: [PATCH 3/4] pnpm sucks --- package.json | 2 +- pnpm-lock.yaml | 76 +++++++++++++++++++++++++------------------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index 46991b8..43580d8 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "devEngines": { "packageManager": { "name": "pnpm", - "version": "^11.2.2", + "version": "^11.13.0", "onFail": "download" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 093ee68..16b7716 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,52 +7,52 @@ importers: configDependencies: {} packageManagerDependencies: '@pnpm/exe': - specifier: 11.9.0 - version: 11.9.0 + specifier: 11.13.0 + version: 11.13.0 pnpm: - specifier: 11.9.0 - version: 11.9.0 + specifier: 11.13.0 + version: 11.13.0 packages: - '@pnpm/exe@11.9.0': - resolution: {integrity: sha512-pPPOpR79qW3nsNhlyDIdfstli4Bi78mk8r22ySxpFRwMbO8KXSjGrVzGmJBsVX39NnJTh7/WADj527nZhG9H9g==} + '@pnpm/exe@11.13.0': + resolution: {integrity: sha512-aXsm4VW1awRuh4X4G4fl+1xdV+L9DElKrgc4Yq/3zgGQQ12ATj1n3MMeosfa68aX/i7E9VyWT42adDSg8+kEFQ==} hasBin: true - '@pnpm/linux-arm64@11.9.0': - resolution: {integrity: sha512-XYmY2qadHauBA3QaHi2R7fI6kt5Flje0WHz9MVrbH0kVH/XLpfOLnwPeE1+EX6K/nDa2CBvzp35VjYCNGFJa9A==} + '@pnpm/linux-arm64@11.13.0': + resolution: {integrity: sha512-86ri9P/i3Enbv0NBAEtz27lBHHwCJqsC7YxHX56+jXPyFobGbsDVR5OUyoCCVVNz/Phs2O7c9SaDVdqKPzUFCA==} cpu: [arm64] os: [linux] - '@pnpm/linux-x64@11.9.0': - resolution: {integrity: sha512-fl7W5imnSmmgXIqMQFZ/rPaVvk9OkKF8/anqHZE3XEDfWcn3BlWGndyOEas/JN7u2BXWYjs63DJZ3rnG6WOhLA==} + '@pnpm/linux-x64@11.13.0': + resolution: {integrity: sha512-ZXvUMP5ew1WZllTq1f7Tm3l6sF5LK5sMesfdu9J6uxsznK/3tTi6edUeiNN6dA22mAHhjvrzVj+MeQ6X3DG0tA==} cpu: [x64] os: [linux] - '@pnpm/linuxstatic-arm64@11.9.0': - resolution: {integrity: sha512-fif8xbnzVEAIlvaU4yIgWKXeXYb4Kj6WMEl/KvM2x1Rp3AKAjBW/53SGzxO4cZP9doAqUzOIpMRGFVbHGeMDRw==} + '@pnpm/linuxstatic-arm64@11.13.0': + resolution: {integrity: sha512-elwRj0sE3W54gDECgbHu2/TerpZsHXRmLSXfzuIvReumGuOYk5zlUhD5dJqzp0B1ktetVNU4Rb1keENz5/Gb/Q==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/linuxstatic-x64@11.9.0': - resolution: {integrity: sha512-9dKu3QdShqOpnWrjW9owARpIJeP0ul8UgIIbBUv8VDGEYibt+g49zQsNaD7SdMD3WeRSjExPQ1zIhplzr5cwvQ==} + '@pnpm/linuxstatic-x64@11.13.0': + resolution: {integrity: sha512-PQyfFMRA6/uYB+1vqx0wSXfOirC5CUOKRlTjXNgI1q/R1Ug/NMDfKOr52qbWFllcG9pIHKV8hZTo4WyBUjS1mA==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/macos-arm64@11.9.0': - resolution: {integrity: sha512-MWzBTgeI5p3odjdVltYvFXaSWAjF2Xk5YaxiP/u2RmW8N6PHsLyIyj37Ds992CrXgFM8fO1RpvsEirozhsD6KA==} + '@pnpm/macos-arm64@11.13.0': + resolution: {integrity: sha512-qWf2wbvESMICLJcVfWNh4pwIsr2oK6yFwbuv1uHi0UY3OnWNt0+POmhqWtYWtDj+EPWM3pSfEAc+KFQAiaBCvg==} cpu: [arm64] os: [darwin] - '@pnpm/win-arm64@11.9.0': - resolution: {integrity: sha512-u/QxEcbKJZxC1t3zUYCZiHzu7TaZ/iXc6EGZoQjkeVT0LXmEVR6ypcK3ByjhIqbxQ3HGX75gnpIpR+VjRjubfw==} + '@pnpm/win-arm64@11.13.0': + resolution: {integrity: sha512-ZvbGFdjU3cX32+/sHOhV9VkkbBucJ9QyW/F6VSsqgkvmTZTXlQglYp4K1KBbKWxYKz4i6M9p5PStI6yYB+y0jA==} cpu: [arm64] os: [win32] - '@pnpm/win-x64@11.9.0': - resolution: {integrity: sha512-HqJVHmZG5UKfLi38AjMl2azVmq87TlWRhwSW+f4q9LLaZeAkFyIZ7LY/pN6mh4VlH9yWj90C+tsb1yKiy7OKnw==} + '@pnpm/win-x64@11.13.0': + resolution: {integrity: sha512-5KX2lMFbXZNvKC+gLftR5FiU25j/jMp24Zi9JB01T3r42uxrHt12GQP7CNkNjxCXdi8jioUB7e3iT1eINS8qVQ==} cpu: [x64] os: [win32] @@ -116,45 +116,45 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - pnpm@11.9.0: - resolution: {integrity: sha512-vWgtXQP+Ul73yf1ngMaITR51asTJyf4AxTh4KCQxDc+Q493E9Tg18G3669UIXkGFXgvLs7YN4qxburieUDbwOw==} + pnpm@11.13.0: + resolution: {integrity: sha512-iNlHJNjy5sGGdEpVhMblnsrIaex7oV6ctM1ijo3HBmggskgdjuO1HqjaMjpzeAaKpYxVajcg0yt8IKBR0Ig2Og==} engines: {node: '>=22.13'} hasBin: true snapshots: - '@pnpm/exe@11.9.0': + '@pnpm/exe@11.13.0': dependencies: '@reflink/reflink': 0.1.19 detect-libc: 2.1.2 optionalDependencies: - '@pnpm/linux-arm64': 11.9.0 - '@pnpm/linux-x64': 11.9.0 - '@pnpm/linuxstatic-arm64': 11.9.0 - '@pnpm/linuxstatic-x64': 11.9.0 - '@pnpm/macos-arm64': 11.9.0 - '@pnpm/win-arm64': 11.9.0 - '@pnpm/win-x64': 11.9.0 + '@pnpm/linux-arm64': 11.13.0 + '@pnpm/linux-x64': 11.13.0 + '@pnpm/linuxstatic-arm64': 11.13.0 + '@pnpm/linuxstatic-x64': 11.13.0 + '@pnpm/macos-arm64': 11.13.0 + '@pnpm/win-arm64': 11.13.0 + '@pnpm/win-x64': 11.13.0 - '@pnpm/linux-arm64@11.9.0': + '@pnpm/linux-arm64@11.13.0': optional: true - '@pnpm/linux-x64@11.9.0': + '@pnpm/linux-x64@11.13.0': optional: true - '@pnpm/linuxstatic-arm64@11.9.0': + '@pnpm/linuxstatic-arm64@11.13.0': optional: true - '@pnpm/linuxstatic-x64@11.9.0': + '@pnpm/linuxstatic-x64@11.13.0': optional: true - '@pnpm/macos-arm64@11.9.0': + '@pnpm/macos-arm64@11.13.0': optional: true - '@pnpm/win-arm64@11.9.0': + '@pnpm/win-arm64@11.13.0': optional: true - '@pnpm/win-x64@11.9.0': + '@pnpm/win-x64@11.13.0': optional: true '@reflink/reflink-darwin-arm64@0.1.19': @@ -194,7 +194,7 @@ snapshots: detect-libc@2.1.2: {} - pnpm@11.9.0: {} + pnpm@11.13.0: {} --- lockfileVersion: '9.0' From bd0437c46d974eaed993b8656dc01e6ee060c281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?He=CC=84sperus?= Date: Tue, 14 Jul 2026 13:19:56 +0800 Subject: [PATCH 4/4] fix(dep): use node in tests --- test/type-inspector.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/type-inspector.test.ts b/test/type-inspector.test.ts index fb20374..ca83b0a 100644 --- a/test/type-inspector.test.ts +++ b/test/type-inspector.test.ts @@ -25,7 +25,7 @@ async function inspect( ): Promise { try { const { stderr, stdout } = await executeFile( - 'bun', + process.execPath, [inspectorPath, filePath, aliasName, ...arguments_], { cwd: projectRoot, encoding: 'utf8' }, );