@korajs/cli 0.4.0 → 0.6.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/dist/bin.cjs +1636 -601
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +1086 -139
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-MVP5PDT4.js → chunk-EEZNRI5W.js} +51 -6
- package/dist/chunk-EEZNRI5W.js.map +1 -0
- package/dist/{chunk-YGVO4POI.js → chunk-Q2FBCOQD.js} +27 -15
- package/dist/chunk-Q2FBCOQD.js.map +1 -0
- package/dist/{chunk-CMSX76KM.js → chunk-VLTPEATY.js} +172 -99
- package/dist/chunk-VLTPEATY.js.map +1 -0
- package/dist/create.cjs +130 -54
- package/dist/create.cjs.map +1 -1
- package/dist/create.js +2 -2
- package/dist/index.cjs +143 -62
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -6
- package/dist/index.d.ts +8 -6
- package/dist/index.js +2 -2
- package/package.json +9 -3
- package/templates/react-basic/README.md.hbs +10 -1
- package/templates/react-basic/src/App.tsx +112 -126
- package/templates/react-basic/src/index.css +165 -159
- package/templates/react-basic/src/kora-worker.ts +0 -1
- package/templates/react-basic/src/main.tsx +12 -12
- package/templates/react-basic/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/react-basic/src/modules/todos/todo.queries.ts +5 -0
- package/templates/react-basic/src/modules/todos/todo.schema.ts +10 -0
- package/templates/react-basic/src/modules/todos/useTodos.ts +31 -0
- package/templates/react-basic/src/schema.ts +6 -12
- package/templates/react-basic/src/vite-env.d.ts +17 -0
- package/templates/react-basic/{tsconfig.json → tsconfig.json.hbs} +1 -2
- package/templates/react-basic/vite.config.ts +57 -50
- package/templates/react-sync/.env.example +19 -0
- package/templates/react-sync/README.md.hbs +43 -1
- package/templates/react-sync/package.json.hbs +3 -0
- package/templates/react-sync/server.ts +90 -26
- package/templates/react-sync/src/App.tsx +132 -130
- package/templates/react-sync/src/auth.ts +25 -0
- package/templates/react-sync/src/index.css +212 -165
- package/templates/react-sync/src/kora-worker.ts +0 -1
- package/templates/react-sync/src/main.tsx +34 -18
- package/templates/react-sync/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/react-sync/src/modules/todos/todo.queries.ts +5 -0
- package/templates/react-sync/src/modules/todos/todo.schema.ts +10 -0
- package/templates/react-sync/src/modules/todos/useTodos.ts +31 -0
- package/templates/react-sync/src/schema.ts +6 -12
- package/templates/react-sync/src/vite-env.d.ts +17 -0
- package/templates/react-sync/{tsconfig.json → tsconfig.json.hbs} +1 -2
- package/templates/react-sync/vite.config.ts +67 -60
- package/templates/react-tailwind/README.md.hbs +10 -1
- package/templates/react-tailwind/src/App.tsx +186 -197
- package/templates/react-tailwind/src/index.css +3 -3
- package/templates/react-tailwind/src/kora-worker.ts +0 -1
- package/templates/react-tailwind/src/main.tsx +19 -12
- package/templates/react-tailwind/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/react-tailwind/src/modules/todos/todo.queries.ts +5 -0
- package/templates/react-tailwind/src/modules/todos/todo.schema.ts +10 -0
- package/templates/react-tailwind/src/modules/todos/useTodos.ts +31 -0
- package/templates/react-tailwind/src/schema.ts +6 -12
- package/templates/react-tailwind/src/vite-env.d.ts +17 -0
- package/templates/react-tailwind/{tsconfig.json → tsconfig.json.hbs} +1 -2
- package/templates/react-tailwind/vite.config.ts +57 -50
- package/templates/react-tailwind-sync/.env.example +19 -0
- package/templates/react-tailwind-sync/README.md.hbs +43 -1
- package/templates/react-tailwind-sync/package.json.hbs +3 -0
- package/templates/react-tailwind-sync/server.ts +90 -26
- package/templates/react-tailwind-sync/src/App.tsx +246 -222
- package/templates/react-tailwind-sync/src/auth.ts +25 -0
- package/templates/react-tailwind-sync/src/index.css +3 -3
- package/templates/react-tailwind-sync/src/kora-worker.ts +0 -1
- package/templates/react-tailwind-sync/src/main.tsx +48 -18
- package/templates/react-tailwind-sync/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/react-tailwind-sync/src/modules/todos/todo.queries.ts +5 -0
- package/templates/react-tailwind-sync/src/modules/todos/todo.schema.ts +10 -0
- package/templates/react-tailwind-sync/src/modules/todos/useTodos.ts +31 -0
- package/templates/react-tailwind-sync/src/schema.ts +6 -12
- package/templates/react-tailwind-sync/src/vite-env.d.ts +17 -0
- package/templates/react-tailwind-sync/{tsconfig.json → tsconfig.json.hbs} +1 -2
- package/templates/react-tailwind-sync/vite.config.ts +67 -60
- package/templates/svelte-basic/.env.example +3 -0
- package/templates/svelte-basic/README.md.hbs +62 -0
- package/templates/svelte-basic/index.html.hbs +12 -0
- package/templates/svelte-basic/kora.config.ts +12 -0
- package/templates/svelte-basic/package.json.hbs +27 -0
- package/templates/svelte-basic/src/App.svelte +131 -0
- package/templates/svelte-basic/src/Root.svelte +14 -0
- package/templates/svelte-basic/src/index.css +287 -0
- package/templates/svelte-basic/src/kora-worker.ts +9 -0
- package/templates/svelte-basic/src/main.ts +16 -0
- package/templates/svelte-basic/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/svelte-basic/src/modules/todos/todo.queries.ts +5 -0
- package/templates/svelte-basic/src/modules/todos/todo.schema.ts +10 -0
- package/templates/svelte-basic/src/modules/todos/useTodos.ts +25 -0
- package/templates/svelte-basic/src/schema.ts +9 -0
- package/templates/svelte-basic/src/vite-env.d.ts +12 -0
- package/templates/svelte-basic/svelte.config.js +5 -0
- package/templates/svelte-basic/tsconfig.json.hbs +14 -0
- package/templates/svelte-basic/vite.config.ts +52 -0
- package/templates/svelte-sync/.env.example +25 -0
- package/templates/svelte-sync/README.md.hbs +105 -0
- package/templates/svelte-sync/index.html.hbs +12 -0
- package/templates/svelte-sync/kora.config.ts +17 -0
- package/templates/svelte-sync/package.json.hbs +43 -0
- package/templates/svelte-sync/server.ts +90 -0
- package/templates/svelte-sync/src/App.svelte +154 -0
- package/templates/svelte-sync/src/Root.svelte +22 -0
- package/templates/svelte-sync/src/auth.ts +25 -0
- package/templates/svelte-sync/src/index.css +339 -0
- package/templates/svelte-sync/src/kora-worker.ts +9 -0
- package/templates/svelte-sync/src/main.ts +32 -0
- package/templates/svelte-sync/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/svelte-sync/src/modules/todos/todo.queries.ts +5 -0
- package/templates/svelte-sync/src/modules/todos/todo.schema.ts +10 -0
- package/templates/svelte-sync/src/modules/todos/useTodos.ts +25 -0
- package/templates/svelte-sync/src/schema.ts +9 -0
- package/templates/svelte-sync/src/vite-env.d.ts +21 -0
- package/templates/svelte-sync/svelte.config.js +5 -0
- package/templates/svelte-sync/tsconfig.json.hbs +14 -0
- package/templates/svelte-sync/vite.config.ts +79 -0
- package/templates/svelte-tailwind/README.md.hbs +62 -0
- package/templates/svelte-tailwind/index.html.hbs +12 -0
- package/templates/svelte-tailwind/kora.config.ts +12 -0
- package/templates/svelte-tailwind/package.json.hbs +30 -0
- package/templates/svelte-tailwind/src/App.svelte +79 -0
- package/templates/svelte-tailwind/src/Root.svelte +14 -0
- package/templates/svelte-tailwind/src/index.css +7 -0
- package/templates/svelte-tailwind/src/kora-worker.ts +9 -0
- package/templates/svelte-tailwind/src/main.ts +16 -0
- package/templates/svelte-tailwind/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/svelte-tailwind/src/modules/todos/todo.queries.ts +5 -0
- package/templates/svelte-tailwind/src/modules/todos/todo.schema.ts +10 -0
- package/templates/svelte-tailwind/src/modules/todos/useTodos.ts +25 -0
- package/templates/svelte-tailwind/src/schema.ts +9 -0
- package/templates/svelte-tailwind/src/vite-env.d.ts +12 -0
- package/templates/svelte-tailwind/svelte.config.js +5 -0
- package/templates/svelte-tailwind/tsconfig.json.hbs +14 -0
- package/templates/svelte-tailwind/vite.config.ts +53 -0
- package/templates/svelte-tailwind-sync/.env.example +25 -0
- package/templates/svelte-tailwind-sync/README.md.hbs +105 -0
- package/templates/svelte-tailwind-sync/index.html.hbs +12 -0
- package/templates/svelte-tailwind-sync/kora.config.ts +17 -0
- package/templates/svelte-tailwind-sync/package.json.hbs +46 -0
- package/templates/svelte-tailwind-sync/server.ts +90 -0
- package/templates/svelte-tailwind-sync/src/App.svelte +196 -0
- package/templates/svelte-tailwind-sync/src/Root.svelte +26 -0
- package/templates/svelte-tailwind-sync/src/auth.ts +25 -0
- package/templates/svelte-tailwind-sync/src/index.css +7 -0
- package/templates/svelte-tailwind-sync/src/kora-worker.ts +9 -0
- package/templates/svelte-tailwind-sync/src/main.ts +32 -0
- package/templates/svelte-tailwind-sync/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/svelte-tailwind-sync/src/modules/todos/todo.queries.ts +5 -0
- package/templates/svelte-tailwind-sync/src/modules/todos/todo.schema.ts +10 -0
- package/templates/svelte-tailwind-sync/src/modules/todos/useTodos.ts +25 -0
- package/templates/svelte-tailwind-sync/src/schema.ts +9 -0
- package/templates/svelte-tailwind-sync/src/vite-env.d.ts +21 -0
- package/templates/svelte-tailwind-sync/svelte.config.js +5 -0
- package/templates/svelte-tailwind-sync/tsconfig.json.hbs +14 -0
- package/templates/svelte-tailwind-sync/vite.config.ts +80 -0
- package/templates/tauri-react/.env.example +20 -0
- package/templates/tauri-react/README.md.hbs +36 -1
- package/templates/tauri-react/dev.ts +11 -11
- package/templates/tauri-react/package.json.hbs +2 -0
- package/templates/tauri-react/server.ts +86 -12
- package/templates/tauri-react/src/App.tsx +769 -544
- package/templates/tauri-react/src/AppShell.tsx +125 -83
- package/templates/tauri-react/src/SetupScreen.tsx +257 -208
- package/templates/tauri-react/src/auth.ts +45 -0
- package/templates/tauri-react/src/main.tsx +3 -3
- package/templates/tauri-react/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/tauri-react/src/modules/todos/todo.queries.ts +5 -0
- package/templates/tauri-react/src/modules/todos/todo.schema.ts +10 -0
- package/templates/tauri-react/src/modules/todos/useTodos.ts +31 -0
- package/templates/tauri-react/src/schema.ts +6 -12
- package/templates/tauri-react/src/sync-config.ts +47 -47
- package/templates/tauri-react/src/updater.ts +15 -15
- package/templates/tauri-react/src/vite-env.d.ts +17 -0
- package/templates/tauri-react/src-tauri/tauri.conf.json +1 -1
- package/templates/tauri-react/tsconfig.json.hbs +14 -0
- package/templates/tauri-react/vite.config.ts +9 -9
- package/templates/vue-basic/README.md.hbs +62 -0
- package/templates/vue-basic/index.html.hbs +12 -0
- package/templates/vue-basic/kora.config.ts +12 -0
- package/templates/vue-basic/package.json.hbs +26 -0
- package/templates/vue-basic/src/App.vue +117 -0
- package/templates/vue-basic/src/index.css +287 -0
- package/templates/vue-basic/src/kora-worker.ts +9 -0
- package/templates/vue-basic/src/main.ts +20 -0
- package/templates/vue-basic/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/vue-basic/src/modules/todos/todo.queries.ts +5 -0
- package/templates/vue-basic/src/modules/todos/todo.schema.ts +10 -0
- package/templates/vue-basic/src/modules/todos/useTodos.ts +32 -0
- package/templates/vue-basic/src/schema.ts +9 -0
- package/templates/vue-basic/src/vite-env.d.ts +17 -0
- package/templates/vue-basic/tsconfig.json.hbs +15 -0
- package/templates/vue-basic/vite.config.ts +69 -0
- package/templates/vue-sync/.env.example +25 -0
- package/templates/vue-sync/README.md.hbs +105 -0
- package/templates/vue-sync/index.html.hbs +12 -0
- package/templates/vue-sync/kora.config.ts +17 -0
- package/templates/vue-sync/package.json.hbs +42 -0
- package/templates/vue-sync/server.ts +90 -0
- package/templates/vue-sync/src/App.vue +135 -0
- package/templates/vue-sync/src/auth.ts +25 -0
- package/templates/vue-sync/src/index.css +339 -0
- package/templates/vue-sync/src/kora-worker.ts +9 -0
- package/templates/vue-sync/src/main.ts +43 -0
- package/templates/vue-sync/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/vue-sync/src/modules/todos/todo.queries.ts +5 -0
- package/templates/vue-sync/src/modules/todos/todo.schema.ts +10 -0
- package/templates/vue-sync/src/modules/todos/useTodos.ts +32 -0
- package/templates/vue-sync/src/schema.ts +9 -0
- package/templates/vue-sync/src/vite-env.d.ts +26 -0
- package/templates/vue-sync/tsconfig.json.hbs +15 -0
- package/templates/vue-sync/vite.config.ts +79 -0
- package/templates/vue-tailwind/README.md.hbs +62 -0
- package/templates/vue-tailwind/index.html.hbs +12 -0
- package/templates/vue-tailwind/kora.config.ts +12 -0
- package/templates/vue-tailwind/package.json.hbs +29 -0
- package/templates/vue-tailwind/src/App.vue +142 -0
- package/templates/vue-tailwind/src/index.css +7 -0
- package/templates/vue-tailwind/src/kora-worker.ts +9 -0
- package/templates/vue-tailwind/src/main.ts +31 -0
- package/templates/vue-tailwind/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/vue-tailwind/src/modules/todos/todo.queries.ts +5 -0
- package/templates/vue-tailwind/src/modules/todos/todo.schema.ts +10 -0
- package/templates/vue-tailwind/src/modules/todos/useTodos.ts +32 -0
- package/templates/vue-tailwind/src/schema.ts +9 -0
- package/templates/vue-tailwind/src/vite-env.d.ts +17 -0
- package/templates/vue-tailwind/tsconfig.json.hbs +15 -0
- package/templates/vue-tailwind/vite.config.ts +70 -0
- package/templates/vue-tailwind-sync/.env.example +25 -0
- package/templates/vue-tailwind-sync/README.md.hbs +105 -0
- package/templates/vue-tailwind-sync/index.html.hbs +12 -0
- package/templates/vue-tailwind-sync/kora.config.ts +17 -0
- package/templates/vue-tailwind-sync/package.json.hbs +45 -0
- package/templates/vue-tailwind-sync/server.ts +90 -0
- package/templates/vue-tailwind-sync/src/App.vue +245 -0
- package/templates/vue-tailwind-sync/src/auth.ts +25 -0
- package/templates/vue-tailwind-sync/src/index.css +7 -0
- package/templates/vue-tailwind-sync/src/kora-worker.ts +9 -0
- package/templates/vue-tailwind-sync/src/main.ts +56 -0
- package/templates/vue-tailwind-sync/src/modules/todos/todo.mutations.ts +25 -0
- package/templates/vue-tailwind-sync/src/modules/todos/todo.queries.ts +5 -0
- package/templates/vue-tailwind-sync/src/modules/todos/todo.schema.ts +10 -0
- package/templates/vue-tailwind-sync/src/modules/todos/useTodos.ts +32 -0
- package/templates/vue-tailwind-sync/src/schema.ts +9 -0
- package/templates/vue-tailwind-sync/src/vite-env.d.ts +26 -0
- package/templates/vue-tailwind-sync/tsconfig.json.hbs +15 -0
- package/templates/vue-tailwind-sync/vite.config.ts +80 -0
- package/dist/chunk-CMSX76KM.js.map +0 -1
- package/dist/chunk-MVP5PDT4.js.map +0 -1
- package/dist/chunk-YGVO4POI.js.map +0 -1
- package/templates/tauri-react/tsconfig.json +0 -15
|
@@ -9,11 +9,12 @@ import {
|
|
|
9
9
|
createLogger,
|
|
10
10
|
createPromptClient,
|
|
11
11
|
directoryExists,
|
|
12
|
+
isSupportedWebFramework,
|
|
12
13
|
resolveCreatePreferencesFlow,
|
|
13
14
|
saveResolvedPreferences,
|
|
14
15
|
shouldSavePreferences,
|
|
15
16
|
validateProjectName
|
|
16
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-VLTPEATY.js";
|
|
17
18
|
|
|
18
19
|
// src/commands/create/create-command.ts
|
|
19
20
|
import { execSync as execSync2 } from "child_process";
|
|
@@ -249,6 +250,48 @@ function createCompatibilityLayerPlan(templateName) {
|
|
|
249
250
|
authLayer
|
|
250
251
|
]
|
|
251
252
|
};
|
|
253
|
+
case "vue-sync":
|
|
254
|
+
return {
|
|
255
|
+
compatibilityTarget: templateName,
|
|
256
|
+
layers: [{ category: "base", name: "vue-sync", sourceTemplate: "vue-sync" }]
|
|
257
|
+
};
|
|
258
|
+
case "vue-basic":
|
|
259
|
+
return {
|
|
260
|
+
compatibilityTarget: templateName,
|
|
261
|
+
layers: [{ category: "base", name: "vue-basic", sourceTemplate: "vue-basic" }]
|
|
262
|
+
};
|
|
263
|
+
case "svelte-sync":
|
|
264
|
+
return {
|
|
265
|
+
compatibilityTarget: templateName,
|
|
266
|
+
layers: [{ category: "base", name: "svelte-sync", sourceTemplate: "svelte-sync" }]
|
|
267
|
+
};
|
|
268
|
+
case "svelte-basic":
|
|
269
|
+
return {
|
|
270
|
+
compatibilityTarget: templateName,
|
|
271
|
+
layers: [{ category: "base", name: "svelte-basic", sourceTemplate: "svelte-basic" }]
|
|
272
|
+
};
|
|
273
|
+
case "vue-tailwind-sync":
|
|
274
|
+
return {
|
|
275
|
+
compatibilityTarget: templateName,
|
|
276
|
+
layers: [{ category: "base", name: "vue-tailwind-sync", sourceTemplate: "vue-tailwind-sync" }]
|
|
277
|
+
};
|
|
278
|
+
case "vue-tailwind":
|
|
279
|
+
return {
|
|
280
|
+
compatibilityTarget: templateName,
|
|
281
|
+
layers: [{ category: "base", name: "vue-tailwind", sourceTemplate: "vue-tailwind" }]
|
|
282
|
+
};
|
|
283
|
+
case "svelte-tailwind-sync":
|
|
284
|
+
return {
|
|
285
|
+
compatibilityTarget: templateName,
|
|
286
|
+
layers: [
|
|
287
|
+
{ category: "base", name: "svelte-tailwind-sync", sourceTemplate: "svelte-tailwind-sync" }
|
|
288
|
+
]
|
|
289
|
+
};
|
|
290
|
+
case "svelte-tailwind":
|
|
291
|
+
return {
|
|
292
|
+
compatibilityTarget: templateName,
|
|
293
|
+
layers: [{ category: "base", name: "svelte-tailwind", sourceTemplate: "svelte-tailwind" }]
|
|
294
|
+
};
|
|
252
295
|
}
|
|
253
296
|
}
|
|
254
297
|
async function composeTemplateLayers(plan, targetDir, context) {
|
|
@@ -310,7 +353,7 @@ var createCommand = defineCommand({
|
|
|
310
353
|
},
|
|
311
354
|
template: {
|
|
312
355
|
type: "string",
|
|
313
|
-
description: "Project template (react-tailwind-sync, react-
|
|
356
|
+
description: "Project template (react-tailwind-sync, react-sync, vue-sync, svelte-sync, tauri-react, ...)"
|
|
314
357
|
},
|
|
315
358
|
pm: {
|
|
316
359
|
type: "string",
|
|
@@ -395,8 +438,10 @@ var createCommand = defineCommand({
|
|
|
395
438
|
prompts,
|
|
396
439
|
store: preferenceStore
|
|
397
440
|
});
|
|
398
|
-
if (selection.framework
|
|
399
|
-
logger.error(
|
|
441
|
+
if (!isSupportedWebFramework(selection.framework)) {
|
|
442
|
+
logger.error(
|
|
443
|
+
`Framework "${selection.framework}" is not available yet. Use react, vue, or svelte.`
|
|
444
|
+
);
|
|
400
445
|
if (!useDefaults) {
|
|
401
446
|
prompts.outro("Project creation aborted.");
|
|
402
447
|
}
|
|
@@ -541,7 +586,7 @@ function isValidPackageManager(value) {
|
|
|
541
586
|
return PACKAGE_MANAGERS.includes(value);
|
|
542
587
|
}
|
|
543
588
|
function isSyncTemplate(template) {
|
|
544
|
-
return template === "react-sync" || template === "react-tailwind-sync" || template === "tauri-react";
|
|
589
|
+
return template === "react-sync" || template === "react-tailwind-sync" || template === "vue-sync" || template === "vue-tailwind-sync" || template === "svelte-sync" || template === "svelte-tailwind-sync" || template === "tauri-react";
|
|
545
590
|
}
|
|
546
591
|
function formatDbProviderForLog(dbProvider) {
|
|
547
592
|
switch (dbProvider) {
|
|
@@ -624,4 +669,4 @@ function resolveKoraVersion() {
|
|
|
624
669
|
export {
|
|
625
670
|
createCommand
|
|
626
671
|
};
|
|
627
|
-
//# sourceMappingURL=chunk-
|
|
672
|
+
//# sourceMappingURL=chunk-EEZNRI5W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/create/create-command.ts","../src/utils/package-manager.ts","../src/commands/create/environment-detection.ts","../src/templates/composer.ts","../src/commands/create/template-engine.ts"],"sourcesContent":["import { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { defineCommand } from 'citty'\nimport { ProjectExistsError } from '../../errors'\nimport { PreferenceStore } from '../../prompts/preferences'\nimport { PromptCancelledError, createPromptClient } from '../../prompts/prompt-client'\nimport { PACKAGE_MANAGERS, TEMPLATES } from '../../types'\nimport type { PackageManager, TemplateName } from '../../types'\nimport { directoryExists } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport {\n\tdetectPackageManager,\n\tgetInstallCommand,\n\tgetRunDevCommand,\n} from '../../utils/package-manager'\nimport {\n\tapplyEditorWorkspacePreset,\n\tdetectEditorFromEnvironment,\n\tdetectGitContext,\n\tdetectMonorepoContext,\n\tresolveMonorepoTargetDirectory,\n} from './environment-detection'\nimport {\n\ttype CreateFlags,\n\tresolveCreatePreferencesFlow,\n\tsaveResolvedPreferences,\n\tshouldSavePreferences,\n} from './preferences-flow'\nimport { isSupportedWebFramework } from './options'\nimport { validateProjectName } from './project-name'\nimport { applySyncProviderPreset } from './sync-provider-preset'\nimport { scaffoldTemplate } from './template-engine'\n\n/**\n * The `create` command — scaffolds a new Kora project.\n * Used as `kora create <name>` or `create-kora-app <name>`.\n */\nexport const createCommand = defineCommand({\n\tmeta: {\n\t\tname: 'create',\n\t\tdescription: 'Create a new Kora application',\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: 'positional',\n\t\t\tdescription: 'Project directory name',\n\t\t\trequired: false,\n\t\t},\n\t\tplatform: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Target platform (web, desktop-tauri)',\n\t\t},\n\t\ttemplate: {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Project template (react-tailwind-sync, react-sync, vue-sync, svelte-sync, tauri-react, ...)',\n\t\t},\n\t\tpm: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Package manager (pnpm, npm, yarn, bun)',\n\t\t},\n\t\tframework: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'UI framework (react, vue, svelte, solid)',\n\t\t},\n\t\tdb: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Database backend for sync templates (sqlite, postgres)',\n\t\t},\n\t\t'db-provider': {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Database provider for postgres (local, supabase, neon, railway, vercel-postgres, custom)',\n\t\t},\n\t\tauth: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Authentication mode (none, email-password, oauth)',\n\t\t},\n\t\t'skip-install': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Skip installing dependencies',\n\t\t\tdefault: false,\n\t\t},\n\t\tyes: {\n\t\t\ttype: 'boolean',\n\t\t\talias: 'y',\n\t\t\tdescription: 'Accept all defaults (react-tailwind-sync + detected package manager)',\n\t\t\tdefault: false,\n\t\t},\n\t\ttailwind: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Use Tailwind CSS (use --no-tailwind to skip)',\n\t\t},\n\t\tsync: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Include sync server (use --no-sync to skip)',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst prompts = createPromptClient()\n\t\tconst preferenceStore = new PreferenceStore()\n\t\tlogger.banner()\n\t\ttry {\n\t\t\tconst useDefaults = args.yes === true\n\t\t\tif (!useDefaults) {\n\t\t\t\tprompts.intro('Kora.js — Offline-first application framework')\n\t\t\t}\n\n\t\t\t// Resolve project name\n\t\t\tconst projectName =\n\t\t\t\targs.name ||\n\t\t\t\t(useDefaults ? 'my-kora-app' : await prompts.text('Project name', 'my-kora-app'))\n\t\t\tif (!projectName) {\n\t\t\t\tlogger.error('Project name is required')\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst nameValidation = validateProjectName(projectName)\n\t\t\tif (!nameValidation.valid) {\n\t\t\t\tlogger.error('Invalid project name.')\n\t\t\t\tfor (const issue of nameValidation.issues) {\n\t\t\t\t\tlogger.step(`- ${issue}`)\n\t\t\t\t}\n\t\t\t\tif (!useDefaults) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst preferenceFlags: CreateFlags = {\n\t\t\t\tplatform: typeof args.platform === 'string' ? args.platform : undefined,\n\t\t\t\tframework: typeof args.framework === 'string' ? args.framework : undefined,\n\t\t\t\tauth: typeof args.auth === 'string' ? args.auth : undefined,\n\t\t\t\tdb: typeof args.db === 'string' ? args.db : undefined,\n\t\t\t\tdbProvider: typeof args['db-provider'] === 'string' ? args['db-provider'] : undefined,\n\t\t\t\ttailwind: args.tailwind,\n\t\t\t\tsync: args.sync,\n\t\t\t\tuseDefaults,\n\t\t\t}\n\n\t\t\tconst selection = await resolveCreatePreferencesFlow({\n\t\t\t\tflags: preferenceFlags,\n\t\t\t\tprompts,\n\t\t\t\tstore: preferenceStore,\n\t\t\t})\n\t\t\tif (!isSupportedWebFramework(selection.framework)) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t`Framework \"${selection.framework}\" is not available yet. Use react, vue, or svelte.`,\n\t\t\t\t)\n\t\t\t\tif (!useDefaults) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (selection.auth !== 'none') {\n\t\t\t\tlogger.error(`Auth mode \"${selection.auth}\" is not available yet. Use \"none\".`)\n\t\t\t\tif (!useDefaults) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Resolve template (explicit --template still overrides all selections).\n\t\t\tconst template: TemplateName =\n\t\t\t\targs.template && isValidTemplate(args.template) ? args.template : selection.template\n\n\t\t\t// Resolve package manager\n\t\t\tlet pm: PackageManager\n\t\t\tif (args.pm && isValidPackageManager(args.pm)) {\n\t\t\t\tpm = args.pm\n\t\t\t} else if (useDefaults) {\n\t\t\t\tpm = detectPackageManager()\n\t\t\t} else if (selection.usedStoredPreferences) {\n\t\t\t\tpm = preferenceStore.getCreatePreferences()?.packageManager ?? detectPackageManager()\n\t\t\t} else {\n\t\t\t\tconst detected = detectPackageManager()\n\t\t\t\tpm = await prompts.select(\n\t\t\t\t\t'Package manager:',\n\t\t\t\t\tPACKAGE_MANAGERS.map((p) => ({\n\t\t\t\t\t\tlabel: p === detected ? `${p} (detected)` : p,\n\t\t\t\t\t\tvalue: p,\n\t\t\t\t\t})),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst editorDetection = detectEditorFromEnvironment()\n\t\t\tconst gitContext = await detectGitContext(process.cwd())\n\t\t\tconst monorepoContext = await detectMonorepoContext(process.cwd())\n\n\t\t\tlet targetDir = resolve(process.cwd(), projectName)\n\t\t\tif (!useDefaults && monorepoContext.isMonorepo && monorepoContext.root !== null) {\n\t\t\t\tconst useWorkspaceTarget = await prompts.confirm(\n\t\t\t\t\t`Detected ${formatMonorepoKind(monorepoContext.kind)} at ${monorepoContext.root}. Create app under packages/${projectName}?`,\n\t\t\t\t\ttrue,\n\t\t\t\t)\n\t\t\t\tif (useWorkspaceTarget) {\n\t\t\t\t\ttargetDir = resolveMonorepoTargetDirectory(monorepoContext.root, projectName)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Validate target directory\n\t\t\tif (await directoryExists(targetDir)) {\n\t\t\t\tthrow new ProjectExistsError(projectName)\n\t\t\t}\n\n\t\t\t// Resolve kora version from this package's own package.json\n\t\t\tconst koraVersion = resolveKoraVersion()\n\n\t\t\t// Scaffold\n\t\t\tlogger.step(`Creating ${projectName} with ${template} template...`)\n\t\t\tawait scaffoldTemplate(template, targetDir, {\n\t\t\t\tprojectName,\n\t\t\t\tpackageManager: pm,\n\t\t\t\tkoraVersion,\n\t\t\t\tdbProvider: selection.dbProvider,\n\t\t\t})\n\t\t\tawait applySyncProviderPreset({\n\t\t\t\ttargetDir,\n\t\t\t\ttemplate,\n\t\t\t\tdb: selection.db,\n\t\t\t\tdbProvider: selection.dbProvider,\n\t\t\t})\n\t\t\tif (!useDefaults && editorDetection.editor !== 'unknown') {\n\t\t\t\tconst shouldApplyEditorPreset = await prompts.confirm(\n\t\t\t\t\t`Detected ${formatEditor(editorDetection.editor)}. Add workspace recommendations for ${formatEditor(editorDetection.editor)}?`,\n\t\t\t\t\ttrue,\n\t\t\t\t)\n\t\t\t\tif (shouldApplyEditorPreset) {\n\t\t\t\t\tconst appliedPreset = await applyEditorWorkspacePreset({\n\t\t\t\t\t\ttargetDir,\n\t\t\t\t\t\teditor: editorDetection.editor,\n\t\t\t\t\t})\n\t\t\t\t\tif (appliedPreset.applied) {\n\t\t\t\t\t\tlogger.step(\n\t\t\t\t\t\t\t`Added editor recommendations at ${relativeToTarget(targetDir, appliedPreset.filePath)}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (selection.db === 'postgres' && isSyncTemplate(template)) {\n\t\t\t\tlogger.info(\n\t\t\t\t\t`Applied PostgreSQL sync preset (${formatDbProviderForLog(selection.dbProvider)}). Update DATABASE_URL in .env.example before running the sync server.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (gitContext.hasRepository) {\n\t\t\t\tlogger.step(\n\t\t\t\t\t`Detected existing git repository at ${gitContext.repositoryRoot}. Skipping git initialization.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tlogger.success('Project scaffolded')\n\n\t\t\tif (shouldSavePreferences(preferenceFlags)) {\n\t\t\t\tsaveResolvedPreferences(preferenceStore, {\n\t\t\t\t\tplatform: selection.platform,\n\t\t\t\t\tframework: selection.framework,\n\t\t\t\t\tauth: selection.auth,\n\t\t\t\t\tdb: selection.db,\n\t\t\t\t\tdbProvider: selection.dbProvider,\n\t\t\t\t\ttailwind: selection.tailwind,\n\t\t\t\t\tsync: selection.sync,\n\t\t\t\t\tpackageManager: pm,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Install dependencies\n\t\t\tif (!args['skip-install']) {\n\t\t\t\tlogger.step('Installing dependencies...')\n\t\t\t\ttry {\n\t\t\t\t\texecSync(getInstallCommand(pm), { cwd: targetDir, stdio: 'inherit' })\n\t\t\t\t\tlogger.success('Dependencies installed')\n\t\t\t\t} catch {\n\t\t\t\t\tlogger.warn('Failed to install dependencies. Run install manually.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Print next steps\n\t\t\tlogger.blank()\n\t\t\tlogger.info('Done! Next steps:')\n\t\t\tlogger.blank()\n\t\t\tlogger.step(` cd ${targetDir}`)\n\t\t\tlogger.step(` ${getRunDevCommand(pm)}`)\n\t\t\tlogger.blank()\n\t\t\tif (!useDefaults) {\n\t\t\t\tprompts.outro('Project ready. Happy building with Kora!')\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof PromptCancelledError) {\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (error instanceof Error && error.message.startsWith('Invalid --')) {\n\t\t\t\tlogger.error(error.message)\n\t\t\t\tif (!args.yes) {\n\t\t\t\t\tprompts.outro('Project creation aborted.')\n\t\t\t\t}\n\t\t\t\tprocess.exitCode = 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t},\n})\n\nfunction isValidTemplate(value: string): value is TemplateName {\n\treturn (TEMPLATES as readonly string[]).includes(value)\n}\n\nfunction isValidPackageManager(value: string): value is PackageManager {\n\treturn (PACKAGE_MANAGERS as readonly string[]).includes(value)\n}\n\nfunction isSyncTemplate(template: TemplateName): boolean {\n\treturn (\n\t\ttemplate === 'react-sync' ||\n\t\ttemplate === 'react-tailwind-sync' ||\n\t\ttemplate === 'vue-sync' ||\n\t\ttemplate === 'vue-tailwind-sync' ||\n\t\ttemplate === 'svelte-sync' ||\n\t\ttemplate === 'svelte-tailwind-sync' ||\n\t\ttemplate === 'tauri-react'\n\t)\n}\n\nfunction formatDbProviderForLog(dbProvider: string): string {\n\tswitch (dbProvider) {\n\t\tcase 'supabase':\n\t\t\treturn 'Supabase'\n\t\tcase 'neon':\n\t\t\treturn 'Neon'\n\t\tcase 'railway':\n\t\t\treturn 'Railway'\n\t\tcase 'vercel-postgres':\n\t\t\treturn 'Vercel Postgres'\n\t\tcase 'custom':\n\t\t\treturn 'Custom'\n\t\tcase 'local':\n\t\t\treturn 'Local Postgres'\n\t\tcase 'none':\n\t\t\treturn 'PostgreSQL'\n\t\tdefault:\n\t\t\treturn dbProvider\n\t}\n}\n\nfunction formatEditor(editor: string): string {\n\tswitch (editor) {\n\t\tcase 'vscode':\n\t\t\treturn 'VS Code'\n\t\tcase 'cursor':\n\t\t\treturn 'Cursor'\n\t\tcase 'windsurf':\n\t\t\treturn 'Windsurf'\n\t\tcase 'zed':\n\t\t\treturn 'Zed'\n\t\tdefault:\n\t\t\treturn editor\n\t}\n}\n\nfunction formatMonorepoKind(kind: string): string {\n\tswitch (kind) {\n\t\tcase 'pnpm-workspace':\n\t\t\treturn 'pnpm workspace'\n\t\tcase 'npm-workspaces':\n\t\t\treturn 'npm workspace'\n\t\tcase 'turborepo':\n\t\t\treturn 'Turborepo'\n\t\tdefault:\n\t\t\treturn 'monorepo'\n\t}\n}\n\nfunction relativeToTarget(targetDir: string, filePath: string | null): string {\n\tif (filePath === null) return '.'\n\tconst normalizedTarget = targetDir.endsWith('/') ? targetDir : `${targetDir}/`\n\tif (filePath.startsWith(normalizedTarget)) {\n\t\treturn filePath.slice(normalizedTarget.length)\n\t}\n\tif (filePath === targetDir) {\n\t\treturn '.'\n\t}\n\treturn filePath\n}\n\n/**\n * Reads the version from @korajs/cli's own package.json and derives a\n * compatible version range for all @korajs packages.\n *\n * The CLI may be a patch ahead of other packages (e.g. CLI-only fixes),\n * so we use the major.minor range (^major.minor.0) which matches all\n * packages in the same release series.\n */\nfunction resolveKoraVersion(): string {\n\ttry {\n\t\tlet dir = dirname(fileURLToPath(import.meta.url))\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst pkgPath = resolve(dir, 'package.json')\n\t\t\tif (existsSync(pkgPath)) {\n\t\t\t\tconst pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { name?: string; version: string }\n\t\t\t\tif (pkg.name === '@korajs/cli') {\n\t\t\t\t\tif (pkg.version === '0.0.0') return 'latest'\n\t\t\t\t\t// Use ^major.minor.0 so all packages in the series match\n\t\t\t\t\tconst parts = pkg.version.split('.')\n\t\t\t\t\treturn `^${parts[0]}.${parts[1]}.0`\n\t\t\t\t}\n\t\t\t}\n\t\t\tdir = dirname(dir)\n\t\t}\n\t\treturn 'latest'\n\t} catch {\n\t\treturn 'latest'\n\t}\n}\n","import { execSync } from 'node:child_process'\nimport type { PackageManager } from '../types'\n\n/**\n * Detects the package manager used to invoke the current process\n * by reading the npm_config_user_agent environment variable.\n * Falls back to 'npm' if detection fails.\n */\nexport function detectPackageManager(): PackageManager {\n\tconst userAgent = process.env.npm_config_user_agent\n\tif (!userAgent) return 'npm'\n\n\tif (userAgent.startsWith('pnpm/')) return 'pnpm'\n\tif (userAgent.startsWith('yarn/')) return 'yarn'\n\tif (userAgent.startsWith('bun/')) return 'bun'\n\treturn 'npm'\n}\n\n/** Returns the install command for the given package manager */\nexport function getInstallCommand(pm: PackageManager): string {\n\treturn pm === 'yarn' ? 'yarn' : `${pm} install`\n}\n\n/** Returns the dev server run command for the given package manager */\nexport function getRunDevCommand(pm: PackageManager): string {\n\tif (pm === 'npm') return 'npm run dev'\n\treturn `${pm} dev`\n}\n\n/** Checks if a package manager is available on PATH */\nexport function isPackageManagerAvailable(pm: PackageManager): boolean {\n\ttry {\n\t\texecSync(`${pm} --version`, { stdio: 'ignore' })\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n","import { access, mkdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\n\nexport type SupportedEditor = 'vscode' | 'cursor' | 'windsurf' | 'zed' | 'unknown'\n\nexport interface EditorDetectionResult {\n\teditor: SupportedEditor\n\tsource: 'env' | 'none'\n}\n\nexport interface GitContextResult {\n\thasRepository: boolean\n\trepositoryRoot: string | null\n}\n\nexport interface MonorepoContextResult {\n\tisMonorepo: boolean\n\troot: string | null\n\tkind: 'pnpm-workspace' | 'npm-workspaces' | 'turborepo' | 'none'\n}\n\nexport interface EditorWorkspacePresetResult {\n\tapplied: boolean\n\tfilePath: string | null\n}\n\n/**\n * Detects which editor is most likely being used by inspecting environment\n * variables commonly set by integrated terminals.\n */\nexport function detectEditorFromEnvironment(\n\tenv: Record<string, string | undefined> = process.env,\n): EditorDetectionResult {\n\tconst termProgram = String(env.TERM_PROGRAM ?? '').toLowerCase()\n\tconst editorValue = `${String(env.EDITOR ?? '')} ${String(env.VISUAL ?? '')}`.toLowerCase()\n\n\tif (\n\t\ttermProgram.includes('cursor') ||\n\t\tenv.CURSOR_TRACE_ID !== undefined ||\n\t\tenv.CURSOR_SESSION_ID !== undefined ||\n\t\teditorValue.includes('cursor')\n\t) {\n\t\treturn { editor: 'cursor', source: 'env' }\n\t}\n\tif (\n\t\ttermProgram.includes('windsurf') ||\n\t\tenv.WINDSURF_SESSION_ID !== undefined ||\n\t\teditorValue.includes('windsurf')\n\t) {\n\t\treturn { editor: 'windsurf', source: 'env' }\n\t}\n\tif (\n\t\ttermProgram.includes('vscode') ||\n\t\tenv.VSCODE_GIT_IPC_HANDLE !== undefined ||\n\t\tenv.VSCODE_IPC_HOOK !== undefined ||\n\t\tenv.VSCODE_PID !== undefined ||\n\t\teditorValue.includes('code')\n\t) {\n\t\treturn { editor: 'vscode', source: 'env' }\n\t}\n\tif (termProgram.includes('zed') || env.ZED_TERM !== undefined || editorValue.includes('zed')) {\n\t\treturn { editor: 'zed', source: 'env' }\n\t}\n\treturn { editor: 'unknown', source: 'none' }\n}\n\n/**\n * Finds the nearest ancestor directory that contains a `.git` entry.\n */\nexport async function detectGitContext(startDir: string): Promise<GitContextResult> {\n\tconst root = await findNearestAncestorWithEntry(startDir, '.git')\n\treturn {\n\t\thasRepository: root !== null,\n\t\trepositoryRoot: root,\n\t}\n}\n\n/**\n * Detects whether the given path is inside a monorepo workspace.\n * Detection currently supports pnpm workspaces, npm workspaces, and Turborepo.\n */\nexport async function detectMonorepoContext(startDir: string): Promise<MonorepoContextResult> {\n\tlet current = resolve(startDir)\n\tfor (;;) {\n\t\tif (await fileExists(join(current, 'pnpm-workspace.yaml'))) {\n\t\t\treturn { isMonorepo: true, root: current, kind: 'pnpm-workspace' }\n\t\t}\n\n\t\tif (await fileExists(join(current, 'turbo.json'))) {\n\t\t\treturn { isMonorepo: true, root: current, kind: 'turborepo' }\n\t\t}\n\n\t\tconst packageJsonPath = join(current, 'package.json')\n\t\tif (await fileExists(packageJsonPath)) {\n\t\t\ttry {\n\t\t\t\tconst packageJsonRaw = await readFile(packageJsonPath, 'utf-8')\n\t\t\t\tconst parsed = JSON.parse(packageJsonRaw) as { workspaces?: unknown }\n\t\t\t\tif (Array.isArray(parsed.workspaces) || isNpmWorkspaceObject(parsed.workspaces)) {\n\t\t\t\t\treturn { isMonorepo: true, root: current, kind: 'npm-workspaces' }\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore malformed package.json and keep walking upward.\n\t\t\t}\n\t\t}\n\n\t\tconst parent = dirname(current)\n\t\tif (parent === current) {\n\t\t\treturn { isMonorepo: false, root: null, kind: 'none' }\n\t\t}\n\t\tcurrent = parent\n\t}\n}\n\n/**\n * Applies editor-specific workspace configuration. For VS Code-compatible\n * editors this creates or updates `.vscode/extensions.json` recommendations.\n */\nexport async function applyEditorWorkspacePreset(params: {\n\ttargetDir: string\n\teditor: SupportedEditor\n}): Promise<EditorWorkspacePresetResult> {\n\tconst { targetDir, editor } = params\n\tif (editor !== 'vscode' && editor !== 'cursor' && editor !== 'windsurf') {\n\t\treturn { applied: false, filePath: null }\n\t}\n\n\tconst vscodeDir = join(targetDir, '.vscode')\n\tconst extensionsPath = join(vscodeDir, 'extensions.json')\n\tawait mkdir(vscodeDir, { recursive: true })\n\n\tconst recommendations = ['korajs.kora-devtools']\n\tconst existing = await readJsonObject(extensionsPath)\n\tconst existingRecommendations = Array.isArray(existing?.recommendations)\n\t\t? existing.recommendations.filter((item): item is string => typeof item === 'string')\n\t\t: []\n\tconst mergedRecommendations = dedupeStrings([...existingRecommendations, ...recommendations])\n\n\tconst next = {\n\t\trecommendations: mergedRecommendations,\n\t}\n\tawait writeFile(extensionsPath, `${JSON.stringify(next, null, 2)}\\n`, 'utf-8')\n\treturn { applied: true, filePath: extensionsPath }\n}\n\n/**\n * Returns a workspace-aware target directory under the detected monorepo root.\n * This keeps generated apps in conventional package folders.\n */\nexport function resolveMonorepoTargetDirectory(monorepoRoot: string, projectName: string): string {\n\treturn join(monorepoRoot, 'packages', projectName)\n}\n\nfunction dedupeStrings(values: readonly string[]): string[] {\n\treturn Array.from(new Set(values))\n}\n\nasync function readJsonObject(path: string): Promise<Record<string, unknown> | null> {\n\ttry {\n\t\tconst content = await readFile(path, 'utf-8')\n\t\tconst parsed: unknown = JSON.parse(content)\n\t\tif (typeof parsed === 'object' && parsed !== null) {\n\t\t\treturn parsed as Record<string, unknown>\n\t\t}\n\t\treturn null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction isNpmWorkspaceObject(value: unknown): value is { packages: unknown } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn Array.isArray(record.packages)\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nasync function findNearestAncestorWithEntry(\n\tstartDir: string,\n\tentryName: string,\n): Promise<string | null> {\n\tlet current = resolve(startDir)\n\tfor (;;) {\n\t\tconst candidate = join(current, entryName)\n\t\ttry {\n\t\t\tawait stat(candidate)\n\t\t\treturn current\n\t\t} catch {\n\t\t\t// keep walking upward\n\t\t}\n\t\tconst parent = dirname(current)\n\t\tif (parent === current) {\n\t\t\treturn null\n\t\t}\n\t\tcurrent = parent\n\t}\n}\n","import { existsSync } from 'node:fs'\nimport { copyFile, mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { TemplateContext, TemplateName } from '../types'\n\nexport type TemplateLayerCategory = 'base' | 'ui' | 'style' | 'sync' | 'db' | 'auth'\n\nexport interface TemplateLayer {\n\tcategory: TemplateLayerCategory\n\tname: string\n\tsourceTemplate: TemplateName | null\n}\n\nexport interface TemplateLayerPlan {\n\tlayers: readonly TemplateLayer[]\n\tcompatibilityTarget: TemplateName\n}\n\n/**\n * Replaces {{variable}} placeholders in a template string with context values.\n *\n * @param template - The template string containing {{variable}} placeholders\n * @param context - Key-value pairs to substitute\n * @returns The template with all placeholders replaced\n */\nexport function substituteVariables(template: string, context: Record<string, string>): string {\n\treturn template.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, key: string) => {\n\t\tconst value = context[key]\n\t\treturn value !== undefined ? value : `{{${key}}}`\n\t})\n}\n\n/**\n * Resolves the absolute path to a bundled template directory.\n *\n * After tsup bundling, import.meta.url points to dist/<file>.js (1 level from root).\n * In source, it's src/templates/composer.ts (2 levels from root).\n * We walk up from the current file to find the package root containing templates/.\n *\n * @param templateName - Name of the template (for example, 'react-basic')\n * @returns Absolute path to the template directory\n */\nexport function getTemplatePath(templateName: TemplateName): string {\n\tlet dir = dirname(fileURLToPath(import.meta.url))\n\tfor (let i = 0; i < 7; i++) {\n\t\tconst candidate = resolve(dir, 'templates', templateName)\n\t\tif (existsSync(candidate)) {\n\t\t\treturn candidate\n\t\t}\n\t\tdir = dirname(dir)\n\t}\n\t// Fallback: assume bundled output and step to package root.\n\tconst currentDir = dirname(fileURLToPath(import.meta.url))\n\treturn resolve(currentDir, '..', '..', '..', 'templates', templateName)\n}\n\n/**\n * Returns a v1 compatibility layer plan that composes to one of the existing\n * four concrete templates. This establishes the layer architecture while\n * preserving byte-for-byte output compatibility for current templates.\n */\nexport function createCompatibilityLayerPlan(templateName: TemplateName): TemplateLayerPlan {\n\tconst baseLayer: TemplateLayer = { category: 'base', name: 'base', sourceTemplate: 'react-basic' }\n\tconst uiLayer: TemplateLayer = { category: 'ui', name: 'react', sourceTemplate: null }\n\tconst authLayer: TemplateLayer = { category: 'auth', name: 'none', sourceTemplate: null }\n\n\tswitch (templateName) {\n\t\tcase 'react-basic':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'plain', sourceTemplate: null },\n\t\t\t\t\t{ category: 'sync', name: 'disabled', sourceTemplate: null },\n\t\t\t\t\t{ category: 'db', name: 'none', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'react-tailwind':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'tailwind', sourceTemplate: 'react-tailwind' },\n\t\t\t\t\t{ category: 'sync', name: 'disabled', sourceTemplate: null },\n\t\t\t\t\t{ category: 'db', name: 'none', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'react-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'plain', sourceTemplate: null },\n\t\t\t\t\t{ category: 'sync', name: 'enabled', sourceTemplate: 'react-sync' },\n\t\t\t\t\t{ category: 'db', name: 'sqlite', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'react-tailwind-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\tbaseLayer,\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'tailwind', sourceTemplate: 'react-tailwind' },\n\t\t\t\t\t{ category: 'sync', name: 'enabled', sourceTemplate: 'react-tailwind-sync' },\n\t\t\t\t\t{ category: 'db', name: 'sqlite', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'tauri-react':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\t{ category: 'base', name: 'tauri', sourceTemplate: 'tauri-react' },\n\t\t\t\t\tuiLayer,\n\t\t\t\t\t{ category: 'style', name: 'plain', sourceTemplate: null },\n\t\t\t\t\t{ category: 'sync', name: 'enabled', sourceTemplate: null },\n\t\t\t\t\t{ category: 'db', name: 'tauri-sqlite', sourceTemplate: null },\n\t\t\t\t\tauthLayer,\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'vue-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'vue-sync', sourceTemplate: 'vue-sync' }],\n\t\t\t}\n\t\tcase 'vue-basic':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'vue-basic', sourceTemplate: 'vue-basic' }],\n\t\t\t}\n\t\tcase 'svelte-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'svelte-sync', sourceTemplate: 'svelte-sync' }],\n\t\t\t}\n\t\tcase 'svelte-basic':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'svelte-basic', sourceTemplate: 'svelte-basic' }],\n\t\t\t}\n\t\tcase 'vue-tailwind-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'vue-tailwind-sync', sourceTemplate: 'vue-tailwind-sync' }],\n\t\t\t}\n\t\tcase 'vue-tailwind':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'vue-tailwind', sourceTemplate: 'vue-tailwind' }],\n\t\t\t}\n\t\tcase 'svelte-tailwind-sync':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [\n\t\t\t\t\t{ category: 'base', name: 'svelte-tailwind-sync', sourceTemplate: 'svelte-tailwind-sync' },\n\t\t\t\t],\n\t\t\t}\n\t\tcase 'svelte-tailwind':\n\t\t\treturn {\n\t\t\t\tcompatibilityTarget: templateName,\n\t\t\t\tlayers: [{ category: 'base', name: 'svelte-tailwind', sourceTemplate: 'svelte-tailwind' }],\n\t\t\t}\n\t}\n}\n\n/**\n * Composes a project by applying template layers in order. Later layers\n * overwrite earlier files, which allows progressive specialization.\n *\n * @param plan - Layer plan describing the composition\n * @param targetDir - Destination directory (must not exist yet)\n * @param context - Variables for template substitution\n */\nexport async function composeTemplateLayers(\n\tplan: TemplateLayerPlan,\n\ttargetDir: string,\n\tcontext: TemplateContext,\n): Promise<void> {\n\tconst vars: Record<string, string> = {\n\t\tprojectName: context.projectName,\n\t\tpackageManager: context.packageManager,\n\t\tkoraVersion: context.koraVersion,\n\t\tdbProvider: context.dbProvider ?? 'none',\n\t}\n\n\tfor (const layer of plan.layers) {\n\t\tif (layer.sourceTemplate === null) {\n\t\t\tcontinue\n\t\t}\n\t\tconst sourceDir = getTemplatePath(layer.sourceTemplate)\n\t\tawait copyDirectory(sourceDir, targetDir, vars)\n\t}\n}\n\nasync function copyDirectory(\n\tsrc: string,\n\tdest: string,\n\tvars: Record<string, string>,\n): Promise<void> {\n\tawait mkdir(dest, { recursive: true })\n\tconst entries = await readdir(src)\n\n\tfor (const entry of entries) {\n\t\tconst srcPath = join(src, entry)\n\t\tconst srcStat = await stat(srcPath)\n\n\t\tif (srcStat.isDirectory()) {\n\t\t\tawait copyDirectory(srcPath, join(dest, entry), vars)\n\t\t\tcontinue\n\t\t}\n\t\tif (entry.endsWith('.hbs')) {\n\t\t\tconst content = await readFile(srcPath, 'utf-8')\n\t\t\tconst outputName = entry.slice(0, -4)\n\t\t\tawait writeFile(join(dest, outputName), substituteVariables(content, vars), 'utf-8')\n\t\t\tcontinue\n\t\t}\n\t\tawait copyFile(srcPath, join(dest, entry))\n\t}\n}\n","import { composeTemplateLayers, createCompatibilityLayerPlan } from '../../templates/composer'\nimport type { TemplateContext, TemplateName } from '../../types'\n\n/**\n * Replaces {{variable}} placeholders in a template string with context values.\n *\n * @param template - The template string containing {{variable}} placeholders\n * @param context - Key-value pairs to substitute\n * @returns The template with all placeholders replaced\n */\nexport { substituteVariables, getTemplatePath } from '../../templates/composer'\n\n/**\n * Scaffolds a project from a bundled template.\n * Copies all files from the template directory to the target, applying\n * variable substitution to .hbs files and stripping the .hbs extension.\n *\n * @param templateName - Which template to use\n * @param targetDir - Destination directory (must not exist yet)\n * @param context - Variables for template substitution\n */\nexport async function scaffoldTemplate(\n\ttemplateName: TemplateName,\n\ttargetDir: string,\n\tcontext: TemplateContext,\n): Promise<void> {\n\tconst plan = createCompatibilityLayerPlan(templateName)\n\tawait composeTemplateLayers(plan, targetDir, context)\n}\n"],"mappings":"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","names":["execSync","existsSync","dirname","resolve","fileURLToPath","mkdir","readFile","stat","writeFile","dirname","join","resolve","resolve","execSync","dirname","fileURLToPath","existsSync"]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
createPromptClient,
|
|
6
6
|
findProjectRoot,
|
|
7
7
|
resolveProjectBinaryEntryPoint
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-VLTPEATY.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/deploy/adapters/adapter.ts
|
|
11
11
|
var DEPLOY_PLATFORMS = [
|
|
@@ -167,7 +167,7 @@ function generateFlyToml(options) {
|
|
|
167
167
|
' interval = "30s"',
|
|
168
168
|
' method = "GET"',
|
|
169
169
|
' timeout = "5s"',
|
|
170
|
-
' path = "/"',
|
|
170
|
+
' path = "/health"',
|
|
171
171
|
""
|
|
172
172
|
].join("\n");
|
|
173
173
|
}
|
|
@@ -279,13 +279,13 @@ var FlyAdapter = class {
|
|
|
279
279
|
projectRoot: config.projectRoot,
|
|
280
280
|
deployDirectory
|
|
281
281
|
});
|
|
282
|
-
const client = await buildClient({
|
|
282
|
+
const client = config.deployTarget === "sync-server" ? null : await buildClient({
|
|
283
283
|
projectRoot: config.projectRoot,
|
|
284
284
|
outDir: join4(deployDirectory, "dist"),
|
|
285
285
|
mode: "production"
|
|
286
286
|
});
|
|
287
287
|
return {
|
|
288
|
-
clientDirectory: client
|
|
288
|
+
clientDirectory: client?.outDir ?? null,
|
|
289
289
|
serverBundlePath: join4(deployDirectory, "server-bundled.js"),
|
|
290
290
|
deployDirectory
|
|
291
291
|
};
|
|
@@ -635,13 +635,13 @@ var RailwayAdapter = class {
|
|
|
635
635
|
projectRoot: config.projectRoot,
|
|
636
636
|
deployDirectory
|
|
637
637
|
});
|
|
638
|
-
const client = await buildClient({
|
|
638
|
+
const client = config.deployTarget === "sync-server" ? null : await buildClient({
|
|
639
639
|
projectRoot: config.projectRoot,
|
|
640
640
|
outDir: join6(deployDirectory, "dist"),
|
|
641
641
|
mode: "production"
|
|
642
642
|
});
|
|
643
643
|
return {
|
|
644
|
-
clientDirectory: client
|
|
644
|
+
clientDirectory: client?.outDir ?? null,
|
|
645
645
|
serverBundlePath: join6(deployDirectory, "server-bundled.js"),
|
|
646
646
|
deployDirectory
|
|
647
647
|
};
|
|
@@ -1005,13 +1005,13 @@ var AwsEcsAdapter = class {
|
|
|
1005
1005
|
projectRoot: config.projectRoot,
|
|
1006
1006
|
deployDirectory
|
|
1007
1007
|
});
|
|
1008
|
-
const client = await buildClient({
|
|
1008
|
+
const client = config.deployTarget === "sync-server" ? null : await buildClient({
|
|
1009
1009
|
projectRoot: config.projectRoot,
|
|
1010
1010
|
outDir: join7(deployDirectory, "dist"),
|
|
1011
1011
|
mode: "production"
|
|
1012
1012
|
});
|
|
1013
1013
|
return {
|
|
1014
|
-
clientDirectory: client
|
|
1014
|
+
clientDirectory: client?.outDir ?? null,
|
|
1015
1015
|
serverBundlePath: join7(deployDirectory, "server-bundled.js"),
|
|
1016
1016
|
deployDirectory
|
|
1017
1017
|
};
|
|
@@ -1356,13 +1356,13 @@ var AwsLightsailAdapter = class {
|
|
|
1356
1356
|
projectRoot: config.projectRoot,
|
|
1357
1357
|
deployDirectory
|
|
1358
1358
|
});
|
|
1359
|
-
const client = await buildClient({
|
|
1359
|
+
const client = config.deployTarget === "sync-server" ? null : await buildClient({
|
|
1360
1360
|
projectRoot: config.projectRoot,
|
|
1361
1361
|
outDir: join8(deployDirectory, "dist"),
|
|
1362
1362
|
mode: "production"
|
|
1363
1363
|
});
|
|
1364
1364
|
return {
|
|
1365
|
-
clientDirectory: client
|
|
1365
|
+
clientDirectory: client?.outDir ?? null,
|
|
1366
1366
|
serverBundlePath: join8(deployDirectory, "server-bundled.js"),
|
|
1367
1367
|
deployDirectory
|
|
1368
1368
|
};
|
|
@@ -1690,7 +1690,7 @@ var GENERATED_HEADER3 = "# Generated by kora deploy \u2014 do not edit manually"
|
|
|
1690
1690
|
function generateDockerfile(options = {}) {
|
|
1691
1691
|
const nodeVersion = options.nodeVersion ?? "20-alpine";
|
|
1692
1692
|
const port = options.port ?? 3e3;
|
|
1693
|
-
const clientDirectory = options.clientDirectory
|
|
1693
|
+
const clientDirectory = options.clientDirectory === void 0 ? "dist" : options.clientDirectory;
|
|
1694
1694
|
const serverBundleFile = options.serverBundleFile ?? "server-bundled.js";
|
|
1695
1695
|
const hasNativeDeps = options.nativeDependencies && Object.keys(options.nativeDependencies).length > 0;
|
|
1696
1696
|
const lines = [
|
|
@@ -1710,7 +1710,9 @@ function generateDockerfile(options = {}) {
|
|
|
1710
1710
|
lines.push("RUN npm install --omit=dev");
|
|
1711
1711
|
lines.push("");
|
|
1712
1712
|
}
|
|
1713
|
-
|
|
1713
|
+
if (clientDirectory !== null) {
|
|
1714
|
+
lines.push(`COPY ${clientDirectory} ./dist`);
|
|
1715
|
+
}
|
|
1714
1716
|
lines.push(`COPY ${serverBundleFile} ./server-bundled.js`);
|
|
1715
1717
|
lines.push("");
|
|
1716
1718
|
lines.push(`EXPOSE ${String(port)}`);
|
|
@@ -1882,7 +1884,8 @@ function readOptionalString(value, field) {
|
|
|
1882
1884
|
}
|
|
1883
1885
|
|
|
1884
1886
|
// src/commands/deploy/deploy-command.ts
|
|
1885
|
-
import {
|
|
1887
|
+
import { existsSync as existsSync2 } from "fs";
|
|
1888
|
+
import { basename, join as join11 } from "path";
|
|
1886
1889
|
import { defineCommand } from "citty";
|
|
1887
1890
|
var deployCommand = defineCommand({
|
|
1888
1891
|
meta: {
|
|
@@ -2037,12 +2040,14 @@ var deployCommand = defineCommand({
|
|
|
2037
2040
|
const region = resolveRegion(args.region, existingState?.region, confirmMode);
|
|
2038
2041
|
const deployDirectory = resolveDeployDirectory(projectRoot);
|
|
2039
2042
|
const environment = args.prod === true ? "production" : "preview";
|
|
2043
|
+
const deployTarget = detectDeployTarget(projectRoot);
|
|
2040
2044
|
const config = {
|
|
2041
2045
|
projectRoot,
|
|
2042
2046
|
appName,
|
|
2043
2047
|
region,
|
|
2044
2048
|
environment,
|
|
2045
|
-
confirm: confirmMode
|
|
2049
|
+
confirm: confirmMode,
|
|
2050
|
+
deployTarget
|
|
2046
2051
|
};
|
|
2047
2052
|
const adapter = createDeployAdapter(platform);
|
|
2048
2053
|
configureAdapterContext(adapter, {
|
|
@@ -2054,10 +2059,14 @@ var deployCommand = defineCommand({
|
|
|
2054
2059
|
logger.info(
|
|
2055
2060
|
`Deploying to ${platform} (${appName}${region ? `, ${region}` : ""}, ${environment})`
|
|
2056
2061
|
);
|
|
2062
|
+
if (deployTarget === "sync-server") {
|
|
2063
|
+
logger.step("Detected Tauri project. Deploying the sync server only.");
|
|
2064
|
+
}
|
|
2057
2065
|
if (confirmMode) {
|
|
2058
2066
|
logger.step("Running in --confirm mode (non-interactive, fail-fast).");
|
|
2059
2067
|
}
|
|
2060
2068
|
await writeDockerfileArtifact(deployDirectory, {
|
|
2069
|
+
clientDirectory: deployTarget === "sync-server" ? null : void 0,
|
|
2061
2070
|
nativeDependencies: {
|
|
2062
2071
|
"better-sqlite3": "^11.0.0",
|
|
2063
2072
|
"drizzle-orm": "^0.45.2",
|
|
@@ -2196,6 +2205,9 @@ function configureAdapterContext(adapter, context) {
|
|
|
2196
2205
|
adapter.setContext(context);
|
|
2197
2206
|
}
|
|
2198
2207
|
}
|
|
2208
|
+
function detectDeployTarget(projectRoot) {
|
|
2209
|
+
return existsSync2(join11(projectRoot, "src-tauri")) ? "sync-server" : "full-stack";
|
|
2210
|
+
}
|
|
2199
2211
|
function hasContextSetter(adapter) {
|
|
2200
2212
|
return typeof adapter.setContext === "function";
|
|
2201
2213
|
}
|
|
@@ -2326,4 +2338,4 @@ export {
|
|
|
2326
2338
|
deployCommand,
|
|
2327
2339
|
generateTypes
|
|
2328
2340
|
};
|
|
2329
|
-
//# sourceMappingURL=chunk-
|
|
2341
|
+
//# sourceMappingURL=chunk-Q2FBCOQD.js.map
|