@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.
Files changed (253) hide show
  1. package/dist/bin.cjs +1636 -601
  2. package/dist/bin.cjs.map +1 -1
  3. package/dist/bin.js +1086 -139
  4. package/dist/bin.js.map +1 -1
  5. package/dist/{chunk-MVP5PDT4.js → chunk-EEZNRI5W.js} +51 -6
  6. package/dist/chunk-EEZNRI5W.js.map +1 -0
  7. package/dist/{chunk-YGVO4POI.js → chunk-Q2FBCOQD.js} +27 -15
  8. package/dist/chunk-Q2FBCOQD.js.map +1 -0
  9. package/dist/{chunk-CMSX76KM.js → chunk-VLTPEATY.js} +172 -99
  10. package/dist/chunk-VLTPEATY.js.map +1 -0
  11. package/dist/create.cjs +130 -54
  12. package/dist/create.cjs.map +1 -1
  13. package/dist/create.js +2 -2
  14. package/dist/index.cjs +143 -62
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +8 -6
  17. package/dist/index.d.ts +8 -6
  18. package/dist/index.js +2 -2
  19. package/package.json +9 -3
  20. package/templates/react-basic/README.md.hbs +10 -1
  21. package/templates/react-basic/src/App.tsx +112 -126
  22. package/templates/react-basic/src/index.css +165 -159
  23. package/templates/react-basic/src/kora-worker.ts +0 -1
  24. package/templates/react-basic/src/main.tsx +12 -12
  25. package/templates/react-basic/src/modules/todos/todo.mutations.ts +25 -0
  26. package/templates/react-basic/src/modules/todos/todo.queries.ts +5 -0
  27. package/templates/react-basic/src/modules/todos/todo.schema.ts +10 -0
  28. package/templates/react-basic/src/modules/todos/useTodos.ts +31 -0
  29. package/templates/react-basic/src/schema.ts +6 -12
  30. package/templates/react-basic/src/vite-env.d.ts +17 -0
  31. package/templates/react-basic/{tsconfig.json → tsconfig.json.hbs} +1 -2
  32. package/templates/react-basic/vite.config.ts +57 -50
  33. package/templates/react-sync/.env.example +19 -0
  34. package/templates/react-sync/README.md.hbs +43 -1
  35. package/templates/react-sync/package.json.hbs +3 -0
  36. package/templates/react-sync/server.ts +90 -26
  37. package/templates/react-sync/src/App.tsx +132 -130
  38. package/templates/react-sync/src/auth.ts +25 -0
  39. package/templates/react-sync/src/index.css +212 -165
  40. package/templates/react-sync/src/kora-worker.ts +0 -1
  41. package/templates/react-sync/src/main.tsx +34 -18
  42. package/templates/react-sync/src/modules/todos/todo.mutations.ts +25 -0
  43. package/templates/react-sync/src/modules/todos/todo.queries.ts +5 -0
  44. package/templates/react-sync/src/modules/todos/todo.schema.ts +10 -0
  45. package/templates/react-sync/src/modules/todos/useTodos.ts +31 -0
  46. package/templates/react-sync/src/schema.ts +6 -12
  47. package/templates/react-sync/src/vite-env.d.ts +17 -0
  48. package/templates/react-sync/{tsconfig.json → tsconfig.json.hbs} +1 -2
  49. package/templates/react-sync/vite.config.ts +67 -60
  50. package/templates/react-tailwind/README.md.hbs +10 -1
  51. package/templates/react-tailwind/src/App.tsx +186 -197
  52. package/templates/react-tailwind/src/index.css +3 -3
  53. package/templates/react-tailwind/src/kora-worker.ts +0 -1
  54. package/templates/react-tailwind/src/main.tsx +19 -12
  55. package/templates/react-tailwind/src/modules/todos/todo.mutations.ts +25 -0
  56. package/templates/react-tailwind/src/modules/todos/todo.queries.ts +5 -0
  57. package/templates/react-tailwind/src/modules/todos/todo.schema.ts +10 -0
  58. package/templates/react-tailwind/src/modules/todos/useTodos.ts +31 -0
  59. package/templates/react-tailwind/src/schema.ts +6 -12
  60. package/templates/react-tailwind/src/vite-env.d.ts +17 -0
  61. package/templates/react-tailwind/{tsconfig.json → tsconfig.json.hbs} +1 -2
  62. package/templates/react-tailwind/vite.config.ts +57 -50
  63. package/templates/react-tailwind-sync/.env.example +19 -0
  64. package/templates/react-tailwind-sync/README.md.hbs +43 -1
  65. package/templates/react-tailwind-sync/package.json.hbs +3 -0
  66. package/templates/react-tailwind-sync/server.ts +90 -26
  67. package/templates/react-tailwind-sync/src/App.tsx +246 -222
  68. package/templates/react-tailwind-sync/src/auth.ts +25 -0
  69. package/templates/react-tailwind-sync/src/index.css +3 -3
  70. package/templates/react-tailwind-sync/src/kora-worker.ts +0 -1
  71. package/templates/react-tailwind-sync/src/main.tsx +48 -18
  72. package/templates/react-tailwind-sync/src/modules/todos/todo.mutations.ts +25 -0
  73. package/templates/react-tailwind-sync/src/modules/todos/todo.queries.ts +5 -0
  74. package/templates/react-tailwind-sync/src/modules/todos/todo.schema.ts +10 -0
  75. package/templates/react-tailwind-sync/src/modules/todos/useTodos.ts +31 -0
  76. package/templates/react-tailwind-sync/src/schema.ts +6 -12
  77. package/templates/react-tailwind-sync/src/vite-env.d.ts +17 -0
  78. package/templates/react-tailwind-sync/{tsconfig.json → tsconfig.json.hbs} +1 -2
  79. package/templates/react-tailwind-sync/vite.config.ts +67 -60
  80. package/templates/svelte-basic/.env.example +3 -0
  81. package/templates/svelte-basic/README.md.hbs +62 -0
  82. package/templates/svelte-basic/index.html.hbs +12 -0
  83. package/templates/svelte-basic/kora.config.ts +12 -0
  84. package/templates/svelte-basic/package.json.hbs +27 -0
  85. package/templates/svelte-basic/src/App.svelte +131 -0
  86. package/templates/svelte-basic/src/Root.svelte +14 -0
  87. package/templates/svelte-basic/src/index.css +287 -0
  88. package/templates/svelte-basic/src/kora-worker.ts +9 -0
  89. package/templates/svelte-basic/src/main.ts +16 -0
  90. package/templates/svelte-basic/src/modules/todos/todo.mutations.ts +25 -0
  91. package/templates/svelte-basic/src/modules/todos/todo.queries.ts +5 -0
  92. package/templates/svelte-basic/src/modules/todos/todo.schema.ts +10 -0
  93. package/templates/svelte-basic/src/modules/todos/useTodos.ts +25 -0
  94. package/templates/svelte-basic/src/schema.ts +9 -0
  95. package/templates/svelte-basic/src/vite-env.d.ts +12 -0
  96. package/templates/svelte-basic/svelte.config.js +5 -0
  97. package/templates/svelte-basic/tsconfig.json.hbs +14 -0
  98. package/templates/svelte-basic/vite.config.ts +52 -0
  99. package/templates/svelte-sync/.env.example +25 -0
  100. package/templates/svelte-sync/README.md.hbs +105 -0
  101. package/templates/svelte-sync/index.html.hbs +12 -0
  102. package/templates/svelte-sync/kora.config.ts +17 -0
  103. package/templates/svelte-sync/package.json.hbs +43 -0
  104. package/templates/svelte-sync/server.ts +90 -0
  105. package/templates/svelte-sync/src/App.svelte +154 -0
  106. package/templates/svelte-sync/src/Root.svelte +22 -0
  107. package/templates/svelte-sync/src/auth.ts +25 -0
  108. package/templates/svelte-sync/src/index.css +339 -0
  109. package/templates/svelte-sync/src/kora-worker.ts +9 -0
  110. package/templates/svelte-sync/src/main.ts +32 -0
  111. package/templates/svelte-sync/src/modules/todos/todo.mutations.ts +25 -0
  112. package/templates/svelte-sync/src/modules/todos/todo.queries.ts +5 -0
  113. package/templates/svelte-sync/src/modules/todos/todo.schema.ts +10 -0
  114. package/templates/svelte-sync/src/modules/todos/useTodos.ts +25 -0
  115. package/templates/svelte-sync/src/schema.ts +9 -0
  116. package/templates/svelte-sync/src/vite-env.d.ts +21 -0
  117. package/templates/svelte-sync/svelte.config.js +5 -0
  118. package/templates/svelte-sync/tsconfig.json.hbs +14 -0
  119. package/templates/svelte-sync/vite.config.ts +79 -0
  120. package/templates/svelte-tailwind/README.md.hbs +62 -0
  121. package/templates/svelte-tailwind/index.html.hbs +12 -0
  122. package/templates/svelte-tailwind/kora.config.ts +12 -0
  123. package/templates/svelte-tailwind/package.json.hbs +30 -0
  124. package/templates/svelte-tailwind/src/App.svelte +79 -0
  125. package/templates/svelte-tailwind/src/Root.svelte +14 -0
  126. package/templates/svelte-tailwind/src/index.css +7 -0
  127. package/templates/svelte-tailwind/src/kora-worker.ts +9 -0
  128. package/templates/svelte-tailwind/src/main.ts +16 -0
  129. package/templates/svelte-tailwind/src/modules/todos/todo.mutations.ts +25 -0
  130. package/templates/svelte-tailwind/src/modules/todos/todo.queries.ts +5 -0
  131. package/templates/svelte-tailwind/src/modules/todos/todo.schema.ts +10 -0
  132. package/templates/svelte-tailwind/src/modules/todos/useTodos.ts +25 -0
  133. package/templates/svelte-tailwind/src/schema.ts +9 -0
  134. package/templates/svelte-tailwind/src/vite-env.d.ts +12 -0
  135. package/templates/svelte-tailwind/svelte.config.js +5 -0
  136. package/templates/svelte-tailwind/tsconfig.json.hbs +14 -0
  137. package/templates/svelte-tailwind/vite.config.ts +53 -0
  138. package/templates/svelte-tailwind-sync/.env.example +25 -0
  139. package/templates/svelte-tailwind-sync/README.md.hbs +105 -0
  140. package/templates/svelte-tailwind-sync/index.html.hbs +12 -0
  141. package/templates/svelte-tailwind-sync/kora.config.ts +17 -0
  142. package/templates/svelte-tailwind-sync/package.json.hbs +46 -0
  143. package/templates/svelte-tailwind-sync/server.ts +90 -0
  144. package/templates/svelte-tailwind-sync/src/App.svelte +196 -0
  145. package/templates/svelte-tailwind-sync/src/Root.svelte +26 -0
  146. package/templates/svelte-tailwind-sync/src/auth.ts +25 -0
  147. package/templates/svelte-tailwind-sync/src/index.css +7 -0
  148. package/templates/svelte-tailwind-sync/src/kora-worker.ts +9 -0
  149. package/templates/svelte-tailwind-sync/src/main.ts +32 -0
  150. package/templates/svelte-tailwind-sync/src/modules/todos/todo.mutations.ts +25 -0
  151. package/templates/svelte-tailwind-sync/src/modules/todos/todo.queries.ts +5 -0
  152. package/templates/svelte-tailwind-sync/src/modules/todos/todo.schema.ts +10 -0
  153. package/templates/svelte-tailwind-sync/src/modules/todos/useTodos.ts +25 -0
  154. package/templates/svelte-tailwind-sync/src/schema.ts +9 -0
  155. package/templates/svelte-tailwind-sync/src/vite-env.d.ts +21 -0
  156. package/templates/svelte-tailwind-sync/svelte.config.js +5 -0
  157. package/templates/svelte-tailwind-sync/tsconfig.json.hbs +14 -0
  158. package/templates/svelte-tailwind-sync/vite.config.ts +80 -0
  159. package/templates/tauri-react/.env.example +20 -0
  160. package/templates/tauri-react/README.md.hbs +36 -1
  161. package/templates/tauri-react/dev.ts +11 -11
  162. package/templates/tauri-react/package.json.hbs +2 -0
  163. package/templates/tauri-react/server.ts +86 -12
  164. package/templates/tauri-react/src/App.tsx +769 -544
  165. package/templates/tauri-react/src/AppShell.tsx +125 -83
  166. package/templates/tauri-react/src/SetupScreen.tsx +257 -208
  167. package/templates/tauri-react/src/auth.ts +45 -0
  168. package/templates/tauri-react/src/main.tsx +3 -3
  169. package/templates/tauri-react/src/modules/todos/todo.mutations.ts +25 -0
  170. package/templates/tauri-react/src/modules/todos/todo.queries.ts +5 -0
  171. package/templates/tauri-react/src/modules/todos/todo.schema.ts +10 -0
  172. package/templates/tauri-react/src/modules/todos/useTodos.ts +31 -0
  173. package/templates/tauri-react/src/schema.ts +6 -12
  174. package/templates/tauri-react/src/sync-config.ts +47 -47
  175. package/templates/tauri-react/src/updater.ts +15 -15
  176. package/templates/tauri-react/src/vite-env.d.ts +17 -0
  177. package/templates/tauri-react/src-tauri/tauri.conf.json +1 -1
  178. package/templates/tauri-react/tsconfig.json.hbs +14 -0
  179. package/templates/tauri-react/vite.config.ts +9 -9
  180. package/templates/vue-basic/README.md.hbs +62 -0
  181. package/templates/vue-basic/index.html.hbs +12 -0
  182. package/templates/vue-basic/kora.config.ts +12 -0
  183. package/templates/vue-basic/package.json.hbs +26 -0
  184. package/templates/vue-basic/src/App.vue +117 -0
  185. package/templates/vue-basic/src/index.css +287 -0
  186. package/templates/vue-basic/src/kora-worker.ts +9 -0
  187. package/templates/vue-basic/src/main.ts +20 -0
  188. package/templates/vue-basic/src/modules/todos/todo.mutations.ts +25 -0
  189. package/templates/vue-basic/src/modules/todos/todo.queries.ts +5 -0
  190. package/templates/vue-basic/src/modules/todos/todo.schema.ts +10 -0
  191. package/templates/vue-basic/src/modules/todos/useTodos.ts +32 -0
  192. package/templates/vue-basic/src/schema.ts +9 -0
  193. package/templates/vue-basic/src/vite-env.d.ts +17 -0
  194. package/templates/vue-basic/tsconfig.json.hbs +15 -0
  195. package/templates/vue-basic/vite.config.ts +69 -0
  196. package/templates/vue-sync/.env.example +25 -0
  197. package/templates/vue-sync/README.md.hbs +105 -0
  198. package/templates/vue-sync/index.html.hbs +12 -0
  199. package/templates/vue-sync/kora.config.ts +17 -0
  200. package/templates/vue-sync/package.json.hbs +42 -0
  201. package/templates/vue-sync/server.ts +90 -0
  202. package/templates/vue-sync/src/App.vue +135 -0
  203. package/templates/vue-sync/src/auth.ts +25 -0
  204. package/templates/vue-sync/src/index.css +339 -0
  205. package/templates/vue-sync/src/kora-worker.ts +9 -0
  206. package/templates/vue-sync/src/main.ts +43 -0
  207. package/templates/vue-sync/src/modules/todos/todo.mutations.ts +25 -0
  208. package/templates/vue-sync/src/modules/todos/todo.queries.ts +5 -0
  209. package/templates/vue-sync/src/modules/todos/todo.schema.ts +10 -0
  210. package/templates/vue-sync/src/modules/todos/useTodos.ts +32 -0
  211. package/templates/vue-sync/src/schema.ts +9 -0
  212. package/templates/vue-sync/src/vite-env.d.ts +26 -0
  213. package/templates/vue-sync/tsconfig.json.hbs +15 -0
  214. package/templates/vue-sync/vite.config.ts +79 -0
  215. package/templates/vue-tailwind/README.md.hbs +62 -0
  216. package/templates/vue-tailwind/index.html.hbs +12 -0
  217. package/templates/vue-tailwind/kora.config.ts +12 -0
  218. package/templates/vue-tailwind/package.json.hbs +29 -0
  219. package/templates/vue-tailwind/src/App.vue +142 -0
  220. package/templates/vue-tailwind/src/index.css +7 -0
  221. package/templates/vue-tailwind/src/kora-worker.ts +9 -0
  222. package/templates/vue-tailwind/src/main.ts +31 -0
  223. package/templates/vue-tailwind/src/modules/todos/todo.mutations.ts +25 -0
  224. package/templates/vue-tailwind/src/modules/todos/todo.queries.ts +5 -0
  225. package/templates/vue-tailwind/src/modules/todos/todo.schema.ts +10 -0
  226. package/templates/vue-tailwind/src/modules/todos/useTodos.ts +32 -0
  227. package/templates/vue-tailwind/src/schema.ts +9 -0
  228. package/templates/vue-tailwind/src/vite-env.d.ts +17 -0
  229. package/templates/vue-tailwind/tsconfig.json.hbs +15 -0
  230. package/templates/vue-tailwind/vite.config.ts +70 -0
  231. package/templates/vue-tailwind-sync/.env.example +25 -0
  232. package/templates/vue-tailwind-sync/README.md.hbs +105 -0
  233. package/templates/vue-tailwind-sync/index.html.hbs +12 -0
  234. package/templates/vue-tailwind-sync/kora.config.ts +17 -0
  235. package/templates/vue-tailwind-sync/package.json.hbs +45 -0
  236. package/templates/vue-tailwind-sync/server.ts +90 -0
  237. package/templates/vue-tailwind-sync/src/App.vue +245 -0
  238. package/templates/vue-tailwind-sync/src/auth.ts +25 -0
  239. package/templates/vue-tailwind-sync/src/index.css +7 -0
  240. package/templates/vue-tailwind-sync/src/kora-worker.ts +9 -0
  241. package/templates/vue-tailwind-sync/src/main.ts +56 -0
  242. package/templates/vue-tailwind-sync/src/modules/todos/todo.mutations.ts +25 -0
  243. package/templates/vue-tailwind-sync/src/modules/todos/todo.queries.ts +5 -0
  244. package/templates/vue-tailwind-sync/src/modules/todos/todo.schema.ts +10 -0
  245. package/templates/vue-tailwind-sync/src/modules/todos/useTodos.ts +32 -0
  246. package/templates/vue-tailwind-sync/src/schema.ts +9 -0
  247. package/templates/vue-tailwind-sync/src/vite-env.d.ts +26 -0
  248. package/templates/vue-tailwind-sync/tsconfig.json.hbs +15 -0
  249. package/templates/vue-tailwind-sync/vite.config.ts +80 -0
  250. package/dist/chunk-CMSX76KM.js.map +0 -1
  251. package/dist/chunk-MVP5PDT4.js.map +0 -1
  252. package/dist/chunk-YGVO4POI.js.map +0 -1
  253. 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-CMSX76KM.js";
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-tailwind, react-sync, react-basic, tauri-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 !== "react") {
399
- logger.error(`Framework "${selection.framework}" is not available yet. Use "react".`);
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-MVP5PDT4.js.map
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-CMSX76KM.js";
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.outDir,
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.outDir,
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.outDir,
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.outDir,
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 ?? "dist";
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
- lines.push(`COPY ${clientDirectory} ./dist`);
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 { basename } from "path";
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-YGVO4POI.js.map
2341
+ //# sourceMappingURL=chunk-Q2FBCOQD.js.map