From 654049f30b985e83f351645e5df0fd59d389f680 Mon Sep 17 00:00:00 2001 From: Joao Paulo Furtado Date: Sun, 4 Oct 2026 12:22:40 -0700 Subject: [PATCH 1/2] perf(toolchain): use stable TypeScript 7 for workspace checks --- AGENTS.md | 2 +- CLAUDE.md | 2 +- examples/abyss-framework/package.json | 3 +- examples/auto-lod/package.json | 3 +- examples/constrained-ik/package.json | 7 +- examples/csg-doorway/package.json | 3 +- examples/fps-friction/package.json | 3 +- examples/native-smoke/package.json | 3 +- examples/prd140-picking/package.json | 3 +- examples/prd162-replay/package.json | 3 +- examples/prd242-compute-lifetime/package.json | 3 +- examples/prd243-cloth/package.json | 3 +- examples/prd249-fluid-field/package.json | 3 +- examples/prd268-probe-volume/package.json | 3 +- examples/prd307-environment-cost/package.json | 3 +- examples/prd314-clip-audit/package.json | 3 +- examples/prd476-fluid-particles/package.json | 3 +- .../src/collision-proof.ts | 2 +- examples/quarry/package.json | 3 +- examples/skinned-crowd/package.json | 7 +- examples/vfx-gallery/package.json | 3 +- package.json | 3 +- packages/assets/package.json | 3 +- packages/blender-mcp/package.json | 3 +- packages/core/package.json | 3 +- .../__tests__/config.spec.ts | 3 +- .../__tests__/scaffold.spec.ts | 28 +- .../__tests__/template.spec.ts | 17 +- packages/create-threenative/package.json | 3 +- .../templates/action-rpg/package.json | 2 +- .../templates/minimal/package.json | 2 +- .../templates/platformer/package.json | 2 +- .../templates/puzzle/package.json | 2 +- .../templates/racing/package.json | 2 +- .../templates/rain/package.json | 5 +- .../templates/rts/package.json | 2 +- .../templates/runner/package.json | 2 +- .../templates/sailing/package.json | 2 +- .../templates/shooter/package.json | 2 +- .../templates/snow/package.json | 2 +- .../templates/starter/package.json | 2 +- .../templates/tower-defense/package.json | 2 +- packages/engine-mcp/package.json | 3 +- packages/metahuman/package.json | 3 +- packages/physics/package.json | 3 +- packages/playtest/__tests__/trace-run.spec.ts | 3 + packages/playtest/package.json | 3 +- .../src/runner/observationSampling.ts | 10 +- packages/playtest/src/runner/traceRun.ts | 11 +- packages/raw-unreal/package.json | 5 +- packages/ueformat/package.json | 3 +- packages/ui/package.json | 3 +- patches/tsup@8.5.1.patch | 11 + pnpm-lock.yaml | 408 +++++++++++++++--- pnpm-workspace.yaml | 4 +- .../__tests__/typescript-toolchain.spec.ts | 93 ++++ scripts/make-sandbox.ts | 2 +- scripts/realism-effects-visual.ts | 6 +- test-support/webgpu-provenance.ts | 6 +- tsconfig.base.json | 3 +- tsconfig.json | 11 +- 61 files changed, 613 insertions(+), 138 deletions(-) create mode 100644 patches/tsup@8.5.1.patch create mode 100644 scripts/__tests__/typescript-toolchain.spec.ts diff --git a/AGENTS.md b/AGENTS.md index 657e664c96..3685e61731 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -80,7 +80,7 @@ pnpm native:verify:desktop # 300 native frames + a non-blank scr **CI.** The pre-push hook runs `pnpm ci:fast` drift checks only; it proves no runtime behaviour. `pnpm ci:local --full` runs the full board; `pnpm ci:local --affected --base origin/develop --target develop` runs what CI would select (dirty or unknown inputs fall back to full). A change touching only Markdown that no fixture consumes (not `AGENTS.md`/`CLAUDE.md`) runs no product CI job. PRs and merge groups into develop use the complete candidate diff: CI-only changes run CI contracts, exact template changes run scaffolder contracts and affected templates, and shared/unknown executable inputs keep exhaustive coverage. Main qualification and scheduled audits remain exhaustive. Template scenarios run once per kit; selective changes run one representative golden journey and full qualification retains both starter and platformer journeys. `ci-required` rejects missing or failed selected checks; retained contexts include `supply-chain`, `template-nonvisual`, `golden-path`, and native `desktop-parity` when applicable. Native host/platform tests run for native or shared runtime consumers, main qualification and unresolved scopes. Unsafe matrix/reusable verdict reuse stays disabled until authoritative complete coverage and per-leg routing exist. A new candidate runs fresh tests; only exact-run immutable build artifacts are shared. Details: `docs/PRDs/CI/PRD-483-impact-driven-ci-without-repeated-template-setup.md` and `docs/PRDs/done/PRD-373-selective-ci-and-develop-promotion.md`. Registry commands read auth from `~/.npmrc`; pass a checkout-local untracked `.npmrc` with `npm --userconfig .npmrc `. Never print either file. -TypeScript 5.9 `strict`, **ESM only**; relative imports end in `.js`. Versions come from the `catalog:` in `pnpm-workspace.yaml`, templates excepted. Biome formats — never hand-format. Interfaces are `I`-prefixed; classes and type aliases are not. Unit tests: `/__tests__/*.spec.ts`, vitest, node environment, DOM and GPU stubbed. +TypeScript 7 `strict` (the native `tsc`); `typescript` imports use the official TypeScript 6 compatibility API for AST scripts and tsup declarations, **ESM only**; relative imports end in `.js`. Versions come from the `catalog:` in `pnpm-workspace.yaml`, templates excepted. Biome formats — never hand-format. Interfaces are `I`-prefixed; classes and type aliases are not. Unit tests: `/__tests__/*.spec.ts`, vitest, node environment, DOM and GPU stubbed. **Existing harnesses — use them, don't rebuild them.** Capability lookup: `capabilities.json`, `packages/engine-mcp`. Behaviour on browser/Android/desktop/iOS: `packages/playtest --target `. User-like install and agent-friction arms: `pnpm sandbox`, `pnpm sweep:capture|judge|pair`, `scripts/score-blind.ts`. Visual baselines and LOC vs plain Three.js: `pnpm visuals`, `visuals:ab`, `visuals:baseline`, `pnpm tsx scripts/count-loc.ts`. Web-vs-native, profiling, frame meters: `pnpm parity` (`packages/runtime-native/conformance/registry.json`), `profile:native-cpu`, `bench:engines`, playtest `perf --file|--executable|--logcat`. What to verify next: `pnpm round:next`, `round:deletions`, `alpha:bar`. diff --git a/CLAUDE.md b/CLAUDE.md index 8a6cabc2b8..87a1dde0d7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -82,7 +82,7 @@ pnpm native:verify:desktop # 300 native frames + a non-blank scr **CI.** The pre-push hook runs `pnpm ci:fast` drift checks only; it proves no runtime behaviour. `pnpm ci:local --full` runs the full board; `pnpm ci:local --affected --base origin/develop --target develop` runs what CI would select (dirty or unknown inputs fall back to full). A change touching only Markdown that no fixture consumes (not `AGENTS.md`/`CLAUDE.md`) runs no product CI job. PRs and merge groups into develop use the complete candidate diff: CI-only changes run CI contracts, exact template changes run scaffolder contracts and affected templates, and shared/unknown executable inputs keep exhaustive coverage. Main qualification and scheduled audits remain exhaustive. Template scenarios run once per kit; selective changes run one representative golden journey and full qualification retains both starter and platformer journeys. `ci-required` rejects missing or failed selected checks; retained contexts include `supply-chain`, `template-nonvisual`, `golden-path`, and native `desktop-parity` when applicable. Native host/platform tests run for native or shared runtime consumers, main qualification and unresolved scopes. Unsafe matrix/reusable verdict reuse stays disabled until authoritative complete coverage and per-leg routing exist. A new candidate runs fresh tests; only exact-run immutable build artifacts are shared. Details: `docs/PRDs/CI/PRD-483-impact-driven-ci-without-repeated-template-setup.md` and `docs/PRDs/done/PRD-373-selective-ci-and-develop-promotion.md`. Registry commands read auth from `~/.npmrc`; pass a checkout-local untracked `.npmrc` with `npm --userconfig .npmrc `. Never print either file. -TypeScript 5.9 `strict`, **ESM only**; relative imports end in `.js`. Versions come from the `catalog:` in `pnpm-workspace.yaml`, templates excepted. Biome formats — never hand-format. Interfaces are `I`-prefixed; classes and type aliases are not. Unit tests: `/__tests__/*.spec.ts`, vitest, node environment, DOM and GPU stubbed. +TypeScript 7 `strict` (the native `tsc`); `typescript` imports use the official TypeScript 6 compatibility API for AST scripts and tsup declarations, **ESM only**; relative imports end in `.js`. Versions come from the `catalog:` in `pnpm-workspace.yaml`, templates excepted. Biome formats — never hand-format. Interfaces are `I`-prefixed; classes and type aliases are not. Unit tests: `/__tests__/*.spec.ts`, vitest, node environment, DOM and GPU stubbed. **Existing harnesses — use them, don't rebuild them.** Capability lookup: `capabilities.json`, `packages/engine-mcp`. Behaviour on browser/Android/desktop/iOS: `packages/playtest --target `. User-like install and agent-friction arms: `pnpm sandbox`, `pnpm sweep:capture|judge|pair`, `scripts/score-blind.ts`. Visual baselines and LOC vs plain Three.js: `pnpm visuals`, `visuals:ab`, `visuals:baseline`, `pnpm tsx scripts/count-loc.ts`. Web-vs-native, profiling, frame meters: `pnpm parity` (`packages/runtime-native/conformance/registry.json`), `profile:native-cpu`, `bench:engines`, playtest `perf --file|--executable|--logcat`. What to verify next: `pnpm round:next`, `round:deletions`, `alpha:bar`. diff --git a/examples/abyss-framework/package.json b/examples/abyss-framework/package.json index e37fe7a7e9..0f396220fa 100644 --- a/examples/abyss-framework/package.json +++ b/examples/abyss-framework/package.json @@ -31,7 +31,8 @@ "create-threenative": "workspace:*", "tailwindcss": "catalog:", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" }, "optionalDependencies": { "@threenative/runtime-native": "workspace:*" diff --git a/examples/auto-lod/package.json b/examples/auto-lod/package.json index a050cc35b6..fdbd004fbf 100644 --- a/examples/auto-lod/package.json +++ b/examples/auto-lod/package.json @@ -22,6 +22,7 @@ "@threenative/runtime-native": "workspace:*", "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/constrained-ik/package.json b/examples/constrained-ik/package.json index b67b0b3294..7f00c1cdd7 100644 --- a/examples/constrained-ik/package.json +++ b/examples/constrained-ik/package.json @@ -3,7 +3,9 @@ "version": "0.1.0", "private": true, "type": "module", - "threenative": { "nativeEntry": "src/game.ts" }, + "threenative": { + "nativeEntry": "src/game.ts" + }, "scripts": { "setup": "npm --prefix ../integrations/ik install --ignore-scripts --no-audit --no-fund", "dev": "vite --host 127.0.0.1", @@ -18,6 +20,7 @@ "devDependencies": { "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/csg-doorway/package.json b/examples/csg-doorway/package.json index 365ce28aea..9b657ee3b0 100644 --- a/examples/csg-doorway/package.json +++ b/examples/csg-doorway/package.json @@ -24,6 +24,7 @@ "@threenative/runtime-native": "workspace:*", "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/fps-friction/package.json b/examples/fps-friction/package.json index 8101406594..6353952eb6 100644 --- a/examples/fps-friction/package.json +++ b/examples/fps-friction/package.json @@ -18,6 +18,7 @@ "devDependencies": { "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/native-smoke/package.json b/examples/native-smoke/package.json index 2006b8a15a..3b001594a3 100644 --- a/examples/native-smoke/package.json +++ b/examples/native-smoke/package.json @@ -21,6 +21,7 @@ "react": "catalog:", "react-dom": "catalog:", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/prd140-picking/package.json b/examples/prd140-picking/package.json index 37c72c6902..f0607afa4c 100644 --- a/examples/prd140-picking/package.json +++ b/examples/prd140-picking/package.json @@ -17,6 +17,7 @@ "devDependencies": { "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/prd162-replay/package.json b/examples/prd162-replay/package.json index a8fdbfb9a9..dced8ea336 100644 --- a/examples/prd162-replay/package.json +++ b/examples/prd162-replay/package.json @@ -19,7 +19,8 @@ "@types/three": "0.185.3", "create-threenative": "0.2.2", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" }, "optionalDependencies": { "@threenative/runtime-native": "0.2.0" diff --git a/examples/prd242-compute-lifetime/package.json b/examples/prd242-compute-lifetime/package.json index 44957fd491..c323ff38f6 100644 --- a/examples/prd242-compute-lifetime/package.json +++ b/examples/prd242-compute-lifetime/package.json @@ -17,6 +17,7 @@ "devDependencies": { "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/prd243-cloth/package.json b/examples/prd243-cloth/package.json index 7b95d0c458..035150f0d7 100644 --- a/examples/prd243-cloth/package.json +++ b/examples/prd243-cloth/package.json @@ -17,6 +17,7 @@ "devDependencies": { "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/prd249-fluid-field/package.json b/examples/prd249-fluid-field/package.json index c52d968e68..f463a41cc7 100644 --- a/examples/prd249-fluid-field/package.json +++ b/examples/prd249-fluid-field/package.json @@ -17,6 +17,7 @@ "devDependencies": { "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/prd268-probe-volume/package.json b/examples/prd268-probe-volume/package.json index 1ecfad4027..036fc93bac 100644 --- a/examples/prd268-probe-volume/package.json +++ b/examples/prd268-probe-volume/package.json @@ -15,6 +15,7 @@ "devDependencies": { "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/prd307-environment-cost/package.json b/examples/prd307-environment-cost/package.json index d7aab53f1d..d3e8791b73 100644 --- a/examples/prd307-environment-cost/package.json +++ b/examples/prd307-environment-cost/package.json @@ -15,6 +15,7 @@ "devDependencies": { "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/prd314-clip-audit/package.json b/examples/prd314-clip-audit/package.json index 7e8046cd26..e4c1bb1d52 100644 --- a/examples/prd314-clip-audit/package.json +++ b/examples/prd314-clip-audit/package.json @@ -15,6 +15,7 @@ "devDependencies": { "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/prd476-fluid-particles/package.json b/examples/prd476-fluid-particles/package.json index 10801707cf..5f9a9a4c24 100644 --- a/examples/prd476-fluid-particles/package.json +++ b/examples/prd476-fluid-particles/package.json @@ -18,6 +18,7 @@ "devDependencies": { "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/prd476-fluid-particles/src/collision-proof.ts b/examples/prd476-fluid-particles/src/collision-proof.ts index dc09afd820..e35f6d1d41 100644 --- a/examples/prd476-fluid-particles/src/collision-proof.ts +++ b/examples/prd476-fluid-particles/src/collision-proof.ts @@ -71,7 +71,7 @@ async function start({ gateClosed = true, validationControl = false } = {}) { // Deliberately invalid actual WebGPU usage verifies that the scope producer rejects errors. if (validationControl) device.createBuffer({ size: 4, usage: 0 }); const adapterInfo = Object.fromEntries( - ["architecture", "description", "device", "vendor"].map((field) => [ + (["architecture", "description", "device", "vendor"] as const).map((field) => [ field, adapter.info[field] ?? "", ]), diff --git a/examples/quarry/package.json b/examples/quarry/package.json index d036442043..34d624f428 100644 --- a/examples/quarry/package.json +++ b/examples/quarry/package.json @@ -25,6 +25,7 @@ "pngjs": "7.0.0", "tsx": "4.23.5", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/skinned-crowd/package.json b/examples/skinned-crowd/package.json index c5739409cd..a169aec225 100644 --- a/examples/skinned-crowd/package.json +++ b/examples/skinned-crowd/package.json @@ -3,7 +3,9 @@ "version": "0.1.0", "private": true, "type": "module", - "threenative": { "nativeEntry": "src/game.ts" }, + "threenative": { + "nativeEntry": "src/game.ts" + }, "scripts": { "build": "vite build", "build:desktop": "node ../../packages/runtime-native/scripts/bundle.mjs --project . --entry src/game.ts --target desktop --output dist/skinned-crowd-native.js", @@ -17,6 +19,7 @@ "devDependencies": { "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/examples/vfx-gallery/package.json b/examples/vfx-gallery/package.json index ec6deee2b0..cc4cf2fdc8 100644 --- a/examples/vfx-gallery/package.json +++ b/examples/vfx-gallery/package.json @@ -19,7 +19,8 @@ "@threenative/playtest": "workspace:*", "@types/three": "0.185.3", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" }, "optionalDependencies": { "@threenative/runtime-native": "workspace:*" diff --git a/package.json b/package.json index 917d33af0d..205a2bfc5c 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,8 @@ "pngjs": "7.0.0", "tsx": "4.23.5", "typescript": "catalog:", - "vitest": "4.1.10" + "vitest": "4.1.10", + "@typescript/native": "catalog:" }, "description": "ThreeNative is an application framework for games whose same vanilla Three.js source runs in the browser on WebGPU and on an owned C++ runtime for desktop and Android. It uses Godot-shaped node names, React and Tailwind for UI, and vanilla `three` underneath on every surface.", "pnpm": { diff --git a/packages/assets/package.json b/packages/assets/package.json index 9648fc7344..77da8576cb 100644 --- a/packages/assets/package.json +++ b/packages/assets/package.json @@ -42,7 +42,8 @@ "publint": "0.3.22", "threenative-blender-mcp": "workspace:*", "tsup": "8.5.1", - "typescript": "catalog:" + "typescript": "catalog:", + "@typescript/native": "catalog:" }, "dependencies": { "@gltf-transform/core": "catalog:", diff --git a/packages/blender-mcp/package.json b/packages/blender-mcp/package.json index 00f094cd49..65dd8fe3d0 100644 --- a/packages/blender-mcp/package.json +++ b/packages/blender-mcp/package.json @@ -45,6 +45,7 @@ "@gltf-transform/core": "catalog:", "publint": "0.3.22", "tsup": "8.5.1", - "typescript": "catalog:" + "typescript": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/packages/core/package.json b/packages/core/package.json index 00a8f85d45..e103199517 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -97,7 +97,8 @@ "threenative-blender-mcp": "workspace:*", "threenative-engine-mcp": "workspace:*", "tsup": "8.5.1", - "typescript": "catalog:" + "typescript": "catalog:", + "@typescript/native": "catalog:" }, "peerDependencies": { "@threenative/playtest": ">=0.3.4 <0.4.0", diff --git a/packages/create-threenative/__tests__/config.spec.ts b/packages/create-threenative/__tests__/config.spec.ts index f4717c46c1..7c63126ff3 100644 --- a/packages/create-threenative/__tests__/config.spec.ts +++ b/packages/create-threenative/__tests__/config.spec.ts @@ -135,7 +135,8 @@ export const rejected: IAudioConfig = { ${rejectedKey}: 2 }; `, ); const outcome = (await execFileAsync(process.execPath, [ - path.resolve("packages/core/node_modules/typescript/bin/tsc"), + path.resolve("packages/core/node_modules/@typescript/native/bin/tsc"), + "--ignoreConfig", "--noEmit", "--strict", "--target", diff --git a/packages/create-threenative/__tests__/scaffold.spec.ts b/packages/create-threenative/__tests__/scaffold.spec.ts index b240e322e4..d6710f430c 100644 --- a/packages/create-threenative/__tests__/scaffold.spec.ts +++ b/packages/create-threenative/__tests__/scaffold.spec.ts @@ -172,25 +172,27 @@ const BUG_REPORT_SKILL_PATHS = [ // docs/verification/prd339-exposure-proof/completion-consumer-8bf16f4.json. // Current develop c18a42b integration: all13 actual generated trees were byte-compared // against reviewed 8bf trees; only the copied Three compute-only Storage3DTexture patch changed. +// TypeScript 7 upgrade: all 13 actual generated trees recover the prior hash when only +// package.json is restored. Compiler manifest bytes are the entire scaffold delta. const PRD_201_PARENT_SCAFFOLD_HASHES: Readonly> = { // Measured through actual createProject trees after exposure/fog consolidation and restamping, // then again on the merge carrying the WebGPU adapter-retention Three patch: the scaffolded // `patches/three@0.185.1.patch` is the only byte that moved on top of the exposure/fog tree, so // all thirteen trees move again. Values below are the merged-tree measurement, not either side's. - "action-rpg": "6aa05e1a9e39719f30242ddee588a91236fbfdbf6b75ec252e91d56effccb49a", - minimal: "ced30816bf592b829d655941da8cfb8555295fe45fd915d73ed1605a15a2a8f9", - platformer: "de6323b7fd05a66ce5e89415df962ed59eae765c65346a71488c609381bf14c6", - puzzle: "5c7eea6460b6f6718018cf3a5ffd9f9ccaeffa219fc3337cb7216008af2ef03f", - racing: "0e9c54935e58bacf835aa10e6d633f1360da394e759714903d7d36f6e04bf38b", - rain: "9b406dc1d87df403e4bff9f825fa4ad824e71cfb77dfb482d0a4da5b54f4e91b", - rts: "54b9ee0cdfe8d4cae460efacc348fba30ac6bf04680b282c789eeec619ed2481", - runner: "30695f2421a37adbeace02a2d30523da187c208b37252d93970f38f1618f064b", + "action-rpg": "db07064e9b6ddaf0415ab60c2fb54d6ca56084c87bff87e49fafe4844136fbbb", + minimal: "dba512d781349fc972bc90fab3e6307674aab9c6ea733b9cf2d5791ac3eb5ace", + platformer: "b62f09bb1f3ffc4894af515fe2821a5b8ec6d4e75474e0de3a808084d1e3cecf", + puzzle: "9bca4fcc9c55caa70645c1960be2f61219513ca4a1e92f7d9ef0ecd13dced69d", + racing: "940c37919b667fbd9823e01c73a3b99b60f0815709f9bbf1d956d24392ca7030", + rain: "0096a3103c5e9d6bf3b43184aaa7f1fb06f5732166b3c310bc4c447a35ed90ce", + rts: "d63cc1c0c0033b6d25269ecc64c5add970f3f7c2776d17ad93a2cffe68d3b015", + runner: "250abc329712cddaf25f812d1409048136802db5070f765cb8fb7f1c76c2d92e", // Initial finite-height readiness plus its scene-owned lifecycle helper and mirrored docs. - sailing: "a4e1a5c72086968e3137eb6b4a8168d0a74f28d292a21f4f82bcd355d9e9138e", - shooter: "668cb308dfaaa2cc86431bb71db895f8e5c8d9e6562bb4e333ac5a0b6618e046", - snow: "550ef7eff2c6df576716145d3b75c2956ac6413a24a1d5463c4d6c6c6ca9575b", - starter: "77d9c77d83cfc2d28e857303f07c1cca498e1135ee3474ac27fac43dfb6337a9", - "tower-defense": "ebed6e13a9be25ba48f6dcb41e2a23fc4798b074d46af688333c326771e919dc", + sailing: "f3b66289b6ec1a5e28e33b4022a3fad8798fb1a5e86b3c5e6f83c344d730e590", + shooter: "71a072f4fc1bdda3bc2162c011f8477248ee2c905a4a5ac7f5b92b3a078722b5", + snow: "0c877dcf381c6e17df89cb9dba8a8181bbde3cf03c78e56ffd1ea15e9f0777d8", + starter: "706caaa2619d5011ad17b3a387c2a7867f5d8502d574df9b8a1d2878ab94bd7d", + "tower-defense": "78a94b927e618cc8393933750a0f4af6bca690a67f706143c89392697a4b5795", }; const GENERATED_SCAFFOLD_METADATA = diff --git a/packages/create-threenative/__tests__/template.spec.ts b/packages/create-threenative/__tests__/template.spec.ts index b83d8b2977..3951d36da4 100644 --- a/packages/create-threenative/__tests__/template.spec.ts +++ b/packages/create-threenative/__tests__/template.spec.ts @@ -140,12 +140,25 @@ async function linkScaffoldDependencies(target: string): Promise { path.resolve("packages/physics/node_modules/@dimforge/rapier3d-compat"), ); await linkDependency(target, "zustand", path.resolve("packages/core/node_modules/zustand")); - await linkDependency(target, "typescript", path.resolve("packages/core/node_modules/typescript")); + await linkDependency( + target, + "typescript", + path.resolve( + packageJson.devDependencies?.["@typescript/native"] === undefined + ? "packages/core/node_modules/@typescript/native" + : "packages/core/node_modules/typescript", + ), + ); + await linkDependency( + target, + "@typescript/native", + path.resolve("packages/core/node_modules/@typescript/native"), + ); await linkDependency(target, "vite", await findPnpmPackage("vite")); await linkDependency(target, "@types/node", await findPnpmPackage("@types/node")); await mkdir(path.join(target, "node_modules/.bin"), { recursive: true }); await symlink( - path.resolve("packages/core/node_modules/typescript/bin/tsc"), + path.resolve("packages/core/node_modules/@typescript/native/bin/tsc"), path.join(target, "node_modules/.bin/tsc"), ); } diff --git a/packages/create-threenative/package.json b/packages/create-threenative/package.json index 40d92e4e71..5656ad9768 100644 --- a/packages/create-threenative/package.json +++ b/packages/create-threenative/package.json @@ -86,7 +86,8 @@ "threenative-blender-mcp": "workspace:*", "tsup": "8.5.1", "typescript": "catalog:", - "vite": "catalog:" + "vite": "catalog:", + "@typescript/native": "catalog:" }, "peerDependencies": { "@threenative/assets": ">=0.3.5 <0.4.0" diff --git a/packages/create-threenative/templates/action-rpg/package.json b/packages/create-threenative/templates/action-rpg/package.json index 3d7ed0e93a..b37621d7a9 100644 --- a/packages/create-threenative/templates/action-rpg/package.json +++ b/packages/create-threenative/templates/action-rpg/package.json @@ -36,7 +36,7 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0" }, "optionalDependencies": { diff --git a/packages/create-threenative/templates/minimal/package.json b/packages/create-threenative/templates/minimal/package.json index 327740be67..eae15cf9c0 100644 --- a/packages/create-threenative/templates/minimal/package.json +++ b/packages/create-threenative/templates/minimal/package.json @@ -27,7 +27,7 @@ "create-threenative": "0.2.8", "esbuild": "0.27.0", "playwright": "1.62.1", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0", "@gltf-transform/cli": "4.4.2" }, diff --git a/packages/create-threenative/templates/platformer/package.json b/packages/create-threenative/templates/platformer/package.json index 58773eb5e8..81b9255655 100644 --- a/packages/create-threenative/templates/platformer/package.json +++ b/packages/create-threenative/templates/platformer/package.json @@ -35,7 +35,7 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0", "@gltf-transform/cli": "4.4.2" }, diff --git a/packages/create-threenative/templates/puzzle/package.json b/packages/create-threenative/templates/puzzle/package.json index 53870872fa..640452c52d 100644 --- a/packages/create-threenative/templates/puzzle/package.json +++ b/packages/create-threenative/templates/puzzle/package.json @@ -35,7 +35,7 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0" }, "optionalDependencies": { diff --git a/packages/create-threenative/templates/racing/package.json b/packages/create-threenative/templates/racing/package.json index 046f2df284..c3c2c0d589 100644 --- a/packages/create-threenative/templates/racing/package.json +++ b/packages/create-threenative/templates/racing/package.json @@ -36,7 +36,7 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0" }, "optionalDependencies": { diff --git a/packages/create-threenative/templates/rain/package.json b/packages/create-threenative/templates/rain/package.json index f796ec7e5d..76667ee8ab 100644 --- a/packages/create-threenative/templates/rain/package.json +++ b/packages/create-threenative/templates/rain/package.json @@ -34,9 +34,10 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "npm:@typescript/typescript6@6.0.2", "vite": "8.2.0", - "@gltf-transform/cli": "4.4.2" + "@gltf-transform/cli": "4.4.2", + "@typescript/native": "npm:typescript@7.0.2" }, "optionalDependencies": { "@threenative/runtime-native": "0.3.4" diff --git a/packages/create-threenative/templates/rts/package.json b/packages/create-threenative/templates/rts/package.json index 115f40a27c..d21175b12c 100644 --- a/packages/create-threenative/templates/rts/package.json +++ b/packages/create-threenative/templates/rts/package.json @@ -35,7 +35,7 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0" }, "optionalDependencies": { diff --git a/packages/create-threenative/templates/runner/package.json b/packages/create-threenative/templates/runner/package.json index 53870872fa..640452c52d 100644 --- a/packages/create-threenative/templates/runner/package.json +++ b/packages/create-threenative/templates/runner/package.json @@ -35,7 +35,7 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0" }, "optionalDependencies": { diff --git a/packages/create-threenative/templates/sailing/package.json b/packages/create-threenative/templates/sailing/package.json index cf9dcb7e75..a6189c5fec 100644 --- a/packages/create-threenative/templates/sailing/package.json +++ b/packages/create-threenative/templates/sailing/package.json @@ -36,7 +36,7 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0", "@gltf-transform/cli": "4.4.2" }, diff --git a/packages/create-threenative/templates/shooter/package.json b/packages/create-threenative/templates/shooter/package.json index 3134aab85b..8aff2c0df4 100644 --- a/packages/create-threenative/templates/shooter/package.json +++ b/packages/create-threenative/templates/shooter/package.json @@ -35,7 +35,7 @@ "create-threenative": "0.2.8", "esbuild": "0.27.0", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0", "@gltf-transform/cli": "4.4.2" }, diff --git a/packages/create-threenative/templates/snow/package.json b/packages/create-threenative/templates/snow/package.json index 9a53bc14f6..612c62fabb 100644 --- a/packages/create-threenative/templates/snow/package.json +++ b/packages/create-threenative/templates/snow/package.json @@ -36,7 +36,7 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0", "@gltf-transform/cli": "4.4.2" }, diff --git a/packages/create-threenative/templates/starter/package.json b/packages/create-threenative/templates/starter/package.json index 90e58d1a8d..1f42a9ac48 100644 --- a/packages/create-threenative/templates/starter/package.json +++ b/packages/create-threenative/templates/starter/package.json @@ -37,7 +37,7 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0", "@gltf-transform/cli": "4.4.2" }, diff --git a/packages/create-threenative/templates/tower-defense/package.json b/packages/create-threenative/templates/tower-defense/package.json index 53870872fa..640452c52d 100644 --- a/packages/create-threenative/templates/tower-defense/package.json +++ b/packages/create-threenative/templates/tower-defense/package.json @@ -35,7 +35,7 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "5.9.3", + "typescript": "7.0.2", "vite": "8.2.0" }, "optionalDependencies": { diff --git a/packages/engine-mcp/package.json b/packages/engine-mcp/package.json index 9ae708e684..18943dd137 100644 --- a/packages/engine-mcp/package.json +++ b/packages/engine-mcp/package.json @@ -48,6 +48,7 @@ "devDependencies": { "publint": "0.3.22", "tsup": "8.5.1", - "typescript": "catalog:" + "typescript": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/packages/metahuman/package.json b/packages/metahuman/package.json index 7a72461fc8..8e0adb5616 100644 --- a/packages/metahuman/package.json +++ b/packages/metahuman/package.json @@ -58,6 +58,7 @@ "publint": "0.3.22", "three": "catalog:", "tsup": "8.5.1", - "typescript": "catalog:" + "typescript": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/packages/physics/package.json b/packages/physics/package.json index 3b887a1fcf..3dc7453d04 100644 --- a/packages/physics/package.json +++ b/packages/physics/package.json @@ -53,6 +53,7 @@ "publint": "0.3.22", "three": "catalog:", "tsup": "8.5.1", - "typescript": "catalog:" + "typescript": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/packages/playtest/__tests__/trace-run.spec.ts b/packages/playtest/__tests__/trace-run.spec.ts index 8c1865e698..a88dc3aaba 100644 --- a/packages/playtest/__tests__/trace-run.spec.ts +++ b/packages/playtest/__tests__/trace-run.spec.ts @@ -8,6 +8,7 @@ const originalGpuDevice = Object.getOwnPropertyDescriptor(globalThis, "GPUDevice afterEach(() => { vi.restoreAllMocks(); Reflect.deleteProperty(globalThis, PIPELINE_DIAGNOSTICS); + Reflect.deleteProperty(globalThis, "__TN_TRACE_GPU_PIPELINES_INSTALLED__"); if (originalGpuDevice === undefined) Reflect.deleteProperty(globalThis, "GPUDevice"); else Object.defineProperty(globalThis, "GPUDevice", originalGpuDevice); }); @@ -54,7 +55,9 @@ describe("GPU pipeline diagnostics", () => { Object.defineProperty(globalThis, "GPUDevice", { configurable: true, value: FakeGpuDevice }); vi.spyOn(console, "error").mockImplementation(() => undefined); + const original = FakeGpuDevice.prototype.createRenderPipelineAsync; installGpuPipelineDiagnostics(); + expect(FakeGpuDevice.prototype.createRenderPipelineAsync).not.toBe(original); await new FakeGpuDevice().createRenderPipelineAsync({ depthStencil: { format: "depth24plus" } }); expect((globalThis as Record)[PIPELINE_DIAGNOSTICS]).toEqual([]); diff --git a/packages/playtest/package.json b/packages/playtest/package.json index a48e41a673..c7b39a531c 100644 --- a/packages/playtest/package.json +++ b/packages/playtest/package.json @@ -86,6 +86,7 @@ "publint": "0.3.22", "three": "catalog:", "tsup": "8.5.1", - "typescript": "catalog:" + "typescript": "catalog:", + "@typescript/native": "catalog:" } } diff --git a/packages/playtest/src/runner/observationSampling.ts b/packages/playtest/src/runner/observationSampling.ts index ad1ec09ac6..9b9cf1273d 100644 --- a/packages/playtest/src/runner/observationSampling.ts +++ b/packages/playtest/src/runner/observationSampling.ts @@ -153,9 +153,9 @@ export async function readCaptureProvenance( const observed = await page.evaluate(async () => { type Adapter = { features?: Iterable; - info?: Record; - limits?: Record; - requestAdapterInfo?: () => Promise>; + info?: Partial>; + limits?: Partial>; + requestAdapterInfo?: () => Promise>>; }; const gpu = (globalThis.navigator as Navigator & { gpu?: { requestAdapter(): Promise } }).gpu; // Which of the four ways an adapter can be unavailable actually happened is the diagnosis: @@ -181,7 +181,7 @@ export async function readCaptureProvenance( const info = infoCandidate === undefined || Object.keys(infoCandidate).length === 0 ? legacyInfo ?? infoCandidate : infoCandidate; - const adapterIdentityKeys = ["architecture", "description", "device", "vendor"]; + const adapterIdentityKeys = ["architecture", "description", "device", "vendor"] as const; const adapterIdentityEntries: Array<[string, string]> = info === undefined ? [] : adapterIdentityKeys.flatMap((key) => { @@ -195,7 +195,7 @@ export async function readCaptureProvenance( if (features.length > 0) webgpuAdapterEntries.push(["features", features.join(",")]); } if (adapterIdentityEntries.length > 0) { - for (const key of ["maxBindGroups", "maxTextureDimension2D", "maxStorageBufferBindingSize"]) { + for (const key of ["maxBindGroups", "maxTextureDimension2D", "maxStorageBufferBindingSize"] as const) { const value = adapter?.limits?.[key]; if (typeof value === "number" && Number.isFinite(value)) webgpuAdapterEntries.push([`limit.${key}`, String(value)]); } diff --git a/packages/playtest/src/runner/traceRun.ts b/packages/playtest/src/runner/traceRun.ts index f46f236f79..b991a8508f 100644 --- a/packages/playtest/src/runner/traceRun.ts +++ b/packages/playtest/src/runner/traceRun.ts @@ -166,7 +166,7 @@ async function recordTrace(args: ITraceArgs, output: string): Promise>; + readonly depthStencil?: { readonly format?: unknown }; readonly label?: string; }; type PipelineDiagnostic = { @@ -174,11 +174,12 @@ export function installGpuPipelineDiagnostics(): void { readonly label?: string; readonly stack: string; }; - const globals = globalThis as typeof globalThis & { - GPUDevice?: { prototype?: { createRenderPipelineAsync?: (descriptor: PipelineDescriptor) => Promise } }; + const globals: { + console: Pick; + GPUDevice?: { prototype?: { createRenderPipelineAsync?(descriptor: PipelineDescriptor): Promise } }; __TN_TRACE_INVALID_GPU_PIPELINES__?: PipelineDiagnostic[]; __TN_TRACE_GPU_PIPELINES_INSTALLED__?: boolean; - }; + } = globalThis; globals.__TN_TRACE_INVALID_GPU_PIPELINES__ = []; if (globals.__TN_TRACE_GPU_PIPELINES_INSTALLED__ === true) return; const prototype = globals.GPUDevice?.prototype; @@ -194,7 +195,7 @@ export function installGpuPipelineDiagnostics(): void { stack: new Error("createRenderPipelineAsync called without depthStencil.format").stack ?? "stack unavailable", }; globals.__TN_TRACE_INVALID_GPU_PIPELINES__?.push(diagnostic); - console.error("TN_INVALID_DEPTH_PIPELINE", diagnostic); + globals.console.error("TN_INVALID_DEPTH_PIPELINE", diagnostic); } return create.call(this, descriptor); }; diff --git a/packages/raw-unreal/package.json b/packages/raw-unreal/package.json index 16ff115810..1d337feff8 100644 --- a/packages/raw-unreal/package.json +++ b/packages/raw-unreal/package.json @@ -2,7 +2,7 @@ "name": "@threenative/raw-unreal", "version": "0.1.4", "license": "MIT", - "description": "Loads raw Unreal editor .uasset static meshes directly into Three.js geometry — UE5 FMeshDescription and UE4.18 FRawMesh layouts, with no interchange conversion.", + "description": "Loads raw Unreal editor .uasset static meshes directly into Three.js geometry \u2014 UE5 FMeshDescription and UE4.18 FRawMesh layouts, with no interchange conversion.", "keywords": ["threenative", "unreal", "uasset", "static-mesh", "three", "threejs", "loader"], "homepage": "https://github.com/ThreeNativeHQ/threenative#readme", "bugs": { @@ -40,7 +40,8 @@ "ooz-wasm": "2.0.0", "publint": "0.3.22", "tsup": "8.5.1", - "typescript": "catalog:" + "typescript": "catalog:", + "@typescript/native": "catalog:" }, "dependencies": { "three": "catalog:" diff --git a/packages/ueformat/package.json b/packages/ueformat/package.json index 5a05fc2ca5..d6a033702e 100644 --- a/packages/ueformat/package.json +++ b/packages/ueformat/package.json @@ -42,7 +42,8 @@ "@types/three": "0.185.3", "publint": "0.3.22", "tsup": "8.5.1", - "typescript": "catalog:" + "typescript": "catalog:", + "@typescript/native": "catalog:" }, "dependencies": { "fflate": "catalog:", diff --git a/packages/ui/package.json b/packages/ui/package.json index ec29c06bfd..05918d6a39 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -44,7 +44,8 @@ "react-dom": "catalog:", "react-test-renderer": "catalog:", "tsup": "8.5.1", - "typescript": "catalog:" + "typescript": "catalog:", + "@typescript/native": "catalog:" }, "scripts": { "build": "tsup --config tsup.config.ts && publint", diff --git a/patches/tsup@8.5.1.patch b/patches/tsup@8.5.1.patch new file mode 100644 index 0000000000..370f0b1a08 --- /dev/null +++ b/patches/tsup@8.5.1.patch @@ -0,0 +1,11 @@ +diff --git a/dist/rollup.js b/dist/rollup.js +--- a/dist/rollup.js ++++ b/dist/rollup.js +@@ -6834,7 +6834,6 @@ + tsconfig: options.tsconfig, + compilerOptions: { + ...compilerOptions, +- baseUrl: compilerOptions.baseUrl || ".", + // Ensure ".d.ts" modules are generated + declaration: true, + // Skip ".js" generation diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6035423074..623953f8e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,6 +33,9 @@ catalogs: '@types/react-test-renderer': specifier: 19.1.0 version: 19.1.0 + '@typescript/native': + specifier: npm:typescript@7.0.2 + version: 7.0.2 '@vitejs/plugin-react': specifier: 6.0.5 version: 6.0.5 @@ -76,8 +79,8 @@ catalogs: specifier: 0.9.14 version: 0.9.14 typescript: - specifier: 5.9.3 - version: 5.9.3 + specifier: npm:@typescript/typescript6@6.0.2 + version: 6.0.2 vite: specifier: 8.2.0 version: 8.2.0 @@ -95,6 +98,9 @@ patchedDependencies: three@0.185.1: hash: c2e051df4c469d033b151cb9da5ce5112c90801aaaa984d6bfde0e09d80c9a66 path: packages/core/patches/three@0.185.1.patch + tsup@8.5.1: + hash: bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770 + path: patches/tsup@8.5.1.patch importers: @@ -121,6 +127,9 @@ importers: '@types/pngjs': specifier: 6.0.5 version: 6.0.5 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 '@vitest/coverage-v8': specifier: 'catalog:' version: 4.1.10(vitest@4.1.10) @@ -141,7 +150,7 @@ importers: version: 4.23.5 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vitest: specifier: 4.1.10 version: 4.1.10(@types/node@20.19.43)(@vitest/coverage-v8@4.1.10)(vite@8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5)) @@ -185,6 +194,9 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 '@vitejs/plugin-react': specifier: 'catalog:' version: 6.0.5(vite@8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5)) @@ -196,7 +208,7 @@ importers: version: 4.3.3 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -239,9 +251,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -258,9 +273,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -289,9 +307,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -327,9 +348,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -368,6 +392,9 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 react: specifier: 'catalog:' version: 19.2.0 @@ -376,7 +403,7 @@ importers: version: 19.2.0(react@19.2.0) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -393,9 +420,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -415,12 +445,15 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 create-threenative: specifier: 0.2.2 version: 0.2.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -441,9 +474,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -466,9 +502,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -488,9 +527,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -507,9 +549,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -526,9 +571,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -545,9 +593,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -570,9 +621,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -598,6 +652,9 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 pngjs: specifier: 7.0.0 version: 7.0.0 @@ -606,7 +663,7 @@ importers: version: 4.23.5 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -623,9 +680,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -645,9 +705,12 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5) @@ -710,6 +773,9 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 ooz-wasm: specifier: 2.0.0 version: 2.0.0 @@ -721,25 +787,28 @@ importers: version: link:../blender-mcp tsup: specifier: 8.5.1 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3) + version: 8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' packages/blender-mcp: devDependencies: '@gltf-transform/core': specifier: 'catalog:' version: 4.4.2 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 publint: specifier: 0.3.22 version: 0.3.22 tsup: specifier: 8.5.1 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3) + version: 8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' packages/core: dependencies: @@ -771,6 +840,9 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 publint: specifier: 0.3.22 version: 0.3.22 @@ -788,10 +860,10 @@ importers: version: link:../engine-mcp tsup: specifier: 8.5.1 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3) + version: 8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' packages/create-threenative: dependencies: @@ -835,6 +907,9 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 esbuild: specifier: 'catalog:' version: 0.27.0 @@ -846,25 +921,28 @@ importers: version: link:../blender-mcp tsup: specifier: 8.5.1 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3) + version: 8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.2.0(@types/node@20.19.43)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.23.5) packages/engine-mcp: devDependencies: + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 publint: specifier: 0.3.22 version: 0.3.22 tsup: specifier: 8.5.1 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3) + version: 8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' packages/metahuman: devDependencies: @@ -874,6 +952,9 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 publint: specifier: 0.3.22 version: 0.3.22 @@ -882,10 +963,10 @@ importers: version: 0.185.1(patch_hash=c2e051df4c469d033b151cb9da5ce5112c90801aaaa984d6bfde0e09d80c9a66) tsup: specifier: 8.5.1 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3) + version: 8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' packages/physics: dependencies: @@ -902,6 +983,9 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 publint: specifier: 0.3.22 version: 0.3.22 @@ -910,10 +994,10 @@ importers: version: 0.185.1(patch_hash=c2e051df4c469d033b151cb9da5ce5112c90801aaaa984d6bfde0e09d80c9a66) tsup: specifier: 8.5.1 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3) + version: 8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' packages/playtest: dependencies: @@ -927,6 +1011,9 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 playwright: specifier: 1.62.1 version: 1.62.1 @@ -938,10 +1025,10 @@ importers: version: 0.185.1(patch_hash=c2e051df4c469d033b151cb9da5ce5112c90801aaaa984d6bfde0e09d80c9a66) tsup: specifier: 8.5.1 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3) + version: 8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' packages/raw-unreal: dependencies: @@ -955,6 +1042,9 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 ooz-wasm: specifier: 2.0.0 version: 2.0.0 @@ -963,10 +1053,10 @@ importers: version: 0.3.22 tsup: specifier: 8.5.1 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3) + version: 8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' packages/runtime-native: dependencies: @@ -1008,15 +1098,18 @@ importers: '@types/three': specifier: 0.185.3 version: 0.185.3 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 publint: specifier: 0.3.22 version: 0.3.22 tsup: specifier: 8.5.1 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3) + version: 8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' packages/ui: devDependencies: @@ -1032,6 +1125,9 @@ importers: '@types/react-test-renderer': specifier: 'catalog:' version: 19.1.0 + '@typescript/native': + specifier: 'catalog:' + version: typescript@7.0.2 publint: specifier: 0.3.22 version: 0.3.22 @@ -1046,10 +1142,10 @@ importers: version: 19.2.0(react@19.2.0) tsup: specifier: 8.5.1 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3) + version: 8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5) typescript: specifier: 'catalog:' - version: 5.9.3 + version: '@typescript/typescript6@6.0.2' packages: @@ -2236,6 +2332,130 @@ packages: '@types/webxr@0.5.24': resolution: {integrity: sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==} + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@typescript/typescript6@6.0.2': + resolution: {integrity: sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==} + hasBin: true + '@vitejs/plugin-react@6.0.5': resolution: {integrity: sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3273,11 +3493,16 @@ packages: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} @@ -4247,6 +4472,70 @@ snapshots: '@types/webxr@0.5.24': {} + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + '@typescript/typescript6@6.0.2': + dependencies: + '@typescript/old': typescript@6.0.3 + '@vitejs/plugin-react@6.0.5(vite@8.2.0(@types/node@20.19.43)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.5))': dependencies: '@rolldown/pluginutils': 1.0.1 @@ -5336,7 +5625,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5)(typescript@5.9.3): + tsup@8.5.1(patch_hash=bdcba0cb0e0023b6ee572aae9dd40456c0c3bb0edd9c2abd290caed6ebef0770)(@typescript/typescript6@6.0.2)(jiti@2.7.0)(postcss@8.5.25)(tsx@4.23.5): dependencies: bundle-require: 5.1.0(esbuild@0.27.7) cac: 6.7.14 @@ -5357,7 +5646,7 @@ snapshots: tree-kill: 1.2.2 optionalDependencies: postcss: 8.5.25 - typescript: 5.9.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - jiti - supports-color @@ -5376,7 +5665,30 @@ snapshots: media-typer: 1.1.1 mime-types: 3.0.2 - typescript@5.9.3: {} + typescript@6.0.3: {} + + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 ufo@1.6.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 948cf4894e..04c7423591 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -26,7 +26,8 @@ catalog: '@tailwindcss/vite': 4.3.3 '@vitejs/plugin-react': 6.0.5 zod: 4.4.3 - typescript: 5.9.3 + typescript: npm:@typescript/typescript6@6.0.2 + '@typescript/native': npm:typescript@7.0.2 vite: 8.2.0 vitest: 4.1.10 esbuild: 0.27.0 @@ -38,3 +39,4 @@ catalog: patchedDependencies: three@0.185.1: packages/core/patches/three@0.185.1.patch + tsup@8.5.1: patches/tsup@8.5.1.patch diff --git a/scripts/__tests__/typescript-toolchain.spec.ts b/scripts/__tests__/typescript-toolchain.spec.ts new file mode 100644 index 0000000000..05ed4fa90e --- /dev/null +++ b/scripts/__tests__/typescript-toolchain.spec.ts @@ -0,0 +1,93 @@ +import { spawnSync } from "node:child_process"; +import { mkdirSync, readFileSync, symlinkSync, writeFileSync } from "node:fs"; +import { createRequire } from "node:module"; +import path from "node:path"; +import ts from "typescript"; +import { describe, expect, it } from "vitest"; +import { makeTempDir } from "../../test-support/temp-dir.js"; + +const root = path.resolve("."); +const native = path.join(root, "node_modules/@typescript/native/bin/tsc"); + +describe("native compiler and compatibility API", () => { + it("runs TypeScript 7 while retaining the documented compiler API", () => { + const result = spawnSync(process.execPath, [native, "--version"], { encoding: "utf8" }); + expect(result.status).toBe(0); + expect(result.stdout.trim()).toBe("Version 7.0.2"); + const require = createRequire(path.join(root, "package.json")); + expect(require("typescript/package.json").name).toBe("@typescript/typescript6"); + expect(require("typescript/package.json").version).toBe("6.0.2"); + const source = ts.createSourceFile( + "fixture.ts", + "export const value = 1;", + ts.ScriptTarget.ES2022, + ); + expect(source.statements).toHaveLength(1); + const tsupRequire = createRequire( + require.resolve("tsup", { paths: [path.join(root, "packages/core")] }), + ); + expect(tsupRequire.resolve("typescript")).toBe(require.resolve("typescript")); + }); + + it("keeps scaffold compiler identity separate from rain's shader API dependency", () => { + const templates = path.join(root, "packages/create-threenative/templates"); + const rain = JSON.parse(readFileSync(path.join(templates, "rain/package.json"), "utf8")); + const starter = JSON.parse(readFileSync(path.join(templates, "starter/package.json"), "utf8")); + expect(starter.devDependencies.typescript).toBe("7.0.2"); + expect(rain.devDependencies.typescript).toBe("npm:@typescript/typescript6@6.0.2"); + expect(rain.devDependencies["@typescript/native"]).toBe("npm:typescript@7.0.2"); + }); +}); + +describe("TypeScript 6 declaration worker compatibility", () => { + it("emits declarations without injecting baseUrl and preserves explicit options", async () => { + const cwd = await makeTempDir("threenative-tsup-compat-"); + writeFileSync( + path.join(cwd, "index.ts"), + "export interface IFixture { readonly value: number; }\n", + ); + writeFileSync(path.join(cwd, "package.json"), JSON.stringify({ type: "module" })); + mkdirSync(path.join(cwd, "node_modules")); + symlinkSync( + path.join(root, "node_modules/typescript"), + path.join(cwd, "node_modules/typescript"), + ); + const config = path.join(cwd, "tsconfig.json"); + const require = createRequire(path.join(root, "packages/core/package.json")); + const cli = path.join( + path.dirname(require.resolve("tsup/package.json")), + "dist/cli-default.js", + ); + const run = () => + spawnSync( + process.execPath, + [cli, "index.ts", "--dts-only", "--format", "esm", "--tsconfig", config], + { cwd, encoding: "utf8", timeout: 30_000 }, + ); + writeFileSync( + config, + JSON.stringify({ + compilerOptions: { strict: true, module: "ESNext", moduleResolution: "Bundler" }, + }), + ); + const valid = run(); + expect(valid.status, valid.stdout + valid.stderr).toBe(0); + expect(readFileSync(path.join(cwd, "dist/index.d.ts"), "utf8")).toContain( + "readonly value: number", + ); + writeFileSync( + config, + JSON.stringify({ + compilerOptions: { + strict: true, + module: "ESNext", + moduleResolution: "Bundler", + baseUrl: ".", + }, + }), + ); + const deprecated = run(); + expect(deprecated.status).not.toBe(0); + expect(deprecated.stdout + deprecated.stderr).toContain("Option 'baseUrl' is deprecated"); + }, 60_000); +}); diff --git a/scripts/make-sandbox.ts b/scripts/make-sandbox.ts index c7844515e5..9aeeb0b9df 100644 --- a/scripts/make-sandbox.ts +++ b/scripts/make-sandbox.ts @@ -445,7 +445,7 @@ function vanillaPackageJson(projectName: string, playtestTarball: string): strin devDependencies: { "@types/three": "0.185.3", playwright: "1.62.1", - typescript: "5.9.3", + typescript: "7.0.2", vite: "8.2.0", }, }, diff --git a/scripts/realism-effects-visual.ts b/scripts/realism-effects-visual.ts index cdc66aeef3..20438679d3 100644 --- a/scripts/realism-effects-visual.ts +++ b/scripts/realism-effects-visual.ts @@ -163,10 +163,10 @@ async function readAdapterInfo( gpu?: { requestAdapter(): Promise<{ info?: Record } | null> }; }; const adapter = await gpuNavigator.gpu?.requestAdapter(); - const raw = adapter?.info ?? {}; + const raw = adapter?.info; return Object.fromEntries( - ["architecture", "description", "device", "vendor"].flatMap((key) => { - const value = raw[key]; + (["architecture", "description", "device", "vendor"] as const).flatMap((key) => { + const value = raw?.[key]; return typeof value === "string" && value.trim() !== "" ? [[key, value]] : []; }), ); diff --git a/test-support/webgpu-provenance.ts b/test-support/webgpu-provenance.ts index a732e92b57..3e6f625a92 100644 --- a/test-support/webgpu-provenance.ts +++ b/test-support/webgpu-provenance.ts @@ -65,7 +65,9 @@ export async function readWebGpuAdapterInfo( return page.evaluate(async () => { const adapterIdentityKeys = ["architecture", "description", "device", "vendor"] as const; type Adapter = { - info?: Record; + info?: Partial< + Record<"architecture" | "description" | "device" | "vendor" | "isFallbackAdapter", unknown> + >; isFallbackAdapter?: boolean; }; @@ -84,7 +86,7 @@ export async function readWebGpuAdapterInfo( } function adapterFields( - info: Record, + info: NonNullable, adapter: Adapter, ): Record { const fallback = info.isFallbackAdapter ?? adapter.isFallbackAdapter; diff --git a/tsconfig.base.json b/tsconfig.base.json index b26a90fb97..2284878bdb 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -13,6 +13,7 @@ "noImplicitOverride": true, "moduleDetection": "force", "skipLibCheck": true, - "lib": ["ES2022", "DOM", "DOM.Iterable"] + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["node"] } } diff --git a/tsconfig.json b/tsconfig.json index e91e6217d8..8d9e4fa2f2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,13 +4,12 @@ "jsx": "react-jsx", "types": ["node"], "allowJs": false, - "baseUrl": ".", "paths": { - "@threenative/core": ["packages/core/src/index.ts"], - "@threenative/core/playtest": ["packages/core/src/playtest.ts"], - "@threenative/physics": ["packages/physics/src/index.ts"], - "@threenative/playtest": ["packages/playtest/src/index.ts"], - "@threenative/ui": ["packages/ui/src/index.ts"] + "@threenative/core": ["./packages/core/src/index.ts"], + "@threenative/core/playtest": ["./packages/core/src/playtest.ts"], + "@threenative/physics": ["./packages/physics/src/index.ts"], + "@threenative/playtest": ["./packages/playtest/src/index.ts"], + "@threenative/ui": ["./packages/ui/src/index.ts"] } }, "include": [ From 479a7a816ddff52ed8e1c8b896c5866aa5e0960b Mon Sep 17 00:00:00 2001 From: Joao Paulo Furtado Date: Sun, 4 Oct 2026 12:51:58 -0700 Subject: [PATCH 2/2] fix(scaffold): keep native compiler pins consistent --- .../__tests__/scaffold.spec.ts | 4 ++-- .../__tests__/template.spec.ts | 16 +++++++--------- packages/create-threenative/package.json | 3 ++- .../templates/rain/package.json | 4 ++-- .../templates/rain/tools/generate-shaders.mjs | 2 +- pnpm-lock.yaml | 6 ++++++ pnpm-workspace.yaml | 1 + scripts/__tests__/typescript-toolchain.spec.ts | 11 +++++++++-- 8 files changed, 30 insertions(+), 17 deletions(-) diff --git a/packages/create-threenative/__tests__/scaffold.spec.ts b/packages/create-threenative/__tests__/scaffold.spec.ts index d6710f430c..e9d9bb6fde 100644 --- a/packages/create-threenative/__tests__/scaffold.spec.ts +++ b/packages/create-threenative/__tests__/scaffold.spec.ts @@ -173,7 +173,7 @@ const BUG_REPORT_SKILL_PATHS = [ // Current develop c18a42b integration: all13 actual generated trees were byte-compared // against reviewed 8bf trees; only the copied Three compute-only Storage3DTexture patch changed. // TypeScript 7 upgrade: all 13 actual generated trees recover the prior hash when only -// package.json is restored. Compiler manifest bytes are the entire scaffold delta. +// package.json and rain's shader API import are restored. Those compiler bytes are the full delta. const PRD_201_PARENT_SCAFFOLD_HASHES: Readonly> = { // Measured through actual createProject trees after exposure/fog consolidation and restamping, // then again on the merge carrying the WebGPU adapter-retention Three patch: the scaffolded @@ -184,7 +184,7 @@ const PRD_201_PARENT_SCAFFOLD_HASHES: Readonly> = { platformer: "b62f09bb1f3ffc4894af515fe2821a5b8ec6d4e75474e0de3a808084d1e3cecf", puzzle: "9bca4fcc9c55caa70645c1960be2f61219513ca4a1e92f7d9ef0ecd13dced69d", racing: "940c37919b667fbd9823e01c73a3b99b60f0815709f9bbf1d956d24392ca7030", - rain: "0096a3103c5e9d6bf3b43184aaa7f1fb06f5732166b3c310bc4c447a35ed90ce", + rain: "eb170ab0eaa78c54628698c6e934383a26c1ce7bde910a531170e44f3dbd8f41", rts: "d63cc1c0c0033b6d25269ecc64c5add970f3f7c2776d17ad93a2cffe68d3b015", runner: "250abc329712cddaf25f812d1409048136802db5070f765cb8fb7f1c76c2d92e", // Initial finite-height readiness plus its scene-owned lifecycle helper and mirrored docs. diff --git a/packages/create-threenative/__tests__/template.spec.ts b/packages/create-threenative/__tests__/template.spec.ts index 3951d36da4..be38bdd0e2 100644 --- a/packages/create-threenative/__tests__/template.spec.ts +++ b/packages/create-threenative/__tests__/template.spec.ts @@ -143,17 +143,15 @@ async function linkScaffoldDependencies(target: string): Promise { await linkDependency( target, "typescript", - path.resolve( - packageJson.devDependencies?.["@typescript/native"] === undefined - ? "packages/core/node_modules/@typescript/native" - : "packages/core/node_modules/typescript", - ), - ); - await linkDependency( - target, - "@typescript/native", path.resolve("packages/core/node_modules/@typescript/native"), ); + if (packageJson.devDependencies?.["@typescript/typescript6"] !== undefined) { + await linkDependency( + target, + "@typescript/typescript6", + path.resolve("packages/core/node_modules/typescript"), + ); + } await linkDependency(target, "vite", await findPnpmPackage("vite")); await linkDependency(target, "@types/node", await findPnpmPackage("@types/node")); await mkdir(path.join(target, "node_modules/.bin"), { recursive: true }); diff --git a/packages/create-threenative/package.json b/packages/create-threenative/package.json index 5656ad9768..003248fb75 100644 --- a/packages/create-threenative/package.json +++ b/packages/create-threenative/package.json @@ -87,7 +87,8 @@ "tsup": "8.5.1", "typescript": "catalog:", "vite": "catalog:", - "@typescript/native": "catalog:" + "@typescript/native": "catalog:", + "@typescript/typescript6": "catalog:" }, "peerDependencies": { "@threenative/assets": ">=0.3.5 <0.4.0" diff --git a/packages/create-threenative/templates/rain/package.json b/packages/create-threenative/templates/rain/package.json index 76667ee8ab..d966b9244b 100644 --- a/packages/create-threenative/templates/rain/package.json +++ b/packages/create-threenative/templates/rain/package.json @@ -34,10 +34,10 @@ "esbuild": "0.27.0", "playwright": "1.62.1", "tailwindcss": "4.3.3", - "typescript": "npm:@typescript/typescript6@6.0.2", + "typescript": "7.0.2", "vite": "8.2.0", "@gltf-transform/cli": "4.4.2", - "@typescript/native": "npm:typescript@7.0.2" + "@typescript/typescript6": "6.0.2" }, "optionalDependencies": { "@threenative/runtime-native": "0.3.4" diff --git a/packages/create-threenative/templates/rain/tools/generate-shaders.mjs b/packages/create-threenative/templates/rain/tools/generate-shaders.mjs index 9018119314..5b2fb6c86f 100644 --- a/packages/create-threenative/templates/rain/tools/generate-shaders.mjs +++ b/packages/create-threenative/templates/rain/tools/generate-shaders.mjs @@ -16,10 +16,10 @@ import { execFileSync } from "node:child_process"; import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; import { dirname, relative, resolve } from "node:path"; import { fileURLToPath } from "node:url"; +import ts from "@typescript/typescript6"; import GLSLDecoder from "three/examples/jsm/transpiler/GLSLDecoder.js"; import TSLEncoder from "three/examples/jsm/transpiler/TSLEncoder.js"; import Transpiler from "three/examples/jsm/transpiler/Transpiler.js"; -import ts from "typescript"; const here = dirname(fileURLToPath(import.meta.url)); // The repository this template lives in, four levels up from `tools/`. A scaffolded project has no diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 623953f8e8..f3b7cac698 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,6 +36,9 @@ catalogs: '@typescript/native': specifier: npm:typescript@7.0.2 version: 7.0.2 + '@typescript/typescript6': + specifier: 6.0.2 + version: 6.0.2 '@vitejs/plugin-react': specifier: 6.0.5 version: 6.0.5 @@ -910,6 +913,9 @@ importers: '@typescript/native': specifier: 'catalog:' version: typescript@7.0.2 + '@typescript/typescript6': + specifier: 'catalog:' + version: 6.0.2 esbuild: specifier: 'catalog:' version: 0.27.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 04c7423591..cab8935ac3 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -28,6 +28,7 @@ catalog: zod: 4.4.3 typescript: npm:@typescript/typescript6@6.0.2 '@typescript/native': npm:typescript@7.0.2 + '@typescript/typescript6': 6.0.2 vite: 8.2.0 vitest: 4.1.10 esbuild: 0.27.0 diff --git a/scripts/__tests__/typescript-toolchain.spec.ts b/scripts/__tests__/typescript-toolchain.spec.ts index 05ed4fa90e..d7a3787e1b 100644 --- a/scripts/__tests__/typescript-toolchain.spec.ts +++ b/scripts/__tests__/typescript-toolchain.spec.ts @@ -5,11 +5,15 @@ import path from "node:path"; import ts from "typescript"; import { describe, expect, it } from "vitest"; import { makeTempDir } from "../../test-support/temp-dir.js"; +import { checkVersionPins } from "../check-version-pins.js"; const root = path.resolve("."); const native = path.join(root, "node_modules/@typescript/native/bin/tsc"); describe("native compiler and compatibility API", () => { + it("keeps the shipped template compiler pins coherent", async () => { + expect(await checkVersionPins(root)).toEqual([]); + }); it("runs TypeScript 7 while retaining the documented compiler API", () => { const result = spawnSync(process.execPath, [native, "--version"], { encoding: "utf8" }); expect(result.status).toBe(0); @@ -34,8 +38,11 @@ describe("native compiler and compatibility API", () => { const rain = JSON.parse(readFileSync(path.join(templates, "rain/package.json"), "utf8")); const starter = JSON.parse(readFileSync(path.join(templates, "starter/package.json"), "utf8")); expect(starter.devDependencies.typescript).toBe("7.0.2"); - expect(rain.devDependencies.typescript).toBe("npm:@typescript/typescript6@6.0.2"); - expect(rain.devDependencies["@typescript/native"]).toBe("npm:typescript@7.0.2"); + expect(rain.devDependencies.typescript).toBe("7.0.2"); + expect(rain.devDependencies["@typescript/typescript6"]).toBe("6.0.2"); + const rainRequire = createRequire(path.join(templates, "rain/package.json")); + const rootRequire = createRequire(path.join(root, "package.json")); + expect(rainRequire.resolve("@typescript/typescript6")).toBe(rootRequire.resolve("typescript")); }); });