Skip to content

Commit 87c718d

Browse files
Add Worker-safe create manifest export (#475)
add worker-safe create manifest export
1 parent b0c8ec9 commit 87c718d

22 files changed

Lines changed: 2367 additions & 7 deletions

.changeset/slow-buses-build.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@tanstack/create": patch
3+
---
4+
5+
Add a Worker-safe edge export backed by a build-time generated template and add-on manifest.

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,5 @@ my-app
1919
coverage
2020
playwright-report
2121
test-results
22+
23+
packages/create/src/generated/

docs/cli-reference.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,45 @@ tanstack create --list-add-ons --framework React --json
4444
tanstack create --addon-details drizzle --framework React --json
4545
```
4646

47+
### Worker-safe programmatic generation
48+
49+
Use `@tanstack/create/edge` in Cloudflare Workers and other runtimes that do not expose a Node package filesystem. The default `@tanstack/create` export is still the Node/CLI path and scans framework templates from disk.
50+
51+
```ts
52+
import {
53+
createApp,
54+
createMemoryEnvironment,
55+
finalizeAddOns,
56+
getFrameworkById,
57+
populateAddOnOptionsDefaults,
58+
} from '@tanstack/create/edge'
59+
60+
const framework = getFrameworkById('react')!
61+
const chosenAddOns = await finalizeAddOns(framework, 'file-router', [
62+
'tanstack-query',
63+
'cloudflare',
64+
])
65+
const addOnOptions = populateAddOnOptionsDefaults(chosenAddOns)
66+
const { environment, output } = createMemoryEnvironment('/app')
67+
68+
await createApp(environment, {
69+
projectName: 'app',
70+
targetDir: '/app',
71+
framework,
72+
mode: 'file-router',
73+
typescript: true,
74+
tailwind: true,
75+
packageManager: 'pnpm',
76+
git: false,
77+
install: false,
78+
intent: false,
79+
chosenAddOns,
80+
addOnOptions,
81+
})
82+
83+
// output.files contains generated files for ZIP creation.
84+
```
85+
4786
---
4887

4988
## tanstack add

eslint.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export default [
1010
ignores: [
1111
'**/assets/**',
1212
'**/dist/**',
13+
'**/src/generated/**',
1314
],
1415
},
1516
...tanstackConfig,

packages/create/package.json

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,32 @@
55
"type": "module",
66
"main": "./dist/index.js",
77
"types": "./dist/types/index.d.ts",
8+
"exports": {
9+
".": {
10+
"types": "./dist/types/index.d.ts",
11+
"import": "./dist/index.js",
12+
"default": "./dist/index.js"
13+
},
14+
"./edge": {
15+
"types": "./dist/types/edge.d.ts",
16+
"import": "./dist/edge.js",
17+
"default": "./dist/edge.js"
18+
},
19+
"./manifest": {
20+
"types": "./dist/types/manifest.d.ts",
21+
"import": "./dist/manifest.js",
22+
"default": "./dist/manifest.js"
23+
},
24+
"./dist/*": "./dist/*",
25+
"./package.json": "./package.json"
26+
},
827
"scripts": {
9-
"build": "tsc && npm run copy-assets",
28+
"build": "npm run generate-manifest && tsc && npm run copy-assets",
29+
"generate-manifest": "node ./scripts/generate-manifest.mjs",
1030
"copy-assets": "node -e \"const fs=require('fs');const path=require('path');function copyDir(src,dest){if(!fs.existsSync(dest))fs.mkdirSync(dest,{recursive:true});for(const entry of fs.readdirSync(src,{withFileTypes:true})){const srcPath=path.join(src,entry.name);const destPath=path.join(dest,entry.name);if(entry.isDirectory())copyDir(srcPath,destPath);else fs.copyFileSync(srcPath,destPath)}}['react','solid'].forEach(fw=>{['add-ons','toolchains','hosts','examples','project'].forEach(dir=>{const src='src/frameworks/'+fw+'/'+dir;const dest='dist/frameworks/'+fw+'/'+dir;if(fs.existsSync(src))copyDir(src,dest)})})\"",
11-
"dev": "tsc --watch",
12-
"test": "eslint ./src && vitest run",
13-
"test:watch": "vitest",
31+
"dev": "npm run generate-manifest && tsc --watch",
32+
"test": "npm run generate-manifest && eslint ./src && vitest run",
33+
"test:watch": "npm run generate-manifest && vitest",
1434
"test:coverage": "vitest run --coverage"
1535
},
1636
"repository": {

0 commit comments

Comments
 (0)