@tanstack/create 0.49.3 → 0.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +732 -0
- package/dist/add-ons.js +42 -2
- package/dist/add-to-app.js +36 -7
- package/dist/custom-add-ons/add-on.js +2 -26
- package/dist/custom-add-ons/starter.js +1 -2
- package/dist/file-helpers.js +11 -10
- package/dist/frameworks/react/add-ons/ai/info.json +1 -1
- package/dist/frameworks/react/add-ons/apollo-client/info.json +1 -1
- package/dist/frameworks/react/add-ons/better-auth/info.json +0 -2
- package/dist/frameworks/react/add-ons/clerk/info.json +0 -1
- package/dist/frameworks/react/add-ons/db/info.json +1 -1
- package/dist/frameworks/react/add-ons/drizzle/info.json +1 -1
- package/dist/frameworks/react/add-ons/drizzle/package.json.ejs +4 -0
- package/dist/frameworks/react/add-ons/mcp/info.json +1 -2
- package/dist/frameworks/react/add-ons/neon/assets/neon-vite-plugin.ts +1 -1
- package/dist/frameworks/react/add-ons/neon/info.json +1 -2
- package/dist/frameworks/react/add-ons/oRPC/info.json +1 -1
- package/dist/frameworks/react/add-ons/paraglide/info.json +1 -1
- package/dist/frameworks/react/add-ons/prisma/info.json +1 -1
- package/dist/frameworks/react/add-ons/prisma/package.json.ejs +4 -0
- package/dist/frameworks/react/add-ons/sentry/info.json +1 -2
- package/dist/frameworks/react/add-ons/tRPC/info.json +1 -1
- package/dist/frameworks/react/add-ons/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +1 -29
- package/dist/frameworks/react/add-ons/workos/info.json +0 -1
- package/dist/frameworks/react/hosts/cloudflare/info.json +0 -1
- package/dist/frameworks/react/hosts/netlify/info.json +0 -1
- package/dist/frameworks/react/hosts/nitro/info.json +0 -1
- package/dist/frameworks/react/hosts/railway/info.json +0 -1
- package/dist/frameworks/react/index.js +1 -6
- package/dist/frameworks/react/project/base/README.md.ejs +86 -436
- package/dist/frameworks/react/project/base/_dot_gitignore +4 -0
- package/dist/frameworks/react/project/base/package.json +8 -5
- package/dist/frameworks/react/project/base/src/components/Header.tsx.ejs +2 -32
- package/dist/frameworks/react/project/base/src/routes/__root.tsx.ejs +4 -44
- package/dist/frameworks/react/project/base/src/routes/index.tsx.ejs +99 -61
- package/dist/frameworks/react/project/base/src/styles.css.ejs +3 -3
- package/dist/frameworks/react/project/base/tsconfig.json.ejs +1 -1
- package/dist/frameworks/react/project/base/vite.config.ts.ejs +33 -27
- package/dist/frameworks/react/project/packages.json +2 -2
- package/dist/frameworks/solid/add-ons/better-auth/info.json +1 -1
- package/dist/frameworks/solid/hosts/cloudflare/info.json +0 -1
- package/dist/frameworks/solid/hosts/netlify/info.json +0 -1
- package/dist/frameworks/solid/hosts/nitro/info.json +0 -1
- package/dist/frameworks/solid/hosts/railway/info.json +0 -1
- package/dist/frameworks/solid/index.js +1 -6
- package/dist/frameworks/solid/project/base/README.md.ejs +43 -117
- package/dist/frameworks/solid/project/base/_dot_gitignore +4 -0
- package/dist/frameworks/solid/project/base/package.json +8 -3
- package/dist/frameworks/solid/project/base/src/components/Header.tsx.ejs +2 -25
- package/dist/frameworks/solid/project/base/src/routes/__root.tsx.ejs +3 -30
- package/dist/frameworks/solid/project/base/src/routes/index.tsx.ejs +97 -35
- package/dist/frameworks/solid/project/base/tsconfig.json.ejs +1 -1
- package/dist/frameworks/solid/project/base/vite.config.ts.ejs +15 -20
- package/dist/frameworks/solid/project/packages.json +2 -2
- package/dist/frameworks.js +0 -1
- package/dist/package-json.js +6 -10
- package/dist/template-file.js +21 -7
- package/dist/types/custom-add-ons/add-on.d.ts +1 -1
- package/dist/types/file-helpers.d.ts +0 -1
- package/dist/types/types.d.ts +12 -12
- package/dist/types.js +1 -2
- package/package.json +1 -1
- package/src/add-ons.ts +54 -2
- package/src/add-to-app.ts +42 -7
- package/src/custom-add-ons/add-on.ts +2 -33
- package/src/custom-add-ons/starter.ts +1 -2
- package/src/file-helpers.ts +11 -10
- package/src/frameworks/react/add-ons/ai/info.json +1 -1
- package/src/frameworks/react/add-ons/apollo-client/info.json +1 -1
- package/src/frameworks/react/add-ons/better-auth/info.json +0 -2
- package/src/frameworks/react/add-ons/clerk/info.json +0 -1
- package/src/frameworks/react/add-ons/db/info.json +1 -1
- package/src/frameworks/react/add-ons/drizzle/info.json +1 -1
- package/src/frameworks/react/add-ons/drizzle/package.json.ejs +4 -0
- package/src/frameworks/react/add-ons/mcp/info.json +1 -2
- package/src/frameworks/react/add-ons/neon/assets/neon-vite-plugin.ts +1 -1
- package/src/frameworks/react/add-ons/neon/info.json +1 -2
- package/src/frameworks/react/add-ons/oRPC/info.json +1 -1
- package/src/frameworks/react/add-ons/paraglide/info.json +1 -1
- package/src/frameworks/react/add-ons/prisma/info.json +1 -1
- package/src/frameworks/react/add-ons/prisma/package.json.ejs +4 -0
- package/src/frameworks/react/add-ons/sentry/info.json +1 -2
- package/src/frameworks/react/add-ons/tRPC/info.json +1 -1
- package/src/frameworks/react/add-ons/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +1 -29
- package/src/frameworks/react/add-ons/workos/info.json +0 -1
- package/src/frameworks/react/hosts/cloudflare/info.json +0 -1
- package/src/frameworks/react/hosts/netlify/info.json +0 -1
- package/src/frameworks/react/hosts/nitro/info.json +0 -1
- package/src/frameworks/react/hosts/railway/info.json +0 -1
- package/src/frameworks/react/index.ts +1 -6
- package/src/frameworks/react/project/base/README.md.ejs +86 -436
- package/src/frameworks/react/project/base/_dot_gitignore +4 -0
- package/src/frameworks/react/project/base/package.json +8 -5
- package/src/frameworks/react/project/base/src/components/Header.tsx.ejs +2 -32
- package/src/frameworks/react/project/base/src/routes/__root.tsx.ejs +4 -44
- package/src/frameworks/react/project/base/src/routes/index.tsx.ejs +99 -61
- package/src/frameworks/react/project/base/src/styles.css.ejs +3 -3
- package/src/frameworks/react/project/base/tsconfig.json.ejs +1 -1
- package/src/frameworks/react/project/base/vite.config.ts.ejs +33 -27
- package/src/frameworks/react/project/packages.json +2 -2
- package/src/frameworks/solid/add-ons/better-auth/info.json +1 -1
- package/src/frameworks/solid/hosts/cloudflare/info.json +0 -1
- package/src/frameworks/solid/hosts/netlify/info.json +0 -1
- package/src/frameworks/solid/hosts/nitro/info.json +0 -1
- package/src/frameworks/solid/hosts/railway/info.json +0 -1
- package/src/frameworks/solid/index.ts +1 -6
- package/src/frameworks/solid/project/base/README.md.ejs +43 -117
- package/src/frameworks/solid/project/base/_dot_gitignore +4 -0
- package/src/frameworks/solid/project/base/package.json +8 -3
- package/src/frameworks/solid/project/base/src/components/Header.tsx.ejs +2 -25
- package/src/frameworks/solid/project/base/src/routes/__root.tsx.ejs +3 -30
- package/src/frameworks/solid/project/base/src/routes/index.tsx.ejs +97 -35
- package/src/frameworks/solid/project/base/tsconfig.json.ejs +1 -1
- package/src/frameworks/solid/project/base/vite.config.ts.ejs +15 -20
- package/src/frameworks/solid/project/packages.json +2 -2
- package/src/frameworks.ts +0 -1
- package/src/package-json.ts +6 -10
- package/src/template-file.ts +27 -8
- package/src/types.ts +1 -2
- package/tests/add-to-app.test.ts +37 -0
- package/tests/file-helper.test.ts +23 -2
- package/tests/package-json.test.ts +32 -0
- package/tests/template-file.test.ts +28 -0
- package/dist/frameworks/react/add-ons/module-federation/assets/module-federation.config.js.ejs +0 -31
- package/dist/frameworks/react/add-ons/module-federation/assets/src/demo-mf-component.tsx +0 -3
- package/dist/frameworks/react/add-ons/module-federation/assets/src/demo-mf-self-contained.tsx +0 -11
- package/dist/frameworks/react/add-ons/module-federation/info.json +0 -11
- package/dist/frameworks/react/add-ons/module-federation/package.json +0 -5
- package/dist/frameworks/react/add-ons/module-federation/small-logo.svg +0 -87
- package/dist/frameworks/react/add-ons/start/assets/_dot_gitignore.append +0 -3
- package/dist/frameworks/react/add-ons/start/assets/src/data/demo.punk-songs.ts +0 -13
- package/dist/frameworks/react/add-ons/start/assets/src/router.tsx.ejs +0 -77
- package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/api.names.ts +0 -10
- package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/api.tq-todos.ts.ejs +0 -35
- package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.api-request.tsx.ejs +0 -68
- package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.css.ejs +0 -43
- package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.server-funcs.tsx.ejs +0 -183
- package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.data-only.tsx.ejs +0 -55
- package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.full-ssr.tsx.ejs +0 -55
- package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.index.tsx.ejs +0 -62
- package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.spa-mode.tsx.ejs +0 -62
- package/dist/frameworks/react/add-ons/start/assets/src/routes/index.tsx.ejs +0 -142
- package/dist/frameworks/react/add-ons/start/assets/src/server.ts.ejs +0 -9
- package/dist/frameworks/react/add-ons/start/assets/vite.config.ts.ejs +0 -40
- package/dist/frameworks/react/add-ons/start/info.json +0 -61
- package/dist/frameworks/react/add-ons/start/package.json +0 -12
- package/dist/frameworks/react/add-ons/start/small-logo.svg +0 -1
- package/dist/frameworks/react/project/base/index.html.ejs +0 -20
- package/dist/frameworks/react/project/base/src/App.css.ejs +0 -38
- package/dist/frameworks/react/project/base/src/App.tsx.ejs +0 -63
- package/dist/frameworks/react/project/base/src/components/Header.css.ejs +0 -18
- package/dist/frameworks/react/project/base/src/logo.svg +0 -12
- package/dist/frameworks/react/project/base/src/main.tsx.ejs +0 -166
- package/dist/frameworks/react/project/base/src/reportWebVitals.ts.ejs +0 -28
- package/dist/frameworks/solid/add-ons/module-federation/assets/module-federation.config.js.ejs +0 -27
- package/dist/frameworks/solid/add-ons/module-federation/assets/src/demo-mf-component.tsx +0 -3
- package/dist/frameworks/solid/add-ons/module-federation/assets/src/demo-mf-self-contained.tsx +0 -9
- package/dist/frameworks/solid/add-ons/module-federation/info.json +0 -10
- package/dist/frameworks/solid/add-ons/module-federation/package.json +0 -5
- package/dist/frameworks/solid/add-ons/module-federation/small-logo.svg +0 -87
- package/dist/frameworks/solid/add-ons/start/assets/public/tanstack-circle-logo.png +0 -0
- package/dist/frameworks/solid/add-ons/start/assets/public/tanstack-word-logo-white.svg +0 -1
- package/dist/frameworks/solid/add-ons/start/assets/src/router.tsx.ejs +0 -30
- package/dist/frameworks/solid/add-ons/start/assets/src/routes/demo.start.server-funcs.tsx +0 -49
- package/dist/frameworks/solid/add-ons/start/assets/src/routes/index.tsx.ejs +0 -138
- package/dist/frameworks/solid/add-ons/start/assets/vite.config.ts.ejs +0 -22
- package/dist/frameworks/solid/add-ons/start/info.json +0 -18
- package/dist/frameworks/solid/add-ons/start/package.json +0 -15
- package/dist/frameworks/solid/add-ons/start/small-logo.svg +0 -1
- package/dist/frameworks/solid/project/base/index.html.ejs +0 -20
- package/dist/frameworks/solid/project/base/src/App.css.ejs +0 -38
- package/dist/frameworks/solid/project/base/src/App.tsx.ejs +0 -34
- package/dist/frameworks/solid/project/base/src/logo.svg +0 -120
- package/dist/frameworks/solid/project/base/src/main.tsx.ejs +0 -126
- package/src/frameworks/react/add-ons/module-federation/assets/module-federation.config.js.ejs +0 -31
- package/src/frameworks/react/add-ons/module-federation/assets/src/demo-mf-component.tsx +0 -3
- package/src/frameworks/react/add-ons/module-federation/assets/src/demo-mf-self-contained.tsx +0 -11
- package/src/frameworks/react/add-ons/module-federation/info.json +0 -11
- package/src/frameworks/react/add-ons/module-federation/package.json +0 -5
- package/src/frameworks/react/add-ons/module-federation/small-logo.svg +0 -87
- package/src/frameworks/react/add-ons/start/assets/_dot_gitignore.append +0 -3
- package/src/frameworks/react/add-ons/start/assets/src/data/demo.punk-songs.ts +0 -13
- package/src/frameworks/react/add-ons/start/assets/src/router.tsx.ejs +0 -77
- package/src/frameworks/react/add-ons/start/assets/src/routes/demo/api.names.ts +0 -10
- package/src/frameworks/react/add-ons/start/assets/src/routes/demo/api.tq-todos.ts.ejs +0 -35
- package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.api-request.tsx.ejs +0 -68
- package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.css.ejs +0 -43
- package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.server-funcs.tsx.ejs +0 -183
- package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.data-only.tsx.ejs +0 -55
- package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.full-ssr.tsx.ejs +0 -55
- package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.index.tsx.ejs +0 -62
- package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.spa-mode.tsx.ejs +0 -62
- package/src/frameworks/react/add-ons/start/assets/src/routes/index.tsx.ejs +0 -142
- package/src/frameworks/react/add-ons/start/assets/src/server.ts.ejs +0 -9
- package/src/frameworks/react/add-ons/start/assets/vite.config.ts.ejs +0 -40
- package/src/frameworks/react/add-ons/start/info.json +0 -61
- package/src/frameworks/react/add-ons/start/package.json +0 -12
- package/src/frameworks/react/add-ons/start/small-logo.svg +0 -1
- package/src/frameworks/react/project/base/index.html.ejs +0 -20
- package/src/frameworks/react/project/base/src/App.css.ejs +0 -38
- package/src/frameworks/react/project/base/src/App.tsx.ejs +0 -63
- package/src/frameworks/react/project/base/src/components/Header.css.ejs +0 -18
- package/src/frameworks/react/project/base/src/logo.svg +0 -12
- package/src/frameworks/react/project/base/src/main.tsx.ejs +0 -166
- package/src/frameworks/react/project/base/src/reportWebVitals.ts.ejs +0 -28
- package/src/frameworks/solid/add-ons/module-federation/assets/module-federation.config.js.ejs +0 -27
- package/src/frameworks/solid/add-ons/module-federation/assets/src/demo-mf-component.tsx +0 -3
- package/src/frameworks/solid/add-ons/module-federation/assets/src/demo-mf-self-contained.tsx +0 -9
- package/src/frameworks/solid/add-ons/module-federation/info.json +0 -10
- package/src/frameworks/solid/add-ons/module-federation/package.json +0 -5
- package/src/frameworks/solid/add-ons/module-federation/small-logo.svg +0 -87
- package/src/frameworks/solid/add-ons/start/assets/public/tanstack-circle-logo.png +0 -0
- package/src/frameworks/solid/add-ons/start/assets/public/tanstack-word-logo-white.svg +0 -1
- package/src/frameworks/solid/add-ons/start/assets/src/router.tsx.ejs +0 -30
- package/src/frameworks/solid/add-ons/start/assets/src/routes/demo.start.server-funcs.tsx +0 -49
- package/src/frameworks/solid/add-ons/start/assets/src/routes/index.tsx.ejs +0 -138
- package/src/frameworks/solid/add-ons/start/assets/vite.config.ts.ejs +0 -22
- package/src/frameworks/solid/add-ons/start/info.json +0 -18
- package/src/frameworks/solid/add-ons/start/package.json +0 -15
- package/src/frameworks/solid/add-ons/start/small-logo.svg +0 -1
- package/src/frameworks/solid/project/base/index.html.ejs +0 -20
- package/src/frameworks/solid/project/base/src/App.css.ejs +0 -38
- package/src/frameworks/solid/project/base/src/App.tsx.ejs +0 -34
- package/src/frameworks/solid/project/base/src/logo.svg +0 -120
- package/src/frameworks/solid/project/base/src/main.tsx.ejs +0 -126
package/dist/add-ons.js
CHANGED
|
@@ -15,16 +15,23 @@ export async function finalizeAddOns(framework, mode, chosenAddOnIDs) {
|
|
|
15
15
|
const addOns = getAllAddOns(framework, mode);
|
|
16
16
|
for (const addOnID of finalAddOnIDs) {
|
|
17
17
|
let addOn;
|
|
18
|
-
const localAddOn = addOns.find((a) => a.id === addOnID)
|
|
18
|
+
const localAddOn = addOns.find((a) => a.id === addOnID) ??
|
|
19
|
+
addOns.find((a) => a.id.toLowerCase() === addOnID.toLowerCase());
|
|
19
20
|
if (localAddOn) {
|
|
20
21
|
addOn = loadAddOn(localAddOn);
|
|
22
|
+
if (localAddOn.id !== addOnID) {
|
|
23
|
+
// Replace the mistyped ID with the canonical one
|
|
24
|
+
finalAddOnIDs.delete(addOnID);
|
|
25
|
+
finalAddOnIDs.add(localAddOn.id);
|
|
26
|
+
}
|
|
21
27
|
}
|
|
22
28
|
else if (addOnID.startsWith('http')) {
|
|
23
29
|
addOn = await loadRemoteAddOn(addOnID);
|
|
24
30
|
addOns.push(addOn);
|
|
25
31
|
}
|
|
26
32
|
else {
|
|
27
|
-
|
|
33
|
+
const suggestion = findClosestAddOn(addOnID, addOns);
|
|
34
|
+
throw new Error(`Add-on ${addOnID} not found${suggestion ? `. Did you mean "${suggestion}"?` : ''}`);
|
|
28
35
|
}
|
|
29
36
|
for (const dependsOn of addOn.dependsOn || []) {
|
|
30
37
|
const dep = addOns.find((a) => a.id === dependsOn);
|
|
@@ -40,6 +47,39 @@ export async function finalizeAddOns(framework, mode, chosenAddOnIDs) {
|
|
|
40
47
|
function loadAddOn(addOn) {
|
|
41
48
|
return addOn;
|
|
42
49
|
}
|
|
50
|
+
function findClosestAddOn(input, addOns) {
|
|
51
|
+
const inputLower = input.toLowerCase();
|
|
52
|
+
let bestMatch;
|
|
53
|
+
let bestDistance = Infinity;
|
|
54
|
+
for (const addOn of addOns) {
|
|
55
|
+
const d = levenshtein(inputLower, addOn.id.toLowerCase());
|
|
56
|
+
if (d < bestDistance) {
|
|
57
|
+
bestDistance = d;
|
|
58
|
+
bestMatch = addOn.id;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Only suggest if the distance is reasonable (less than half the input length)
|
|
62
|
+
if (bestMatch && bestDistance <= Math.max(Math.floor(input.length / 2), 2)) {
|
|
63
|
+
return bestMatch;
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
function levenshtein(a, b) {
|
|
68
|
+
const m = a.length;
|
|
69
|
+
const n = b.length;
|
|
70
|
+
let prev = Array.from({ length: n + 1 }, (_, j) => j);
|
|
71
|
+
for (let i = 1; i <= m; i++) {
|
|
72
|
+
const curr = [i];
|
|
73
|
+
for (let j = 1; j <= n; j++) {
|
|
74
|
+
curr[j] =
|
|
75
|
+
a[i - 1] === b[j - 1]
|
|
76
|
+
? prev[j - 1]
|
|
77
|
+
: 1 + Math.min(prev[j], curr[j - 1], prev[j - 1]);
|
|
78
|
+
}
|
|
79
|
+
prev = curr;
|
|
80
|
+
}
|
|
81
|
+
return prev[n];
|
|
82
|
+
}
|
|
43
83
|
export function populateAddOnOptionsDefaults(chosenAddOns) {
|
|
44
84
|
const addOnOptions = {};
|
|
45
85
|
for (const addOn of chosenAddOns) {
|
package/dist/add-to-app.js
CHANGED
|
@@ -45,13 +45,41 @@ export async function getCurrentConfiguration(environment, cwd) {
|
|
|
45
45
|
return persistedOptions;
|
|
46
46
|
}
|
|
47
47
|
export async function writeFiles(environment, cwd, output, forced) {
|
|
48
|
+
const toRelativePath = (filePath) => {
|
|
49
|
+
const normalizedFilePath = filePath.replace(/\\/g, '/');
|
|
50
|
+
const normalizedCwd = cwd.replace(/\\/g, '/');
|
|
51
|
+
const cwdWithoutDrive = normalizedCwd.replace(/^[a-zA-Z]:/, '');
|
|
52
|
+
const cwdWithoutDriveNoLeading = cwdWithoutDrive.replace(/^\/+/, '');
|
|
53
|
+
if (normalizedFilePath === normalizedCwd) {
|
|
54
|
+
return '';
|
|
55
|
+
}
|
|
56
|
+
if (normalizedFilePath.startsWith(`${normalizedCwd}/`)) {
|
|
57
|
+
return normalizedFilePath.slice(normalizedCwd.length + 1);
|
|
58
|
+
}
|
|
59
|
+
if (normalizedFilePath === cwdWithoutDrive) {
|
|
60
|
+
return '';
|
|
61
|
+
}
|
|
62
|
+
if (normalizedFilePath.startsWith(`${cwdWithoutDrive}/`)) {
|
|
63
|
+
return normalizedFilePath.slice(cwdWithoutDrive.length + 1);
|
|
64
|
+
}
|
|
65
|
+
if (normalizedFilePath === cwdWithoutDriveNoLeading) {
|
|
66
|
+
return '';
|
|
67
|
+
}
|
|
68
|
+
if (normalizedFilePath.startsWith(`${cwdWithoutDriveNoLeading}/`)) {
|
|
69
|
+
return normalizedFilePath.slice(cwdWithoutDriveNoLeading.length + 1);
|
|
70
|
+
}
|
|
71
|
+
return normalizedFilePath.replace(/^\/+/, '');
|
|
72
|
+
};
|
|
73
|
+
const relativeOutputFiles = Object.keys(output.files).reduce((acc, filePath) => {
|
|
74
|
+
acc[toRelativePath(filePath)] = output.files[filePath];
|
|
75
|
+
return acc;
|
|
76
|
+
}, {});
|
|
48
77
|
const currentFiles = await recursivelyGatherFilesFromEnvironment(environment, cwd, false);
|
|
49
78
|
const overwrittenFiles = [];
|
|
50
79
|
const changedFiles = [];
|
|
51
|
-
for (const
|
|
52
|
-
const relativeFile = file.replace(cwd, '');
|
|
80
|
+
for (const relativeFile of Object.keys(relativeOutputFiles)) {
|
|
53
81
|
if (currentFiles[relativeFile]) {
|
|
54
|
-
if (currentFiles[relativeFile] !==
|
|
82
|
+
if (currentFiles[relativeFile] !== relativeOutputFiles[relativeFile]) {
|
|
55
83
|
overwrittenFiles.push(relativeFile);
|
|
56
84
|
}
|
|
57
85
|
}
|
|
@@ -66,9 +94,10 @@ export async function writeFiles(environment, cwd, output, forced) {
|
|
|
66
94
|
throw new Error('User cancelled');
|
|
67
95
|
}
|
|
68
96
|
}
|
|
69
|
-
for (const
|
|
70
|
-
|
|
71
|
-
|
|
97
|
+
for (const filePath of output.deletedFiles) {
|
|
98
|
+
const relativeFilePath = toRelativePath(filePath);
|
|
99
|
+
if (environment.exists(resolve(cwd, relativeFilePath))) {
|
|
100
|
+
await environment.deleteFile(resolve(cwd, relativeFilePath));
|
|
72
101
|
}
|
|
73
102
|
}
|
|
74
103
|
environment.startStep({
|
|
@@ -78,7 +107,7 @@ export async function writeFiles(environment, cwd, output, forced) {
|
|
|
78
107
|
});
|
|
79
108
|
for (const file of [...changedFiles, ...overwrittenFiles]) {
|
|
80
109
|
const fName = basename(file);
|
|
81
|
-
const contents =
|
|
110
|
+
const contents = relativeOutputFiles[file];
|
|
82
111
|
if (fName === 'package.json') {
|
|
83
112
|
const currentJson = JSON.parse(await environment.readFile(resolve(cwd, file)));
|
|
84
113
|
const newJSON = mergePackageJSON(currentJson, JSON.parse(contents));
|
|
@@ -25,7 +25,7 @@ export function camelCase(str) {
|
|
|
25
25
|
export function templatize(routeCode, routeFile) {
|
|
26
26
|
let code = routeCode;
|
|
27
27
|
// Replace the import
|
|
28
|
-
code = code.replace(/import { createFileRoute } from ['"]@tanstack\/react-router['"]/g, `import {
|
|
28
|
+
code = code.replace(/import { createFileRoute } from ['"]@tanstack\/react-router['"]/g, `import { createFileRoute } from '@tanstack/react-router'`);
|
|
29
29
|
// Extract route path and definition, then transform the route declaration
|
|
30
30
|
const routeMatch = code.match(/export\s+const\s+Route\s*=\s*createFileRoute\(['"]([^'"]+)['"]\)\s*\(\{([^}]+)\}\)/);
|
|
31
31
|
let path = '';
|
|
@@ -33,21 +33,7 @@ export function templatize(routeCode, routeFile) {
|
|
|
33
33
|
const fullMatch = routeMatch[0];
|
|
34
34
|
path = routeMatch[1];
|
|
35
35
|
const routeDefinition = routeMatch[2];
|
|
36
|
-
code = code.replace(fullMatch,
|
|
37
|
-
import type { RootRoute } from '@tanstack/react-router'
|
|
38
|
-
import tailwind from '@tailwindcss/vite';
|
|
39
|
-
<% } else { %>
|
|
40
|
-
export const Route = createFileRoute('${path}')({${routeDefinition}})
|
|
41
|
-
<% } %>`);
|
|
42
|
-
code += `
|
|
43
|
-
<% if (codeRouter) { %>
|
|
44
|
-
export default (parentRoute: RootRoute) => createRoute({
|
|
45
|
-
path: '${path}',
|
|
46
|
-
${routeDefinition}
|
|
47
|
-
getParentRoute: () => parentRoute,
|
|
48
|
-
})
|
|
49
|
-
<% } %>
|
|
50
|
-
`;
|
|
36
|
+
code = code.replace(fullMatch, `export const Route = createFileRoute('${path}')({${routeDefinition}})`);
|
|
51
37
|
}
|
|
52
38
|
else {
|
|
53
39
|
console.error(`No route found in the file: ${routeFile}`);
|
|
@@ -66,14 +52,6 @@ export async function validateAddOnSetup(environment) {
|
|
|
66
52
|
environment.error('This project is using code-router mode.', 'To create an add-on, the project must not use code-router mode.');
|
|
67
53
|
process.exit(1);
|
|
68
54
|
}
|
|
69
|
-
if (!options.tailwind) {
|
|
70
|
-
environment.error('This project is not using Tailwind CSS.', 'To create an add-on, the project must be created with Tailwind CSS.');
|
|
71
|
-
process.exit(1);
|
|
72
|
-
}
|
|
73
|
-
if (!options.typescript) {
|
|
74
|
-
environment.error('This project is not using TypeScript.', 'To create an add-on, the project must be created with TypeScript.');
|
|
75
|
-
process.exit(1);
|
|
76
|
-
}
|
|
77
55
|
}
|
|
78
56
|
export async function readOrGenerateAddOnInfo(options) {
|
|
79
57
|
const info = existsSync(INFO_FILE)
|
|
@@ -84,7 +62,6 @@ export async function readOrGenerateAddOnInfo(options) {
|
|
|
84
62
|
version: '0.0.1',
|
|
85
63
|
description: 'Add-on',
|
|
86
64
|
author: 'Jane Smith <jane.smith@example.com>',
|
|
87
|
-
tailwind: options.tailwind || true,
|
|
88
65
|
license: 'MIT',
|
|
89
66
|
link: `https://github.com/jane-smith/${options.projectName}-add-on`,
|
|
90
67
|
shadcnComponents: [],
|
|
@@ -101,7 +78,6 @@ export async function readOrGenerateAddOnInfo(options) {
|
|
|
101
78
|
},
|
|
102
79
|
dependsOn: options.chosenAddOns,
|
|
103
80
|
};
|
|
104
|
-
info.tailwind = options.tailwind || true;
|
|
105
81
|
return info;
|
|
106
82
|
}
|
|
107
83
|
export async function generateProject(persistedOptions) {
|
|
@@ -29,8 +29,7 @@ export async function readOrGenerateStarterInfo(options) {
|
|
|
29
29
|
devDependencies: {},
|
|
30
30
|
},
|
|
31
31
|
dependsOn: options.chosenAddOns,
|
|
32
|
-
typescript:
|
|
33
|
-
tailwind: options.tailwind,
|
|
32
|
+
typescript: true,
|
|
34
33
|
};
|
|
35
34
|
}
|
|
36
35
|
async function loadCurrentStarterInfo(environment) {
|
package/dist/file-helpers.js
CHANGED
|
@@ -29,24 +29,25 @@ export function getBinaryFile(content) {
|
|
|
29
29
|
return null;
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
|
-
* Convert an absolute path to a clean relative path by removing a base directory.
|
|
33
32
|
* Returns a path without leading ./ or / prefix.
|
|
34
33
|
*/
|
|
35
34
|
export function toCleanPath(absolutePath, baseDir) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
// Normalize both paths to use forward slashes for consistent comparison
|
|
36
|
+
const normalizedPath = absolutePath.replace(/\\/g, '/');
|
|
37
|
+
const normalizedBase = baseDir.replace(/\\/g, '/');
|
|
38
|
+
let cleanPath = normalizedPath.replace(normalizedBase, '');
|
|
39
|
+
// Handle leading path separator
|
|
40
|
+
if (cleanPath.startsWith('/')) {
|
|
39
41
|
cleanPath = cleanPath.slice(1);
|
|
40
42
|
}
|
|
41
43
|
return cleanPath;
|
|
42
44
|
}
|
|
43
45
|
export function relativePath(from, to, stripExtension = false) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
: from;
|
|
46
|
+
// Always normalize backslashes to forward slashes for Windows compatibility
|
|
47
|
+
const normalized = from.replace(/\\/g, '/');
|
|
48
|
+
const cleanedFrom = normalized.startsWith('./')
|
|
49
|
+
? normalized.slice(2)
|
|
50
|
+
: normalized;
|
|
50
51
|
const cleanedTo = to.startsWith('./') ? to.slice(2) : to;
|
|
51
52
|
const fromSegments = cleanedFrom.split('/');
|
|
52
53
|
const toSegments = cleanedTo.split('/');
|
|
@@ -17,5 +17,9 @@
|
|
|
17
17
|
"db:migrate": "dotenv -e .env.local -- prisma migrate dev",
|
|
18
18
|
"db:studio": "dotenv -e .env.local -- prisma studio",
|
|
19
19
|
"db:seed": "dotenv -e .env.local -- prisma db seed"
|
|
20
|
+
}<% if (addOnOption.prisma.database === 'sqlite') { %>,
|
|
21
|
+
"pnpm": {
|
|
22
|
+
"onlyBuiltDependencies": ["better-sqlite3"]
|
|
20
23
|
}
|
|
24
|
+
<% } %>
|
|
21
25
|
}
|
|
@@ -6,8 +6,6 @@ import { createTRPCOptionsProxy } from "@trpc/tanstack-react-query";
|
|
|
6
6
|
|
|
7
7
|
import type { TRPCRouter } from "@/integrations/trpc/router";
|
|
8
8
|
|
|
9
|
-
import { TRPCProvider } from "@/integrations/trpc/react";
|
|
10
|
-
|
|
11
9
|
function getUrl() {
|
|
12
10
|
const base = (() => {
|
|
13
11
|
if (typeof window !== "undefined") return "";
|
|
@@ -42,22 +40,8 @@ export function getContext() {
|
|
|
42
40
|
trpc: serverHelpers,
|
|
43
41
|
};
|
|
44
42
|
}
|
|
45
|
-
|
|
46
|
-
export function Provider({
|
|
47
|
-
children,
|
|
48
|
-
queryClient,
|
|
49
|
-
}: {
|
|
50
|
-
children: React.ReactNode;
|
|
51
|
-
queryClient: QueryClient;
|
|
52
|
-
}) {
|
|
53
|
-
return (
|
|
54
|
-
<TRPCProvider trpcClient={trpcClient} queryClient={queryClient}>
|
|
55
|
-
{children}
|
|
56
|
-
</TRPCProvider>
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
43
|
<% } else { %>
|
|
60
|
-
import { QueryClient
|
|
44
|
+
import { QueryClient } from '@tanstack/react-query'
|
|
61
45
|
|
|
62
46
|
export function getContext() {
|
|
63
47
|
const queryClient = new QueryClient();
|
|
@@ -65,16 +49,4 @@ export function getContext() {
|
|
|
65
49
|
queryClient,
|
|
66
50
|
};
|
|
67
51
|
}
|
|
68
|
-
|
|
69
|
-
export function Provider({
|
|
70
|
-
children,
|
|
71
|
-
queryClient,
|
|
72
|
-
}: {
|
|
73
|
-
children: React.ReactNode;
|
|
74
|
-
queryClient: QueryClient;
|
|
75
|
-
}) {
|
|
76
|
-
return (
|
|
77
|
-
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
52
|
<% } %>
|
|
@@ -20,14 +20,9 @@ export function createFrameworkDefinition() {
|
|
|
20
20
|
basePackageJSON,
|
|
21
21
|
optionalPackages,
|
|
22
22
|
supportedModes: {
|
|
23
|
-
'code-router': {
|
|
24
|
-
displayName: 'Code Router',
|
|
25
|
-
description: 'TanStack Router using code to define routes',
|
|
26
|
-
forceTypescript: false,
|
|
27
|
-
},
|
|
28
23
|
'file-router': {
|
|
29
24
|
displayName: 'File Router',
|
|
30
|
-
description: 'TanStack
|
|
25
|
+
description: 'TanStack Start with file-based routing',
|
|
31
26
|
forceTypescript: true,
|
|
32
27
|
},
|
|
33
28
|
},
|