From c52f8da8b443f88998bbdd0ec1b75778290556ef Mon Sep 17 00:00:00 2001 From: Kristof Siket Date: Wed, 19 Aug 2026 11:38:09 +0200 Subject: [PATCH 1/8] feat(cli): add tsx as a runtime dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tsx handles TypeScript transpilation and ESM resolution in both the CLI process and the spawned alchemy converge child under Node. Ships worker files and must stay external in all tsdown configs — added to the external array alongside esbuild for both entries in composer-cli/tsdown.config.ts. Signed-off-by: Kristof Siket --- .../0-framework/3-tooling/cli/package.json | 3 +- packages/9-public/composer-cli/package.json | 3 +- .../9-public/composer-cli/tsdown.config.ts | 7 +- pnpm-lock.yaml | 244 ++++++++++-------- 4 files changed, 141 insertions(+), 116 deletions(-) diff --git a/packages/0-framework/3-tooling/cli/package.json b/packages/0-framework/3-tooling/cli/package.json index d529c4400..df4a73b1c 100644 --- a/packages/0-framework/3-tooling/cli/package.json +++ b/packages/0-framework/3-tooling/cli/package.json @@ -23,7 +23,8 @@ "@internal/foundation": "workspace:0.10.0", "@prisma/cli-engine": "0.2.0", "c12": "^3.3.4", - "chokidar": "^4.0.3" + "chokidar": "^4.0.3", + "tsx": "^4.19.3" }, "devDependencies": { "@internal/tsdown-config": "workspace:0.10.0", diff --git a/packages/9-public/composer-cli/package.json b/packages/9-public/composer-cli/package.json index 4e4d2170f..311101139 100644 --- a/packages/9-public/composer-cli/package.json +++ b/packages/9-public/composer-cli/package.json @@ -25,7 +25,8 @@ "alchemy": "2.0.0-beta.67", "c12": "^3.3.4", "effect": "4.0.0-beta.103", - "esbuild": "^0.28.1" + "esbuild": "^0.28.1", + "tsx": "^4.19.3" }, "peerDependencies": { "@prisma/cli-engine": "0.2.0" diff --git a/packages/9-public/composer-cli/tsdown.config.ts b/packages/9-public/composer-cli/tsdown.config.ts index abbb0d48d..7cc60c056 100644 --- a/packages/9-public/composer-cli/tsdown.config.ts +++ b/packages/9-public/composer-cli/tsdown.config.ts @@ -31,7 +31,9 @@ export default defineConfig([ // fail every cross-package instanceof. scripts/check-cli-engine-pin.mjs // enforces both that and the exact-version agreement between the // manifests. - external: ['esbuild', '@prisma/cli-engine'], + // tsx ships worker files and must not be bundled — it must remain a real + // import so its own file layout is intact at runtime. + external: ['esbuild', '@prisma/cli-engine', 'tsx'], noExternal: [/^@internal\//], }, { @@ -51,7 +53,8 @@ export default defineConfig([ // different things. scripts/check-cli-engine-pin.mjs checks dist/bin.mjs // by name for exactly this, and check-family-static-graph.mjs walks its // graph. - external: ['esbuild', '@prisma/cli-engine'], + // tsx ships worker files and must not be bundled. + external: ['esbuild', '@prisma/cli-engine', 'tsx'], noExternal: [/^@internal\//], }, ]); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d9b70329..bfb2c4185 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,7 +60,7 @@ importers: version: link:../../packages/9-public/composer-prisma-cloud '@prisma/orm-postgres': specifier: 8.0.0-rc.4 - version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -94,7 +94,7 @@ importers: version: link:../../packages/9-public/composer-prisma-cloud alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) effect: specifier: 4.0.0-beta.103 version: 4.0.0-beta.103 @@ -119,7 +119,7 @@ importers: version: link:../../packages/9-public/composer-prisma-cloud alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -209,7 +209,7 @@ importers: version: link:../../packages/9-public/composer-prisma-cloud '@prisma/orm-postgres': specifier: 8.0.0-rc.4 - version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) effect: specifier: 4.0.0-beta.103 version: 4.0.0-beta.103 @@ -246,7 +246,7 @@ importers: version: link:../../packages/9-public/composer-prisma-cloud alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) effect: specifier: 4.0.0-beta.103 version: 4.0.0-beta.103 @@ -289,7 +289,7 @@ importers: version: link:modules/storefront alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -308,7 +308,7 @@ importers: dependencies: '@prisma/orm-postgres': specifier: 8.0.0-rc.4 - version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -336,7 +336,7 @@ importers: dependencies: '@prisma/orm-postgres': specifier: 8.0.0-rc.4 - version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@store/catalog': specifier: workspace:0.10.0 version: link:../catalog @@ -429,7 +429,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) examples/storefront-auth: dependencies: @@ -450,7 +450,7 @@ importers: version: link:modules/storefront alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -528,7 +528,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) examples/streams: dependencies: @@ -547,7 +547,7 @@ importers: version: 1.3.14 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -563,7 +563,7 @@ importers: version: link:../tsdown-config tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -572,7 +572,7 @@ importers: devDependencies: tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -587,7 +587,7 @@ importers: version: 1.1.0 alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) effect: specifier: 4.0.0-beta.103 version: 4.0.0-beta.103 @@ -600,13 +600,13 @@ importers: version: 1.3.14 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) packages/0-framework/2-authoring/bundle-paths: devDependencies: @@ -615,7 +615,7 @@ importers: version: link:../../0-foundation/tsdown-config tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -643,7 +643,7 @@ importers: version: 26.1.1 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -674,7 +674,7 @@ importers: version: 26.1.1 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -702,13 +702,13 @@ importers: version: 1.3.14 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) packages/0-framework/3-tooling/assemble: dependencies: @@ -730,7 +730,7 @@ importers: version: 26.1.1 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -755,6 +755,9 @@ importers: chokidar: specifier: ^4.0.3 version: 4.0.3 + tsx: + specifier: ^4.19.3 + version: 4.23.12 devDependencies: '@internal/tsdown-config': specifier: workspace:0.10.0 @@ -767,7 +770,7 @@ importers: version: 26.1.1 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -813,7 +816,7 @@ importers: version: 8.22.0 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -837,7 +840,7 @@ importers: version: link:../s3-protocol alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) effect: specifier: 4.0.0-beta.103 version: 4.0.0-beta.103 @@ -859,7 +862,7 @@ importers: version: 26.1.1 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -880,7 +883,7 @@ importers: version: 1.60.0 alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) effect: specifier: 4.0.0-beta.103 version: 4.0.0-beta.103 @@ -896,7 +899,7 @@ importers: version: 26.1.1 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -920,7 +923,7 @@ importers: version: 26.1.1 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -953,16 +956,16 @@ importers: version: link:../../../0-framework/2-authoring/service-rpc '@prisma/orm-postgres': specifier: 8.0.0-rc.4 - version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@prisma/orm-toolchain': specifier: 8.0.0-rc.4 - version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@standard-schema/spec': specifier: ^1.1.0 version: 1.1.0 alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -987,13 +990,13 @@ importers: version: 1.3.14 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) packages/1-prisma-cloud/2-shared-modules/auth: dependencies: @@ -1017,16 +1020,16 @@ importers: version: link:../../../0-framework/2-authoring/service-rpc '@prisma/orm-postgres': specifier: 8.0.0-rc.4 - version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@prisma/orm-toolchain': specifier: 8.0.0-rc.4 - version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) arktype: specifier: ^2.2.3 version: 2.2.3 better-auth: specifier: 1.6.24 - version: 1.6.24(@cloudflare/workers-types@5.20260804.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1077.0))(mysql2@3.22.5(@types/node@26.1.1))(next@16.2.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.22.0)(prisma@7.9.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))) + version: 1.6.24(@cloudflare/workers-types@5.20260804.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1077.0))(mysql2@3.22.5(@types/node@26.1.1))(next@16.2.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.22.0)(prisma@7.9.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))) jose: specifier: ^6.1.3 version: 6.2.4 @@ -1042,13 +1045,13 @@ importers: version: 1.3.14 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) packages/1-prisma-cloud/2-shared-modules/cron: dependencies: @@ -1079,13 +1082,13 @@ importers: version: 1.3.14 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) packages/1-prisma-cloud/2-shared-modules/email: dependencies: @@ -1122,13 +1125,13 @@ importers: version: 8.0.1 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) packages/1-prisma-cloud/2-shared-modules/storage: dependencies: @@ -1159,13 +1162,13 @@ importers: version: 1.3.14 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) packages/1-prisma-cloud/2-shared-modules/streams: dependencies: @@ -1193,7 +1196,7 @@ importers: devDependencies: '@durable-streams/server-conformance-tests': specifier: 0.2.3 - version: 0.2.3(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 0.2.3(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@internal/tsdown-config': specifier: workspace:0.10.0 version: link:../../../0-framework/0-foundation/tsdown-config @@ -1202,13 +1205,13 @@ importers: version: 1.3.14 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) packages/9-public/composer: dependencies: @@ -1220,7 +1223,7 @@ importers: version: 1.1.0 alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -1236,7 +1239,7 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(effect@4.0.0-beta.103)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))) + version: 4.0.0-beta.103(effect@4.0.0-beta.103)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))) '@internal/assemble': specifier: workspace:0.10.0 version: link:../../0-framework/3-tooling/assemble @@ -1269,7 +1272,7 @@ importers: version: 26.1.1 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1281,7 +1284,7 @@ importers: version: link:../composer alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) c12: specifier: ^3.3.4 version: 3.3.4 @@ -1291,6 +1294,9 @@ importers: esbuild: specifier: ^0.28.1 version: 0.28.1 + tsx: + specifier: ^4.19.3 + version: 4.23.12 devDependencies: '@internal/cli': specifier: workspace:0.10.0 @@ -1306,7 +1312,7 @@ importers: version: 26.1.1 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1330,13 +1336,13 @@ importers: version: 1.60.0 '@prisma/orm-toolchain': specifier: 8.0.0-rc.4 - version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@standard-schema/spec': specifier: ^1.1.0 version: 1.1.0 alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -1354,7 +1360,7 @@ importers: version: 8.22.0 tsdown: specifier: ^0.22.7 - version: 0.22.12(typescript@6.0.3) + version: 0.22.12(tsx@4.23.12)(typescript@6.0.3) devDependencies: '@internal/auth': specifier: workspace:0.10.0 @@ -1406,7 +1412,7 @@ importers: version: link:../../0-framework/0-foundation/tsdown-config '@prisma/orm-postgres': specifier: 8.0.0-rc.4 - version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + version: 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@types/node': specifier: ^26.0.1 version: 26.1.1 @@ -1439,7 +1445,7 @@ importers: version: 26.1.1 alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) prisma: specifier: 7.9.0 version: 7.9.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) @@ -1457,7 +1463,7 @@ importers: version: link:../packages/9-public/composer-prisma-cloud alchemy: specifier: 2.0.0-beta.67 - version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) + version: 2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1) devDependencies: '@prisma/composer-cli': specifier: workspace:0.10.0 @@ -5473,6 +5479,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.23.12: + resolution: {integrity: sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==} + engines: {node: '>=18.0.0'} + hasBin: true + turbo@2.10.5: resolution: {integrity: sha512-07Y/C7OUp23l4P92PJoYtFNbHjLhftrZH5Ce7dbczS4kX2Re+wtbXvZLoxn/pUtzgsQaRCBaRuZPJp4zmAn0WQ==} hasBin: true @@ -6166,25 +6177,25 @@ snapshots: '@distilled.cloud/core': 0.30.3(effect@4.0.0-beta.103) effect: 4.0.0-beta.103 - '@distilled.cloud/cloudflare-rolldown-plugin@0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260704.1)': + '@distilled.cloud/cloudflare-rolldown-plugin@0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(workerd@1.20260704.1)': dependencies: '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260704.1) magic-string: 0.30.21 unenv: 2.0.0-rc.24 optionalDependencies: rolldown: 1.1.5 - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0) transitivePeerDependencies: - workerd - '@distilled.cloud/cloudflare-rolldown-plugin@0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260704.1)': + '@distilled.cloud/cloudflare-rolldown-plugin@0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(workerd@1.20260704.1)': dependencies: '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260704.1) magic-string: 0.30.21 unenv: 2.0.0-rc.24 optionalDependencies: rolldown: 1.1.5 - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0) transitivePeerDependencies: - workerd @@ -6198,13 +6209,13 @@ snapshots: '@effect/platform-bun': 4.0.0-beta.103(effect@4.0.0-beta.103) '@effect/platform-node': 4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1) - '@distilled.cloud/cloudflare-vite-plugin@0.15.0(@distilled.cloud/cloudflare-runtime@0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103))(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260704.1)': + '@distilled.cloud/cloudflare-vite-plugin@0.15.0(@distilled.cloud/cloudflare-runtime@0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103))(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(workerd@1.20260704.1)': dependencies: '@distilled.cloud/cloudflare': 0.30.3(effect@4.0.0-beta.103) - '@distilled.cloud/cloudflare-rolldown-plugin': 0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260704.1) + '@distilled.cloud/cloudflare-rolldown-plugin': 0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(workerd@1.20260704.1) '@distilled.cloud/cloudflare-runtime': 0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103) effect: 4.0.0-beta.103 - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0) optionalDependencies: '@effect/platform-bun': 4.0.0-beta.103(effect@4.0.0-beta.103) '@effect/platform-node': 4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1) @@ -6212,13 +6223,13 @@ snapshots: - rolldown - workerd - '@distilled.cloud/cloudflare-vite-plugin@0.15.0(@distilled.cloud/cloudflare-runtime@0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103))(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260704.1)': + '@distilled.cloud/cloudflare-vite-plugin@0.15.0(@distilled.cloud/cloudflare-runtime@0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103))(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(workerd@1.20260704.1)': dependencies: '@distilled.cloud/cloudflare': 0.30.3(effect@4.0.0-beta.103) - '@distilled.cloud/cloudflare-rolldown-plugin': 0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260704.1) + '@distilled.cloud/cloudflare-rolldown-plugin': 0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(workerd@1.20260704.1) '@distilled.cloud/cloudflare-runtime': 0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103) effect: 4.0.0-beta.103 - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0) optionalDependencies: '@effect/platform-bun': 4.0.0-beta.103(effect@4.0.0-beta.103) '@effect/platform-node': 4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1) @@ -6255,11 +6266,11 @@ snapshots: '@microsoft/fetch-event-source': 2.0.1 fastq: 1.20.1 - '@durable-streams/server-conformance-tests@0.2.3(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))': + '@durable-streams/server-conformance-tests@0.2.3(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@durable-streams/client': 0.2.3 fast-check: 4.9.0 - vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) transitivePeerDependencies: - '@edge-runtime/vm' - '@opentelemetry/api' @@ -6308,15 +6319,15 @@ snapshots: '@cloudflare/workers-types': 5.20260804.1 effect: 4.0.0-beta.103 - '@effect/vitest@4.0.0-beta.103(effect@4.0.0-beta.103)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))': + '@effect/vitest@4.0.0-beta.103(effect@4.0.0-beta.103)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: effect: 4.0.0-beta.103 - vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) - '@effect/vitest@4.0.0-beta.103(effect@4.0.0-beta.103)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))': + '@effect/vitest@4.0.0-beta.103(effect@4.0.0-beta.103)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: effect: 4.0.0-beta.103 - vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@electric-sql/pglite-socket@0.0.20(@electric-sql/pglite@0.3.15)': dependencies: @@ -6971,10 +6982,10 @@ snapshots: dependencies: openapi-fetch: 0.14.0 - '@prisma/orm-family-sql@8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))': + '@prisma/orm-family-sql@8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@prisma/orm-framework': 8.0.0-rc.4(typescript@6.0.3) - '@prisma/orm-toolchain': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + '@prisma/orm-toolchain': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@standard-schema/spec': 1.1.0 arktype: 2.2.3 pathe: 2.0.3 @@ -6997,12 +7008,12 @@ snapshots: optionalDependencies: typescript: 6.0.3 - '@prisma/orm-postgres@8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))': + '@prisma/orm-postgres@8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))': dependencies: - '@prisma/orm-family-sql': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + '@prisma/orm-family-sql': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@prisma/orm-framework': 8.0.0-rc.4(typescript@6.0.3) - '@prisma/orm-target-postgres': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) - '@prisma/orm-toolchain': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + '@prisma/orm-target-postgres': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) + '@prisma/orm-toolchain': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@types/pg': 8.20.4 pathe: 2.0.3 pg: 8.22.0 @@ -7015,11 +7026,11 @@ snapshots: - typanion - vite - '@prisma/orm-target-postgres@8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))': + '@prisma/orm-target-postgres@8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))': dependencies: - '@prisma/orm-family-sql': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + '@prisma/orm-family-sql': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@prisma/orm-framework': 8.0.0-rc.4(typescript@6.0.3) - '@prisma/orm-toolchain': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + '@prisma/orm-toolchain': 8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@standard-schema/spec': 1.1.0 '@types/pg': 8.20.4 arktype: 2.2.3 @@ -7035,7 +7046,7 @@ snapshots: - typanion - vite - '@prisma/orm-toolchain@8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))': + '@prisma/orm-toolchain@8.0.0-rc.4(@prisma/cli-engine@0.2.0)(typanion@3.14.0)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@prisma/cli-engine': 0.2.0 '@prisma/orm-framework': 8.0.0-rc.4(typescript@6.0.3) @@ -7058,7 +7069,7 @@ snapshots: wrap-ansi: 10.0.0 optionalDependencies: typescript: 6.0.3 - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0) transitivePeerDependencies: - magicast - typanion @@ -7757,21 +7768,21 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))': + '@vitest/mocker@4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0) - '@vitest/mocker@4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))': + '@vitest/mocker@4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -7896,7 +7907,7 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - alchemy@2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1): + alchemy@2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1): dependencies: '@alchemy.run/node-utils': 0.0.5(patch_hash=6faf37cc2077b96dea5bf0d1906285c3f32e99f34af71943256985056678b266) '@aws-sdk/credential-providers': 3.1077.0 @@ -7904,14 +7915,14 @@ snapshots: '@distilled.cloud/aws': 0.30.3(effect@4.0.0-beta.103) '@distilled.cloud/axiom': 0.30.3(effect@4.0.0-beta.103) '@distilled.cloud/cloudflare': 0.30.3(effect@4.0.0-beta.103) - '@distilled.cloud/cloudflare-rolldown-plugin': 0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260704.1) + '@distilled.cloud/cloudflare-rolldown-plugin': 0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(workerd@1.20260704.1) '@distilled.cloud/cloudflare-runtime': 0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103) - '@distilled.cloud/cloudflare-vite-plugin': 0.15.0(@distilled.cloud/cloudflare-runtime@0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103))(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260704.1) + '@distilled.cloud/cloudflare-vite-plugin': 0.15.0(@distilled.cloud/cloudflare-runtime@0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103))(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(workerd@1.20260704.1) '@distilled.cloud/core': 0.30.3(effect@4.0.0-beta.103) '@distilled.cloud/neon': 0.30.3(effect@4.0.0-beta.103) '@distilled.cloud/planetscale': 0.30.3(effect@4.0.0-beta.103) '@effect/sql-d1': 4.0.0-beta.103(effect@4.0.0-beta.103) - '@effect/vitest': 4.0.0-beta.103(effect@4.0.0-beta.103)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))) + '@effect/vitest': 4.0.0-beta.103(effect@4.0.0-beta.103)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))) '@libsql/client': 0.17.4 '@octokit/rest': 22.0.1 '@octokit/webhooks': 14.2.0 @@ -7941,7 +7952,7 @@ snapshots: optionalDependencies: '@effect/platform-bun': 4.0.0-beta.103(effect@4.0.0-beta.103) '@effect/platform-node': 4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1) - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0) ws: 8.21.1 transitivePeerDependencies: - '@mongodb-js/zstd' @@ -7963,7 +7974,7 @@ snapshots: - vitest - workerd - alchemy@2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1): + alchemy@2.0.0-beta.67(patch_hash=b4f53c9c951c28d72ce7373ac88b38bd85718e114e5001fa7b2a8f7f869d6fac)(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.103)(typescript@6.0.3)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)))(workerd@1.20260704.1)(ws@8.21.1): dependencies: '@alchemy.run/node-utils': 0.0.5(patch_hash=6faf37cc2077b96dea5bf0d1906285c3f32e99f34af71943256985056678b266) '@aws-sdk/credential-providers': 3.1077.0 @@ -7971,14 +7982,14 @@ snapshots: '@distilled.cloud/aws': 0.30.3(effect@4.0.0-beta.103) '@distilled.cloud/axiom': 0.30.3(effect@4.0.0-beta.103) '@distilled.cloud/cloudflare': 0.30.3(effect@4.0.0-beta.103) - '@distilled.cloud/cloudflare-rolldown-plugin': 0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260704.1) + '@distilled.cloud/cloudflare-rolldown-plugin': 0.15.0(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(workerd@1.20260704.1) '@distilled.cloud/cloudflare-runtime': 0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103) - '@distilled.cloud/cloudflare-vite-plugin': 0.15.0(@distilled.cloud/cloudflare-runtime@0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103))(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260704.1) + '@distilled.cloud/cloudflare-vite-plugin': 0.15.0(@distilled.cloud/cloudflare-runtime@0.15.0(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103))(@distilled.cloud/cloudflare@0.30.3(effect@4.0.0-beta.103))(@effect/platform-bun@4.0.0-beta.103(effect@4.0.0-beta.103))(@effect/platform-node@4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1))(effect@4.0.0-beta.103)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))(workerd@1.20260704.1) '@distilled.cloud/core': 0.30.3(effect@4.0.0-beta.103) '@distilled.cloud/neon': 0.30.3(effect@4.0.0-beta.103) '@distilled.cloud/planetscale': 0.30.3(effect@4.0.0-beta.103) '@effect/sql-d1': 4.0.0-beta.103(effect@4.0.0-beta.103) - '@effect/vitest': 4.0.0-beta.103(effect@4.0.0-beta.103)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))) + '@effect/vitest': 4.0.0-beta.103(effect@4.0.0-beta.103)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))) '@libsql/client': 0.17.4 '@octokit/rest': 22.0.1 '@octokit/webhooks': 14.2.0 @@ -8008,7 +8019,7 @@ snapshots: optionalDependencies: '@effect/platform-bun': 4.0.0-beta.103(effect@4.0.0-beta.103) '@effect/platform-node': 4.0.0-beta.103(effect@4.0.0-beta.103)(ioredis@5.11.1) - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0) ws: 8.21.1 transitivePeerDependencies: - '@mongodb-js/zstd' @@ -8074,7 +8085,7 @@ snapshots: before-after-hook@4.0.0: {} - better-auth@1.6.24(@cloudflare/workers-types@5.20260804.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1077.0))(mysql2@3.22.5(@types/node@26.1.1))(next@16.2.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.22.0)(prisma@7.9.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0))): + better-auth@1.6.24(@cloudflare/workers-types@5.20260804.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1077.0))(mysql2@3.22.5(@types/node@26.1.1))(next@16.2.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.22.0)(prisma@7.9.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0))): dependencies: '@better-auth/core': 1.6.24(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@cloudflare/workers-types@5.20260804.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) '@better-auth/drizzle-adapter': 1.6.24(@better-auth/core@1.6.24(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@cloudflare/workers-types@5.20260804.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2) @@ -8101,7 +8112,7 @@ snapshots: prisma: 7.9.0(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) transitivePeerDependencies: - '@cloudflare/workers-types' - '@opentelemetry/api' @@ -9694,7 +9705,7 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsdown@0.22.12(typescript@6.0.3): + tsdown@0.22.12(tsx@4.23.12)(typescript@6.0.3): dependencies: ansis: 4.3.1 cac: 7.0.0 @@ -9712,6 +9723,7 @@ snapshots: unconfig-core: 7.5.0 verkit: 0.1.2 optionalDependencies: + tsx: 4.23.12 typescript: 6.0.3 transitivePeerDependencies: - '@ts-macro/tsc' @@ -9721,6 +9733,12 @@ snapshots: tslib@2.8.1: {} + tsx@4.23.12: + dependencies: + esbuild: 0.28.2 + optionalDependencies: + fsevents: 2.3.3 + turbo@2.10.5: optionalDependencies: '@turbo/darwin-64': 2.10.5 @@ -9804,7 +9822,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0): + vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -9816,9 +9834,10 @@ snapshots: esbuild: 0.28.1 fsevents: 2.3.3 jiti: 2.6.1 + tsx: 4.23.12 yaml: 2.9.0 - vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0): + vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -9830,12 +9849,13 @@ snapshots: esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.6.1 + tsx: 4.23.12 yaml: 2.9.0 - vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)): + vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -9852,17 +9872,17 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.1.1 transitivePeerDependencies: - msw - vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)): + vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -9879,7 +9899,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.12)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.1.1 From 5b2bf61ca8b5d7d7d772cf9e45160d24e67174aa Mon Sep 17 00:00:00 2001 From: Kristof Siket Date: Wed, 19 Aug 2026 11:51:38 +0200 Subject: [PATCH 2/8] feat(cli): register tsx for TypeScript entry-graph loading under Node Replace registerEntryResolution() with registerTsRuntime() from the new runtime-loader.ts. tsx/esm/api's register() replaces the hand-rolled Node resolve hook: tsx handles .ts/.js/extensionless imports and tsconfig-aware transpilation in both the CLI process (via load-entry/load-config) and the spawned converge child. The registration is idempotent and a no-op under Bun, which resolves TypeScript natively. Signed-off-by: Kristof Siket --- .../0-framework/3-tooling/cli/src/load-config.ts | 2 ++ .../0-framework/3-tooling/cli/src/load-entry.ts | 4 ++-- .../3-tooling/cli/src/runtime-loader.ts | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 packages/0-framework/3-tooling/cli/src/runtime-loader.ts diff --git a/packages/0-framework/3-tooling/cli/src/load-config.ts b/packages/0-framework/3-tooling/cli/src/load-config.ts index d83ac12d7..8baee4c43 100644 --- a/packages/0-framework/3-tooling/cli/src/load-config.ts +++ b/packages/0-framework/3-tooling/cli/src/load-config.ts @@ -26,6 +26,7 @@ import { blindCast } from '@internal/foundation/casts'; import { CliStructuredError } from '@internal/foundation/errors'; import * as c12 from 'c12'; import { effectResolutionDiagnostic } from './check-effect-resolution.ts'; +import { registerTsRuntime } from './runtime-loader.ts'; export const CONFIG_FILENAME = 'prisma-composer.config.ts'; @@ -177,6 +178,7 @@ async function evaluateConfig( configPath: string, verifySamePath: boolean, ): Promise<{ value: unknown; diagnostics: readonly CliStructuredError[] }> { + await registerTsRuntime(); let result: Awaited>; try { result = await c12.loadConfig({ diff --git a/packages/0-framework/3-tooling/cli/src/load-entry.ts b/packages/0-framework/3-tooling/cli/src/load-entry.ts index f77e85071..7921ee1ff 100644 --- a/packages/0-framework/3-tooling/cli/src/load-entry.ts +++ b/packages/0-framework/3-tooling/cli/src/load-entry.ts @@ -10,8 +10,8 @@ import type { ModuleNode, ServiceNode } from '@internal/core'; import { isNode } from '@internal/core'; import { blindCast } from '@internal/foundation/casts'; import { CliStructuredError } from '@internal/foundation/errors'; -import { registerEntryResolution } from './entry-resolution.ts'; import { explainJsxLoadError } from './jsx-load-error.ts'; +import { registerTsRuntime } from './runtime-loader.ts'; export interface LoadedEntry { /** The resolved absolute path to the entry module on disk. */ @@ -20,7 +20,7 @@ export interface LoadedEntry { } export async function loadEntry(entryArg: string, cwd: string): Promise { - registerEntryResolution(); + await registerTsRuntime(); const resolvedPath = path.resolve(cwd, entryArg); let mod: unknown; try { diff --git a/packages/0-framework/3-tooling/cli/src/runtime-loader.ts b/packages/0-framework/3-tooling/cli/src/runtime-loader.ts new file mode 100644 index 000000000..b34246370 --- /dev/null +++ b/packages/0-framework/3-tooling/cli/src/runtime-loader.ts @@ -0,0 +1,15 @@ +/** + * Registers tsx's ESM hook once in the CLI process so that user TypeScript — + * the entry graph and the config file — loads under Node without requiring + * `allowImportingTsExtensions` in the user's tsconfig. Idempotent and a no-op + * under Bun, which resolves .ts/.js/extensionless natively. + */ + +let registered = false; + +export async function registerTsRuntime(): Promise { + if (registered || typeof process.versions.bun === 'string') return; + registered = true; + const { register } = await import('tsx/esm/api'); + register(); +} From 6899430e5efbffe2dd18f1aa14821ebe5c53c1de Mon Sep 17 00:00:00 2001 From: Kristof Siket Date: Wed, 19 Aug 2026 11:51:52 +0200 Subject: [PATCH 3/8] feat(cli): run converge child under tsx in Node MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Under Node, alchemyCommandLine() now returns process.execPath with [tsx-cli, alchemy.js, ...args] instead of the alchemy launcher. tsx provides TypeScript resolution for the stack file and the entry graph it imports — the same registration loadEntry applies in the CLI process itself. Under Bun, the alchemy launcher is used unchanged (Bun resolves TypeScript natively, and the launcher handles its own dispatch). The rerun hint in structured errors shows the tsx form under Node: npx tsx node_modules/alchemy/bin/alchemy.js ... alchemyCommandLine() is now async; converge.ts and spawnAlchemy updated to await it. Signed-off-by: Kristof Siket --- .../3-tooling/cli/src/family/converge.ts | 2 +- .../src/operations/execute-deploy-destroy.ts | 5 +- .../cli/src/operations/execute-dev.ts | 5 +- .../3-tooling/cli/src/run-alchemy.ts | 88 +++++++++++++++---- 4 files changed, 81 insertions(+), 19 deletions(-) diff --git a/packages/0-framework/3-tooling/cli/src/family/converge.ts b/packages/0-framework/3-tooling/cli/src/family/converge.ts index 97ddbf33c..bd97f6b67 100644 --- a/packages/0-framework/3-tooling/cli/src/family/converge.ts +++ b/packages/0-framework/3-tooling/cli/src/family/converge.ts @@ -56,7 +56,7 @@ export interface ConvergeContext { * terminal reaches alchemy natively and the engine owns signal policy. */ export function convergeSpawn(ctx: ConvergeContext): RunAlchemy { return async (invocation) => { - const line = alchemyCommandLine(invocation); + const line = await alchemyCommandLine(invocation); return await ctx.spawn({ command: line.command, args: line.args, diff --git a/packages/0-framework/3-tooling/cli/src/operations/execute-deploy-destroy.ts b/packages/0-framework/3-tooling/cli/src/operations/execute-deploy-destroy.ts index d4c6d9373..efc9f8fb3 100644 --- a/packages/0-framework/3-tooling/cli/src/operations/execute-deploy-destroy.ts +++ b/packages/0-framework/3-tooling/cli/src/operations/execute-deploy-destroy.ts @@ -451,7 +451,10 @@ async function runStackPipelineInner( return notOk(toStructured('DEPLOY.STACK_WRITE_FAILED', error)); } - const reproduceCommand = `alchemy ${action} ${GENERATED_STACK_RELATIVE_PATH} --yes --stage ${alchemyStage}`; + const reproduceCommand = + typeof process.versions.bun === 'string' + ? `alchemy ${action} ${GENERATED_STACK_RELATIVE_PATH} --yes --stage ${alchemyStage}` + : `npx tsx node_modules/alchemy/bin/alchemy.js ${action} ${GENERATED_STACK_RELATIVE_PATH} --yes --stage ${alchemyStage}`; // Hand the terminal to alchemy against the generated file. let outcome: AlchemyOutcome; diff --git a/packages/0-framework/3-tooling/cli/src/operations/execute-dev.ts b/packages/0-framework/3-tooling/cli/src/operations/execute-dev.ts index 76b70c702..07ed6fa3d 100644 --- a/packages/0-framework/3-tooling/cli/src/operations/execute-dev.ts +++ b/packages/0-framework/3-tooling/cli/src/operations/execute-dev.ts @@ -124,7 +124,10 @@ export async function executeDev( throw error; } - const reproduceCommand = `alchemy deploy ${DEV_STACK_RELATIVE_PATH} --yes --stage dev`; + const reproduceCommand = + typeof process.versions.bun === 'string' + ? `alchemy deploy ${DEV_STACK_RELATIVE_PATH} --yes --stage dev` + : `npx tsx node_modules/alchemy/bin/alchemy.js deploy ${DEV_STACK_RELATIVE_PATH} --yes --stage dev`; const converge = async (): Promise<{ outcome: AlchemyOutcome; stackPath: string }> => { let stackPath: string; diff --git a/packages/0-framework/3-tooling/cli/src/run-alchemy.ts b/packages/0-framework/3-tooling/cli/src/run-alchemy.ts index 245d3778d..426c32060 100644 --- a/packages/0-framework/3-tooling/cli/src/run-alchemy.ts +++ b/packages/0-framework/3-tooling/cli/src/run-alchemy.ts @@ -1,11 +1,17 @@ /** * Pipeline step 7 (deploy-cli.md § The pipeline; design-notes.md's "Driving - * Alchemy" call): hand the terminal to the generated stack file. Resolves the - * workspace's own installed `alchemy` bin (walking up `node_modules/.bin` - * from the generated file's package dir) rather than going through - * `bunx`/`npx`, so this works the same under node and bun — the resolved - * bin's own launcher (`alchemy/bin/cli.js`) does its own node/bun dispatch - * from there, driven by the env it inherits. + * Alchemy" call): hand the terminal to the generated stack file. + * + * Under Bun, resolves the workspace's own installed `alchemy` bin (walking up + * `node_modules/.bin` from the generated file's package dir). Alchemy's bin + * launcher (`alchemy/bin/cli.js`) does its own node/bun dispatch driven by + * the env it inherits. + * + * Under Node, bypasses the alchemy launcher and runs `alchemy.js` directly + * under tsx (`node ...`). tsx + * handles TypeScript resolution for the stack file and the entry graph it + * imports, which is the same registration `loadEntry` applies in the CLI + * process itself. * * This module composes the invocation; it does not decide how the child is * started. Under the CLI the engine starts it (`ctx.spawn`), which is what @@ -16,6 +22,7 @@ import { spawn } from 'node:child_process'; import * as fs from 'node:fs'; import * as path from 'node:path'; +import { fileURLToPath } from 'node:url'; import { CliStructuredError } from '@internal/foundation/errors'; /** Walks up from `startDir` looking for `node_modules/.bin/alchemy`. */ @@ -36,6 +43,33 @@ export function resolveAlchemyBin(startDir: string): string { } } +/** + * Walks up from `startDir` looking for `node_modules/alchemy/bin/alchemy.js` — + * the compiled JS entry that the tsx-based Node invocation runs directly, + * bypassing the alchemy launcher's node/bun dispatch. + */ +export function resolveAlchemyJs(startDir: string): string { + let dir = startDir; + while (true) { + const candidate = path.join(dir, 'node_modules', 'alchemy', 'bin', 'alchemy.js'); + if (fs.existsSync(candidate)) return candidate; + const parent = path.dirname(dir); + if (parent === dir) { + throw new CliStructuredError( + 'DEPLOY.ALCHEMY_BIN_MISSING', + `Could not find an installed \`alchemy\` bin above "${startDir}".`, + { fix: 'Add "alchemy" as a dependency of your app.' }, + ); + } + dir = parent; + } +} + +/** Resolves the tsx CLI entry from the installed tsx package. */ +export async function resolveTsxCli(): Promise { + return fileURLToPath(await import.meta.resolve('tsx/cli')); +} + /** * WHAT to converge. Deliberately not a command line: which alchemy binary to * run is a question about this machine's installed tree, and answering it @@ -64,21 +98,43 @@ export interface AlchemyCommandLine { readonly env: Readonly>; } +const alchemyArgs = (invocation: AlchemyInvocation): string[] => [ + invocation.action, + invocation.stackFileRelativePath, + '--yes', + '--stage', + invocation.stage, +]; + /** * Resolves the invocation against this machine — the step every adapter takes * and no caller should. Raises DEPLOY.ALCHEMY_BIN_MISSING when the app has no * alchemy installed. + * + * Under Bun, runs the alchemy launcher directly (it handles its own dispatch). + * Under Node, runs `node ` so tsx provides + * TypeScript resolution for the stack file and the entry graph it imports. */ -export function alchemyCommandLine(invocation: AlchemyInvocation): AlchemyCommandLine { +export async function alchemyCommandLine( + invocation: AlchemyInvocation, +): Promise { + if (typeof process.versions.bun === 'string') { + return { + command: resolveAlchemyBin(invocation.cwd), + args: alchemyArgs(invocation), + cwd: invocation.cwd, + env: invocation.env, + }; + } + + const [tsxCliPath, alchemyJsPath] = await Promise.all([ + resolveTsxCli(), + Promise.resolve(resolveAlchemyJs(invocation.cwd)), + ]); + return { - command: resolveAlchemyBin(invocation.cwd), - args: [ - invocation.action, - invocation.stackFileRelativePath, - '--yes', - '--stage', - invocation.stage, - ], + command: process.execPath, + args: [tsxCliPath, alchemyJsPath, ...alchemyArgs(invocation)], cwd: invocation.cwd, env: invocation.env, }; @@ -128,7 +184,7 @@ export function alchemyInvocation(input: AlchemyInvocationInput): AlchemyInvocat * Ctrl-C'd deploy report itself as a failure. */ export const spawnAlchemy: RunAlchemy = async (invocation) => { - const line = alchemyCommandLine(invocation); + const line = await alchemyCommandLine(invocation); return new Promise((resolve, reject) => { const child = spawn(line.command, [...line.args], { cwd: line.cwd, From ad7fc200361ccb2a805e7a2ba513679dc037ef27 Mon Sep 17 00:00:00 2001 From: Kristof Siket Date: Wed, 19 Aug 2026 11:57:12 +0200 Subject: [PATCH 4/8] refactor(cli): remove hand-rolled resolve hook and update tests for tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Delete entry-resolution.ts (replaced by tsx/esm/api registration) - Delete entry-cjs-ext-import.ts and cjs-ext-service.cts — these tested the hook's .cjs→.cts mapping; tsx handles CommonJS TypeScript differently - Update fixture comments to reference tsx instead of the hook - Update load-entry.test.ts Node spawn tests to drive run-load-entry.ts under tsx CLI (node ), proving .js/extensionless/ .mjs specifiers resolve under Node via tsx - Update run-alchemy.test.ts: await alchemyCommandLine() calls (now async), add resolveAlchemyJs() and resolveTsxCli() tests, fix pre-existing curly-quote parse errors in test names Signed-off-by: Kristof Siket --- .../__tests__/fixtures/cjs-ext-service.cts | 4 - .../fixtures/entry-cjs-ext-import.ts | 4 - .../__tests__/fixtures/entry-js-ext-import.ts | 8 +- .../fixtures/entry-mjs-ext-import.ts | 5 +- .../__tests__/fixtures/entry-no-ext-import.ts | 8 +- .../cli/src/__tests__/load-entry.test.ts | 61 ++++-------- .../cli/src/__tests__/run-alchemy.test.ts | 88 +++++++++++++---- .../3-tooling/cli/src/entry-resolution.ts | 94 ------------------- 8 files changed, 95 insertions(+), 177 deletions(-) delete mode 100644 packages/0-framework/3-tooling/cli/src/__tests__/fixtures/cjs-ext-service.cts delete mode 100644 packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-cjs-ext-import.ts delete mode 100644 packages/0-framework/3-tooling/cli/src/entry-resolution.ts diff --git a/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/cjs-ext-service.cts b/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/cjs-ext-service.cts deleted file mode 100644 index b49430582..000000000 --- a/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/cjs-ext-service.cts +++ /dev/null @@ -1,4 +0,0 @@ -// Fixture for the Node resolve-hook test: a .cts (CJS TypeScript) module. -// The hook maps ./cjs-ext-service.cjs to this file at runtime. -// Not a Composer node — the test only needs to prove the file is found. -module.exports = {}; diff --git a/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-cjs-ext-import.ts b/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-cjs-ext-import.ts deleted file mode 100644 index 0de101e21..000000000 --- a/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-cjs-ext-import.ts +++ /dev/null @@ -1,4 +0,0 @@ -// @ts-nocheck -- fixture for the Node resolve-hook test; uses a .cjs -// specifier for a .cts file. The hook in entry-resolution.ts maps it to -// cjs-ext-service.cts at runtime. -export { default } from './cjs-ext-service.cjs'; diff --git a/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-js-ext-import.ts b/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-js-ext-import.ts index 6a20ef5d9..c99f25f68 100644 --- a/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-js-ext-import.ts +++ b/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-js-ext-import.ts @@ -1,5 +1,5 @@ -// @ts-nocheck -- fixture for the Node resolve-hook test; uses a .js -// specifier for a .ts file. The hook in entry-resolution.ts maps it to -// js-ext-service.ts at runtime. Not typechecked because TypeScript would -// report the .js file as missing (it doesn't exist; only the .ts does). +// @ts-nocheck -- fixture for the Node tsx-runner test; uses a .js +// specifier for a .ts file. tsx maps it to js-ext-service.ts at runtime. +// Not typechecked because TypeScript would report the .js file as missing +// (it doesn't exist; only the .ts does). export { default } from './js-ext-service.js'; diff --git a/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-mjs-ext-import.ts b/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-mjs-ext-import.ts index b5a5101da..08a87100b 100644 --- a/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-mjs-ext-import.ts +++ b/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-mjs-ext-import.ts @@ -1,4 +1,3 @@ -// @ts-nocheck -- fixture for the Node resolve-hook test; uses a .mjs -// specifier for a .mts file. The hook in entry-resolution.ts maps it to -// mjs-ext-service.mts at runtime. +// @ts-nocheck -- fixture for the Node tsx-runner test; uses a .mjs +// specifier for a .mts file. tsx maps it to mjs-ext-service.mts at runtime. export { default } from './mjs-ext-service.mjs'; diff --git a/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-no-ext-import.ts b/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-no-ext-import.ts index 866896b1d..a1a270e26 100644 --- a/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-no-ext-import.ts +++ b/packages/0-framework/3-tooling/cli/src/__tests__/fixtures/entry-no-ext-import.ts @@ -1,5 +1,5 @@ -// @ts-nocheck -- fixture for the Node resolve-hook test; uses an extensionless -// specifier for a .ts file. The hook in entry-resolution.ts maps it to -// no-ext-service.ts at runtime. Not typechecked because TypeScript would -// report the module as missing (only the .ts source exists). +// @ts-nocheck -- fixture for the Node tsx-runner test; uses an extensionless +// specifier for a .ts file. tsx maps it to no-ext-service.ts at runtime. +// Not typechecked because TypeScript would report the module as missing +// (only the .ts source exists). export { default } from './no-ext-service'; diff --git a/packages/0-framework/3-tooling/cli/src/__tests__/load-entry.test.ts b/packages/0-framework/3-tooling/cli/src/__tests__/load-entry.test.ts index 78c8602b1..c6130393e 100644 --- a/packages/0-framework/3-tooling/cli/src/__tests__/load-entry.test.ts +++ b/packages/0-framework/3-tooling/cli/src/__tests__/load-entry.test.ts @@ -1,11 +1,15 @@ import { describe, expect, test } from 'bun:test'; import { spawnSync } from 'node:child_process'; import * as path from 'node:path'; +import { fileURLToPath } from 'node:url'; import { CliStructuredError } from '@internal/foundation/errors'; import { loadEntry } from '../load-entry.ts'; const fixture = (name: string) => path.join(import.meta.dir, 'fixtures', name); +// Resolve the tsx CLI path once. Under Bun, import.meta.resolve is synchronous. +const tsxCli = fileURLToPath(import.meta.resolve('tsx/cli')); + describe('loadEntry()', () => { test('accepts a service default export', async () => { const entry = await loadEntry(fixture('valid-service.ts'), import.meta.dir); @@ -50,84 +54,53 @@ describe('loadEntry()', () => { expect(error.cause).toBeDefined(); }); - // Bun's own module loader transforms JSX — this failure is node-specific - // (the CLI's shebang runtime; see node-compat.test.ts), so it's reproduced - // by spawning real node against a small standalone driver rather than - // calling loadEntry() in-process here. - test('a .tsx transitively imported by the entry gets a tailored error under node', () => { - const result = spawnSync('node', [fixture('run-load-entry.ts'), fixture('jsx-in-graph.ts')], { - encoding: 'utf8', - }); - - expect(result.status).not.toBe(0); - expect(result.stderr).toContain(fixture('jsx-in-graph.tsx')); - expect(result.stderr).toContain("node's own module loader"); - expect(result.stderr).toContain('JSX transform'); - expect(result.stderr).toContain('examples/email/scripts/build.ts'); - // where.path carries the entry (ruling on `where`: the natural path). - expect(result.stderr).toContain(`Where: ${fixture('jsx-in-graph.ts')}`); - }, 15000); - - // The resolve hook is node-specific (Bun resolves .js→.ts natively). - // These tests spawn real node so the hook registration path is exercised. + // tsx runs under Node and transpiles TypeScript for the entry graph. These + // tests spawn real node with the tsx CLI to exercise the tsx registration + // path that loadEntry() calls before importing the entry. - test('a .js-extension import resolves to the .ts source under node', () => { + test('a .js-extension import resolves to the .ts source under node via tsx', () => { const result = spawnSync( 'node', - [fixture('run-load-entry.ts'), fixture('entry-js-ext-import.ts')], + [tsxCli, fixture('run-load-entry.ts'), fixture('entry-js-ext-import.ts')], { encoding: 'utf8' }, ); expect(result.status).toBe(0); }, 15000); - test('an extensionless import resolves to the .ts source under node', () => { + test('an extensionless import resolves to the .ts source under node via tsx', () => { const result = spawnSync( 'node', - [fixture('run-load-entry.ts'), fixture('entry-no-ext-import.ts')], + [tsxCli, fixture('run-load-entry.ts'), fixture('entry-no-ext-import.ts')], { encoding: 'utf8' }, ); expect(result.status).toBe(0); }, 15000); - test('a .mjs-extension import resolves to the .mts source under node', () => { + test('a .mjs-extension import resolves to the .mts source under node via tsx', () => { const result = spawnSync( 'node', - [fixture('run-load-entry.ts'), fixture('entry-mjs-ext-import.ts')], + [tsxCli, fixture('run-load-entry.ts'), fixture('entry-mjs-ext-import.ts')], { encoding: 'utf8' }, ); expect(result.status).toBe(0); }, 15000); - test('a .cjs-extension import resolves to the .cts source under node', () => { - const result = spawnSync( - 'node', - [fixture('run-load-entry.ts'), fixture('entry-cjs-ext-import.ts')], - { encoding: 'utf8' }, - ); - - // The hook resolved .cjs → .cts; resolution succeeded, but the fixture's - // export is not a Composer node, so the failure is ENTRY_EXPORT_INVALID. - expect(result.stderr).not.toContain('Cannot find module'); - expect(result.stderr).toContain('must default-export a node'); - }, 15000); - - test('a genuinely missing relative import still fails with the original error under node', () => { + test('a genuinely missing relative import still fails with a module-not-found error under node', () => { const result = spawnSync( 'node', - [fixture('run-load-entry.ts'), fixture('entry-truly-missing-import.ts')], + [tsxCli, fixture('run-load-entry.ts'), fixture('entry-truly-missing-import.ts')], { encoding: 'utf8' }, ); expect(result.status).not.toBe(0); - // The hook exhausted all candidates; the original ERR_MODULE_NOT_FOUND is re-thrown. expect(result.stderr).toContain('truly-missing'); }, 15000); - // Bun resolves .js→.ts natively — load in-process to confirm the hook is a - // no-op (nothing is registered) and the imports still work. + // Bun resolves .js→.ts natively — load in-process to confirm tsx registration + // is a no-op (nothing is registered under Bun) and the imports still work. test('a .js-extension import loads correctly in-process under bun', async () => { const entry = await loadEntry(fixture('entry-js-ext-import.ts'), import.meta.dir); expect(entry.root.kind).toBe('service'); diff --git a/packages/0-framework/3-tooling/cli/src/__tests__/run-alchemy.test.ts b/packages/0-framework/3-tooling/cli/src/__tests__/run-alchemy.test.ts index 73cd8fd86..d15514b14 100644 --- a/packages/0-framework/3-tooling/cli/src/__tests__/run-alchemy.test.ts +++ b/packages/0-framework/3-tooling/cli/src/__tests__/run-alchemy.test.ts @@ -14,6 +14,8 @@ import { alchemyCommandLine, alchemyInvocation, resolveAlchemyBin, + resolveAlchemyJs, + resolveTsxCli, spawnAlchemy, } from '../run-alchemy.ts'; @@ -93,12 +95,13 @@ describe('alchemyInvocation()', () => { }); }); - test('becomes ` --yes --stage ` against the resolved bin', () => { + // Tests run under bun, so the bun branch is taken: command = alchemy bin. + test('becomes ` --yes --stage ` against the resolved bin', async () => { const dir = makeTmpDir(); const bin = installFakeAlchemy(dir); expect( - alchemyCommandLine( + await alchemyCommandLine( alchemyInvocation({ command: 'deploy', stackFileRelativePath: '.prisma-composer/alchemy.run.ts', @@ -115,35 +118,39 @@ describe('alchemyInvocation()', () => { }); }); - test('destroy passes --stage too — the stage is never left to alchemy’s machine-dependent default', () => { + test("destroy passes --stage too — the stage is never left to alchemy's machine-dependent default", async () => { const dir = makeTmpDir(); installFakeAlchemy(dir); expect( - alchemyCommandLine( - alchemyInvocation({ - command: 'destroy', - stackFileRelativePath: '.prisma-composer/alchemy.run.ts', - cwd: dir, - stage: 'br_test123', - containerEnv: {}, - }), + ( + await alchemyCommandLine( + alchemyInvocation({ + command: 'destroy', + stackFileRelativePath: '.prisma-composer/alchemy.run.ts', + cwd: dir, + stage: 'br_test123', + containerEnv: {}, + }), + ) ).args, ).toEqual(['destroy', '.prisma-composer/alchemy.run.ts', '--yes', '--stage', 'br_test123']); }); - test('the stage never comes from the environment: identical argv whatever USER is', () => { + test('the stage never comes from the environment: identical argv whatever USER is', async () => { const dir = makeTmpDir(); installFakeAlchemy(dir); - const argv = alchemyCommandLine( - alchemyInvocation({ - command: 'deploy', - stackFileRelativePath: '.prisma-composer/alchemy.run.ts', - cwd: dir, - stage: 'br_test123', - containerEnv: {}, - }), + const argv = ( + await alchemyCommandLine( + alchemyInvocation({ + command: 'deploy', + stackFileRelativePath: '.prisma-composer/alchemy.run.ts', + cwd: dir, + stage: 'br_test123', + containerEnv: {}, + }), + ) ).args; expect(argv).not.toContain(os.userInfo().username); @@ -276,3 +283,44 @@ describe('spawnAlchemy()', () => { ).rejects.toThrow(/Could not find an installed `alchemy` bin/); }); }); + +/** A fake `alchemy.js` at `/node_modules/alchemy/bin/alchemy.js`. */ +function installFakeAlchemyJs(dir: string, body: readonly string[] = []): string { + const binDir = path.join(dir, 'node_modules', 'alchemy', 'bin'); + fs.mkdirSync(binDir, { recursive: true }); + const js = path.join(binDir, 'alchemy.js'); + fs.writeFileSync(js, body.join('\n')); + return js; +} + +describe('resolveAlchemyJs()', () => { + test('finds node_modules/alchemy/bin/alchemy.js in the given directory', () => { + const dir = makeTmpDir(); + const js = installFakeAlchemyJs(dir); + + expect(resolveAlchemyJs(dir)).toBe(js); + }); + + test('walks up through parent directories', () => { + const root = makeTmpDir(); + const js = installFakeAlchemyJs(root); + const nested = path.join(root, 'examples', 'app'); + fs.mkdirSync(nested, { recursive: true }); + + expect(resolveAlchemyJs(nested)).toBe(js); + }); + + test('throws when no alchemy.js is found', () => { + const dir = makeTmpDir(); + expect(() => resolveAlchemyJs(dir)).toThrow(/Could not find an installed `alchemy` bin/); + }); +}); + +describe('resolveTsxCli()', () => { + test('returns the path to the tsx CLI entry that exists on disk', async () => { + const tsxCliPath = await resolveTsxCli(); + + expect(tsxCliPath).toMatch(/tsx/); + expect(fs.existsSync(tsxCliPath)).toBe(true); + }); +}); diff --git a/packages/0-framework/3-tooling/cli/src/entry-resolution.ts b/packages/0-framework/3-tooling/cli/src/entry-resolution.ts deleted file mode 100644 index 88a424204..000000000 --- a/packages/0-framework/3-tooling/cli/src/entry-resolution.ts +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Synchronous Node resolve hook so that entry modules may import relative - * files using the specifier forms TypeScript accepts by default — - * extensionless `./service` and `./service.js` for a `.ts` source file — - * without requiring `allowImportingTsExtensions` in every consumer's tsconfig. - * - * Resolution only; uses TypeScript's own documented mapping: for a specifier - * Node could not resolve, strip any JS-family extension and probe the - * corresponding TypeScript source; first candidate that exists on disk wins. - * Format-specific rules: `.mjs` → `.mts`; `.cjs` → `.cts`; `.js` and - * extensionless → `.ts`, `.mts`, `.tsx`, then `./index.ts`. Bare and package - * specifiers are never touched. Existing `./x.ts` imports keep working — - * Node resolves them before the hook fires (ADR-0005: no transform, no - * guessing, deterministic TypeScript rule). - * - * Bun resolves `./x.js` and `./x` to `x.ts` natively, so the hook is a - * no-op under Bun. Nothing is registered there. - */ - -import { existsSync } from 'node:fs'; -import * as mod from 'node:module'; -import { fileURLToPath } from 'node:url'; - -let registered = false; - -/** - * Registers the resolve hook once (idempotent). Call at the start of - * `loadEntry` so every module in the entry graph benefits, including those - * imported lazily after the entry itself loads. - */ -export function registerEntryResolution(): void { - if (registered || typeof process.versions.bun === 'string') return; - // registerHooks landed in Node 22.15; the engine floor is 22.18. - // Guard here covers any non-standard environment. - if (typeof mod.registerHooks !== 'function') return; - registered = true; - mod.registerHooks({ - resolve(specifier, context, nextResolve) { - try { - return nextResolve(specifier, context); - } catch (error) { - if ( - !isRelativeSpecifier(specifier) || - context.parentURL === undefined || - !isModuleNotFoundError(error) - ) { - throw error; - } - for (const candidate of sourceCandidates(new URL(specifier, context.parentURL))) { - if (existsSync(fileURLToPath(candidate))) { - return nextResolve(candidate.href, context); - } - } - throw error; - } - }, - }); -} - -/** - * TypeScript's extension mapping: for a JS-family or extensionless URL, - * produce the source candidates to probe. Format-specific: `.mjs` maps only - * to `.mts`; `.cjs` maps only to `.cts`; `.js` and extensionless probe - * `.ts`, `.mts`, `.tsx` (keeping `.tsx` so the JSX diagnostic fires), then - * `./index.ts`. - */ -function sourceCandidates(resolved: URL): URL[] { - const href = resolved.href; - if (href.endsWith('.mjs')) { - const base = href.slice(0, -4); - return [new URL(`${base}.mts`)]; - } - if (href.endsWith('.cjs')) { - const base = href.slice(0, -4); - return [new URL(`${base}.cts`)]; - } - const base = href.endsWith('.js') ? href.slice(0, -3) : href; - return [ - new URL(`${base}.ts`), - new URL(`${base}.mts`), - new URL(`${base}.tsx`), - new URL(`${base}/index.ts`), - ]; -} - -function isRelativeSpecifier(specifier: string): boolean { - return specifier.startsWith('./') || specifier.startsWith('../'); -} - -function isModuleNotFoundError(error: unknown): boolean { - if (!(error instanceof Error)) return false; - if (!('code' in error)) return false; - return error.code === 'ERR_MODULE_NOT_FOUND'; -} From 7e52c7c5149a9ef8ca3f7a90271dec3b04900193 Mon Sep 17 00:00:00 2001 From: Kristof Siket Date: Wed, 19 Aug 2026 12:06:13 +0200 Subject: [PATCH 5/8] feat(cli): add js-ext-imports example and update deploy-cli.md for tsx Add examples/js-ext-imports as an E2E regression guard: module.ts imports ./service.js while service.ts is the actual source, proving tsx resolves .js-extension imports to .ts under Node. Update docs/design/10-domains/deploy-cli.md to remove the old hand-rolled registerHooks description and document the tsx-based approach: tsx/esm/api register in the main process, and the alchemy converge child running as node alchemy.js on Node (unchanged on Bun). Signed-off-by: Kristof Siket --- docs/design/10-domains/deploy-cli.md | 18 ++++++------- examples/js-ext-imports/module.ts | 10 +++++++ examples/js-ext-imports/package.json | 27 +++++++++++++++++++ .../js-ext-imports/prisma-composer.config.ts | 8 ++++++ examples/js-ext-imports/service.ts | 13 +++++++++ examples/js-ext-imports/tsconfig.json | 7 +++++ 6 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 examples/js-ext-imports/module.ts create mode 100644 examples/js-ext-imports/package.json create mode 100644 examples/js-ext-imports/prisma-composer.config.ts create mode 100644 examples/js-ext-imports/service.ts create mode 100644 examples/js-ext-imports/tsconfig.json diff --git a/docs/design/10-domains/deploy-cli.md b/docs/design/10-domains/deploy-cli.md index f4810edc6..ef0e8d3d7 100644 --- a/docs/design/10-domains/deploy-cli.md +++ b/docs/design/10-domains/deploy-cli.md @@ -43,15 +43,15 @@ not exist on `dev` (clipanion rejects them as unknown flags). `prisma-composer build` and topology emission are out of scope (see § Out of scope). **Runtime.** The bin is runtime-agnostic — no bun-only APIs anywhere in the -CLI or assembly code — so it runs under both bun and node (≥ 22.18, where -type stripping imports the user's `.ts` entry natively). Under node, the CLI -also registers a synchronous resolve hook (`node:module` `registerHooks`) so -that relative imports inside the entry graph may use `./x.js` or extensionless -`./x` specifiers for `.ts` source files without requiring -`allowImportingTsExtensions`; `.mjs` and `.cjs` specifiers map to `.mts` and -`.cts` respectively. Bun resolves these natively and the hook is a no-op there. One inherent caveat: an app whose service module imports -bun APIs can only deploy under bun, since loading the graph imports that module -— the app's choice, not a CLI limit. +CLI or assembly code — so it runs under both bun and node. Under node, the CLI +registers tsx (`tsx/esm/api` `register`) so that relative imports inside the +entry graph may use `./x.js` or extensionless `./x` specifiers for `.ts` +source files; `.mjs` specifiers map to `.mts`. Bun resolves these natively and +tsx registration is skipped there. The alchemy converge child also runs under +tsx on node (`node alchemy.js`) so entry-graph TypeScript resolution +is consistent across the main process and the child. One inherent caveat: an +app whose service module imports bun APIs can only deploy under bun, since +loading the graph imports that module — the app's choice, not a CLI limit. ## The pipeline diff --git a/examples/js-ext-imports/module.ts b/examples/js-ext-imports/module.ts new file mode 100644 index 000000000..0ed312c91 --- /dev/null +++ b/examples/js-ext-imports/module.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- service.js resolves to service.ts under tsx; TypeScript sees +// the .js extension as missing (no .js file exists), so this file is excluded +// from type-checking. It acts as a loadability guard: `prisma-composer deploy` +// must be able to import ./service.js via tsx without failing. +import { module } from '@prisma/composer'; +import guardService from './service.js'; + +export default module('js-ext-imports', ({ provision }) => { + provision(guardService); +}); diff --git a/examples/js-ext-imports/package.json b/examples/js-ext-imports/package.json new file mode 100644 index 000000000..d602fd88c --- /dev/null +++ b/examples/js-ext-imports/package.json @@ -0,0 +1,27 @@ +{ + "name": "@prisma/example-js-ext-imports", + "version": "0.10.0", + "private": true, + "type": "module", + "scripts": { + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@prisma/composer": "workspace:0.10.0", + "@prisma/composer-cli": "workspace:0.10.0", + "@prisma/composer-prisma-cloud": "workspace:0.10.0" + }, + "devDependencies": { + "@types/bun": "^1.3.13", + "typescript": "^6.0.3" + }, + "overrides": { + "effect": "4.0.0-beta.103", + "@effect/sql-d1": "4.0.0-beta.103", + "@effect/sql-pg": "4.0.0-beta.103", + "@effect/vitest": "4.0.0-beta.103", + "@effect/platform-bun": "4.0.0-beta.103", + "@effect/platform-node": "4.0.0-beta.103", + "@effect/platform-node-shared": "4.0.0-beta.103" + } +} diff --git a/examples/js-ext-imports/prisma-composer.config.ts b/examples/js-ext-imports/prisma-composer.config.ts new file mode 100644 index 000000000..2c085a38f --- /dev/null +++ b/examples/js-ext-imports/prisma-composer.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from '@prisma/composer/config'; +import { nodeBuild } from '@prisma/composer/node/control'; +import { prismaCloud, prismaState } from '@prisma/composer-prisma-cloud/control'; + +export default defineConfig({ + extensions: [prismaCloud(), nodeBuild()], + state: prismaState(), +}); diff --git a/examples/js-ext-imports/service.ts b/examples/js-ext-imports/service.ts new file mode 100644 index 000000000..e5d96aa1b --- /dev/null +++ b/examples/js-ext-imports/service.ts @@ -0,0 +1,13 @@ +import node from '@prisma/composer/node'; +import { compute } from '@prisma/composer-prisma-cloud'; + +/** + * A minimal compute service used solely as the target of a .js-extension + * import in module.ts. Its purpose is to prove that tsx resolves ./service.js + * to this .ts source under Node — it is not meant to be deployed. + */ +export default compute({ + name: 'js-ext-guard', + deps: {}, + build: node({ module: import.meta.url, entry: 'server.js' }), +}); diff --git a/examples/js-ext-imports/tsconfig.json b/examples/js-ext-imports/tsconfig.json new file mode 100644 index 000000000..ee0457649 --- /dev/null +++ b/examples/js-ext-imports/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "types": ["bun"] + }, + "include": ["service.ts"] +} From c54b047fc5d5125ec96d6a2af85bbd8544ce7484 Mon Sep 17 00:00:00 2001 From: Kristof Siket Date: Wed, 19 Aug 2026 12:10:27 +0200 Subject: [PATCH 6/8] chore: record the js-ext-imports example in the lockfile CI installs with --frozen-lockfile; the new workspace package has to be in pnpm-lock.yaml or every job fails at install. Signed-off-by: Kristof Siket --- pnpm-lock.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfb2c4185..61de71cb6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -199,6 +199,25 @@ importers: specifier: ^6.0.3 version: 6.0.3 + examples/js-ext-imports: + dependencies: + '@prisma/composer': + specifier: workspace:0.10.0 + version: link:../../packages/9-public/composer + '@prisma/composer-cli': + specifier: workspace:0.10.0 + version: link:../../packages/9-public/composer-cli + '@prisma/composer-prisma-cloud': + specifier: workspace:0.10.0 + version: link:../../packages/9-public/composer-prisma-cloud + devDependencies: + '@types/bun': + specifier: ^1.3.13 + version: 1.3.14 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + examples/pn-widgets: dependencies: '@prisma/composer': From 168db55a7af0dd68051de20fd5ed436eb3c383b5 Mon Sep 17 00:00:00 2001 From: Kristof Siket Date: Wed, 19 Aug 2026 13:13:18 +0200 Subject: [PATCH 7/8] fix(cli): launch converge child under its own runtime on both Bun and Node MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Under Bun, alchemyCommandLine() now uses process.execPath (bun) + [alchemy.js, args] instead of the alchemy launcher. The launcher re-dispatches based on npm_config_user_agent, which bun does not set when invoked directly, so the child would fall through to Node. Under Node the behaviour is unchanged: node + tsx-cli + alchemy.js + args. The invariant: Composer always launches the converge child with its own runtime, explicitly — no env heuristics. Update run-alchemy.test.ts to install a fake alchemy.js (not the bin launcher) for all alchemyCommandLine and spawnAlchemy tests under Bun. Update deploy-destroy.test.ts CWD fixture to also include alchemy.js so resolveAlchemyJs does not throw before the engine's scripted child runs. Signed-off-by: Kristof Siket --- .../cli/src/__tests__/run-alchemy.test.ts | 25 ++++++++++--------- .../family/__tests__/deploy-destroy.test.ts | 3 +++ .../3-tooling/cli/src/run-alchemy.ts | 14 +++++------ 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/packages/0-framework/3-tooling/cli/src/__tests__/run-alchemy.test.ts b/packages/0-framework/3-tooling/cli/src/__tests__/run-alchemy.test.ts index d15514b14..f2c4b3d79 100644 --- a/packages/0-framework/3-tooling/cli/src/__tests__/run-alchemy.test.ts +++ b/packages/0-framework/3-tooling/cli/src/__tests__/run-alchemy.test.ts @@ -95,10 +95,10 @@ describe('alchemyInvocation()', () => { }); }); - // Tests run under bun, so the bun branch is taken: command = alchemy bin. + // Tests run under bun, so the bun branch is taken: command = process.execPath (bun), args[0] = alchemy.js. test('becomes ` --yes --stage ` against the resolved bin', async () => { const dir = makeTmpDir(); - const bin = installFakeAlchemy(dir); + const js = installFakeAlchemyJs(dir); expect( await alchemyCommandLine( @@ -111,8 +111,8 @@ describe('alchemyInvocation()', () => { }), ), ).toEqual({ - command: bin, - args: ['deploy', '.prisma-composer/alchemy.run.ts', '--yes', '--stage', 'ci-42'], + command: process.execPath, + args: [js, 'deploy', '.prisma-composer/alchemy.run.ts', '--yes', '--stage', 'ci-42'], cwd: dir, env: {}, }); @@ -120,7 +120,7 @@ describe('alchemyInvocation()', () => { test("destroy passes --stage too — the stage is never left to alchemy's machine-dependent default", async () => { const dir = makeTmpDir(); - installFakeAlchemy(dir); + const js = installFakeAlchemyJs(dir); expect( ( @@ -134,12 +134,12 @@ describe('alchemyInvocation()', () => { }), ) ).args, - ).toEqual(['destroy', '.prisma-composer/alchemy.run.ts', '--yes', '--stage', 'br_test123']); + ).toEqual([js, 'destroy', '.prisma-composer/alchemy.run.ts', '--yes', '--stage', 'br_test123']); }); test('the stage never comes from the environment: identical argv whatever USER is', async () => { const dir = makeTmpDir(); - installFakeAlchemy(dir); + const js = installFakeAlchemyJs(dir); const argv = ( await alchemyCommandLine( @@ -155,6 +155,7 @@ describe('alchemyInvocation()', () => { expect(argv).not.toContain(os.userInfo().username); expect(argv).toEqual([ + js, 'deploy', '.prisma-composer/alchemy.run.ts', '--yes', @@ -165,7 +166,7 @@ describe('alchemyInvocation()', () => { test('env carries only the ADDITIONS — the containers plus the extra pointers, never a whole environment', () => { const dir = makeTmpDir(); - installFakeAlchemy(dir); + installFakeAlchemyJs(dir); expect( alchemyInvocation({ @@ -187,8 +188,8 @@ describe('spawnAlchemy()', () => { test('runs the invocation in its cwd with its env additions merged over the invoking environment', async () => { const dir = makeTmpDir(); const captureFile = path.join(dir, 'capture.json'); - installFakeAlchemy(dir, [ - 'const fs = require("node:fs");', + installFakeAlchemyJs(dir, [ + 'import fs from "node:fs";', 'fs.writeFileSync(process.env.CAPTURE_FILE, JSON.stringify({', ' argv: process.argv.slice(2),', ' cwd: process.cwd(),', @@ -228,7 +229,7 @@ describe('spawnAlchemy()', () => { test("returns a failing child's status verbatim rather than collapsing it", async () => { const dir = makeTmpDir(); - installFakeAlchemy(dir, ['process.exit(3);']); + installFakeAlchemyJs(dir, ['process.exit(3);']); expect( await spawnAlchemy({ @@ -251,7 +252,7 @@ describe('spawnAlchemy()', () => { */ test('a signal-killed child comes back as the signal with a null exit code', async () => { const dir = makeTmpDir(); - installFakeAlchemy(dir, [ + installFakeAlchemyJs(dir, [ 'process.kill(process.pid, "SIGTERM");', 'setTimeout(() => {}, 5000);', ]); diff --git a/packages/0-framework/3-tooling/cli/src/family/__tests__/deploy-destroy.test.ts b/packages/0-framework/3-tooling/cli/src/family/__tests__/deploy-destroy.test.ts index 3da1d0d82..d63185eb2 100644 --- a/packages/0-framework/3-tooling/cli/src/family/__tests__/deploy-destroy.test.ts +++ b/packages/0-framework/3-tooling/cli/src/family/__tests__/deploy-destroy.test.ts @@ -37,6 +37,9 @@ const CWD = (() => { const bin = path.join(dir, 'node_modules', '.bin'); fs.mkdirSync(bin, { recursive: true }); fs.writeFileSync(path.join(bin, 'alchemy'), '#!/usr/bin/env node\n', { mode: 0o755 }); + const alchemyBin = path.join(dir, 'node_modules', 'alchemy', 'bin'); + fs.mkdirSync(alchemyBin, { recursive: true }); + fs.writeFileSync(path.join(alchemyBin, 'alchemy.js'), ''); return dir; })(); diff --git a/packages/0-framework/3-tooling/cli/src/run-alchemy.ts b/packages/0-framework/3-tooling/cli/src/run-alchemy.ts index 426c32060..b3a484c59 100644 --- a/packages/0-framework/3-tooling/cli/src/run-alchemy.ts +++ b/packages/0-framework/3-tooling/cli/src/run-alchemy.ts @@ -2,10 +2,9 @@ * Pipeline step 7 (deploy-cli.md § The pipeline; design-notes.md's "Driving * Alchemy" call): hand the terminal to the generated stack file. * - * Under Bun, resolves the workspace's own installed `alchemy` bin (walking up - * `node_modules/.bin` from the generated file's package dir). Alchemy's bin - * launcher (`alchemy/bin/cli.js`) does its own node/bun dispatch driven by - * the env it inherits. + * Under Bun, runs `alchemy.js` directly under `process.execPath` (bun) so + * the converge child always inherits the CLI's own runtime — no launcher, no + * env heuristics. * * Under Node, bypasses the alchemy launcher and runs `alchemy.js` directly * under tsx (`node ...`). tsx @@ -111,7 +110,8 @@ const alchemyArgs = (invocation: AlchemyInvocation): string[] => [ * and no caller should. Raises DEPLOY.ALCHEMY_BIN_MISSING when the app has no * alchemy installed. * - * Under Bun, runs the alchemy launcher directly (it handles its own dispatch). + * Under Bun, runs `alchemy.js` directly under `process.execPath` (bun) — the + * converge child always inherits the CLI's own runtime, explicitly. * Under Node, runs `node ` so tsx provides * TypeScript resolution for the stack file and the entry graph it imports. */ @@ -120,8 +120,8 @@ export async function alchemyCommandLine( ): Promise { if (typeof process.versions.bun === 'string') { return { - command: resolveAlchemyBin(invocation.cwd), - args: alchemyArgs(invocation), + command: process.execPath, + args: [resolveAlchemyJs(invocation.cwd), ...alchemyArgs(invocation)], cwd: invocation.cwd, env: invocation.env, }; From 737905d2a485aa5cbc75484af3c397d7eb708bf7 Mon Sep 17 00:00:00 2001 From: Kristof Siket Date: Wed, 19 Aug 2026 13:13:30 +0200 Subject: [PATCH 8/8] fix(store): add "type": "module" to storefront package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without this, tsx's getPackageType() returns "commonjs" for service.ts and compiles it to CJS. The CJS output tries to require() @prisma/composer/nextjs, which is an ESM-only .mjs file — Node refuses a synchronous require() of a .mjs module, so the import fails silently and storefrontService is undefined when module.ts's provision() runs. The other store packages (catalog, orders, promotions) already had "type": "module". Signed-off-by: Kristof Siket --- examples/store/modules/storefront/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/store/modules/storefront/package.json b/examples/store/modules/storefront/package.json index e69abda41..492c83217 100644 --- a/examples/store/modules/storefront/package.json +++ b/examples/store/modules/storefront/package.json @@ -2,6 +2,7 @@ "name": "@store/storefront", "version": "0.10.0", "private": true, + "type": "module", "exports": { ".": "./src/service.ts" },