@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
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.ts","../src/commands/dev/dev-command.ts","../src/commands/dev/kora-config.ts","../src/commands/dev/process-manager.ts","../src/commands/dev/schema-watcher.ts","../src/commands/generate/generate-command.ts","../src/commands/migrate/migrate-command.ts","../src/commands/migrate/migration-generator.ts","../src/commands/migrate/schema-differ.ts","../src/commands/migrate/migration-runner.ts","../src/commands/migrate/schema-loader.ts"],"sourcesContent":["import { defineCommand, runMain } from 'citty'\nimport { createCommand } from './commands/create/create-command'\nimport { deployCommand } from './commands/deploy/deploy-command'\nimport { devCommand } from './commands/dev/dev-command'\nimport { generateCommand } from './commands/generate/generate-command'\nimport { migrateCommand } from './commands/migrate/migrate-command'\n\nconst main = defineCommand({\n\tmeta: {\n\t\tname: 'kora',\n\t\tdescription: 'Kora.js — Offline-first application framework',\n\t},\n\tsubCommands: {\n\t\tcreate: createCommand,\n\t\tdev: devCommand,\n\t\tdeploy: deployCommand,\n\t\tgenerate: generateCommand,\n\t\tmigrate: migrateCommand,\n\t},\n})\n\nrunMain(main)\n","import { access } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { resolve } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { DevServerError, InvalidProjectError } from '../../errors'\nimport {\n\tfindProjectRoot,\n\tfindSchemaFile,\n\thasTsxInstalled,\n\tresolveProjectBinaryEntryPoint,\n} from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { loadKoraConfig } from './kora-config'\nimport type { KoraConfigFile } from './kora-config'\nimport { ProcessManager } from './process-manager'\nimport { SchemaWatcher } from './schema-watcher'\n\ninterface ManagedSyncStoreConfig {\n\ttype: 'memory' | 'sqlite' | 'postgres'\n\tfilename?: string\n\tconnectionString?: string\n}\n\n/**\n * The `dev` command — starts the Kora development environment.\n */\nexport const devCommand = defineCommand({\n\tmeta: {\n\t\tname: 'dev',\n\t\tdescription: 'Start the Kora development environment',\n\t},\n\targs: {\n\t\tport: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Vite dev server port',\n\t\t},\n\t\t'sync-port': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Kora sync server port',\n\t\t},\n\t\t'no-sync': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable sync server startup',\n\t\t\tdefault: false,\n\t\t},\n\t\t'no-watch': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable schema file watching',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst config = await loadKoraConfig(projectRoot)\n\t\tconst vitePort = typeof args.port === 'string' ? args.port : String(config?.dev?.port ?? 5173)\n\t\tconst syncPortFromConfig =\n\t\t\ttypeof config?.dev?.sync === 'object' && typeof config.dev.sync.port === 'number'\n\t\t\t\t? config.dev.sync.port\n\t\t\t\t: 3001\n\t\tconst syncPort =\n\t\t\ttypeof args['sync-port'] === 'string' ? args['sync-port'] : String(syncPortFromConfig)\n\n\t\tconst configSyncEnabled =\n\t\t\tconfig?.dev?.sync === undefined ||\n\t\t\tconfig.dev.sync === true ||\n\t\t\t(typeof config.dev.sync === 'object' && config.dev.sync.enabled !== false)\n\n\t\tconst configWatchEnabled =\n\t\t\tconfig?.dev?.watch === undefined ||\n\t\t\tconfig.dev.watch === true ||\n\t\t\t(typeof config.dev.watch === 'object' && config.dev.watch.enabled !== false)\n\n\t\tconst watchDebounceMs =\n\t\t\ttypeof config?.dev?.watch === 'object' && typeof config.dev.watch.debounceMs === 'number'\n\t\t\t\t? config.dev.watch.debounceMs\n\t\t\t\t: 300\n\n\t\tconst viteEntryPoint = await resolveProjectBinaryEntryPoint(projectRoot, 'vite', 'vite')\n\t\tif (!viteEntryPoint) {\n\t\t\tthrow new DevServerError('vite', join(projectRoot, 'node_modules', '.bin', 'vite'))\n\t\t}\n\n\t\tconst syncServerFile = await findSyncServerFile(projectRoot)\n\t\tlet managedSyncStore = normalizeManagedSyncStore(config, projectRoot)\n\t\tconst postgresEnvRequested = isPostgresEnvRequested(config)\n\t\tconst syncAllowed = args['no-sync'] !== true && configSyncEnabled\n\t\tlet shouldStartSync = syncAllowed && (syncServerFile !== null || managedSyncStore !== null)\n\n\t\tlet hasTsx = false\n\t\tif (shouldStartSync && syncServerFile !== null) {\n\t\t\thasTsx = await hasTsxInstalled(projectRoot)\n\t\t\tif (!hasTsx) {\n\t\t\t\tlogger.warn('Sync server detected, but \"tsx\" is not installed. Skipping sync.')\n\t\t\t}\n\t\t}\n\n\t\tif (shouldStartSync && syncServerFile === null && managedSyncStore) {\n\t\t\tconst hasServerPackage = await fileExists(\n\t\t\t\tjoin(projectRoot, 'node_modules', '@korajs', 'server', 'package.json'),\n\t\t\t)\n\t\t\tif (!hasServerPackage) {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'Managed sync is configured, but @korajs/server is not installed. Install it or add server.ts.',\n\t\t\t\t)\n\t\t\t\tmanagedSyncStore = null\n\t\t\t\tshouldStartSync = syncAllowed && (syncServerFile !== null || managedSyncStore !== null)\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tsyncAllowed &&\n\t\t\tsyncServerFile === null &&\n\t\t\tmanagedSyncStore === null &&\n\t\t\tpostgresEnvRequested\n\t\t) {\n\t\t\tlogger.warn(\n\t\t\t\t'Managed postgres sync requested but no connection string found. Set dev.sync.store.connectionString or DATABASE_URL.',\n\t\t\t)\n\t\t}\n\n\t\tlet configuredSchemaPath: string | null = null\n\t\tif (typeof config?.schema === 'string') {\n\t\t\tconst candidate = resolve(projectRoot, config.schema)\n\t\t\tif (await fileExists(candidate)) {\n\t\t\t\tconfiguredSchemaPath = candidate\n\t\t\t} else {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`Configured schema file not found: ${candidate}. Falling back to auto-detection.`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst schemaPath = configuredSchemaPath ?? (await findSchemaFile(projectRoot))\n\t\tconst watchEnabled = args['no-watch'] !== true && configWatchEnabled && schemaPath !== null\n\n\t\tconst processManager = new ProcessManager()\n\t\tlet schemaWatcher: SchemaWatcher | null = null\n\t\tlet shuttingDown = false\n\t\tlet resolveFinished: (() => void) | undefined\n\t\tconst finished = new Promise<void>((resolve) => {\n\t\t\tresolveFinished = resolve\n\t\t})\n\n\t\tconst onManagedProcessExit = () => {\n\t\t\tif (!processManager.hasRunning() && !shuttingDown) {\n\t\t\t\tresolveFinished?.()\n\t\t\t}\n\t\t}\n\n\t\tconst shutdown = async () => {\n\t\t\tif (shuttingDown) return\n\t\t\tshuttingDown = true\n\t\t\tschemaWatcher?.stop()\n\t\t\tawait processManager.shutdownAll()\n\t\t\tresolveFinished?.()\n\t\t}\n\n\t\tconst onSigInt = () => {\n\t\t\tvoid shutdown()\n\t\t}\n\t\tconst onSigTerm = () => {\n\t\t\tvoid shutdown()\n\t\t}\n\n\t\tprocess.on('SIGINT', onSigInt)\n\t\tprocess.on('SIGTERM', onSigTerm)\n\n\t\tlogger.banner()\n\t\tlogger.info('Starting development environment:')\n\t\tlogger.blank()\n\t\tlogger.step(` Vite dev server on port ${vitePort}`)\n\t\tif (shouldStartSync && hasTsx && syncServerFile) {\n\t\t\tlogger.step(` Sync server on port ${syncPort}`)\n\t\t} else if (shouldStartSync && syncServerFile === null && managedSyncStore !== null) {\n\t\t\tlogger.step(` Managed sync server on port ${syncPort} (${managedSyncStore.type})`)\n\t\t} else if (syncAllowed && syncServerFile === null) {\n\t\t\tlogger.step(' Sync server configured but no server.ts/server.js or managed store found')\n\t\t} else if (!syncAllowed) {\n\t\t\tlogger.step(' Sync server disabled via --no-sync')\n\t\t}\n\n\t\tif (watchEnabled && schemaPath) {\n\t\t\tlogger.step(` Schema watcher enabled (${schemaPath})`)\n\t\t} else if (args['no-watch'] === true) {\n\t\t\tlogger.step(' Schema watcher disabled via --no-watch')\n\t\t} else {\n\t\t\tlogger.step(' Schema watcher disabled (schema.ts not found)')\n\t\t}\n\t\tlogger.blank()\n\n\t\tprocessManager.spawn({\n\t\t\tlabel: 'vite',\n\t\t\tcommand: process.execPath,\n\t\t\targs: [viteEntryPoint, '--port', String(vitePort)],\n\t\t\tcwd: projectRoot,\n\t\t\tonExit: onManagedProcessExit,\n\t\t})\n\n\t\tif (shouldStartSync && hasTsx && syncServerFile) {\n\t\t\tprocessManager.spawn({\n\t\t\t\tlabel: 'sync',\n\t\t\t\tcommand: process.execPath,\n\t\t\t\targs: ['--import', 'tsx', syncServerFile],\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tenv: {\n\t\t\t\t\tPORT: String(syncPort),\n\t\t\t\t\tKORA_SYNC_PORT: String(syncPort),\n\t\t\t\t},\n\t\t\t\tonExit: onManagedProcessExit,\n\t\t\t})\n\t\t}\n\n\t\tif (shouldStartSync && syncServerFile === null && managedSyncStore !== null) {\n\t\t\tprocessManager.spawn({\n\t\t\t\tlabel: 'sync',\n\t\t\t\tcommand: process.execPath,\n\t\t\t\targs: ['--input-type=module', '--eval', MANAGED_SYNC_BOOTSTRAP_SCRIPT],\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tenv: {\n\t\t\t\t\tKORA_DEV_SYNC_CONFIG: JSON.stringify({\n\t\t\t\t\t\tport: Number(syncPort),\n\t\t\t\t\t\tstore: managedSyncStore,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tonExit: onManagedProcessExit,\n\t\t\t})\n\t\t}\n\n\t\tif (watchEnabled && schemaPath) {\n\t\t\tschemaWatcher = new SchemaWatcher({\n\t\t\t\tschemaPath,\n\t\t\t\tprojectRoot,\n\t\t\t\tdebounceMs: watchDebounceMs,\n\t\t\t\tonRegenerate: () => {\n\t\t\t\t\tlogger.success('Regenerated types from schema changes')\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tlogger.error(`Schema watcher error: ${error.message}`)\n\t\t\t\t},\n\t\t\t})\n\t\t\tschemaWatcher.start()\n\t\t}\n\n\t\tawait finished\n\t\tprocess.off('SIGINT', onSigInt)\n\t\tprocess.off('SIGTERM', onSigTerm)\n\t},\n})\n\nasync function findSyncServerFile(projectRoot: string): Promise<string | null> {\n\tconst candidates = [join(projectRoot, 'server.ts'), join(projectRoot, 'server.js')]\n\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\n\treturn null\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\nfunction normalizeManagedSyncStore(\n\tconfig: KoraConfigFile | null,\n\tprojectRoot: string,\n): ManagedSyncStoreConfig | null {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return null\n\n\tconst store = sync.store\n\tif (store === undefined) return { type: 'memory' }\n\n\tif (store === 'memory') return { type: 'memory' }\n\tif (store === 'sqlite') return { type: 'sqlite', filename: join(projectRoot, 'kora-sync.db') }\n\tif (store === 'postgres') {\n\t\tconst connectionString = process.env.DATABASE_URL\n\t\tif (!connectionString) return null\n\t\treturn { type: 'postgres', connectionString }\n\t}\n\n\tif (typeof store === 'object' && store !== null) {\n\t\tif (store.type === 'memory') return { type: 'memory' }\n\t\tif (store.type === 'sqlite') {\n\t\t\tconst filename =\n\t\t\t\ttypeof store.filename === 'string' && store.filename.length > 0\n\t\t\t\t\t? resolve(projectRoot, store.filename)\n\t\t\t\t\t: join(projectRoot, 'kora-sync.db')\n\t\t\treturn { type: 'sqlite', filename }\n\t\t}\n\t\tif (store.type === 'postgres' && typeof store.connectionString === 'string') {\n\t\t\treturn { type: 'postgres', connectionString: store.connectionString }\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction isPostgresEnvRequested(config: KoraConfigFile | null): boolean {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return false\n\tif (sync.store === 'postgres') return true\n\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'postgres')\n\t\treturn true\n\treturn false\n}\n\nconst MANAGED_SYNC_BOOTSTRAP_SCRIPT = `\nconst config = JSON.parse(process.env.KORA_DEV_SYNC_CONFIG ?? '{}');\nconst {\n createKoraServer,\n MemoryServerStore,\n createSqliteServerStore,\n createPostgresServerStore,\n} = await import('@korajs/server');\nconst storeConfig = config.store ?? { type: 'memory' };\nlet store;\nif (storeConfig.type === 'memory') {\n store = new MemoryServerStore();\n} else if (storeConfig.type === 'sqlite') {\n const filename = typeof storeConfig.filename === 'string' && storeConfig.filename.length > 0\n ? storeConfig.filename\n : './kora-sync.db';\n store = createSqliteServerStore({ filename });\n} else if (storeConfig.type === 'postgres') {\n if (typeof storeConfig.connectionString !== 'string' || storeConfig.connectionString.length === 0) {\n throw new Error('Managed postgres sync requires a connectionString');\n }\n store = await createPostgresServerStore({\n connectionString: storeConfig.connectionString,\n });\n} else {\n throw new Error('Unsupported managed sync store type: ' + String(storeConfig.type));\n}\nconst server = createKoraServer({ store, port: Number(config.port ?? 3001) });\nconst shutdown = async () => {\n try {\n await server.stop();\n } catch {\n }\n process.exit(0);\n};\nprocess.on('SIGINT', () => {\n void shutdown();\n});\nprocess.on('SIGTERM', () => {\n void shutdown();\n});\nawait server.start();\nprocess.stdout.write('Managed sync server running on ws://localhost:' + String(config.port ?? 3001) + '\\\\n');\nawait new Promise(() => {});\n`\n","import { spawn } from 'node:child_process'\nimport { access } from 'node:fs/promises'\nimport { extname, join } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\nexport interface KoraConfigFile {\n\tschema?: string\n\tdev?: {\n\t\tport?: number\n\t\tsync?:\n\t\t\t| boolean\n\t\t\t| {\n\t\t\t\t\tenabled?: boolean\n\t\t\t\t\tport?: number\n\t\t\t\t\tstore?:\n\t\t\t\t\t\t| 'memory'\n\t\t\t\t\t\t| 'sqlite'\n\t\t\t\t\t\t| 'postgres'\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'memory'\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'sqlite'\n\t\t\t\t\t\t\t\tfilename?: string\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'postgres'\n\t\t\t\t\t\t\t\tconnectionString: string\n\t\t\t\t\t\t }\n\t\t\t }\n\t\twatch?:\n\t\t\t| boolean\n\t\t\t| {\n\t\t\t\t\tenabled?: boolean\n\t\t\t\t\tdebounceMs?: number\n\t\t\t }\n\t}\n}\n\nconst CONFIG_CANDIDATES = [\n\t'kora.config.ts',\n\t'kora.config.mts',\n\t'kora.config.cts',\n\t'kora.config.js',\n\t'kora.config.mjs',\n\t'kora.config.cjs',\n]\n\n/**\n * Loads `kora.config.*` from the project root if present.\n */\nexport async function loadKoraConfig(projectRoot: string): Promise<KoraConfigFile | null> {\n\tconst configPath = await findKoraConfigFile(projectRoot)\n\tif (!configPath) return null\n\n\tconst ext = extname(configPath)\n\tif (ext === '.ts' || ext === '.mts' || ext === '.cts') {\n\t\tconst loaded = await loadTypeScriptConfig(configPath, projectRoot)\n\t\treturn toConfigObject(loaded)\n\t}\n\n\tconst loaded = await import(pathToFileURL(configPath).href)\n\treturn toConfigObject(loaded)\n}\n\nasync function findKoraConfigFile(projectRoot: string): Promise<string | null> {\n\tfor (const file of CONFIG_CANDIDATES) {\n\t\tconst candidate = join(projectRoot, file)\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\n\treturn null\n}\n\nasync function loadTypeScriptConfig(configPath: string, projectRoot: string): Promise<unknown> {\n\tif (!(await hasTsxInstalled(projectRoot))) {\n\t\tthrow new Error(\n\t\t\t`Found TypeScript config at ${configPath}, but \"tsx\" is not installed in this project. Install tsx or use kora.config.js.`,\n\t\t)\n\t}\n\n\t// Use process.execPath (node) + --import tsx to avoid .cmd shim issues on Windows.\n\t// Use dynamic import() with .then() since --eval may run as CJS (no top-level await).\n\tconst script =\n\t\t'const configPath = process.argv[process.argv.length - 1];' +\n\t\t\"import('node:url').then(u => import(u.pathToFileURL(configPath).href))\" +\n\t\t'.then(mod => { const v = mod.default ?? mod; process.stdout.write(JSON.stringify(v)) })' +\n\t\t'.catch(e => { process.stderr.write(String(e)); process.exit(1) })'\n\n\tconst output = await runCommand(\n\t\tprocess.execPath,\n\t\t['--import', 'tsx', '--eval', script, configPath],\n\t\tprojectRoot,\n\t)\n\n\ttry {\n\t\treturn JSON.parse(output)\n\t} catch {\n\t\tthrow new Error(`Failed to parse ${configPath} output as JSON.`)\n\t}\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<string> {\n\treturn await new Promise<string>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tlet stdout = ''\n\t\tlet stderr = ''\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\tstdout += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\tstderr += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim())\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treject(new Error(`Failed to load kora config (exit ${code ?? 'unknown'}): ${stderr.trim()}`))\n\t\t})\n\t})\n}\n\nfunction toConfigObject(mod: unknown): KoraConfigFile {\n\tif (typeof mod !== 'object' || mod === null) {\n\t\tthrow new Error('kora config must export an object.')\n\t}\n\n\tconst value = (mod as Record<string, unknown>).default ?? mod\n\tif (typeof value !== 'object' || value === null || Array.isArray(value)) {\n\t\tthrow new Error('kora config must export an object.')\n\t}\n\n\treturn value as KoraConfigFile\n}\n","import { spawn as spawnChild } from 'node:child_process'\nimport type { ChildProcess, SpawnOptions } from 'node:child_process'\n\nexport interface ManagedProcessConfig {\n\tlabel: string\n\tcommand: string\n\targs: string[]\n\tcwd: string\n\tenv?: Record<string, string>\n\tonExit?: (code: number | null, signal: NodeJS.Signals | null) => void\n}\n\ninterface RunningProcess {\n\tchild: ChildProcess\n\texitPromise: Promise<void>\n\tstdoutBuffer: string\n\tstderrBuffer: string\n}\n\n/**\n * Manages long-running child processes for the dev command.\n */\nexport class ProcessManager {\n\tprivate readonly processes = new Map<string, RunningProcess>()\n\n\tspawn(config: ManagedProcessConfig): void {\n\t\tconst options: SpawnOptions = {\n\t\t\tcwd: config.cwd,\n\t\t\tenv: { ...process.env, ...config.env },\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t}\n\n\t\tconst child = spawnChild(config.command, config.args, options)\n\t\tlet resolveExit: (() => void) | undefined\n\n\t\tconst runningProcess: RunningProcess = {\n\t\t\tchild,\n\t\t\texitPromise: new Promise<void>((resolve) => {\n\t\t\t\tresolveExit = resolve\n\t\t\t}),\n\t\t\tstdoutBuffer: '',\n\t\t\tstderrBuffer: '',\n\t\t}\n\n\t\tthis.processes.set(config.label, runningProcess)\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\trunningProcess.stdoutBuffer = this.writeChunk(\n\t\t\t\tconfig.label,\n\t\t\t\trunningProcess.stdoutBuffer,\n\t\t\t\tchunk,\n\t\t\t\tfalse,\n\t\t\t)\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\trunningProcess.stderrBuffer = this.writeChunk(\n\t\t\t\tconfig.label,\n\t\t\t\trunningProcess.stderrBuffer,\n\t\t\t\tchunk,\n\t\t\t\ttrue,\n\t\t\t)\n\t\t})\n\n\t\tchild.on('exit', (code, signal) => {\n\t\t\tthis.flushBuffer(config.label, runningProcess.stdoutBuffer, false)\n\t\t\tthis.flushBuffer(config.label, runningProcess.stderrBuffer, true)\n\t\t\tthis.processes.delete(config.label)\n\t\t\tconfig.onExit?.(code, signal)\n\t\t\tresolveExit?.()\n\t\t})\n\t}\n\n\thasRunning(): boolean {\n\t\treturn this.processes.size > 0\n\t}\n\n\tasync shutdownAll(): Promise<void> {\n\t\tconst running = Array.from(this.processes.values())\n\t\tif (running.length === 0) return\n\n\t\tfor (const processEntry of running) {\n\t\t\tprocessEntry.child.kill('SIGTERM')\n\t\t}\n\n\t\tawait Promise.race([Promise.all(running.map((entry) => entry.exitPromise)), delay(5000)])\n\n\t\tconst remaining = Array.from(this.processes.values())\n\t\tif (remaining.length === 0) return\n\n\t\tfor (const processEntry of remaining) {\n\t\t\tprocessEntry.child.kill('SIGKILL')\n\t\t}\n\n\t\tawait Promise.all(remaining.map((entry) => entry.exitPromise))\n\t}\n\n\tprivate writeChunk(label: string, buffer: string, chunk: Buffer, isError: boolean): string {\n\t\tconst combined = `${buffer}${chunk.toString('utf-8')}`\n\t\tconst lines = combined.split(/\\r?\\n/)\n\t\tconst remaining = lines.pop() ?? ''\n\n\t\tfor (const line of lines) {\n\t\t\tthis.writeLine(label, line, isError)\n\t\t}\n\n\t\treturn remaining\n\t}\n\n\tprivate flushBuffer(label: string, buffer: string, isError: boolean): void {\n\t\tif (!buffer) return\n\t\tthis.writeLine(label, buffer, isError)\n\t}\n\n\tprivate writeLine(label: string, line: string, isError: boolean): void {\n\t\tconst stream = isError ? process.stderr : process.stdout\n\t\tstream.write(`[${label}] ${line}\\n`)\n\t}\n}\n\nfunction delay(ms: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms)\n\t})\n}\n","import { spawn } from 'node:child_process'\nimport { watch } from 'node:fs'\nimport type { FSWatcher } from 'node:fs'\nimport { join } from 'node:path'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\nexport interface SchemaWatcherConfig {\n\tschemaPath: string\n\tprojectRoot: string\n\tdebounceMs?: number\n\tonRegenerate?: () => void\n\tonError?: (error: Error) => void\n}\n\n/**\n * Watches a schema file and regenerates types when it changes.\n */\nexport class SchemaWatcher {\n\tprivate readonly debounceMs: number\n\tprivate watcher: FSWatcher | null = null\n\tprivate debounceTimer: NodeJS.Timeout | null = null\n\n\tconstructor(private readonly config: SchemaWatcherConfig) {\n\t\tthis.debounceMs = config.debounceMs ?? 300\n\t}\n\n\tstart(): void {\n\t\tif (this.watcher) return\n\n\t\tthis.watcher = watch(this.config.schemaPath, () => {\n\t\t\tthis.scheduleRegeneration()\n\t\t})\n\n\t\tthis.watcher.on('error', (error) => {\n\t\t\tthis.config.onError?.(toError(error))\n\t\t})\n\t}\n\n\tstop(): void {\n\t\tif (this.debounceTimer) {\n\t\t\tclearTimeout(this.debounceTimer)\n\t\t\tthis.debounceTimer = null\n\t\t}\n\n\t\tthis.watcher?.close()\n\t\tthis.watcher = null\n\t}\n\n\tasync regenerate(): Promise<void> {\n\t\t// Use process.execPath (node) + --import tsx to run kora generate,\n\t\t// avoiding .cmd shim issues on Windows with paths containing spaces.\n\t\tconst koraBinJs = join(\n\t\t\tthis.config.projectRoot,\n\t\t\t'node_modules',\n\t\t\t'@korajs',\n\t\t\t'cli',\n\t\t\t'dist',\n\t\t\t'bin.js',\n\t\t)\n\t\tconst hasTsx = await hasTsxInstalled(this.config.projectRoot)\n\n\t\tconst command = process.execPath\n\t\tconst args = hasTsx\n\t\t\t? ['--import', 'tsx', koraBinJs, 'generate', 'types', '--schema', this.config.schemaPath]\n\t\t\t: [koraBinJs, 'generate', 'types', '--schema', this.config.schemaPath]\n\n\t\tawait spawnCommand(command, args, this.config.projectRoot)\n\t\tthis.config.onRegenerate?.()\n\t}\n\n\tprivate scheduleRegeneration(): void {\n\t\tif (this.debounceTimer) {\n\t\t\tclearTimeout(this.debounceTimer)\n\t\t}\n\n\t\tthis.debounceTimer = setTimeout(() => {\n\t\t\tthis.debounceTimer = null\n\t\t\tvoid this.regenerate().catch((error) => {\n\t\t\t\tthis.config.onError?.(toError(error))\n\t\t\t})\n\t\t}, this.debounceMs)\n\t}\n}\n\nasync function spawnCommand(command: string, args: string[], cwd: string): Promise<void> {\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\twritePrefixedLines(chunk, false)\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\twritePrefixedLines(chunk, true)\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve()\n\t\t\t\treturn\n\t\t\t}\n\t\t\treject(new Error(`Type generation exited with code ${code ?? 'unknown'}.`))\n\t\t})\n\t})\n}\n\nfunction writePrefixedLines(chunk: Buffer, isError: boolean): void {\n\tconst text = chunk.toString('utf-8')\n\tconst lines = text.split(/\\r?\\n/).filter((line) => line.length > 0)\n\tconst stream = isError ? process.stderr : process.stdout\n\n\tfor (const line of lines) {\n\t\tstream.write(`[kora] ${line}\\n`)\n\t}\n}\n\nfunction toError(error: unknown): Error {\n\tif (error instanceof Error) return error\n\treturn new Error(String(error))\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport { dirname, resolve } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError, SchemaNotFoundError } from '../../errors'\nimport { findProjectRoot, findSchemaFile } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { generateTypes } from './type-generator'\n\n/**\n * The `generate` command with `types` subcommand.\n * Reads a schema file and generates TypeScript interfaces.\n */\nexport const generateCommand = defineCommand({\n\tmeta: {\n\t\tname: 'generate',\n\t\tdescription: 'Generate code from your Kora schema',\n\t},\n\tsubCommands: {\n\t\ttypes: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'types',\n\t\t\t\tdescription: 'Generate TypeScript types from your schema',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tschema: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Path to schema file',\n\t\t\t\t},\n\t\t\t\toutput: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Output file path',\n\t\t\t\t\tdefault: 'kora/generated/types.ts',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\n\t\t\t\t// Find project root\n\t\t\t\tconst projectRoot = await findProjectRoot()\n\t\t\t\tif (!projectRoot) {\n\t\t\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t\t\t}\n\n\t\t\t\t// Find schema file\n\t\t\t\tlet schemaPath: string\n\t\t\t\tif (args.schema && typeof args.schema === 'string') {\n\t\t\t\t\tschemaPath = resolve(args.schema)\n\t\t\t\t} else {\n\t\t\t\t\tconst found = await findSchemaFile(projectRoot)\n\t\t\t\t\tif (!found) {\n\t\t\t\t\t\tthrow new SchemaNotFoundError([\n\t\t\t\t\t\t\t'src/schema.ts',\n\t\t\t\t\t\t\t'schema.ts',\n\t\t\t\t\t\t\t'src/schema.js',\n\t\t\t\t\t\t\t'schema.js',\n\t\t\t\t\t\t])\n\t\t\t\t\t}\n\t\t\t\t\tschemaPath = found\n\t\t\t\t}\n\n\t\t\t\tlogger.step(`Reading schema from ${schemaPath}...`)\n\n\t\t\t\t// Dynamic import the schema file\n\t\t\t\tconst schemaModule: unknown = await import(schemaPath)\n\t\t\t\tconst schema = extractSchema(schemaModule)\n\n\t\t\t\tif (!schema) {\n\t\t\t\t\tlogger.error('Schema file must export a SchemaDefinition as the default export.')\n\t\t\t\t\tprocess.exitCode = 1\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Generate types\n\t\t\t\tconst output = generateTypes(schema)\n\t\t\t\tconst outputFile = typeof args.output === 'string' ? args.output : 'kora/generated/types.ts'\n\t\t\t\tconst outputPath = resolve(projectRoot, outputFile)\n\n\t\t\t\tawait mkdir(dirname(outputPath), { recursive: true })\n\t\t\t\tawait writeFile(outputPath, output, 'utf-8')\n\n\t\t\t\tlogger.success(`Generated types at ${outputPath}`)\n\t\t\t},\n\t\t}),\n\t},\n})\n\nfunction extractSchema(mod: unknown): SchemaDefinition | null {\n\tif (typeof mod !== 'object' || mod === null) return null\n\tconst record = mod as Record<string, unknown>\n\n\t// Check for default export\n\tconst candidate = record.default ?? record\n\tif (isSchemaDefinition(candidate)) return candidate\n\n\treturn null\n}\n\nfunction isSchemaDefinition(value: unknown): value is SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst obj = value as Record<string, unknown>\n\treturn (\n\t\ttypeof obj.version === 'number' &&\n\t\ttypeof obj.collections === 'object' &&\n\t\tobj.collections !== null\n\t)\n}\n","import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError, SchemaNotFoundError } from '../../errors'\nimport { findProjectRoot, findSchemaFile } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { promptConfirm } from '../../utils/prompt'\nimport { loadKoraConfig } from '../dev/kora-config'\nimport { generateMigration } from './migration-generator'\nimport { runMigration } from './migration-runner'\nimport { diffSchemas } from './schema-differ'\nimport { loadSchemaDefinition } from './schema-loader'\n\nconst SNAPSHOT_PATH = 'kora/schema.snapshot.json'\nconst MIGRATIONS_DIR = 'kora/migrations'\n\ninterface MigrationManifest {\n\tid: string\n\tfromVersion: number\n\ttoVersion: number\n\tup: string[]\n\tdown: string[]\n\tsummary: string[]\n\tcontainsBreakingChanges: boolean\n}\n\n/**\n * The `migrate` command — detects schema changes and generates migration artifacts.\n */\nexport const migrateCommand = defineCommand({\n\tmeta: {\n\t\tname: 'migrate',\n\t\tdescription: 'Detect schema changes and generate/apply migrations',\n\t},\n\targs: {\n\t\tapply: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Apply migration to configured database backends',\n\t\t\tdefault: false,\n\t\t},\n\t\tschema: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Path to schema file',\n\t\t},\n\t\tdb: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'SQLite database path for --apply (overrides config)',\n\t\t},\n\t\t'output-dir': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Migration output directory',\n\t\t\tdefault: MIGRATIONS_DIR,\n\t\t},\n\t\t'dry-run': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Preview migration changes without writing files',\n\t\t\tdefault: false,\n\t\t},\n\t\tforce: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Skip breaking-change confirmation prompts',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst config = await loadKoraConfig(projectRoot)\n\t\tconst resolvedSchemaPath =\n\t\t\ttypeof args.schema === 'string'\n\t\t\t\t? resolve(projectRoot, args.schema)\n\t\t\t\t: typeof config?.schema === 'string'\n\t\t\t\t\t? resolve(projectRoot, config.schema)\n\t\t\t\t\t: await findSchemaFile(projectRoot)\n\n\t\tif (!resolvedSchemaPath) {\n\t\t\tthrow new SchemaNotFoundError(['src/schema.ts', 'schema.ts', 'src/schema.js', 'schema.js'])\n\t\t}\n\n\t\tconst currentSchema = await loadSchemaDefinition(resolvedSchemaPath, projectRoot)\n\n\t\tconst snapshotFile = join(projectRoot, SNAPSHOT_PATH)\n\t\tconst previousSchema = await readSchemaSnapshot(snapshotFile)\n\n\t\tif (!previousSchema) {\n\t\t\tif (args['dry-run'] === true) {\n\t\t\t\tlogger.info('No schema snapshot found. Dry run: baseline snapshot would be created.')\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tawait writeSchemaSnapshot(snapshotFile, currentSchema)\n\t\t\tlogger.success(`Initialized schema snapshot at ${snapshotFile}`)\n\t\t\tlogger.step('Run `kora migrate` again after schema changes to generate migrations.')\n\t\t\treturn\n\t\t}\n\n\t\tconst diff = diffSchemas(previousSchema, currentSchema)\n\t\tconst outputDir =\n\t\t\ttypeof args['output-dir'] === 'string'\n\t\t\t\t? resolve(projectRoot, args['output-dir'])\n\t\t\t\t: resolve(projectRoot, MIGRATIONS_DIR)\n\n\t\tif (!diff.hasChanges) {\n\t\t\tlogger.success('No schema changes detected.')\n\t\t\tif (args.apply === true) {\n\t\t\t\tconst sqlitePath = resolveSqliteApplyPath(args.db, projectRoot, config)\n\t\t\t\tconst postgresConnectionString = resolvePostgresConnectionString(config)\n\t\t\t\tconst pending = await listMigrationManifests(outputDir)\n\n\t\t\t\tif (pending.length === 0) {\n\t\t\t\t\tlogger.step('No migration files found to apply.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tfor (const manifest of pending) {\n\t\t\t\t\tconst report = await runMigration({\n\t\t\t\t\t\tupStatements: manifest.up,\n\t\t\t\t\t\tmigrationId: manifest.id,\n\t\t\t\t\t\tfromVersion: manifest.fromVersion,\n\t\t\t\t\t\ttoVersion: manifest.toVersion,\n\t\t\t\t\t\tsqlitePath,\n\t\t\t\t\t\tpostgresConnectionString,\n\t\t\t\t\t\tprojectRoot,\n\t\t\t\t\t})\n\n\t\t\t\t\tfor (const backend of report.backends) {\n\t\t\t\t\t\tlogger.step(\n\t\t\t\t\t\t\t` ${manifest.id} -> ${backend.backend}: applied=${backend.statementsApplied}, skipped=${backend.skipped}`,\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\treturn\n\t\t}\n\n\t\tconst generated = generateMigration(previousSchema, currentSchema, diff)\n\n\t\tlogger.banner()\n\t\tlogger.info(`Detected schema change: v${diff.fromVersion} → v${diff.toVersion}`)\n\t\tlogger.blank()\n\t\tlogger.info('Changes:')\n\t\tfor (const line of generated.summary) {\n\t\t\tlogger.step(` ${line}`)\n\t\t}\n\n\t\tif (diff.hasBreakingChanges && args['dry-run'] !== true) {\n\t\t\tlogger.blank()\n\t\t\tlogger.warn('Breaking schema changes detected.')\n\t\t\tconst shouldContinue = await confirmBreakingChanges(args.force === true)\n\t\t\tif (!shouldContinue) {\n\t\t\t\tlogger.warn('Migration generation aborted.')\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif (args['dry-run'] === true) {\n\t\t\tlogger.blank()\n\t\t\tlogger.warn('Dry run enabled: no files written, no migrations applied.')\n\t\t\treturn\n\t\t}\n\n\t\tawait mkdir(outputDir, { recursive: true })\n\n\t\tconst migrationPath = await writeMigrationFile(\n\t\t\toutputDir,\n\t\t\tdiff.fromVersion,\n\t\t\tdiff.toVersion,\n\t\t\tgenerated,\n\t\t)\n\t\tawait writeSchemaSnapshot(snapshotFile, currentSchema)\n\n\t\tlogger.blank()\n\t\tlogger.success(`Generated migration: ${migrationPath}`)\n\n\t\tif (args.apply === true) {\n\t\t\tconst sqlitePath = resolveSqliteApplyPath(args.db, projectRoot, config)\n\t\t\tconst postgresConnectionString = resolvePostgresConnectionString(config)\n\t\t\tconst pending = await listMigrationManifests(outputDir)\n\n\t\t\tfor (const manifest of pending) {\n\t\t\t\tconst report = await runMigration({\n\t\t\t\t\tupStatements: manifest.up,\n\t\t\t\t\tmigrationId: manifest.id,\n\t\t\t\t\tfromVersion: manifest.fromVersion,\n\t\t\t\t\ttoVersion: manifest.toVersion,\n\t\t\t\t\tsqlitePath,\n\t\t\t\t\tpostgresConnectionString,\n\t\t\t\t\tprojectRoot,\n\t\t\t\t})\n\n\t\t\t\tfor (const backend of report.backends) {\n\t\t\t\t\tlogger.step(\n\t\t\t\t\t\t` ${manifest.id} -> ${backend.backend}: applied=${backend.statementsApplied}, skipped=${backend.skipped}, history=${backend.historyRecorded}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlogger.success('Applied pending migrations successfully.')\n\t\t}\n\t},\n})\n\nasync function readSchemaSnapshot(path: string): Promise<SchemaDefinition | null> {\n\ttry {\n\t\tconst content = await readFile(path, 'utf-8')\n\t\treturn JSON.parse(content) as SchemaDefinition\n\t} catch {\n\t\treturn null\n\t}\n}\n\nasync function confirmBreakingChanges(force: boolean): Promise<boolean> {\n\tif (force) {\n\t\treturn true\n\t}\n\n\tif (!isInteractiveTerminal()) {\n\t\tthrow new Error(\n\t\t\t'Breaking schema changes require confirmation. Re-run with --force to continue or --dry-run to preview.',\n\t\t)\n\t}\n\n\treturn await promptConfirm('Continue and generate a breaking migration?', false)\n}\n\nfunction isInteractiveTerminal(): boolean {\n\treturn process.stdin.isTTY === true && process.stdout.isTTY === true\n}\n\nasync function writeSchemaSnapshot(path: string, schema: SchemaDefinition): Promise<void> {\n\tawait mkdir(dirname(path), { recursive: true })\n\tawait writeFile(path, `${JSON.stringify(schema, null, 2)}\\n`, 'utf-8')\n}\n\nasync function writeMigrationFile(\n\toutputDir: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tgenerated: ReturnType<typeof generateMigration>,\n): Promise<string> {\n\tconst existing = await readdir(outputDir).catch(() => [])\n\tconst sequence = existing.filter((file) => /^\\d{3}-/.test(file)).length + 1\n\tconst filename = `${String(sequence).padStart(3, '0')}-v${fromVersion}-to-v${toVersion}.ts`\n\tconst path = join(outputDir, filename)\n\tconst migrationId = filename.replace(/\\.ts$/, '')\n\n\tconst fileContent = [\n\t\t`export const up = ${JSON.stringify(generated.up, null, 2)} as const`,\n\t\t'',\n\t\t`export const down = ${JSON.stringify(generated.down, null, 2)} as const`,\n\t\t'',\n\t\t`export const summary = ${JSON.stringify(generated.summary, null, 2)} as const`,\n\t\t'',\n\t\t`export const containsBreakingChanges = ${generated.containsBreakingChanges}`,\n\t\t'',\n\t].join('\\n')\n\n\tawait writeFile(path, fileContent, 'utf-8')\n\tawait writeMigrationManifest(join(outputDir, `${migrationId}.json`), {\n\t\tid: migrationId,\n\t\tfromVersion,\n\t\ttoVersion,\n\t\tup: generated.up,\n\t\tdown: generated.down,\n\t\tsummary: generated.summary,\n\t\tcontainsBreakingChanges: generated.containsBreakingChanges,\n\t})\n\treturn path\n}\n\nasync function writeMigrationManifest(path: string, manifest: MigrationManifest): Promise<void> {\n\tawait writeFile(path, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf-8')\n}\n\nasync function listMigrationManifests(outputDir: string): Promise<MigrationManifest[]> {\n\tconst files = await readdir(outputDir).catch(() => [])\n\tconst migrationFiles = files\n\t\t.filter((file) => /^\\d{3}-.*\\.ts$/.test(file))\n\t\t.sort((left, right) => left.localeCompare(right))\n\n\tconst manifests: MigrationManifest[] = []\n\tfor (const file of migrationFiles) {\n\t\tconst id = file.replace(/\\.ts$/, '')\n\t\tconst manifestPath = join(outputDir, `${id}.json`)\n\t\tconst jsonManifest = await readMigrationManifest(manifestPath)\n\n\t\tif (jsonManifest) {\n\t\t\tmanifests.push({ ...jsonManifest, id })\n\t\t\tcontinue\n\t\t}\n\n\t\tconst migrationPath = join(outputDir, file)\n\t\tconst sourceManifest = await readMigrationManifestFromSource(migrationPath, id)\n\t\tmanifests.push(sourceManifest)\n\t}\n\n\treturn manifests\n}\n\nasync function readMigrationManifest(path: string): Promise<MigrationManifest | null> {\n\ttry {\n\t\tconst content = await readFile(path, 'utf-8')\n\t\treturn JSON.parse(content) as MigrationManifest\n\t} catch (error) {\n\t\tconst code = (error as NodeJS.ErrnoException).code\n\t\tif (code === 'ENOENT') {\n\t\t\treturn null\n\t\t}\n\t\tthrow error\n\t}\n}\n\nasync function readMigrationManifestFromSource(\n\tpath: string,\n\tid: string,\n): Promise<MigrationManifest> {\n\tconst content = await readFile(path, 'utf-8')\n\tconst versions = parseVersionsFromMigrationId(id)\n\n\treturn {\n\t\tid,\n\t\tfromVersion: versions.fromVersion,\n\t\ttoVersion: versions.toVersion,\n\t\tup: parseStringArrayExport(content, 'up'),\n\t\tdown: parseStringArrayExport(content, 'down'),\n\t\tsummary: parseStringArrayExport(content, 'summary'),\n\t\tcontainsBreakingChanges: parseBooleanExport(content, 'containsBreakingChanges'),\n\t}\n}\n\nfunction parseVersionsFromMigrationId(id: string): { fromVersion: number; toVersion: number } {\n\tconst match = id.match(/-v(\\d+)-to-v(\\d+)$/)\n\tif (!match) {\n\t\tthrow new Error(`Migration id \"${id}\" does not include a vX-to-vY version suffix.`)\n\t}\n\n\treturn {\n\t\tfromVersion: Number.parseInt(match[1], 10),\n\t\ttoVersion: Number.parseInt(match[2], 10),\n\t}\n}\n\nfunction parseStringArrayExport(source: string, exportName: 'up' | 'down' | 'summary'): string[] {\n\tconst expression = parseExportExpression(source, exportName)\n\tconst parsed = JSON.parse(expression) as unknown\n\tif (!Array.isArray(parsed) || parsed.some((item) => typeof item !== 'string')) {\n\t\tthrow new Error(`Migration export \"${exportName}\" must be a string array.`)\n\t}\n\n\treturn parsed\n}\n\nfunction parseBooleanExport(source: string, exportName: 'containsBreakingChanges'): boolean {\n\tconst expression = parseLiteralExport(source, exportName)\n\tif (expression === 'true') return true\n\tif (expression === 'false') return false\n\tthrow new Error(`Migration export \"${exportName}\" must be a boolean literal.`)\n}\n\nfunction parseExportExpression(source: string, exportName: string): string {\n\tconst escapedName = exportName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\tconst regex = new RegExp(`export const ${escapedName} = ([\\\\s\\\\S]*?) as const`)\n\tconst match = source.match(regex)\n\tif (!match || !match[1]) {\n\t\tthrow new Error(`Failed to read migration export \"${exportName}\".`)\n\t}\n\n\treturn match[1].trim()\n}\n\nfunction parseLiteralExport(source: string, exportName: string): string {\n\tconst escapedName = exportName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\tconst regex = new RegExp(`export const ${escapedName} = ([^\\n\\r]+)`)\n\tconst match = source.match(regex)\n\tif (!match || !match[1]) {\n\t\tthrow new Error(`Failed to read migration export \"${exportName}\".`)\n\t}\n\n\treturn match[1].trim()\n}\n\nfunction resolveSqliteApplyPath(\n\tdbArg: unknown,\n\tprojectRoot: string,\n\tconfig: Awaited<ReturnType<typeof loadKoraConfig>>,\n): string | undefined {\n\tif (typeof dbArg === 'string') {\n\t\treturn resolve(projectRoot, dbArg)\n\t}\n\n\tconst sync = config?.dev?.sync\n\tif (typeof sync === 'object' && sync !== null) {\n\t\tif (sync.store === 'sqlite') {\n\t\t\treturn join(projectRoot, 'kora-sync.db')\n\t\t}\n\t\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'sqlite') {\n\t\t\tif (typeof sync.store.filename === 'string' && sync.store.filename.length > 0) {\n\t\t\t\treturn resolve(projectRoot, sync.store.filename)\n\t\t\t}\n\t\t\treturn join(projectRoot, 'kora-sync.db')\n\t\t}\n\t}\n\n\treturn undefined\n}\n\nfunction resolvePostgresConnectionString(\n\tconfig: Awaited<ReturnType<typeof loadKoraConfig>>,\n): string | undefined {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return undefined\n\n\tif (sync.store === 'postgres') {\n\t\treturn process.env.DATABASE_URL\n\t}\n\n\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'postgres') {\n\t\treturn sync.store.connectionString\n\t}\n\n\treturn undefined\n}\n","import { generateSQL } from '@korajs/core'\nimport type { CollectionDefinition, FieldDescriptor, SchemaDefinition } from '@korajs/core'\nimport type { SchemaDiff } from './schema-differ'\nimport { getChangedCollections } from './schema-differ'\n\nexport interface GeneratedMigration {\n\tup: string[]\n\tdown: string[]\n\tsummary: string[]\n\tcontainsBreakingChanges: boolean\n}\n\n/**\n * Generates SQL up/down migration statements from a schema diff.\n */\nexport function generateMigration(\n\tprevious: SchemaDefinition,\n\tcurrent: SchemaDefinition,\n\tdiff: SchemaDiff,\n): GeneratedMigration {\n\tconst up: string[] = []\n\tconst down: string[] = []\n\n\tfor (const change of diff.changes) {\n\t\tif (change.type === 'collection-added') {\n\t\t\tconst collectionDef = current.collections[change.collection]\n\t\t\tif (!collectionDef) continue\n\t\t\tup.push(...generateSQL(change.collection, collectionDef))\n\t\t\tdown.push(...dropCollectionStatements(change.collection))\n\t\t}\n\n\t\tif (change.type === 'collection-removed') {\n\t\t\tconst collectionDef = previous.collections[change.collection]\n\t\t\tup.push(...dropCollectionStatements(change.collection))\n\t\t\tif (collectionDef) {\n\t\t\t\tdown.push(...generateSQL(change.collection, collectionDef))\n\t\t\t}\n\t\t}\n\t}\n\n\tconst changedCollections = getChangedCollections(diff).filter(\n\t\t(collection) =>\n\t\t\tcollection in previous.collections &&\n\t\t\tcollection in current.collections &&\n\t\t\tdiff.changes.some(\n\t\t\t\t(change) =>\n\t\t\t\t\tchange.collection === collection &&\n\t\t\t\t\t(change.type === 'field-added' ||\n\t\t\t\t\t\tchange.type === 'field-removed' ||\n\t\t\t\t\t\tchange.type === 'field-changed' ||\n\t\t\t\t\t\tchange.type === 'index-added' ||\n\t\t\t\t\t\tchange.type === 'index-removed'),\n\t\t\t),\n\t)\n\n\tfor (const collection of changedCollections) {\n\t\tconst previousDef = previous.collections[collection]\n\t\tconst currentDef = current.collections[collection]\n\t\tif (!previousDef || !currentDef) continue\n\n\t\tvalidateRebuildSafety(collection, previousDef, currentDef)\n\n\t\tup.push(...generateRebuildStatements(collection, previousDef, currentDef))\n\t\tdown.push(...generateRebuildStatements(collection, currentDef, previousDef))\n\t}\n\n\tdown.reverse()\n\n\treturn {\n\t\tup,\n\t\tdown,\n\t\tsummary: diff.changes.map(formatChange),\n\t\tcontainsBreakingChanges: diff.hasBreakingChanges,\n\t}\n}\n\nfunction generateRebuildStatements(\n\tcollection: string,\n\tfrom: CollectionDefinition,\n\tto: CollectionDefinition,\n): string[] {\n\tconst table = quoteIdentifier(collection)\n\tconst tempTable = quoteIdentifier(`_kora_mig_${collection}_new`)\n\n\tconst targetColumns = [\n\t\t'id TEXT PRIMARY KEY NOT NULL',\n\t\t...Object.entries(to.fields).map(([field, descriptor]) => columnDefinition(field, descriptor)),\n\t\t'_created_at INTEGER NOT NULL',\n\t\t'_updated_at INTEGER NOT NULL',\n\t\t'_deleted INTEGER NOT NULL DEFAULT 0',\n\t]\n\n\tconst statements: string[] = []\n\tstatements.push(`CREATE TABLE ${tempTable} (\\n ${targetColumns.join(',\\n ')}\\n)`)\n\n\tconst toFields = Object.keys(to.fields)\n\tconst columns = ['id', ...toFields, '_created_at', '_updated_at', '_deleted']\n\tconst selectExpressions = columns.map((column) =>\n\t\tprojectionForColumn(column, from.fields, to.fields[column] ?? null),\n\t)\n\n\tstatements.push(\n\t\t`INSERT INTO ${tempTable} (${columns.map(quoteIdentifier).join(', ')}) SELECT ${selectExpressions.join(', ')} FROM ${table}`,\n\t)\n\tstatements.push(`DROP TABLE ${table}`)\n\tstatements.push(`ALTER TABLE ${tempTable} RENAME TO ${table}`)\n\n\tfor (const indexField of to.indexes) {\n\t\tstatements.push(\n\t\t\t`CREATE INDEX IF NOT EXISTS idx_${collection}_${indexField} ON ${table} (${quoteIdentifier(indexField)})`,\n\t\t)\n\t}\n\n\treturn statements\n}\n\nfunction validateRebuildSafety(\n\tcollection: string,\n\tfrom: CollectionDefinition,\n\tto: CollectionDefinition,\n): void {\n\tfor (const [fieldName, descriptor] of Object.entries(to.fields)) {\n\t\tif (fieldName in from.fields) continue\n\t\tif (descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot auto-migrate collection \"${collection}\": added required field \"${fieldName}\" has no default value.`,\n\t\t\t)\n\t\t}\n\t}\n\n\tfor (const [fieldName, targetDescriptor] of Object.entries(to.fields)) {\n\t\tconst sourceDescriptor = from.fields[fieldName]\n\t\tif (!sourceDescriptor) continue\n\t\tif (canTransformField(sourceDescriptor, targetDescriptor)) continue\n\n\t\tif (\n\t\t\ttargetDescriptor.required &&\n\t\t\ttargetDescriptor.defaultValue === undefined &&\n\t\t\t!targetDescriptor.auto\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot auto-migrate collection \"${collection}\": changed required field \"${fieldName}\" from ${sourceDescriptor.kind} to ${targetDescriptor.kind} without a safe transform/default.`,\n\t\t\t)\n\t\t}\n\t}\n}\n\nfunction projectionForColumn(\n\tcolumn: string,\n\tfromFields: Record<string, FieldDescriptor>,\n\ttargetDescriptor: FieldDescriptor | null,\n): string {\n\tif (\n\t\tcolumn === 'id' ||\n\t\tcolumn === '_created_at' ||\n\t\tcolumn === '_updated_at' ||\n\t\tcolumn === '_deleted'\n\t) {\n\t\treturn quoteIdentifier(column)\n\t}\n\n\tconst sourceDescriptor = fromFields[column]\n\tif (sourceDescriptor && targetDescriptor) {\n\t\treturn projectionForFieldTransform(column, sourceDescriptor, targetDescriptor)\n\t}\n\n\tif (sourceDescriptor) {\n\t\treturn quoteIdentifier(column)\n\t}\n\n\tif (!targetDescriptor) {\n\t\treturn 'NULL'\n\t}\n\n\tif (targetDescriptor.auto && targetDescriptor.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\tif (targetDescriptor.defaultValue !== undefined) {\n\t\treturn sqlLiteral(targetDescriptor.defaultValue)\n\t}\n\n\treturn 'NULL'\n}\n\nfunction projectionForFieldTransform(\n\tcolumn: string,\n\tsource: FieldDescriptor,\n\ttarget: FieldDescriptor,\n): string {\n\tconst sourceColumn = quoteIdentifier(column)\n\tif (source.kind === target.kind && source.itemKind === target.itemKind) {\n\t\tif (target.kind === 'enum' && target.enumValues && target.enumValues.length > 0) {\n\t\t\tconst allowed = target.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\t\tconst fallback =\n\t\t\t\ttarget.defaultValue !== undefined ? sqlLiteral(target.defaultValue) : sourceColumn\n\t\t\treturn `CASE WHEN ${sourceColumn} IN (${allowed}) THEN ${sourceColumn} ELSE ${fallback} END`\n\t\t}\n\t\treturn sourceColumn\n\t}\n\n\tif (target.kind === 'string') {\n\t\treturn `CAST(${sourceColumn} AS TEXT)`\n\t}\n\n\tif (target.kind === 'number' || target.kind === 'timestamp') {\n\t\tif (\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum' ||\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean'\n\t\t) {\n\t\t\tconst castType = target.kind === 'number' ? 'REAL' : 'INTEGER'\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL ELSE CAST(${sourceColumn} AS ${castType}) END`\n\t\t}\n\t}\n\n\tif (target.kind === 'boolean') {\n\t\tif (source.kind === 'number' || source.kind === 'timestamp' || source.kind === 'boolean') {\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL WHEN CAST(${sourceColumn} AS REAL) = 0 THEN 0 ELSE 1 END`\n\t\t}\n\n\t\tif (source.kind === 'string' || source.kind === 'enum') {\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL WHEN LOWER(TRIM(CAST(${sourceColumn} AS TEXT))) IN ('1','true','t','yes','y','on') THEN 1 WHEN LOWER(TRIM(CAST(${sourceColumn} AS TEXT))) IN ('0','false','f','no','n','off') THEN 0 ELSE ${projectionFallback(target)} END`\n\t\t}\n\t}\n\n\tif (target.kind === 'enum' && target.enumValues && target.enumValues.length > 0) {\n\t\tif (source.kind === 'string' || source.kind === 'enum') {\n\t\t\tconst allowed = target.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\t\treturn `CASE WHEN ${sourceColumn} IN (${allowed}) THEN ${sourceColumn} ELSE ${projectionFallback(target)} END`\n\t\t}\n\t}\n\n\tif (target.kind === 'array' && source.kind === 'array' && source.itemKind === target.itemKind) {\n\t\treturn sourceColumn\n\t}\n\n\tif (target.auto && target.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\treturn projectionFallback(target)\n}\n\nfunction canTransformField(source: FieldDescriptor, target: FieldDescriptor): boolean {\n\tif (source.kind === target.kind && source.itemKind === target.itemKind) {\n\t\treturn true\n\t}\n\n\tif (target.kind === 'string') {\n\t\treturn true\n\t}\n\n\tif (target.kind === 'number' || target.kind === 'timestamp') {\n\t\treturn (\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum' ||\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean'\n\t\t)\n\t}\n\n\tif (target.kind === 'boolean') {\n\t\treturn (\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean' ||\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum'\n\t\t)\n\t}\n\n\tif (target.kind === 'enum') {\n\t\treturn source.kind === 'string' || source.kind === 'enum'\n\t}\n\n\tif (target.kind === 'array') {\n\t\treturn source.kind === 'array' && source.itemKind === target.itemKind\n\t}\n\n\tif (target.kind === 'richtext') {\n\t\treturn source.kind === 'richtext'\n\t}\n\n\treturn false\n}\n\nfunction projectionFallback(target: FieldDescriptor): string {\n\tif (target.auto && target.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\tif (target.defaultValue !== undefined) {\n\t\treturn sqlLiteral(target.defaultValue)\n\t}\n\n\treturn 'NULL'\n}\n\nfunction dropCollectionStatements(collection: string): string[] {\n\tconst table = quoteIdentifier(collection)\n\tconst opsTable = quoteIdentifier(`_kora_ops_${collection}`)\n\treturn [`DROP TABLE IF EXISTS ${table}`, `DROP TABLE IF EXISTS ${opsTable}`]\n}\n\nfunction columnDefinition(fieldName: string, descriptor: FieldDescriptor): string {\n\tconst sqlType = mapFieldType(descriptor)\n\tconst parts = [quoteIdentifier(fieldName), sqlType]\n\n\tif (descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto) {\n\t\tparts.push('NOT NULL')\n\t}\n\n\tif (descriptor.defaultValue !== undefined) {\n\t\tparts.push(`DEFAULT ${sqlLiteral(descriptor.defaultValue)}`)\n\t}\n\n\tif (descriptor.kind === 'enum' && descriptor.enumValues) {\n\t\tconst values = descriptor.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\tparts.push(`CHECK (${quoteIdentifier(fieldName)} IN (${values}))`)\n\t}\n\n\treturn parts.join(' ')\n}\n\nfunction mapFieldType(descriptor: FieldDescriptor): string {\n\tswitch (descriptor.kind) {\n\t\tcase 'string':\n\t\t\treturn 'TEXT'\n\t\tcase 'number':\n\t\t\treturn 'REAL'\n\t\tcase 'boolean':\n\t\t\treturn 'INTEGER'\n\t\tcase 'enum':\n\t\t\treturn 'TEXT'\n\t\tcase 'timestamp':\n\t\t\treturn 'INTEGER'\n\t\tcase 'array':\n\t\t\treturn 'TEXT'\n\t\tcase 'richtext':\n\t\t\treturn 'BLOB'\n\t}\n}\n\nfunction sqlLiteral(value: unknown): string {\n\tif (value === null) return 'NULL'\n\tif (typeof value === 'number') return String(value)\n\tif (typeof value === 'boolean') return value ? '1' : '0'\n\tif (typeof value === 'string') return `'${value.replaceAll(\"'\", \"''\")}'`\n\treturn `'${JSON.stringify(value).replaceAll(\"'\", \"''\")}'`\n}\n\nfunction quoteIdentifier(identifier: string): string {\n\tif (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier)) {\n\t\tthrow new Error(`Invalid SQL identifier: ${identifier}`)\n\t}\n\treturn identifier\n}\n\nfunction formatChange(change: SchemaDiff['changes'][number]): string {\n\tswitch (change.type) {\n\t\tcase 'collection-added':\n\t\t\treturn `+ collection ${change.collection}`\n\t\tcase 'collection-removed':\n\t\t\treturn `- collection ${change.collection}`\n\t\tcase 'field-added':\n\t\t\treturn `+ ${change.collection}.${change.field}`\n\t\tcase 'field-removed':\n\t\t\treturn `- ${change.collection}.${change.field}`\n\t\tcase 'field-changed':\n\t\t\treturn `~ ${change.collection}.${change.field}`\n\t\tcase 'index-added':\n\t\t\treturn `+ index ${change.collection}.${change.index}`\n\t\tcase 'index-removed':\n\t\t\treturn `- index ${change.collection}.${change.index}`\n\t}\n}\n","import type { FieldDescriptor, SchemaDefinition } from '@korajs/core'\n\nexport type SchemaChange =\n\t| { type: 'collection-added'; collection: string }\n\t| { type: 'collection-removed'; collection: string }\n\t| { type: 'field-added'; collection: string; field: string; descriptor: FieldDescriptor }\n\t| { type: 'field-removed'; collection: string; field: string; descriptor: FieldDescriptor }\n\t| {\n\t\t\ttype: 'field-changed'\n\t\t\tcollection: string\n\t\t\tfield: string\n\t\t\tbefore: FieldDescriptor\n\t\t\tafter: FieldDescriptor\n\t }\n\t| { type: 'index-added'; collection: string; index: string }\n\t| { type: 'index-removed'; collection: string; index: string }\n\nexport interface SchemaDiff {\n\tfromVersion: number\n\ttoVersion: number\n\tchanges: SchemaChange[]\n\thasChanges: boolean\n\thasBreakingChanges: boolean\n}\n\n/**\n * Computes a structural schema diff.\n */\nexport function diffSchemas(previous: SchemaDefinition, current: SchemaDefinition): SchemaDiff {\n\tconst changes: SchemaChange[] = []\n\n\tconst previousCollections = new Set(Object.keys(previous.collections))\n\tconst currentCollections = new Set(Object.keys(current.collections))\n\n\tfor (const collection of currentCollections) {\n\t\tif (!previousCollections.has(collection)) {\n\t\t\tchanges.push({ type: 'collection-added', collection })\n\t\t}\n\t}\n\n\tfor (const collection of previousCollections) {\n\t\tif (!currentCollections.has(collection)) {\n\t\t\tchanges.push({ type: 'collection-removed', collection })\n\t\t}\n\t}\n\n\tfor (const collection of currentCollections) {\n\t\tif (!previousCollections.has(collection)) continue\n\n\t\tconst previousDef = previous.collections[collection]\n\t\tconst currentDef = current.collections[collection]\n\t\tif (!previousDef || !currentDef) continue\n\n\t\tconst previousFields = previousDef.fields\n\t\tconst currentFields = currentDef.fields\n\n\t\tfor (const [fieldName, currentField] of Object.entries(currentFields)) {\n\t\t\tconst previousField = previousFields[fieldName]\n\t\t\tif (!previousField) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-added',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tdescriptor: currentField,\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!fieldDescriptorsEqual(previousField, currentField)) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-changed',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tbefore: previousField,\n\t\t\t\t\tafter: currentField,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tfor (const [fieldName, previousField] of Object.entries(previousFields)) {\n\t\t\tif (!(fieldName in currentFields)) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-removed',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tdescriptor: previousField,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst previousIndexes = new Set(previousDef.indexes)\n\t\tconst currentIndexes = new Set(currentDef.indexes)\n\n\t\tfor (const index of currentIndexes) {\n\t\t\tif (!previousIndexes.has(index)) {\n\t\t\t\tchanges.push({ type: 'index-added', collection, index })\n\t\t\t}\n\t\t}\n\n\t\tfor (const index of previousIndexes) {\n\t\t\tif (!currentIndexes.has(index)) {\n\t\t\t\tchanges.push({ type: 'index-removed', collection, index })\n\t\t\t}\n\t\t}\n\t}\n\n\tchanges.sort(compareChanges)\n\n\treturn {\n\t\tfromVersion: previous.version,\n\t\ttoVersion: current.version,\n\t\tchanges,\n\t\thasChanges: changes.length > 0,\n\t\thasBreakingChanges: changes.some(isBreakingChange),\n\t}\n}\n\nexport function getChangedCollections(diff: SchemaDiff): string[] {\n\tconst collections = new Set<string>()\n\tfor (const change of diff.changes) {\n\t\tcollections.add(change.collection)\n\t}\n\treturn [...collections].sort()\n}\n\nfunction isBreakingChange(change: SchemaChange): boolean {\n\tif (change.type === 'collection-removed' || change.type === 'field-removed') return true\n\tif (change.type === 'field-changed') {\n\t\tif (change.before.kind !== change.after.kind) return true\n\t\tif (change.before.itemKind !== change.after.itemKind) return true\n\t\tif (serializeEnum(change.before.enumValues) !== serializeEnum(change.after.enumValues))\n\t\t\treturn true\n\t\tif (change.before.required !== change.after.required && change.after.required) return true\n\t\treturn false\n\t}\n\tif (change.type === 'field-added') {\n\t\tconst descriptor = change.descriptor\n\t\treturn descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto\n\t}\n\treturn false\n}\n\nfunction fieldDescriptorsEqual(left: FieldDescriptor, right: FieldDescriptor): boolean {\n\treturn (\n\t\tleft.kind === right.kind &&\n\t\tleft.required === right.required &&\n\t\tleft.defaultValue === right.defaultValue &&\n\t\tleft.auto === right.auto &&\n\t\tleft.itemKind === right.itemKind &&\n\t\tserializeEnum(left.enumValues) === serializeEnum(right.enumValues)\n\t)\n}\n\nfunction serializeEnum(values: readonly string[] | null): string {\n\tif (!values) return ''\n\treturn values.join('|')\n}\n\nfunction compareChanges(left: SchemaChange, right: SchemaChange): number {\n\tif (left.collection < right.collection) return -1\n\tif (left.collection > right.collection) return 1\n\n\tif (left.type < right.type) return -1\n\tif (left.type > right.type) return 1\n\n\tconst leftKey = 'field' in left ? left.field : 'index' in left ? left.index : ''\n\tconst rightKey = 'field' in right ? right.field : 'index' in right ? right.index : ''\n\n\tif (leftKey < rightKey) return -1\n\tif (leftKey > rightKey) return 1\n\treturn 0\n}\n","export interface RunMigrationOptions {\n\tupStatements: string[]\n\tmigrationId?: string\n\tfromVersion?: number\n\ttoVersion?: number\n\tsqlitePath?: string\n\tpostgresConnectionString?: string\n\tprojectRoot?: string\n\tsqliteDriver?: {\n\t\topen(path: string): {\n\t\t\texec(sql: string): void\n\t\t\tisMigrationApplied?(id: string): boolean\n\t\t\tclose?(): void\n\t\t}\n\t}\n\tpostgresClientFactory?: (connectionString: string) => {\n\t\tunsafe(query: string): Promise<unknown>\n\t\tend?(): Promise<void>\n\t}\n}\n\nexport interface BackendApplyReport {\n\tbackend: 'sqlite' | 'postgres'\n\tstatementsApplied: number\n\thistoryRecorded: boolean\n\tskipped: boolean\n}\n\nexport interface RunMigrationReport {\n\tbackends: BackendApplyReport[]\n}\n\nexport class MigrationApplyError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly backend: 'sqlite' | 'postgres',\n\t\tpublic readonly report: RunMigrationReport,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'MigrationApplyError'\n\t}\n}\n\n/**\n * Applies migration statements to configured backends.\n */\nexport async function runMigration(options: RunMigrationOptions): Promise<RunMigrationReport> {\n\tconst report: RunMigrationReport = { backends: [] }\n\tconst migrationId = options.migrationId ?? `migration-${Date.now()}`\n\tconst fromVersion = options.fromVersion ?? 0\n\tconst toVersion = options.toVersion ?? 0\n\n\tif (options.sqlitePath) {\n\t\ttry {\n\t\t\tconst sqliteReport = await runSqliteMigration(\n\t\t\t\toptions.sqlitePath,\n\t\t\t\toptions.upStatements,\n\t\t\t\tmigrationId,\n\t\t\t\tfromVersion,\n\t\t\t\ttoVersion,\n\t\t\t\toptions.projectRoot,\n\t\t\t\toptions.sqliteDriver,\n\t\t\t)\n\t\t\treport.backends.push(sqliteReport)\n\t\t} catch (error) {\n\t\t\tthrow new MigrationApplyError((error as Error).message, 'sqlite', report)\n\t\t}\n\t}\n\n\tif (options.postgresConnectionString) {\n\t\ttry {\n\t\t\tconst postgresReport = await runPostgresMigration(\n\t\t\t\toptions.postgresConnectionString,\n\t\t\t\toptions.upStatements,\n\t\t\t\tmigrationId,\n\t\t\t\tfromVersion,\n\t\t\t\ttoVersion,\n\t\t\t\toptions.postgresClientFactory,\n\t\t\t)\n\t\t\treport.backends.push(postgresReport)\n\t\t} catch (error) {\n\t\t\tthrow new MigrationApplyError((error as Error).message, 'postgres', report)\n\t\t}\n\t}\n\n\treturn report\n}\n\nasync function runSqliteMigration(\n\tpath: string,\n\tstatements: string[],\n\tmigrationId: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tprojectRoot?: string,\n\tdriverOverride?: RunMigrationOptions['sqliteDriver'],\n): Promise<BackendApplyReport> {\n\tconst driver = driverOverride ?? (await loadSqliteDriver(projectRoot))\n\tconst db = driver.open(path)\n\tlet statementsApplied = 0\n\n\ttry {\n\t\tdb.exec('BEGIN')\n\t\tdb.exec(\n\t\t\t'CREATE TABLE IF NOT EXISTS _kora_migrations (id TEXT PRIMARY KEY NOT NULL, from_version INTEGER NOT NULL, to_version INTEGER NOT NULL, applied_at INTEGER NOT NULL)',\n\t\t)\n\t\tconst alreadyApplied =\n\t\t\ttypeof db.isMigrationApplied === 'function' ? db.isMigrationApplied(migrationId) : false\n\t\tif (alreadyApplied) {\n\t\t\tdb.exec('COMMIT')\n\t\t\treturn {\n\t\t\t\tbackend: 'sqlite',\n\t\t\t\tstatementsApplied: 0,\n\t\t\t\thistoryRecorded: true,\n\t\t\t\tskipped: true,\n\t\t\t}\n\t\t}\n\t\tfor (const statement of statements) {\n\t\t\tdb.exec(statement)\n\t\t\tstatementsApplied++\n\t\t}\n\t\tdb.exec(\n\t\t\t`INSERT OR REPLACE INTO _kora_migrations (id, from_version, to_version, applied_at) VALUES (${sqlLiteral(migrationId)}, ${fromVersion}, ${toVersion}, ${Date.now()})`,\n\t\t)\n\t\tdb.exec('COMMIT')\n\n\t\treturn {\n\t\t\tbackend: 'sqlite',\n\t\t\tstatementsApplied,\n\t\t\thistoryRecorded: true,\n\t\t\tskipped: false,\n\t\t}\n\t} catch (error) {\n\t\ttry {\n\t\t\tdb.exec('ROLLBACK')\n\t\t} catch {\n\t\t\t// best effort\n\t\t}\n\t\tthrow error\n\t} finally {\n\t\tif (typeof db.close === 'function') {\n\t\t\tdb.close()\n\t\t}\n\t}\n}\n\nasync function loadSqliteDriver(projectRoot?: string): Promise<{\n\topen(path: string): {\n\t\texec(sql: string): void\n\t\tisMigrationApplied(id: string): boolean\n\t\tclose(): void\n\t}\n}> {\n\ttry {\n\t\tconst { createRequire } = await import('node:module')\n\t\tconst requireFrom = createRequire(projectRoot ? `${projectRoot}/package.json` : import.meta.url)\n\t\tconst Database = requireFrom('better-sqlite3') as new (\n\t\t\tpath: string,\n\t\t) => {\n\t\t\texec(sql: string): void\n\t\t\tprepare(sql: string): {\n\t\t\t\tget(...params: unknown[]): { count?: number } | undefined\n\t\t\t}\n\t\t\tclose(): void\n\t\t}\n\n\t\treturn {\n\t\t\topen(path: string) {\n\t\t\t\tconst db = new Database(path)\n\t\t\t\treturn {\n\t\t\t\t\texec(sql: string) {\n\t\t\t\t\t\tdb.exec(sql)\n\t\t\t\t\t},\n\t\t\t\t\tisMigrationApplied(id: string) {\n\t\t\t\t\t\tconst row = db\n\t\t\t\t\t\t\t.prepare('SELECT COUNT(*) AS count FROM _kora_migrations WHERE id = ?')\n\t\t\t\t\t\t\t.get(id)\n\t\t\t\t\t\treturn (row?.count ?? 0) > 0\n\t\t\t\t\t},\n\t\t\t\t\tclose() {\n\t\t\t\t\t\tdb.close()\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t} catch {\n\t\tthrow new Error(\n\t\t\t'SQLite migration apply requires the \"better-sqlite3\" package in the target project dependencies.',\n\t\t)\n\t}\n}\n\nasync function runPostgresMigration(\n\tconnectionString: string,\n\tstatements: string[],\n\tmigrationId: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tclientFactoryOverride?: RunMigrationOptions['postgresClientFactory'],\n): Promise<BackendApplyReport> {\n\tconst sql =\n\t\ttypeof clientFactoryOverride === 'function'\n\t\t\t? clientFactoryOverride(connectionString)\n\t\t\t: (await loadPostgresModule()).default(connectionString)\n\tlet statementsApplied = 0\n\n\ttry {\n\t\tawait sql.unsafe('BEGIN')\n\t\tawait sql.unsafe(\n\t\t\t'CREATE TABLE IF NOT EXISTS _kora_migrations (id TEXT PRIMARY KEY, from_version INTEGER NOT NULL, to_version INTEGER NOT NULL, applied_at BIGINT NOT NULL)',\n\t\t)\n\t\tconst existing = await sql.unsafe<{ count: number }[]>(\n\t\t\t`SELECT COUNT(*)::int AS count FROM _kora_migrations WHERE id = ${sqlLiteral(migrationId)}`,\n\t\t)\n\t\tif ((existing[0]?.count ?? 0) > 0) {\n\t\t\tawait sql.unsafe('COMMIT')\n\t\t\treturn {\n\t\t\t\tbackend: 'postgres',\n\t\t\t\tstatementsApplied: 0,\n\t\t\t\thistoryRecorded: true,\n\t\t\t\tskipped: true,\n\t\t\t}\n\t\t}\n\t\tfor (const statement of statements) {\n\t\t\tawait sql.unsafe(statement)\n\t\t\tstatementsApplied++\n\t\t}\n\t\tawait sql.unsafe(\n\t\t\t`INSERT INTO _kora_migrations (id, from_version, to_version, applied_at) VALUES (${sqlLiteral(migrationId)}, ${fromVersion}, ${toVersion}, ${Date.now()}) ON CONFLICT (id) DO UPDATE SET from_version = EXCLUDED.from_version, to_version = EXCLUDED.to_version, applied_at = EXCLUDED.applied_at`,\n\t\t)\n\t\tawait sql.unsafe('COMMIT')\n\n\t\treturn {\n\t\t\tbackend: 'postgres',\n\t\t\tstatementsApplied,\n\t\t\thistoryRecorded: true,\n\t\t\tskipped: false,\n\t\t}\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait sql.unsafe('ROLLBACK')\n\t\t} catch {\n\t\t\t// best effort\n\t\t}\n\t\tthrow error\n\t} finally {\n\t\tif (typeof sql.end === 'function') {\n\t\t\tawait sql.end()\n\t\t}\n\t}\n}\n\nfunction sqlLiteral(value: string): string {\n\treturn `'${value.replaceAll(\"'\", \"''\")}'`\n}\n\nasync function loadPostgresModule(): Promise<{\n\tdefault: (connectionString: string) => {\n\t\tunsafe: (query: string) => Promise<unknown>\n\t\tend?: () => Promise<void>\n\t}\n}> {\n\ttry {\n\t\tconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n\t\t\tspecifier: string,\n\t\t) => Promise<unknown>\n\t\tconst mod = await dynamicImport('postgres')\n\t\tif (typeof mod === 'object' && mod !== null && 'default' in mod) {\n\t\t\treturn mod as {\n\t\t\t\tdefault: (connectionString: string) => {\n\t\t\t\t\tunsafe: (query: string) => Promise<unknown>\n\t\t\t\t\tend?: () => Promise<void>\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthrow new Error('Invalid postgres module')\n\t} catch {\n\t\tthrow new Error(\n\t\t\t'PostgreSQL migration apply requires the \"postgres\" package in the target project dependencies.',\n\t\t)\n\t}\n}\n","import { spawn } from 'node:child_process'\nimport { extname } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\n/**\n * Loads a schema definition from a TS/JS module.\n */\nexport async function loadSchemaDefinition(\n\tschemaPath: string,\n\tprojectRoot: string,\n): Promise<SchemaDefinition> {\n\tconst ext = extname(schemaPath)\n\tconst moduleValue =\n\t\text === '.ts' || ext === '.mts' || ext === '.cts'\n\t\t\t? await loadTypeScriptModule(schemaPath, projectRoot)\n\t\t\t: await import(`${pathToFileURL(schemaPath).href}?t=${Date.now()}-${Math.random()}`)\n\n\treturn extractSchema(moduleValue)\n}\n\nfunction extractSchema(value: unknown): SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) {\n\t\tthrow new Error('Schema module must export an object.')\n\t}\n\n\tconst moduleRecord = value as Record<string, unknown>\n\tconst candidate = moduleRecord.default ?? moduleRecord\n\n\tif (!isSchemaDefinition(candidate)) {\n\t\tthrow new Error('Schema module must export a valid SchemaDefinition as default export.')\n\t}\n\n\treturn candidate\n}\n\nfunction isSchemaDefinition(value: unknown): value is SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst object = value as Record<string, unknown>\n\treturn (\n\t\ttypeof object.version === 'number' &&\n\t\ttypeof object.collections === 'object' &&\n\t\tobject.collections !== null &&\n\t\ttypeof object.relations === 'object' &&\n\t\tobject.relations !== null\n\t)\n}\n\nasync function loadTypeScriptModule(schemaPath: string, projectRoot: string): Promise<unknown> {\n\tif (!(await hasTsxInstalled(projectRoot))) {\n\t\tthrow new Error(\n\t\t\t`Schema file is TypeScript (${schemaPath}) but local \"tsx\" was not found. Install tsx in the project.`,\n\t\t)\n\t}\n\n\tconst script =\n\t\t'const modulePath = process.argv[process.argv.length - 1];' +\n\t\t\"import('node:url').then(u => import(u.pathToFileURL(modulePath).href))\" +\n\t\t'.then(mod => { const v = mod.default ?? mod; process.stdout.write(JSON.stringify(v)) })' +\n\t\t'.catch(e => { process.stderr.write(String(e)); process.exit(1) })'\n\n\tconst output = await runCommand(\n\t\tprocess.execPath,\n\t\t['--import', 'tsx', '--eval', script, schemaPath],\n\t\tprojectRoot,\n\t)\n\n\ttry {\n\t\treturn JSON.parse(output)\n\t} catch {\n\t\tthrow new Error(`Failed to parse schema module output for ${schemaPath}`)\n\t}\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<string> {\n\treturn await new Promise<string>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tlet stdout = ''\n\t\tlet stderr = ''\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\tstdout += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\tstderr += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim())\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treject(\n\t\t\t\tnew Error(`Failed to load TypeScript schema (exit ${code ?? 'unknown'}): ${stderr.trim()}`),\n\t\t\t)\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["defineCommand","access","join","loaded","resolve","resolve","spawn","join","join","resolve","spawn","join","resolve","access","resolve","defineCommand","defineCommand","resolve","mkdir","writeFile","dirname","join","resolve","defineCommand","sqlLiteral","spawn","extname","pathToFileURL","extname","pathToFileURL","extractSchema","isSchemaDefinition","runCommand","resolve","spawn","defineCommand","resolve","join","mkdir","dirname","writeFile","defineCommand"]}
1
+ {"version":3,"sources":["../src/bin.ts","../src/commands/backup/backup-command.ts","../src/commands/compact/compact-command.ts","../src/commands/dev/kora-config.ts","../src/commands/migrate/schema-loader.ts","../src/commands/dev/dev-command.ts","../src/commands/dev/process-manager.ts","../src/commands/dev/schema-watcher.ts","../src/commands/doctor/doctor-command.ts","../src/commands/doctor/doctor-checks.ts","../src/commands/generate/generate-command.ts","../src/commands/generate/hook-generator.ts","../src/commands/logs/logs-command.ts","../src/commands/migrate/migrate-command.ts","../src/commands/migrate/migration-generator.ts","../src/commands/migrate/schema-differ.ts","../src/commands/migrate/migration-runner.ts","../src/commands/migrate/operation-transform-generator.ts","../src/commands/status/status-command.ts"],"sourcesContent":["import { defineCommand, runMain } from 'citty'\nimport { backupCommand } from './commands/backup/backup-command'\nimport { compactCommand } from './commands/compact/compact-command'\nimport { createCommand } from './commands/create/create-command'\nimport { deployCommand } from './commands/deploy/deploy-command'\nimport { devCommand } from './commands/dev/dev-command'\nimport { doctorCommand } from './commands/doctor/doctor-command'\nimport { generateCommand } from './commands/generate/generate-command'\nimport { logsCommand } from './commands/logs/logs-command'\nimport { migrateCommand } from './commands/migrate/migrate-command'\nimport { statusCommand } from './commands/status/status-command'\n\nconst main = defineCommand({\n\tmeta: {\n\t\tname: 'kora',\n\t\tdescription: 'Kora.js — Offline-first application framework',\n\t},\n\tsubCommands: {\n\t\tbackup: backupCommand,\n\t\tcompact: compactCommand,\n\t\tcreate: createCommand,\n\t\tdev: devCommand,\n\t\tdoctor: doctorCommand,\n\t\tdeploy: deployCommand,\n\t\tgenerate: generateCommand,\n\t\tlogs: logsCommand,\n\t\tmigrate: migrateCommand,\n\t\tstatus: statusCommand,\n\t},\n})\n\nrunMain(main)\n","import { readFile, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { createLogger } from '../../utils/logger'\n\nconst DEFAULT_SYNC_PORT = 3001\n\n/**\n * The `backup` command — creates and restores Kora sync server backups.\n */\nexport const backupCommand = defineCommand({\n\tmeta: {\n\t\tname: 'backup',\n\t\tdescription: 'Backup and restore Kora sync server data',\n\t},\n\tsubCommands: {\n\t\tcreate: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'create',\n\t\t\t\tdescription: 'Create a backup of the sync server',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\turl: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t\t\t},\n\t\t\t\tout: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Output file path (default: kora-backup-<timestamp>.kora)',\n\t\t\t\t},\n\t\t\t\ttoken: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup token (defaults to KORA_BACKUP_TOKEN or KORA_ADMIN_TOKEN)',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst url =\n\t\t\t\t\ttypeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\t\t\tconst outFile = typeof args.out === 'string' ? args.out : `kora-backup-${Date.now()}.kora`\n\t\t\t\tconst token =\n\t\t\t\t\ttypeof args.token === 'string'\n\t\t\t\t\t\t? args.token\n\t\t\t\t\t\t: (process.env.KORA_BACKUP_TOKEN ?? process.env.KORA_ADMIN_TOKEN)\n\n\t\t\t\tlogger.banner()\n\t\t\t\tlogger.info(`Exporting backup from ${url}...`)\n\n\t\t\t\ttry {\n\t\t\t\t\tconst backupUrl = `${url.replace(/\\/$/, '')}/__kora/backup/export`\n\t\t\t\t\tconst response = await fetch(backupUrl, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tconst error = await response.json().catch(() => ({ message: response.statusText }))\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Backup failed: ${(error as { message: string }).message ?? response.statusText}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst buffer = await response.arrayBuffer()\n\t\t\t\t\tawait writeFile(outFile, new Uint8Array(buffer))\n\n\t\t\t\t\tconst size = (buffer.byteLength / 1024).toFixed(1)\n\t\t\t\t\tlogger.success(`Backup saved to ${outFile} (${size} KB)`)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error('Backup failed')\n\t\t\t\t\tif (error instanceof Error) logger.error(error.message)\n\t\t\t\t\tlogger.blank()\n\t\t\t\t\tlogger.step('Make sure the Kora sync server is running.')\n\t\t\t\t\tprocess.exit(1)\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\n\t\trestore: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'restore',\n\t\t\t\tdescription: 'Restore a backup to the sync server',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tfile: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup file path',\n\t\t\t\t\trequired: true,\n\t\t\t\t},\n\t\t\t\turl: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t\t\t},\n\t\t\t\tmerge: {\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\tdescription: 'Merge with existing data instead of replacing',\n\t\t\t\t\tdefault: false,\n\t\t\t\t},\n\t\t\t\ttoken: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup token (defaults to KORA_BACKUP_TOKEN or KORA_ADMIN_TOKEN)',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst filePath = typeof args.file === 'string' ? args.file : ''\n\t\t\t\tconst url =\n\t\t\t\t\ttypeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\t\t\tconst merge = args.merge === true\n\t\t\t\tconst token =\n\t\t\t\t\ttypeof args.token === 'string'\n\t\t\t\t\t\t? args.token\n\t\t\t\t\t\t: (process.env.KORA_BACKUP_TOKEN ?? process.env.KORA_ADMIN_TOKEN)\n\n\t\t\t\tlogger.banner()\n\t\t\t\tlogger.info(`Restoring backup from ${filePath} to ${url}...`)\n\n\t\t\t\ttry {\n\t\t\t\t\tconst data = await readFile(filePath)\n\t\t\t\t\tconst restoreUrl = `${url.replace(/\\/$/, '')}/__kora/backup/import?merge=${merge}`\n\n\t\t\t\t\tconst response = await fetch(restoreUrl, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t\t\t\t\t\tbody: data,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tconst error = await response.json().catch(() => ({ message: response.statusText }))\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Restore failed: ${(error as { message: string }).message ?? response.statusText}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = (await response.json()) as {\n\t\t\t\t\t\toperationsRestored: number\n\t\t\t\t\t\tsuccess: boolean\n\t\t\t\t\t\tduration?: number\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\tlogger.success(\n\t\t\t\t\t\t\t`Restored ${result.operationsRestored} operations${result.duration ? ` in ${result.duration}ms` : ''}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error('Restore completed with errors')\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error('Restore failed')\n\t\t\t\t\tif (error instanceof Error) logger.error(error.message)\n\t\t\t\t\tprocess.exit(1)\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\n\t\tinfo: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'info',\n\t\t\t\tdescription: 'Show backup file information',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tfile: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Backup file path',\n\t\t\t\t\trequired: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst filePath = typeof args.file === 'string' ? args.file : ''\n\n\t\t\t\ttry {\n\t\t\t\t\tconst data = await readFile(filePath)\n\t\t\t\t\tconst { readBackupManifest } = await import('@korajs/store')\n\n\t\t\t\t\tconst manifest = readBackupManifest(\n\t\t\t\t\t\tnew Uint8Array(data.buffer, data.byteOffset, data.byteLength),\n\t\t\t\t\t)\n\n\t\t\t\t\tlogger.banner()\n\t\t\t\t\tlogger.info(`Backup: ${filePath}`)\n\t\t\t\t\tlogger.blank()\n\t\t\t\t\tlogger.step(`Created: ${new Date(manifest.createdAt).toISOString()}`)\n\t\t\t\t\tlogger.step(`Node ID: ${manifest.nodeId}`)\n\t\t\t\t\tlogger.step(`Schema: v${manifest.schemaVersion}`)\n\t\t\t\t\tlogger.step(`Operations: ${manifest.operationCount.toLocaleString()}`)\n\t\t\t\t\tlogger.step(`Collections: ${manifest.collections.join(', ') || '(none)'}`)\n\t\t\t\t\tlogger.step(`Checksum: ${manifest.checksum.slice(0, 16)}...`)\n\t\t\t\t\tlogger.blank()\n\t\t\t\t\tlogger.step(`Format version: ${manifest.version}`)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error('Failed to read backup file')\n\t\t\t\t\tif (error instanceof Error) logger.error(error.message)\n\t\t\t\t\tprocess.exit(1)\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\t},\n})\n","import { resolve } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError } from '../../errors'\nimport { findProjectRoot } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { loadKoraConfig } from '../dev/kora-config'\nimport { loadSchemaDefinition } from '../migrate/schema-loader'\n\n/**\n * Compact the local client operation log (materialized rows are the baseline).\n */\nexport const compactCommand = defineCommand({\n\tmeta: {\n\t\tname: 'compact',\n\t\tdescription: 'Compact the local Kora operation log after server ack',\n\t},\n\targs: {\n\t\tdb: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Path to the local SQLite database (required)',\n\t\t},\n\t\tschema: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Path to schema file',\n\t\t},\n\t\tstrategy: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Compaction strategy: after-ack | after-days | never',\n\t\t\tdefault: 'after-ack',\n\t\t},\n\t\tdays: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Age threshold when strategy is after-days',\n\t\t\tdefault: '30',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst dbPath = typeof args.db === 'string' ? resolve(projectRoot, args.db) : undefined\n\t\tif (!dbPath) {\n\t\t\tthrow new Error('Missing --db <path> to the local SQLite database file.')\n\t\t}\n\n\t\tconst config = await loadKoraConfig(projectRoot)\n\t\tconst schemaPath =\n\t\t\ttypeof args.schema === 'string'\n\t\t\t\t? resolve(projectRoot, args.schema)\n\t\t\t\t: typeof config?.schema === 'string'\n\t\t\t\t\t? resolve(projectRoot, config.schema)\n\t\t\t\t\t: undefined\n\t\tif (!schemaPath) {\n\t\t\tthrow new Error('Could not resolve schema path. Pass --schema <path>.')\n\t\t}\n\n\t\tconst schema = await loadSchemaDefinition(schemaPath, projectRoot)\n\t\tconst { BetterSqlite3Adapter } = await import('@korajs/store/better-sqlite3')\n\t\tconst { Store } = await import('@korajs/store')\n\n\t\tconst strategyName = typeof args.strategy === 'string' ? args.strategy : 'after-ack'\n\t\tconst days = Number.parseInt(typeof args.days === 'string' ? args.days : '30', 10)\n\n\t\tconst store = new Store({\n\t\t\tschema,\n\t\t\tadapter: new BetterSqlite3Adapter(dbPath),\n\t\t})\n\t\tawait store.open()\n\n\t\tlet result: { deletedCount: number; watermark: Map<string, number> }\n\t\tif (strategyName === 'never') {\n\t\t\tresult = await store.compact({ mode: 'never' })\n\t\t} else if (strategyName === 'after-days') {\n\t\t\tresult = await store.compact({ mode: 'after-days', days })\n\t\t} else if (strategyName === 'after-ack') {\n\t\t\tresult = await store.compact({ mode: 'after-ack' })\n\t\t} else {\n\t\t\tawait store.close()\n\t\t\tthrow new Error(`Unknown strategy \"${strategyName}\". Use after-ack, after-days, or never.`)\n\t\t}\n\n\t\tawait store.close()\n\n\t\tlogger.banner()\n\t\tlogger.success(`Compacted ${result.deletedCount} operation log entries.`)\n\t\tfor (const [nodeId, seq] of result.watermark) {\n\t\t\tlogger.step(` ${nodeId}: seq <= ${seq}`)\n\t\t}\n\t},\n})\n","import { spawn } from 'node:child_process'\nimport { access } from 'node:fs/promises'\nimport { extname, join } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\nexport interface KoraConfigFile {\n\tschema?: string\n\tdev?: {\n\t\tport?: number\n\t\tsync?:\n\t\t\t| boolean\n\t\t\t| {\n\t\t\t\t\tenabled?: boolean\n\t\t\t\t\tport?: number\n\t\t\t\t\tstore?:\n\t\t\t\t\t\t| 'memory'\n\t\t\t\t\t\t| 'sqlite'\n\t\t\t\t\t\t| 'postgres'\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'memory'\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'sqlite'\n\t\t\t\t\t\t\t\tfilename?: string\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\ttype: 'postgres'\n\t\t\t\t\t\t\t\tconnectionString: string\n\t\t\t\t\t\t }\n\t\t\t }\n\t\twatch?:\n\t\t\t| boolean\n\t\t\t| {\n\t\t\t\t\tenabled?: boolean\n\t\t\t\t\tdebounceMs?: number\n\t\t\t }\n\t}\n}\n\nconst CONFIG_CANDIDATES = [\n\t'kora.config.ts',\n\t'kora.config.mts',\n\t'kora.config.cts',\n\t'kora.config.js',\n\t'kora.config.mjs',\n\t'kora.config.cjs',\n]\n\n/**\n * Loads `kora.config.*` from the project root if present.\n */\nexport async function loadKoraConfig(projectRoot: string): Promise<KoraConfigFile | null> {\n\tconst configPath = await findKoraConfigFile(projectRoot)\n\tif (!configPath) return null\n\n\tconst ext = extname(configPath)\n\tif (ext === '.ts' || ext === '.mts' || ext === '.cts') {\n\t\tconst loaded = await loadTypeScriptConfig(configPath, projectRoot)\n\t\treturn toConfigObject(loaded)\n\t}\n\n\tconst loaded = await import(pathToFileURL(configPath).href)\n\treturn toConfigObject(loaded)\n}\n\nasync function findKoraConfigFile(projectRoot: string): Promise<string | null> {\n\tfor (const file of CONFIG_CANDIDATES) {\n\t\tconst candidate = join(projectRoot, file)\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\n\treturn null\n}\n\nasync function loadTypeScriptConfig(configPath: string, projectRoot: string): Promise<unknown> {\n\tif (!(await hasTsxInstalled(projectRoot))) {\n\t\tthrow new Error(\n\t\t\t`Found TypeScript config at ${configPath}, but \"tsx\" is not installed in this project. Install tsx or use kora.config.js.`,\n\t\t)\n\t}\n\n\t// Use process.execPath (node) + --import tsx to avoid .cmd shim issues on Windows.\n\t// Use dynamic import() with .then() since --eval may run as CJS (no top-level await).\n\tconst script =\n\t\t'const configPath = process.argv[process.argv.length - 1];' +\n\t\t\"import('node:url').then(u => import(u.pathToFileURL(configPath).href))\" +\n\t\t'.then(mod => { const v = mod.default ?? mod; process.stdout.write(JSON.stringify(v)) })' +\n\t\t'.catch(e => { process.stderr.write(String(e)); process.exit(1) })'\n\n\tconst output = await runCommand(\n\t\tprocess.execPath,\n\t\t['--import', 'tsx', '--eval', script, configPath],\n\t\tprojectRoot,\n\t)\n\n\ttry {\n\t\treturn JSON.parse(output)\n\t} catch {\n\t\tthrow new Error(`Failed to parse ${configPath} output as JSON.`)\n\t}\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<string> {\n\treturn await new Promise<string>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tlet stdout = ''\n\t\tlet stderr = ''\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\tstdout += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\tstderr += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim())\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treject(new Error(`Failed to load kora config (exit ${code ?? 'unknown'}): ${stderr.trim()}`))\n\t\t})\n\t})\n}\n\nfunction toConfigObject(mod: unknown): KoraConfigFile {\n\tif (typeof mod !== 'object' || mod === null) {\n\t\tthrow new Error('kora config must export an object.')\n\t}\n\n\tconst value = (mod as Record<string, unknown>).default ?? mod\n\tif (typeof value !== 'object' || value === null || Array.isArray(value)) {\n\t\tthrow new Error('kora config must export an object.')\n\t}\n\n\treturn value as KoraConfigFile\n}\n","import { spawn } from 'node:child_process'\nimport { extname } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\n/**\n * Loads a schema definition from a TS/JS module.\n */\nexport async function loadSchemaDefinition(\n\tschemaPath: string,\n\tprojectRoot: string,\n): Promise<SchemaDefinition> {\n\tconst ext = extname(schemaPath)\n\tconst moduleValue =\n\t\text === '.ts' || ext === '.mts' || ext === '.cts'\n\t\t\t? await loadTypeScriptModule(schemaPath, projectRoot)\n\t\t\t: await import(`${pathToFileURL(schemaPath).href}?t=${Date.now()}-${Math.random()}`)\n\n\treturn extractSchema(moduleValue)\n}\n\nfunction extractSchema(value: unknown): SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) {\n\t\tthrow new Error('Schema module must export an object.')\n\t}\n\n\tconst moduleRecord = value as Record<string, unknown>\n\tconst candidate = moduleRecord.default ?? moduleRecord\n\n\tif (!isSchemaDefinition(candidate)) {\n\t\tthrow new Error('Schema module must export a valid SchemaDefinition as default export.')\n\t}\n\n\treturn candidate\n}\n\nfunction isSchemaDefinition(value: unknown): value is SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst object = value as Record<string, unknown>\n\treturn (\n\t\ttypeof object.version === 'number' &&\n\t\ttypeof object.collections === 'object' &&\n\t\tobject.collections !== null &&\n\t\ttypeof object.relations === 'object' &&\n\t\tobject.relations !== null\n\t)\n}\n\nasync function loadTypeScriptModule(schemaPath: string, projectRoot: string): Promise<unknown> {\n\tif (!(await hasTsxInstalled(projectRoot))) {\n\t\tthrow new Error(\n\t\t\t`Schema file is TypeScript (${schemaPath}) but local \"tsx\" was not found. Install tsx in the project.`,\n\t\t)\n\t}\n\n\tconst script =\n\t\t'const modulePath = process.argv[process.argv.length - 1];' +\n\t\t\"import('node:url').then(u => import(u.pathToFileURL(modulePath).href))\" +\n\t\t'.then(mod => { const v = mod.default ?? mod; process.stdout.write(JSON.stringify(v)) })' +\n\t\t'.catch(e => { process.stderr.write(String(e)); process.exit(1) })'\n\n\tconst output = await runCommand(\n\t\tprocess.execPath,\n\t\t['--import', 'tsx', '--eval', script, schemaPath],\n\t\tprojectRoot,\n\t)\n\n\ttry {\n\t\treturn JSON.parse(output)\n\t} catch {\n\t\tthrow new Error(`Failed to parse schema module output for ${schemaPath}`)\n\t}\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<string> {\n\treturn await new Promise<string>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tlet stdout = ''\n\t\tlet stderr = ''\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\tstdout += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\tstderr += chunk.toString('utf-8')\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim())\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treject(\n\t\t\t\tnew Error(`Failed to load TypeScript schema (exit ${code ?? 'unknown'}): ${stderr.trim()}`),\n\t\t\t)\n\t\t})\n\t})\n}\n","import { access } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { resolve } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { DevServerError, InvalidProjectError } from '../../errors'\nimport {\n\tfindProjectRoot,\n\tfindSchemaFile,\n\thasTsxInstalled,\n\tresolveProjectBinaryEntryPoint,\n} from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { loadKoraConfig } from './kora-config'\nimport type { KoraConfigFile } from './kora-config'\nimport { ProcessManager } from './process-manager'\nimport { SchemaWatcher } from './schema-watcher'\n\ninterface ManagedSyncStoreConfig {\n\ttype: 'memory' | 'sqlite' | 'postgres'\n\tfilename?: string\n\tconnectionString?: string\n}\n\n/**\n * The `dev` command — starts the Kora development environment.\n */\nexport const devCommand = defineCommand({\n\tmeta: {\n\t\tname: 'dev',\n\t\tdescription: 'Start the Kora development environment',\n\t},\n\targs: {\n\t\tport: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Vite dev server port',\n\t\t},\n\t\t'sync-port': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Kora sync server port',\n\t\t},\n\t\t'no-sync': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable sync server startup',\n\t\t\tdefault: false,\n\t\t},\n\t\t'no-watch': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable schema file watching',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst config = await loadKoraConfig(projectRoot)\n\t\tconst vitePort = typeof args.port === 'string' ? args.port : String(config?.dev?.port ?? 5173)\n\t\tconst syncPortFromConfig =\n\t\t\ttypeof config?.dev?.sync === 'object' && typeof config.dev.sync.port === 'number'\n\t\t\t\t? config.dev.sync.port\n\t\t\t\t: 3001\n\t\tconst syncPort =\n\t\t\ttypeof args['sync-port'] === 'string' ? args['sync-port'] : String(syncPortFromConfig)\n\n\t\tconst configSyncEnabled =\n\t\t\tconfig?.dev?.sync === undefined ||\n\t\t\tconfig.dev.sync === true ||\n\t\t\t(typeof config.dev.sync === 'object' && config.dev.sync.enabled !== false)\n\n\t\tconst configWatchEnabled =\n\t\t\tconfig?.dev?.watch === undefined ||\n\t\t\tconfig.dev.watch === true ||\n\t\t\t(typeof config.dev.watch === 'object' && config.dev.watch.enabled !== false)\n\n\t\tconst watchDebounceMs =\n\t\t\ttypeof config?.dev?.watch === 'object' && typeof config.dev.watch.debounceMs === 'number'\n\t\t\t\t? config.dev.watch.debounceMs\n\t\t\t\t: 300\n\n\t\tconst viteEntryPoint = await resolveProjectBinaryEntryPoint(projectRoot, 'vite', 'vite')\n\t\tif (!viteEntryPoint) {\n\t\t\tthrow new DevServerError('vite', join(projectRoot, 'node_modules', '.bin', 'vite'))\n\t\t}\n\n\t\tconst syncServerFile = await findSyncServerFile(projectRoot)\n\t\tlet managedSyncStore = normalizeManagedSyncStore(config, projectRoot)\n\t\tconst postgresEnvRequested = isPostgresEnvRequested(config)\n\t\tconst syncAllowed = args['no-sync'] !== true && configSyncEnabled\n\t\tlet shouldStartSync = syncAllowed && (syncServerFile !== null || managedSyncStore !== null)\n\n\t\tlet hasTsx = false\n\t\tif (shouldStartSync && syncServerFile !== null) {\n\t\t\thasTsx = await hasTsxInstalled(projectRoot)\n\t\t\tif (!hasTsx) {\n\t\t\t\tlogger.warn('Sync server detected, but \"tsx\" is not installed. Skipping sync.')\n\t\t\t}\n\t\t}\n\n\t\tif (shouldStartSync && syncServerFile === null && managedSyncStore) {\n\t\t\tconst hasServerPackage = await fileExists(\n\t\t\t\tjoin(projectRoot, 'node_modules', '@korajs', 'server', 'package.json'),\n\t\t\t)\n\t\t\tif (!hasServerPackage) {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'Managed sync is configured, but @korajs/server is not installed. Install it or add server.ts.',\n\t\t\t\t)\n\t\t\t\tmanagedSyncStore = null\n\t\t\t\tshouldStartSync = syncAllowed && (syncServerFile !== null || managedSyncStore !== null)\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tsyncAllowed &&\n\t\t\tsyncServerFile === null &&\n\t\t\tmanagedSyncStore === null &&\n\t\t\tpostgresEnvRequested\n\t\t) {\n\t\t\tlogger.warn(\n\t\t\t\t'Managed postgres sync requested but no connection string found. Set dev.sync.store.connectionString or DATABASE_URL.',\n\t\t\t)\n\t\t}\n\n\t\tlet configuredSchemaPath: string | null = null\n\t\tif (typeof config?.schema === 'string') {\n\t\t\tconst candidate = resolve(projectRoot, config.schema)\n\t\t\tif (await fileExists(candidate)) {\n\t\t\t\tconfiguredSchemaPath = candidate\n\t\t\t} else {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`Configured schema file not found: ${candidate}. Falling back to auto-detection.`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst schemaPath = configuredSchemaPath ?? (await findSchemaFile(projectRoot))\n\t\tconst watchEnabled = args['no-watch'] !== true && configWatchEnabled && schemaPath !== null\n\n\t\tconst processManager = new ProcessManager()\n\t\tlet schemaWatcher: SchemaWatcher | null = null\n\t\tlet shuttingDown = false\n\t\tlet resolveFinished: (() => void) | undefined\n\t\tconst finished = new Promise<void>((resolve) => {\n\t\t\tresolveFinished = resolve\n\t\t})\n\n\t\tconst onManagedProcessExit = () => {\n\t\t\tif (!processManager.hasRunning() && !shuttingDown) {\n\t\t\t\tresolveFinished?.()\n\t\t\t}\n\t\t}\n\n\t\tconst shutdown = async () => {\n\t\t\tif (shuttingDown) return\n\t\t\tshuttingDown = true\n\t\t\tschemaWatcher?.stop()\n\t\t\tawait processManager.shutdownAll()\n\t\t\tresolveFinished?.()\n\t\t}\n\n\t\tconst onSigInt = () => {\n\t\t\tvoid shutdown()\n\t\t}\n\t\tconst onSigTerm = () => {\n\t\t\tvoid shutdown()\n\t\t}\n\n\t\tprocess.on('SIGINT', onSigInt)\n\t\tprocess.on('SIGTERM', onSigTerm)\n\n\t\tlogger.banner()\n\t\tlogger.info('Starting development environment:')\n\t\tlogger.blank()\n\t\tlogger.step(` Vite dev server on port ${vitePort}`)\n\t\tif (shouldStartSync && hasTsx && syncServerFile) {\n\t\t\tlogger.step(` Sync server on port ${syncPort}`)\n\t\t} else if (shouldStartSync && syncServerFile === null && managedSyncStore !== null) {\n\t\t\tlogger.step(` Managed sync server on port ${syncPort} (${managedSyncStore.type})`)\n\t\t} else if (syncAllowed && syncServerFile === null) {\n\t\t\tlogger.step(' Sync server configured but no server.ts/server.js or managed store found')\n\t\t} else if (!syncAllowed) {\n\t\t\tlogger.step(' Sync server disabled via --no-sync')\n\t\t}\n\n\t\tif (watchEnabled && schemaPath) {\n\t\t\tlogger.step(` Schema watcher enabled (${schemaPath})`)\n\t\t} else if (args['no-watch'] === true) {\n\t\t\tlogger.step(' Schema watcher disabled via --no-watch')\n\t\t} else {\n\t\t\tlogger.step(' Schema watcher disabled (schema.ts not found)')\n\t\t}\n\t\tlogger.blank()\n\n\t\tlogger.step(' Kora DevTools overlay: Ctrl+Shift+K (Cmd+Shift+K on macOS) when devtools: true')\n\n\t\tprocessManager.spawn({\n\t\t\tlabel: 'vite',\n\t\t\tcommand: process.execPath,\n\t\t\targs: [viteEntryPoint, '--port', String(vitePort)],\n\t\t\tcwd: projectRoot,\n\t\t\tenv: {\n\t\t\t\tKORA_DEV: '1',\n\t\t\t},\n\t\t\tonExit: onManagedProcessExit,\n\t\t})\n\n\t\tif (shouldStartSync && hasTsx && syncServerFile) {\n\t\t\tprocessManager.spawn({\n\t\t\t\tlabel: 'sync',\n\t\t\t\tcommand: process.execPath,\n\t\t\t\targs: ['--import', 'tsx', syncServerFile],\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tenv: {\n\t\t\t\t\tPORT: String(syncPort),\n\t\t\t\t\tKORA_SYNC_PORT: String(syncPort),\n\t\t\t\t},\n\t\t\t\tonExit: onManagedProcessExit,\n\t\t\t})\n\t\t}\n\n\t\tif (shouldStartSync && syncServerFile === null && managedSyncStore !== null) {\n\t\t\tprocessManager.spawn({\n\t\t\t\tlabel: 'sync',\n\t\t\t\tcommand: process.execPath,\n\t\t\t\targs: ['--input-type=module', '--eval', MANAGED_SYNC_BOOTSTRAP_SCRIPT],\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tenv: {\n\t\t\t\t\tKORA_DEV_SYNC_CONFIG: JSON.stringify({\n\t\t\t\t\t\tport: Number(syncPort),\n\t\t\t\t\t\tstore: managedSyncStore,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tonExit: onManagedProcessExit,\n\t\t\t})\n\t\t}\n\n\t\tif (watchEnabled && schemaPath) {\n\t\t\tschemaWatcher = new SchemaWatcher({\n\t\t\t\tschemaPath,\n\t\t\t\tprojectRoot,\n\t\t\t\tdebounceMs: watchDebounceMs,\n\t\t\t\tonRegenerate: () => {\n\t\t\t\t\tlogger.success('Regenerated types from schema changes')\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tlogger.error(`Schema watcher error: ${error.message}`)\n\t\t\t\t},\n\t\t\t})\n\t\t\tschemaWatcher.start()\n\t\t}\n\n\t\tawait finished\n\t\tprocess.off('SIGINT', onSigInt)\n\t\tprocess.off('SIGTERM', onSigTerm)\n\t},\n})\n\nasync function findSyncServerFile(projectRoot: string): Promise<string | null> {\n\tconst candidates = [join(projectRoot, 'server.ts'), join(projectRoot, 'server.js')]\n\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tawait access(candidate)\n\t\t\treturn candidate\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\n\treturn null\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\nfunction normalizeManagedSyncStore(\n\tconfig: KoraConfigFile | null,\n\tprojectRoot: string,\n): ManagedSyncStoreConfig | null {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return null\n\n\tconst store = sync.store\n\tif (store === undefined) return { type: 'memory' }\n\n\tif (store === 'memory') return { type: 'memory' }\n\tif (store === 'sqlite') return { type: 'sqlite', filename: join(projectRoot, 'kora-sync.db') }\n\tif (store === 'postgres') {\n\t\tconst connectionString = process.env.DATABASE_URL\n\t\tif (!connectionString) return null\n\t\treturn { type: 'postgres', connectionString }\n\t}\n\n\tif (typeof store === 'object' && store !== null) {\n\t\tif (store.type === 'memory') return { type: 'memory' }\n\t\tif (store.type === 'sqlite') {\n\t\t\tconst filename =\n\t\t\t\ttypeof store.filename === 'string' && store.filename.length > 0\n\t\t\t\t\t? resolve(projectRoot, store.filename)\n\t\t\t\t\t: join(projectRoot, 'kora-sync.db')\n\t\t\treturn { type: 'sqlite', filename }\n\t\t}\n\t\tif (store.type === 'postgres' && typeof store.connectionString === 'string') {\n\t\t\treturn { type: 'postgres', connectionString: store.connectionString }\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction isPostgresEnvRequested(config: KoraConfigFile | null): boolean {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return false\n\tif (sync.store === 'postgres') return true\n\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'postgres')\n\t\treturn true\n\treturn false\n}\n\nconst MANAGED_SYNC_BOOTSTRAP_SCRIPT = `\nconst config = JSON.parse(process.env.KORA_DEV_SYNC_CONFIG ?? '{}');\nconst {\n createKoraServer,\n MemoryServerStore,\n createSqliteServerStore,\n createPostgresServerStore,\n} = await import('@korajs/server');\nconst storeConfig = config.store ?? { type: 'memory' };\nlet store;\nif (storeConfig.type === 'memory') {\n store = new MemoryServerStore();\n} else if (storeConfig.type === 'sqlite') {\n const filename = typeof storeConfig.filename === 'string' && storeConfig.filename.length > 0\n ? storeConfig.filename\n : './kora-sync.db';\n store = createSqliteServerStore({ filename });\n} else if (storeConfig.type === 'postgres') {\n if (typeof storeConfig.connectionString !== 'string' || storeConfig.connectionString.length === 0) {\n throw new Error('Managed postgres sync requires a connectionString');\n }\n store = await createPostgresServerStore({\n connectionString: storeConfig.connectionString,\n });\n} else {\n throw new Error('Unsupported managed sync store type: ' + String(storeConfig.type));\n}\nconst server = createKoraServer({ store, port: Number(config.port ?? 3001) });\nconst shutdown = async () => {\n try {\n await server.stop();\n } catch {\n }\n process.exit(0);\n};\nprocess.on('SIGINT', () => {\n void shutdown();\n});\nprocess.on('SIGTERM', () => {\n void shutdown();\n});\nawait server.start();\nprocess.stdout.write('Managed sync server running on ws://localhost:' + String(config.port ?? 3001) + '\\\\n');\nawait new Promise(() => {});\n`\n","import { spawn as spawnChild } from 'node:child_process'\nimport type { ChildProcess, SpawnOptions } from 'node:child_process'\n\nexport interface ManagedProcessConfig {\n\tlabel: string\n\tcommand: string\n\targs: string[]\n\tcwd: string\n\tenv?: Record<string, string>\n\tonExit?: (code: number | null, signal: NodeJS.Signals | null) => void\n}\n\ninterface RunningProcess {\n\tchild: ChildProcess\n\texitPromise: Promise<void>\n\tstdoutBuffer: string\n\tstderrBuffer: string\n}\n\n/**\n * Manages long-running child processes for the dev command.\n */\nexport class ProcessManager {\n\tprivate readonly processes = new Map<string, RunningProcess>()\n\n\tspawn(config: ManagedProcessConfig): void {\n\t\tconst options: SpawnOptions = {\n\t\t\tcwd: config.cwd,\n\t\t\tenv: { ...process.env, ...config.env },\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t}\n\n\t\tconst child = spawnChild(config.command, config.args, options)\n\t\tlet resolveExit: (() => void) | undefined\n\n\t\tconst runningProcess: RunningProcess = {\n\t\t\tchild,\n\t\t\texitPromise: new Promise<void>((resolve) => {\n\t\t\t\tresolveExit = resolve\n\t\t\t}),\n\t\t\tstdoutBuffer: '',\n\t\t\tstderrBuffer: '',\n\t\t}\n\n\t\tthis.processes.set(config.label, runningProcess)\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\trunningProcess.stdoutBuffer = this.writeChunk(\n\t\t\t\tconfig.label,\n\t\t\t\trunningProcess.stdoutBuffer,\n\t\t\t\tchunk,\n\t\t\t\tfalse,\n\t\t\t)\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\trunningProcess.stderrBuffer = this.writeChunk(\n\t\t\t\tconfig.label,\n\t\t\t\trunningProcess.stderrBuffer,\n\t\t\t\tchunk,\n\t\t\t\ttrue,\n\t\t\t)\n\t\t})\n\n\t\tchild.on('exit', (code, signal) => {\n\t\t\tthis.flushBuffer(config.label, runningProcess.stdoutBuffer, false)\n\t\t\tthis.flushBuffer(config.label, runningProcess.stderrBuffer, true)\n\t\t\tthis.processes.delete(config.label)\n\t\t\tconfig.onExit?.(code, signal)\n\t\t\tresolveExit?.()\n\t\t})\n\t}\n\n\thasRunning(): boolean {\n\t\treturn this.processes.size > 0\n\t}\n\n\tasync shutdownAll(): Promise<void> {\n\t\tconst running = Array.from(this.processes.values())\n\t\tif (running.length === 0) return\n\n\t\tfor (const processEntry of running) {\n\t\t\tprocessEntry.child.kill('SIGTERM')\n\t\t}\n\n\t\tawait Promise.race([Promise.all(running.map((entry) => entry.exitPromise)), delay(5000)])\n\n\t\tconst remaining = Array.from(this.processes.values())\n\t\tif (remaining.length === 0) return\n\n\t\tfor (const processEntry of remaining) {\n\t\t\tprocessEntry.child.kill('SIGKILL')\n\t\t}\n\n\t\tawait Promise.all(remaining.map((entry) => entry.exitPromise))\n\t}\n\n\tprivate writeChunk(label: string, buffer: string, chunk: Buffer, isError: boolean): string {\n\t\tconst combined = `${buffer}${chunk.toString('utf-8')}`\n\t\tconst lines = combined.split(/\\r?\\n/)\n\t\tconst remaining = lines.pop() ?? ''\n\n\t\tfor (const line of lines) {\n\t\t\tthis.writeLine(label, line, isError)\n\t\t}\n\n\t\treturn remaining\n\t}\n\n\tprivate flushBuffer(label: string, buffer: string, isError: boolean): void {\n\t\tif (!buffer) return\n\t\tthis.writeLine(label, buffer, isError)\n\t}\n\n\tprivate writeLine(label: string, line: string, isError: boolean): void {\n\t\tconst stream = isError ? process.stderr : process.stdout\n\t\tstream.write(`[${label}] ${line}\\n`)\n\t}\n}\n\nfunction delay(ms: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms)\n\t})\n}\n","import { spawn } from 'node:child_process'\nimport { watch } from 'node:fs'\nimport type { FSWatcher } from 'node:fs'\nimport { join } from 'node:path'\nimport { hasTsxInstalled } from '../../utils/fs-helpers'\n\nexport interface SchemaWatcherConfig {\n\tschemaPath: string\n\tprojectRoot: string\n\tdebounceMs?: number\n\tonRegenerate?: () => void\n\tonError?: (error: Error) => void\n}\n\n/**\n * Watches a schema file and regenerates types when it changes.\n */\nexport class SchemaWatcher {\n\tprivate readonly debounceMs: number\n\tprivate watcher: FSWatcher | null = null\n\tprivate debounceTimer: NodeJS.Timeout | null = null\n\n\tconstructor(private readonly config: SchemaWatcherConfig) {\n\t\tthis.debounceMs = config.debounceMs ?? 300\n\t}\n\n\tstart(): void {\n\t\tif (this.watcher) return\n\n\t\tthis.watcher = watch(this.config.schemaPath, () => {\n\t\t\tthis.scheduleRegeneration()\n\t\t})\n\n\t\tthis.watcher.on('error', (error) => {\n\t\t\tthis.config.onError?.(toError(error))\n\t\t})\n\t}\n\n\tstop(): void {\n\t\tif (this.debounceTimer) {\n\t\t\tclearTimeout(this.debounceTimer)\n\t\t\tthis.debounceTimer = null\n\t\t}\n\n\t\tthis.watcher?.close()\n\t\tthis.watcher = null\n\t}\n\n\tasync regenerate(): Promise<void> {\n\t\t// Use process.execPath (node) + --import tsx to run kora generate,\n\t\t// avoiding .cmd shim issues on Windows with paths containing spaces.\n\t\tconst koraBinJs = join(\n\t\t\tthis.config.projectRoot,\n\t\t\t'node_modules',\n\t\t\t'@korajs',\n\t\t\t'cli',\n\t\t\t'dist',\n\t\t\t'bin.js',\n\t\t)\n\t\tconst hasTsx = await hasTsxInstalled(this.config.projectRoot)\n\n\t\tconst command = process.execPath\n\t\tconst args = hasTsx\n\t\t\t? ['--import', 'tsx', koraBinJs, 'generate', 'types', '--schema', this.config.schemaPath]\n\t\t\t: [koraBinJs, 'generate', 'types', '--schema', this.config.schemaPath]\n\n\t\tawait spawnCommand(command, args, this.config.projectRoot)\n\t\tthis.config.onRegenerate?.()\n\t}\n\n\tprivate scheduleRegeneration(): void {\n\t\tif (this.debounceTimer) {\n\t\t\tclearTimeout(this.debounceTimer)\n\t\t}\n\n\t\tthis.debounceTimer = setTimeout(() => {\n\t\t\tthis.debounceTimer = null\n\t\t\tvoid this.regenerate().catch((error) => {\n\t\t\t\tthis.config.onError?.(toError(error))\n\t\t\t})\n\t\t}, this.debounceMs)\n\t}\n}\n\nasync function spawnCommand(command: string, args: string[], cwd: string): Promise<void> {\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tenv: process.env,\n\t\t})\n\n\t\tchild.stdout?.on('data', (chunk: Buffer) => {\n\t\t\twritePrefixedLines(chunk, false)\n\t\t})\n\n\t\tchild.stderr?.on('data', (chunk: Buffer) => {\n\t\t\twritePrefixedLines(chunk, true)\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\treject(error)\n\t\t})\n\n\t\tchild.on('exit', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve()\n\t\t\t\treturn\n\t\t\t}\n\t\t\treject(new Error(`Type generation exited with code ${code ?? 'unknown'}.`))\n\t\t})\n\t})\n}\n\nfunction writePrefixedLines(chunk: Buffer, isError: boolean): void {\n\tconst text = chunk.toString('utf-8')\n\tconst lines = text.split(/\\r?\\n/).filter((line) => line.length > 0)\n\tconst stream = isError ? process.stderr : process.stdout\n\n\tfor (const line of lines) {\n\t\tstream.write(`[kora] ${line}\\n`)\n\t}\n}\n\nfunction toError(error: unknown): Error {\n\tif (error instanceof Error) return error\n\treturn new Error(String(error))\n}\n","import { defineCommand } from 'citty'\nimport { InvalidProjectError } from '../../errors'\nimport { findProjectRoot } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { doctorHasFailures, runDoctorChecks } from './doctor-checks'\n\n/**\n * Diagnose common Kora project setup issues (schema, worker, sync, versions).\n */\nexport const doctorCommand = defineCommand({\n\tmeta: {\n\t\tname: 'doctor',\n\t\tdescription: 'Check Kora project setup (schema, worker, sync server, versions)',\n\t},\n\targs: {\n\t\turl: {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Sync server HTTP base URL for status probe (default: from .env or localhost:3001)',\n\t\t},\n\t\t'skip-network': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Skip sync server and schema version network checks',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst syncHttpUrl = typeof args.url === 'string' ? args.url : undefined\n\t\tconst skipNetwork = args['skip-network'] === true\n\n\t\tlogger.banner()\n\t\tlogger.info(`Checking project at ${projectRoot}`)\n\t\tlogger.blank()\n\n\t\tconst results = await runDoctorChecks({\n\t\t\tprojectRoot,\n\t\t\tsyncHttpUrl,\n\t\t\tskipNetwork,\n\t\t})\n\n\t\tfor (const check of results) {\n\t\t\tconst prefix =\n\t\t\t\tcheck.status === 'pass'\n\t\t\t\t\t? 'success'\n\t\t\t\t\t: check.status === 'warn'\n\t\t\t\t\t\t? 'warn'\n\t\t\t\t\t\t: check.status === 'fail'\n\t\t\t\t\t\t\t? 'error'\n\t\t\t\t\t\t\t: 'step'\n\t\t\tlogger[prefix](`${check.title}: ${check.message}`)\n\t\t\tif (check.fix && check.status !== 'pass' && check.status !== 'skip') {\n\t\t\t\tlogger.step(` Fix: ${check.fix}`)\n\t\t\t}\n\t\t}\n\n\t\tlogger.blank()\n\t\tif (doctorHasFailures(results)) {\n\t\t\tlogger.error('Doctor found blocking issues.')\n\t\t\tprocess.exitCode = 1\n\t\t\treturn\n\t\t}\n\n\t\tconst warnings = results.filter((r) => r.status === 'warn').length\n\t\tif (warnings > 0) {\n\t\t\tlogger.warn(`Doctor finished with ${warnings} warning(s).`)\n\t\t} else {\n\t\t\tlogger.success('All checks passed.')\n\t\t}\n\t},\n})\n","import { access, readFile } from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { findSchemaFile } from '../../utils/fs-helpers'\nimport { loadKoraConfig } from '../dev/kora-config'\nimport { loadSchemaDefinition } from '../migrate/schema-loader'\n\nexport type DoctorCheckStatus = 'pass' | 'warn' | 'fail' | 'skip'\n\nexport interface DoctorCheckResult {\n\tid: string\n\ttitle: string\n\tstatus: DoctorCheckStatus\n\tmessage: string\n\tfix?: string\n}\n\nexport interface DoctorRunOptions {\n\tprojectRoot: string\n\t/** HTTP base URL for sync status probe (e.g. http://localhost:3001) */\n\tsyncHttpUrl?: string\n\t/** Skip network checks */\n\tskipNetwork?: boolean\n}\n\nconst STATUS_ENDPOINT = '/__kora/status'\n\n/**\n * Run all static and optional network diagnostics for a Kora project.\n */\nexport async function runDoctorChecks(options: DoctorRunOptions): Promise<DoctorCheckResult[]> {\n\tconst { projectRoot } = options\n\tconst results: DoctorCheckResult[] = []\n\n\tresults.push({\n\t\tid: 'project-root',\n\t\ttitle: 'Project root',\n\t\tstatus: 'pass',\n\t\tmessage: projectRoot,\n\t})\n\n\tconst config = await loadKoraConfig(projectRoot)\n\tif (!config) {\n\t\tresults.push({\n\t\t\tid: 'kora-config',\n\t\t\ttitle: 'kora.config',\n\t\t\tstatus: 'warn',\n\t\t\tmessage: 'No kora.config.* file found.',\n\t\t\tfix: 'Add kora.config.ts with schema path and dev settings (see create-kora-app templates).',\n\t\t})\n\t} else {\n\t\tresults.push({\n\t\t\tid: 'kora-config',\n\t\t\ttitle: 'kora.config',\n\t\t\tstatus: 'pass',\n\t\t\tmessage: 'Configuration file loaded.',\n\t\t})\n\t}\n\n\tconst schemaPath = await resolveSchemaPath(projectRoot, config?.schema)\n\tif (!schemaPath) {\n\t\tresults.push({\n\t\t\tid: 'schema',\n\t\t\ttitle: 'Schema',\n\t\t\tstatus: 'fail',\n\t\t\tmessage: 'Could not find schema.ts in src/ or project root.',\n\t\t\tfix: 'Add src/schema.ts or set schema in kora.config.ts.',\n\t\t})\n\t} else {\n\t\ttry {\n\t\t\tconst schema = await loadSchemaDefinition(schemaPath, projectRoot)\n\t\t\tresults.push({\n\t\t\t\tid: 'schema',\n\t\t\t\ttitle: 'Schema',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Loaded schema v${schema.version} (${Object.keys(schema.collections).length} collection(s)).`,\n\t\t\t})\n\n\t\t\tconst workerCheck = await checkWorkerFile(projectRoot)\n\t\t\tresults.push(workerCheck)\n\n\t\t\tconst depsCheck = await checkDependencies(projectRoot)\n\t\t\tresults.push(depsCheck)\n\n\t\t\tresults.push(opfsBrowserNote())\n\n\t\t\tif (!options.skipNetwork) {\n\t\t\t\tconst syncUrl = options.syncHttpUrl ?? (await resolveSyncHttpUrl(projectRoot, config))\n\t\t\t\tconst syncChecks = await checkSyncServer(syncUrl, schema)\n\t\t\t\tresults.push(...syncChecks)\n\t\t\t} else {\n\t\t\t\tresults.push({\n\t\t\t\t\tid: 'sync-server',\n\t\t\t\t\ttitle: 'Sync server',\n\t\t\t\t\tstatus: 'skip',\n\t\t\t\t\tmessage: 'Network checks skipped.',\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\t\tresults.push({\n\t\t\t\tid: 'schema',\n\t\t\t\ttitle: 'Schema',\n\t\t\t\tstatus: 'fail',\n\t\t\t\tmessage: `Failed to load schema: ${message}`,\n\t\t\t\tfix: 'Ensure the schema exports defineSchema() as default and TypeScript can be evaluated (install tsx).',\n\t\t\t})\n\t\t}\n\t}\n\n\treturn results\n}\n\nasync function resolveSchemaPath(\n\tprojectRoot: string,\n\tconfigSchema?: string,\n): Promise<string | null> {\n\tif (typeof configSchema === 'string') {\n\t\tconst resolved = resolve(projectRoot, configSchema)\n\t\ttry {\n\t\t\tawait access(resolved)\n\t\t\treturn resolved\n\t\t} catch {\n\t\t\t// fall through to search\n\t\t}\n\t}\n\treturn findSchemaFile(projectRoot)\n}\n\nasync function checkWorkerFile(projectRoot: string): Promise<DoctorCheckResult> {\n\tconst candidates = [\n\t\tjoin(projectRoot, 'src', 'kora-worker.ts'),\n\t\tjoin(projectRoot, 'src', 'kora-worker.js'),\n\t]\n\n\tfor (const path of candidates) {\n\t\ttry {\n\t\t\tawait access(path)\n\t\t\treturn {\n\t\t\t\tid: 'worker',\n\t\t\t\ttitle: 'SQLite WASM worker',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Found ${path.replace(projectRoot, '.')}.`,\n\t\t\t}\n\t\t} catch {\n\t\t\t// try next\n\t\t}\n\t}\n\n\treturn {\n\t\tid: 'worker',\n\t\ttitle: 'SQLite WASM worker',\n\t\tstatus: 'warn',\n\t\tmessage: 'No src/kora-worker.ts found.',\n\t\tfix: 'Add kora-worker.ts and pass store.workerUrl from Vite (?worker&url) in createApp().',\n\t}\n}\n\nasync function checkDependencies(projectRoot: string): Promise<DoctorCheckResult> {\n\ttry {\n\t\tconst raw = await readFile(join(projectRoot, 'package.json'), 'utf-8')\n\t\tconst pkg = JSON.parse(raw) as {\n\t\t\tdependencies?: Record<string, string>\n\t\t\tdevDependencies?: Record<string, string>\n\t\t}\n\t\tconst deps = { ...pkg.dependencies, ...pkg.devDependencies }\n\t\tconst hasKora = Boolean(deps.korajs || deps.kora)\n\t\tconst hasStore = Boolean(deps['@korajs/store'])\n\t\tif (hasKora || hasStore) {\n\t\t\treturn {\n\t\t\t\tid: 'dependencies',\n\t\t\t\ttitle: 'Dependencies',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: hasKora\n\t\t\t\t\t? 'korajs is listed in package.json.'\n\t\t\t\t\t: '@korajs/store is listed in package.json.',\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tid: 'dependencies',\n\t\t\ttitle: 'Dependencies',\n\t\t\tstatus: 'fail',\n\t\t\tmessage: 'No korajs or @korajs/store dependency found.',\n\t\t\tfix: 'Run pnpm add korajs @korajs/react (or your package manager equivalent).',\n\t\t}\n\t} catch {\n\t\treturn {\n\t\t\tid: 'dependencies',\n\t\t\ttitle: 'Dependencies',\n\t\t\tstatus: 'fail',\n\t\t\tmessage: 'Could not read package.json.',\n\t\t\tfix: 'Run this command from a Kora app directory with a valid package.json.',\n\t\t}\n\t}\n}\n\nfunction opfsBrowserNote(): DoctorCheckResult {\n\treturn {\n\t\tid: 'opfs',\n\t\ttitle: 'OPFS persistence',\n\t\tstatus: 'skip',\n\t\tmessage:\n\t\t\t'OPFS availability is checked in the browser at runtime. Open the app and confirm no IndexedDB fallback warning in the console.',\n\t\tfix: 'Use a Chromium-based browser with storage access; avoid private mode if persistence fails.',\n\t}\n}\n\nasync function resolveSyncHttpUrl(\n\tprojectRoot: string,\n\tconfig: Awaited<ReturnType<typeof loadKoraConfig>>,\n): Promise<string> {\n\tconst envUrl = await readEnvSyncUrl(projectRoot)\n\tif (envUrl) {\n\t\treturn toSyncStatusHttpBase(envUrl)\n\t}\n\n\tconst syncPort =\n\t\ttypeof config?.dev?.sync === 'object' && typeof config.dev.sync.port === 'number'\n\t\t\t? config.dev.sync.port\n\t\t\t: 3001\n\n\treturn `http://localhost:${syncPort}`\n}\n\nasync function readEnvSyncUrl(projectRoot: string): Promise<string | null> {\n\tfor (const file of ['.env', '.env.local']) {\n\t\tconst path = join(projectRoot, file)\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf-8')\n\t\t\tfor (const line of content.split('\\n')) {\n\t\t\t\tconst trimmed = line.trim()\n\t\t\t\tif (!trimmed || trimmed.startsWith('#')) continue\n\t\t\t\tconst match = trimmed.match(/^VITE_SYNC_URL=(.+)$/)\n\t\t\t\tif (match?.[1]) {\n\t\t\t\t\treturn match[1].trim().replace(/^[\"']|[\"']$/g, '')\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// continue\n\t\t}\n\t}\n\treturn null\n}\n\n/** Converts a WebSocket sync URL to an HTTP base for {@link STATUS_ENDPOINT}. */\nexport function toSyncStatusHttpBase(url: string): string {\n\ttry {\n\t\tconst parsed = new URL(url)\n\t\tif (parsed.protocol === 'ws:') {\n\t\t\tparsed.protocol = 'http:'\n\t\t} else if (parsed.protocol === 'wss:') {\n\t\t\tparsed.protocol = 'https:'\n\t\t}\n\t\tparsed.pathname = ''\n\t\tparsed.search = ''\n\t\tparsed.hash = ''\n\t\treturn parsed.toString().replace(/\\/$/, '')\n\t} catch {\n\t\treturn 'http://localhost:3001'\n\t}\n}\n\ninterface ServerStatusResponse {\n\tschemaVersion: number\n\trunning: boolean\n\tversion: string\n}\n\nasync function checkSyncServer(\n\thttpBase: string,\n\tschema: SchemaDefinition,\n): Promise<DoctorCheckResult[]> {\n\tconst statusUrl = `${httpBase.replace(/\\/$/, '')}${STATUS_ENDPOINT}`\n\n\ttry {\n\t\tconst response = await fetch(statusUrl, {\n\t\t\tsignal: AbortSignal.timeout(5000),\n\t\t})\n\t\tif (!response.ok) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: 'sync-server',\n\t\t\t\t\ttitle: 'Sync server',\n\t\t\t\t\tstatus: 'fail',\n\t\t\t\t\tmessage: `GET ${statusUrl} returned ${response.status}.`,\n\t\t\t\t\tfix: 'Start the sync server with `kora dev` or `pnpm run dev` in a sync template.',\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\n\t\tconst body = (await response.json()) as ServerStatusResponse\n\t\tconst results: DoctorCheckResult[] = [\n\t\t\t{\n\t\t\t\tid: 'sync-server',\n\t\t\t\ttitle: 'Sync server',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Reachable at ${statusUrl} (server v${body.version ?? 'unknown'}).`,\n\t\t\t},\n\t\t]\n\n\t\tif (typeof body.schemaVersion === 'number' && body.schemaVersion !== schema.version) {\n\t\t\tresults.push({\n\t\t\t\tid: 'schema-version',\n\t\t\t\ttitle: 'Schema version',\n\t\t\t\tstatus: 'warn',\n\t\t\t\tmessage: `Client schema v${schema.version} differs from server schema v${body.schemaVersion}.`,\n\t\t\t\tfix: 'Run migrations on the server and client, or align schema.version before syncing.',\n\t\t\t})\n\t\t} else {\n\t\t\tresults.push({\n\t\t\t\tid: 'schema-version',\n\t\t\t\ttitle: 'Schema version',\n\t\t\t\tstatus: 'pass',\n\t\t\t\tmessage: `Client and server both use schema v${schema.version}.`,\n\t\t\t})\n\t\t}\n\n\t\treturn results\n\t} catch (error) {\n\t\tconst detail = error instanceof Error ? error.message : String(error)\n\t\treturn [\n\t\t\t{\n\t\t\t\tid: 'sync-server',\n\t\t\t\ttitle: 'Sync server',\n\t\t\t\tstatus: 'warn',\n\t\t\t\tmessage: `Could not reach ${statusUrl}: ${detail}`,\n\t\t\t\tfix: 'Start the sync server, or pass --skip-network for local-only checks.',\n\t\t\t},\n\t\t]\n\t}\n}\n\n/**\n * True when any check failed (doctor should exit non-zero).\n */\nexport function doctorHasFailures(results: DoctorCheckResult[]): boolean {\n\treturn results.some((r) => r.status === 'fail')\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport { dirname, resolve } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError, SchemaNotFoundError } from '../../errors'\nimport { findProjectRoot, findSchemaFile } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { loadSchemaDefinition } from '../migrate/schema-loader'\nimport { generateCollectionHooks } from './hook-generator'\nimport { generateTypes } from './type-generator'\n\n/**\n * The `generate` command with `types` subcommand.\n * Reads a schema file and generates TypeScript interfaces.\n */\nexport const generateCommand = defineCommand({\n\tmeta: {\n\t\tname: 'generate',\n\t\tdescription: 'Generate code from your Kora schema',\n\t},\n\tsubCommands: {\n\t\ttypes: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'types',\n\t\t\t\tdescription: 'Generate TypeScript types from your schema',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tschema: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Path to schema file',\n\t\t\t\t},\n\t\t\t\toutput: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Output file path',\n\t\t\t\t\tdefault: 'kora/generated/types.ts',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\n\t\t\t\t// Find project root\n\t\t\t\tconst projectRoot = await findProjectRoot()\n\t\t\t\tif (!projectRoot) {\n\t\t\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t\t\t}\n\n\t\t\t\t// Find schema file\n\t\t\t\tlet schemaPath: string\n\t\t\t\tif (args.schema && typeof args.schema === 'string') {\n\t\t\t\t\tschemaPath = resolve(args.schema)\n\t\t\t\t} else {\n\t\t\t\t\tconst found = await findSchemaFile(projectRoot)\n\t\t\t\t\tif (!found) {\n\t\t\t\t\t\tthrow new SchemaNotFoundError([\n\t\t\t\t\t\t\t'src/schema.ts',\n\t\t\t\t\t\t\t'schema.ts',\n\t\t\t\t\t\t\t'src/schema.js',\n\t\t\t\t\t\t\t'schema.js',\n\t\t\t\t\t\t])\n\t\t\t\t\t}\n\t\t\t\t\tschemaPath = found\n\t\t\t\t}\n\n\t\t\t\tlogger.step(`Reading schema from ${schemaPath}...`)\n\n\t\t\t\t// Dynamic import the schema file\n\t\t\t\tconst schemaModule: unknown = await import(schemaPath)\n\t\t\t\tconst schema = extractSchema(schemaModule)\n\n\t\t\t\tif (!schema) {\n\t\t\t\t\tlogger.error('Schema file must export a SchemaDefinition as the default export.')\n\t\t\t\t\tprocess.exitCode = 1\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Generate types\n\t\t\t\tconst output = generateTypes(schema)\n\t\t\t\tconst outputFile = typeof args.output === 'string' ? args.output : 'kora/generated/types.ts'\n\t\t\t\tconst outputPath = resolve(projectRoot, outputFile)\n\n\t\t\t\tawait mkdir(dirname(outputPath), { recursive: true })\n\t\t\t\tawait writeFile(outputPath, output, 'utf-8')\n\n\t\t\t\tlogger.success(`Generated types at ${outputPath}`)\n\t\t\t},\n\t\t}),\n\t\thooks: defineCommand({\n\t\t\tmeta: {\n\t\t\t\tname: 'hooks',\n\t\t\t\tdescription: 'Generate per-collection React hook stubs',\n\t\t\t},\n\t\t\targs: {\n\t\t\t\tschema: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Path to schema file',\n\t\t\t\t},\n\t\t\t\toutput: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Output directory for hooks',\n\t\t\t\t\tdefault: 'kora/generated/hooks',\n\t\t\t\t},\n\t\t\t\ttypes: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdescription: 'Relative import path to generated types from hook files',\n\t\t\t\t\tdefault: '../types',\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync run({ args }) {\n\t\t\t\tconst logger = createLogger()\n\t\t\t\tconst projectRoot = await findProjectRoot()\n\t\t\t\tif (!projectRoot) {\n\t\t\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t\t\t}\n\n\t\t\t\tlet schemaPath: string\n\t\t\t\tif (args.schema && typeof args.schema === 'string') {\n\t\t\t\t\tschemaPath = resolve(projectRoot, args.schema)\n\t\t\t\t} else {\n\t\t\t\t\tconst found = await findSchemaFile(projectRoot)\n\t\t\t\t\tif (!found) {\n\t\t\t\t\t\tthrow new SchemaNotFoundError([\n\t\t\t\t\t\t\t'src/schema.ts',\n\t\t\t\t\t\t\t'schema.ts',\n\t\t\t\t\t\t\t'src/schema.js',\n\t\t\t\t\t\t\t'schema.js',\n\t\t\t\t\t\t])\n\t\t\t\t\t}\n\t\t\t\t\tschemaPath = found\n\t\t\t\t}\n\n\t\t\t\tconst schema = await loadSchemaDefinition(schemaPath, projectRoot)\n\t\t\t\tconst outputDir =\n\t\t\t\t\ttypeof args.output === 'string'\n\t\t\t\t\t\t? resolve(projectRoot, args.output)\n\t\t\t\t\t\t: resolve(projectRoot, 'kora/generated/hooks')\n\n\t\t\t\tconst files = generateCollectionHooks(schema)\n\t\t\t\tfor (const [name, content] of files) {\n\t\t\t\t\tconst adjusted =\n\t\t\t\t\t\ttypeof args.types === 'string' && args.types !== '../types'\n\t\t\t\t\t\t\t? content.replace(\"from '../types'\", `from '${args.types}'`)\n\t\t\t\t\t\t\t: content\n\t\t\t\t\tconst filePath = resolve(outputDir, name)\n\t\t\t\t\tawait mkdir(dirname(filePath), { recursive: true })\n\t\t\t\t\tawait writeFile(filePath, adjusted, 'utf-8')\n\t\t\t\t}\n\n\t\t\t\tlogger.success(`Generated ${String(files.size)} hook file(s) at ${outputDir}`)\n\t\t\t\tlogger.step('Run `kora generate types` first if ../types is missing.')\n\t\t\t},\n\t\t}),\n\t},\n})\n\nfunction extractSchema(mod: unknown): SchemaDefinition | null {\n\tif (typeof mod !== 'object' || mod === null) return null\n\tconst record = mod as Record<string, unknown>\n\n\t// Check for default export\n\tconst candidate = record.default ?? record\n\tif (isSchemaDefinition(candidate)) return candidate\n\n\treturn null\n}\n\nfunction isSchemaDefinition(value: unknown): value is SchemaDefinition {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst obj = value as Record<string, unknown>\n\treturn (\n\t\ttypeof obj.version === 'number' &&\n\t\ttypeof obj.collections === 'object' &&\n\t\tobj.collections !== null\n\t)\n}\n","import type { SchemaDefinition } from '@korajs/core'\n\n/**\n * Generates per-collection React hook stubs from a schema.\n *\n * @param schema - Validated schema definition\n * @returns Map of file basename to file contents\n */\nexport function generateCollectionHooks(schema: SchemaDefinition): Map<string, string> {\n\tconst files = new Map<string, string>()\n\n\tfor (const collectionName of Object.keys(schema.collections)) {\n\t\tconst pascal = toPascalCase(collectionName)\n\t\tconst hookName = `use${pascal}`\n\n\t\tconst content = [\n\t\t\t'// Auto-generated by `kora generate hooks` — safe to edit',\n\t\t\t`// Schema v${String(schema.version)}`,\n\t\t\t'',\n\t\t\t\"import { useCollection, useMutation, useQuery } from '@korajs/react'\",\n\t\t\t`import type { ${pascal}InsertInput, ${pascal}Record, ${pascal}UpdateInput } from '../types'`,\n\t\t\t'',\n\t\t\t'/**',\n\t\t\t` * Collection hook for \\`${collectionName}\\`.`,\n\t\t\t' * Add useQuery(...) calls with your QueryBuilder factories.',\n\t\t\t' */',\n\t\t\t`export function ${hookName}() {`,\n\t\t\t`\\tconst ${collectionName} = useCollection('${collectionName}')`,\n\t\t\t'',\n\t\t\t`\\tconst insert = useMutation((data: ${pascal}InsertInput) => ${collectionName}.insert(data))`,\n\t\t\t`\\tconst update = useMutation((id: string, data: ${pascal}UpdateInput) =>`,\n\t\t\t`\\t\\t${collectionName}.update(id, data),`,\n\t\t\t'\\t)',\n\t\t\t`\\tconst remove = useMutation((id: string) => ${collectionName}.delete(id))`,\n\t\t\t'',\n\t\t\t'\\treturn {',\n\t\t\t`\\t\\t${collectionName},`,\n\t\t\t'\\t\\tinsert,',\n\t\t\t'\\t\\tupdate,',\n\t\t\t'\\t\\tremove,',\n\t\t\t'\\t}',\n\t\t\t'}',\n\t\t\t'',\n\t\t].join('\\n')\n\n\t\tfiles.set(`${collectionName}.ts`, content)\n\t}\n\n\tconst indexLines = [\n\t\t'// Auto-generated by `kora generate hooks`',\n\t\t'',\n\t\t...Object.keys(schema.collections).map((name) => {\n\t\t\tconst pascal = toPascalCase(name)\n\t\t\treturn `export { use${pascal} } from './${name}'`\n\t\t}),\n\t\t'',\n\t]\n\n\tfiles.set('index.ts', indexLines.join('\\n'))\n\treturn files\n}\n\nfunction toPascalCase(value: string): string {\n\treturn value\n\t\t.split(/[-_]/)\n\t\t.filter((part) => part.length > 0)\n\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t.join('')\n}\n","import { defineCommand } from 'citty'\nimport { createLogger } from '../../utils/logger'\n\nconst DEFAULT_SYNC_PORT = 3001\nconst EVENTS_ENDPOINT = '/__kora/events'\n\n/**\n * The `logs` command — streams real-time events from a Kora sync server.\n */\nexport const logsCommand = defineCommand({\n\tmeta: {\n\t\tname: 'logs',\n\t\tdescription: 'Stream real-time events from a Kora sync server',\n\t},\n\targs: {\n\t\turl: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t},\n\t\tfollow: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Follow log output (like tail -f)',\n\t\t\tdefault: true,\n\t\t\talias: 'f',\n\t\t},\n\t\tlevel: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Filter by log level (info, warn, error)',\n\t\t},\n\t\ttoken: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Admin token (defaults to KORA_ADMIN_TOKEN)',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst url = typeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\tconst follow = args.follow !== false\n\t\tconst levelFilter = typeof args.level === 'string' ? args.level : null\n\t\tconst token =\n\t\t\ttypeof args.token === 'string' ? args.token : (process.env.KORA_ADMIN_TOKEN ?? undefined)\n\t\tconst eventsUrl = `${url.replace(/\\/$/, '')}${EVENTS_ENDPOINT}`\n\n\t\tlogger.banner()\n\t\tlogger.info(`Connecting to ${eventsUrl}...`)\n\t\tlogger.blank()\n\n\t\ttry {\n\t\t\tconst response = await fetch(eventsUrl, {\n\t\t\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to connect to ${eventsUrl}: ${response.status} ${response.statusText}`,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst reader = response.body?.getReader()\n\t\t\tif (!reader) {\n\t\t\t\tthrow new Error('Response body is not readable')\n\t\t\t}\n\n\t\t\tconst decoder = new TextDecoder()\n\t\t\tlet buffer = ''\n\n\t\t\tconst processLine = (line: string) => {\n\t\t\t\t// SSE format: \"event: <type>\\ndata: <json>\\n\\n\"\n\t\t\t\tif (line.startsWith('event: ')) {\n\t\t\t\t\treturn // We handle the data line\n\t\t\t\t}\n\t\t\t\tif (line.startsWith('data: ')) {\n\t\t\t\t\tconst data = line.slice(6)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = JSON.parse(data) as Record<string, unknown>\n\t\t\t\t\t\tconst level = String(parsed.level ?? 'info')\n\n\t\t\t\t\t\tif (levelFilter && level !== levelFilter) return\n\n\t\t\t\t\t\tconst timestamp = parsed.timestamp\n\t\t\t\t\t\t\t? new Date(parsed.timestamp as number).toISOString()\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\tconst event = String(parsed.event ?? 'unknown')\n\t\t\t\t\t\tconst nodeId = parsed.nodeId ? ` [${parsed.nodeId}]` : ''\n\t\t\t\t\t\tconst session = parsed.sessionId ? ` <${parsed.sessionId}>` : ''\n\t\t\t\t\t\tconst count = parsed.count ? ` (${parsed.count})` : ''\n\t\t\t\t\t\tconst error = parsed.error ? ` — ${parsed.error}` : ''\n\n\t\t\t\t\t\tconst prefix = level === 'error' ? '✗' : level === 'warn' ? '⚠' : '●'\n\t\t\t\t\t\tconst color =\n\t\t\t\t\t\t\tlevel === 'error' ? '\\x1b[31m' : level === 'warn' ? '\\x1b[33m' : '\\x1b[36m'\n\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`${color}${prefix}${'\\x1b[0m'} ${timestamp.slice(11, 23)} ${event}${nodeId}${session}${count}${error}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Ignore parse errors on malformed data\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst read = async () => {\n\t\t\t\twhile (true) {\n\t\t\t\t\tconst { done, value } = await reader.read()\n\t\t\t\t\tif (done) break\n\n\t\t\t\t\tbuffer += decoder.decode(value, { stream: true })\n\t\t\t\t\tconst lines = buffer.split('\\n')\n\t\t\t\t\tbuffer = lines.pop() ?? ''\n\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\tprocessLine(line.trim())\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!follow) break\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait read()\n\t\t} catch (error) {\n\t\t\tlogger.error(`Failed to connect to ${eventsUrl}`)\n\t\t\tif (error instanceof Error) {\n\t\t\t\tlogger.error(error.message)\n\t\t\t}\n\t\t\tlogger.blank()\n\t\t\tlogger.step('Make sure the Kora sync server is running.')\n\t\t\tlogger.step('Start it with: kora dev')\n\t\t\tprocess.exit(1)\n\t\t}\n\t},\n})\n","import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport type { SchemaDefinition } from '@korajs/core'\nimport { defineCommand } from 'citty'\nimport { InvalidProjectError, SchemaNotFoundError } from '../../errors'\nimport { findProjectRoot, findSchemaFile } from '../../utils/fs-helpers'\nimport { createLogger } from '../../utils/logger'\nimport { promptConfirm } from '../../utils/prompt'\nimport { loadKoraConfig } from '../dev/kora-config'\nimport { generateMigration } from './migration-generator'\nimport { runMigration } from './migration-runner'\nimport { generateOperationTransformModule } from './operation-transform-generator'\nimport { diffSchemas } from './schema-differ'\nimport { loadSchemaDefinition } from './schema-loader'\n\nconst SNAPSHOT_PATH = 'kora/schema.snapshot.json'\nconst MIGRATIONS_DIR = 'kora/migrations'\n\ninterface MigrationManifest {\n\tid: string\n\tfromVersion: number\n\ttoVersion: number\n\tup: string[]\n\tdown: string[]\n\tsummary: string[]\n\tcontainsBreakingChanges: boolean\n}\n\n/**\n * The `migrate` command — detects schema changes and generates migration artifacts.\n */\nexport const migrateCommand = defineCommand({\n\tmeta: {\n\t\tname: 'migrate',\n\t\tdescription: 'Detect schema changes and generate/apply migrations',\n\t},\n\targs: {\n\t\tapply: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Apply migration to configured database backends',\n\t\t\tdefault: false,\n\t\t},\n\t\tschema: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Path to schema file',\n\t\t},\n\t\tdb: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'SQLite database path for --apply (overrides config)',\n\t\t},\n\t\t'output-dir': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Migration output directory',\n\t\t\tdefault: MIGRATIONS_DIR,\n\t\t},\n\t\t'dry-run': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Preview migration changes without writing files',\n\t\t\tdefault: false,\n\t\t},\n\t\tforce: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Skip breaking-change confirmation prompts',\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\n\t\tconst projectRoot = await findProjectRoot()\n\t\tif (!projectRoot) {\n\t\t\tthrow new InvalidProjectError(process.cwd())\n\t\t}\n\n\t\tconst config = await loadKoraConfig(projectRoot)\n\t\tconst resolvedSchemaPath =\n\t\t\ttypeof args.schema === 'string'\n\t\t\t\t? resolve(projectRoot, args.schema)\n\t\t\t\t: typeof config?.schema === 'string'\n\t\t\t\t\t? resolve(projectRoot, config.schema)\n\t\t\t\t\t: await findSchemaFile(projectRoot)\n\n\t\tif (!resolvedSchemaPath) {\n\t\t\tthrow new SchemaNotFoundError(['src/schema.ts', 'schema.ts', 'src/schema.js', 'schema.js'])\n\t\t}\n\n\t\tconst currentSchema = await loadSchemaDefinition(resolvedSchemaPath, projectRoot)\n\n\t\tconst snapshotFile = join(projectRoot, SNAPSHOT_PATH)\n\t\tconst previousSchema = await readSchemaSnapshot(snapshotFile)\n\n\t\tif (!previousSchema) {\n\t\t\tif (args['dry-run'] === true) {\n\t\t\t\tlogger.info('No schema snapshot found. Dry run: baseline snapshot would be created.')\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tawait writeSchemaSnapshot(snapshotFile, currentSchema)\n\t\t\tlogger.success(`Initialized schema snapshot at ${snapshotFile}`)\n\t\t\tlogger.step('Run `kora migrate` again after schema changes to generate migrations.')\n\t\t\treturn\n\t\t}\n\n\t\tconst diff = diffSchemas(previousSchema, currentSchema)\n\t\tconst outputDir =\n\t\t\ttypeof args['output-dir'] === 'string'\n\t\t\t\t? resolve(projectRoot, args['output-dir'])\n\t\t\t\t: resolve(projectRoot, MIGRATIONS_DIR)\n\n\t\tif (!diff.hasChanges) {\n\t\t\tlogger.success('No schema changes detected.')\n\t\t\tif (args.apply === true) {\n\t\t\t\tconst sqlitePath = resolveSqliteApplyPath(args.db, projectRoot, config)\n\t\t\t\tconst postgresConnectionString = resolvePostgresConnectionString(config)\n\t\t\t\tconst pending = await listMigrationManifests(outputDir)\n\n\t\t\t\tif (pending.length === 0) {\n\t\t\t\t\tlogger.step('No migration files found to apply.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tfor (const manifest of pending) {\n\t\t\t\t\tconst report = await runMigration({\n\t\t\t\t\t\tupStatements: manifest.up,\n\t\t\t\t\t\tmigrationId: manifest.id,\n\t\t\t\t\t\tfromVersion: manifest.fromVersion,\n\t\t\t\t\t\ttoVersion: manifest.toVersion,\n\t\t\t\t\t\tsqlitePath,\n\t\t\t\t\t\tpostgresConnectionString,\n\t\t\t\t\t\tprojectRoot,\n\t\t\t\t\t})\n\n\t\t\t\t\tfor (const backend of report.backends) {\n\t\t\t\t\t\tlogger.step(\n\t\t\t\t\t\t\t` ${manifest.id} -> ${backend.backend}: applied=${backend.statementsApplied}, skipped=${backend.skipped}`,\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\treturn\n\t\t}\n\n\t\tconst generated = generateMigration(previousSchema, currentSchema, diff)\n\n\t\tlogger.banner()\n\t\tlogger.info(`Detected schema change: v${diff.fromVersion} → v${diff.toVersion}`)\n\t\tlogger.blank()\n\t\tlogger.info('Changes:')\n\t\tfor (const line of generated.summary) {\n\t\t\tlogger.step(` ${line}`)\n\t\t}\n\n\t\tif (diff.hasBreakingChanges && args['dry-run'] !== true) {\n\t\t\tlogger.blank()\n\t\t\tlogger.warn('Breaking schema changes detected.')\n\t\t\tconst shouldContinue = await confirmBreakingChanges(args.force === true)\n\t\t\tif (!shouldContinue) {\n\t\t\t\tlogger.warn('Migration generation aborted.')\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif (args['dry-run'] === true) {\n\t\t\tlogger.blank()\n\t\t\tlogger.warn('Dry run enabled: no files written, no migrations applied.')\n\t\t\treturn\n\t\t}\n\n\t\tawait mkdir(outputDir, { recursive: true })\n\n\t\tconst migrationPath = await writeMigrationFile(\n\t\t\toutputDir,\n\t\t\tdiff.fromVersion,\n\t\t\tdiff.toVersion,\n\t\t\tgenerated,\n\t\t)\n\t\tawait writeSchemaSnapshot(snapshotFile, currentSchema)\n\n\t\tlogger.blank()\n\t\tlogger.success(`Generated migration: ${migrationPath}`)\n\n\t\tif (args.apply === true) {\n\t\t\tconst sqlitePath = resolveSqliteApplyPath(args.db, projectRoot, config)\n\t\t\tconst postgresConnectionString = resolvePostgresConnectionString(config)\n\t\t\tconst pending = await listMigrationManifests(outputDir)\n\n\t\t\tfor (const manifest of pending) {\n\t\t\t\tconst report = await runMigration({\n\t\t\t\t\tupStatements: manifest.up,\n\t\t\t\t\tmigrationId: manifest.id,\n\t\t\t\t\tfromVersion: manifest.fromVersion,\n\t\t\t\t\ttoVersion: manifest.toVersion,\n\t\t\t\t\tsqlitePath,\n\t\t\t\t\tpostgresConnectionString,\n\t\t\t\t\tprojectRoot,\n\t\t\t\t})\n\n\t\t\t\tfor (const backend of report.backends) {\n\t\t\t\t\tlogger.step(\n\t\t\t\t\t\t` ${manifest.id} -> ${backend.backend}: applied=${backend.statementsApplied}, skipped=${backend.skipped}, history=${backend.historyRecorded}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlogger.success('Applied pending migrations successfully.')\n\t\t}\n\t},\n})\n\nasync function readSchemaSnapshot(path: string): Promise<SchemaDefinition | null> {\n\ttry {\n\t\tconst content = await readFile(path, 'utf-8')\n\t\treturn JSON.parse(content) as SchemaDefinition\n\t} catch {\n\t\treturn null\n\t}\n}\n\nasync function confirmBreakingChanges(force: boolean): Promise<boolean> {\n\tif (force) {\n\t\treturn true\n\t}\n\n\tif (!isInteractiveTerminal()) {\n\t\tthrow new Error(\n\t\t\t'Breaking schema changes require confirmation. Re-run with --force to continue or --dry-run to preview.',\n\t\t)\n\t}\n\n\treturn await promptConfirm('Continue and generate a breaking migration?', false)\n}\n\nfunction isInteractiveTerminal(): boolean {\n\treturn process.stdin.isTTY === true && process.stdout.isTTY === true\n}\n\nasync function writeSchemaSnapshot(path: string, schema: SchemaDefinition): Promise<void> {\n\tawait mkdir(dirname(path), { recursive: true })\n\tawait writeFile(path, `${JSON.stringify(schema, null, 2)}\\n`, 'utf-8')\n}\n\nasync function writeMigrationFile(\n\toutputDir: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tgenerated: ReturnType<typeof generateMigration>,\n): Promise<string> {\n\tconst existing = await readdir(outputDir).catch(() => [])\n\tconst sequence = existing.filter((file) => /^\\d{3}-/.test(file)).length + 1\n\tconst filename = `${String(sequence).padStart(3, '0')}-v${fromVersion}-to-v${toVersion}.ts`\n\tconst path = join(outputDir, filename)\n\tconst migrationId = filename.replace(/\\.ts$/, '')\n\n\tconst fileContent = [\n\t\t`export const up = ${JSON.stringify(generated.up, null, 2)} as const`,\n\t\t'',\n\t\t`export const down = ${JSON.stringify(generated.down, null, 2)} as const`,\n\t\t'',\n\t\t`export const summary = ${JSON.stringify(generated.summary, null, 2)} as const`,\n\t\t'',\n\t\t`export const containsBreakingChanges = ${generated.containsBreakingChanges}`,\n\t\t'',\n\t].join('\\n')\n\n\tawait writeFile(path, fileContent, 'utf-8')\n\n\tconst transformsPath = join(outputDir, `${migrationId}.transforms.ts`)\n\tawait writeFile(transformsPath, generateOperationTransformModule(fromVersion, toVersion), 'utf-8')\n\tawait writeMigrationManifest(join(outputDir, `${migrationId}.json`), {\n\t\tid: migrationId,\n\t\tfromVersion,\n\t\ttoVersion,\n\t\tup: generated.up,\n\t\tdown: generated.down,\n\t\tsummary: generated.summary,\n\t\tcontainsBreakingChanges: generated.containsBreakingChanges,\n\t})\n\treturn path\n}\n\nasync function writeMigrationManifest(path: string, manifest: MigrationManifest): Promise<void> {\n\tawait writeFile(path, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf-8')\n}\n\nasync function listMigrationManifests(outputDir: string): Promise<MigrationManifest[]> {\n\tconst files = await readdir(outputDir).catch(() => [])\n\tconst migrationFiles = files\n\t\t.filter((file) => /^\\d{3}-.*\\.ts$/.test(file))\n\t\t.sort((left, right) => left.localeCompare(right))\n\n\tconst manifests: MigrationManifest[] = []\n\tfor (const file of migrationFiles) {\n\t\tconst id = file.replace(/\\.ts$/, '')\n\t\tconst manifestPath = join(outputDir, `${id}.json`)\n\t\tconst jsonManifest = await readMigrationManifest(manifestPath)\n\n\t\tif (jsonManifest) {\n\t\t\tmanifests.push({ ...jsonManifest, id })\n\t\t\tcontinue\n\t\t}\n\n\t\tconst migrationPath = join(outputDir, file)\n\t\tconst sourceManifest = await readMigrationManifestFromSource(migrationPath, id)\n\t\tmanifests.push(sourceManifest)\n\t}\n\n\treturn manifests\n}\n\nasync function readMigrationManifest(path: string): Promise<MigrationManifest | null> {\n\ttry {\n\t\tconst content = await readFile(path, 'utf-8')\n\t\treturn JSON.parse(content) as MigrationManifest\n\t} catch (error) {\n\t\tconst code = (error as NodeJS.ErrnoException).code\n\t\tif (code === 'ENOENT') {\n\t\t\treturn null\n\t\t}\n\t\tthrow error\n\t}\n}\n\nasync function readMigrationManifestFromSource(\n\tpath: string,\n\tid: string,\n): Promise<MigrationManifest> {\n\tconst content = await readFile(path, 'utf-8')\n\tconst versions = parseVersionsFromMigrationId(id)\n\n\treturn {\n\t\tid,\n\t\tfromVersion: versions.fromVersion,\n\t\ttoVersion: versions.toVersion,\n\t\tup: parseStringArrayExport(content, 'up'),\n\t\tdown: parseStringArrayExport(content, 'down'),\n\t\tsummary: parseStringArrayExport(content, 'summary'),\n\t\tcontainsBreakingChanges: parseBooleanExport(content, 'containsBreakingChanges'),\n\t}\n}\n\nfunction parseVersionsFromMigrationId(id: string): { fromVersion: number; toVersion: number } {\n\tconst match = id.match(/-v(\\d+)-to-v(\\d+)$/)\n\tif (!match) {\n\t\tthrow new Error(`Migration id \"${id}\" does not include a vX-to-vY version suffix.`)\n\t}\n\n\tconst fromVersionText = match[1]\n\tconst toVersionText = match[2]\n\tif (fromVersionText === undefined || toVersionText === undefined) {\n\t\tthrow new Error(`Migration id \"${id}\" does not include a vX-to-vY version suffix.`)\n\t}\n\n\treturn {\n\t\tfromVersion: Number.parseInt(fromVersionText, 10),\n\t\ttoVersion: Number.parseInt(toVersionText, 10),\n\t}\n}\n\nfunction parseStringArrayExport(source: string, exportName: 'up' | 'down' | 'summary'): string[] {\n\tconst expression = parseExportExpression(source, exportName)\n\tconst parsed = JSON.parse(expression) as unknown\n\tif (!Array.isArray(parsed) || parsed.some((item) => typeof item !== 'string')) {\n\t\tthrow new Error(`Migration export \"${exportName}\" must be a string array.`)\n\t}\n\n\treturn parsed\n}\n\nfunction parseBooleanExport(source: string, exportName: 'containsBreakingChanges'): boolean {\n\tconst expression = parseLiteralExport(source, exportName)\n\tif (expression === 'true') return true\n\tif (expression === 'false') return false\n\tthrow new Error(`Migration export \"${exportName}\" must be a boolean literal.`)\n}\n\nfunction parseExportExpression(source: string, exportName: string): string {\n\tconst escapedName = exportName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\tconst regex = new RegExp(`export const ${escapedName} = ([\\\\s\\\\S]*?) as const`)\n\tconst match = source.match(regex)\n\tif (!match || !match[1]) {\n\t\tthrow new Error(`Failed to read migration export \"${exportName}\".`)\n\t}\n\n\treturn match[1].trim()\n}\n\nfunction parseLiteralExport(source: string, exportName: string): string {\n\tconst escapedName = exportName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\tconst regex = new RegExp(`export const ${escapedName} = ([^\\n\\r]+)`)\n\tconst match = source.match(regex)\n\tif (!match || !match[1]) {\n\t\tthrow new Error(`Failed to read migration export \"${exportName}\".`)\n\t}\n\n\treturn match[1].trim()\n}\n\nfunction resolveSqliteApplyPath(\n\tdbArg: unknown,\n\tprojectRoot: string,\n\tconfig: Awaited<ReturnType<typeof loadKoraConfig>>,\n): string | undefined {\n\tif (typeof dbArg === 'string') {\n\t\treturn resolve(projectRoot, dbArg)\n\t}\n\n\tconst sync = config?.dev?.sync\n\tif (typeof sync === 'object' && sync !== null) {\n\t\tif (sync.store === 'sqlite') {\n\t\t\treturn join(projectRoot, 'kora-sync.db')\n\t\t}\n\t\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'sqlite') {\n\t\t\tif (typeof sync.store.filename === 'string' && sync.store.filename.length > 0) {\n\t\t\t\treturn resolve(projectRoot, sync.store.filename)\n\t\t\t}\n\t\t\treturn join(projectRoot, 'kora-sync.db')\n\t\t}\n\t}\n\n\treturn undefined\n}\n\nfunction resolvePostgresConnectionString(\n\tconfig: Awaited<ReturnType<typeof loadKoraConfig>>,\n): string | undefined {\n\tconst sync = config?.dev?.sync\n\tif (typeof sync !== 'object' || sync === null) return undefined\n\n\tif (sync.store === 'postgres') {\n\t\treturn process.env.DATABASE_URL\n\t}\n\n\tif (typeof sync.store === 'object' && sync.store !== null && sync.store.type === 'postgres') {\n\t\treturn sync.store.connectionString\n\t}\n\n\treturn undefined\n}\n","import { generateSQL } from '@korajs/core'\nimport type { CollectionDefinition, FieldDescriptor, SchemaDefinition } from '@korajs/core'\nimport type { SchemaDiff } from './schema-differ'\nimport { getChangedCollections } from './schema-differ'\n\nexport interface GeneratedMigration {\n\tup: string[]\n\tdown: string[]\n\tsummary: string[]\n\tcontainsBreakingChanges: boolean\n}\n\n/**\n * Generates SQL up/down migration statements from a schema diff.\n */\nexport function generateMigration(\n\tprevious: SchemaDefinition,\n\tcurrent: SchemaDefinition,\n\tdiff: SchemaDiff,\n): GeneratedMigration {\n\tconst up: string[] = []\n\tconst down: string[] = []\n\n\tfor (const change of diff.changes) {\n\t\tif (change.type === 'collection-added') {\n\t\t\tconst collectionDef = current.collections[change.collection]\n\t\t\tif (!collectionDef) continue\n\t\t\tup.push(...generateSQL(change.collection, collectionDef))\n\t\t\tdown.push(...dropCollectionStatements(change.collection))\n\t\t}\n\n\t\tif (change.type === 'collection-removed') {\n\t\t\tconst collectionDef = previous.collections[change.collection]\n\t\t\tup.push(...dropCollectionStatements(change.collection))\n\t\t\tif (collectionDef) {\n\t\t\t\tdown.push(...generateSQL(change.collection, collectionDef))\n\t\t\t}\n\t\t}\n\t}\n\n\tconst changedCollections = getChangedCollections(diff).filter(\n\t\t(collection) =>\n\t\t\tcollection in previous.collections &&\n\t\t\tcollection in current.collections &&\n\t\t\tdiff.changes.some(\n\t\t\t\t(change) =>\n\t\t\t\t\tchange.collection === collection &&\n\t\t\t\t\t(change.type === 'field-added' ||\n\t\t\t\t\t\tchange.type === 'field-removed' ||\n\t\t\t\t\t\tchange.type === 'field-changed' ||\n\t\t\t\t\t\tchange.type === 'index-added' ||\n\t\t\t\t\t\tchange.type === 'index-removed'),\n\t\t\t),\n\t)\n\n\tfor (const collection of changedCollections) {\n\t\tconst previousDef = previous.collections[collection]\n\t\tconst currentDef = current.collections[collection]\n\t\tif (!previousDef || !currentDef) continue\n\n\t\tvalidateRebuildSafety(collection, previousDef, currentDef)\n\n\t\tup.push(...generateRebuildStatements(collection, previousDef, currentDef))\n\t\tdown.push(...generateRebuildStatements(collection, currentDef, previousDef))\n\t}\n\n\tdown.reverse()\n\n\treturn {\n\t\tup,\n\t\tdown,\n\t\tsummary: diff.changes.map(formatChange),\n\t\tcontainsBreakingChanges: diff.hasBreakingChanges,\n\t}\n}\n\nfunction generateRebuildStatements(\n\tcollection: string,\n\tfrom: CollectionDefinition,\n\tto: CollectionDefinition,\n): string[] {\n\tconst table = quoteIdentifier(collection)\n\tconst tempTable = quoteIdentifier(`_kora_mig_${collection}_new`)\n\n\tconst targetColumns = [\n\t\t'id TEXT PRIMARY KEY NOT NULL',\n\t\t...Object.entries(to.fields).map(([field, descriptor]) => columnDefinition(field, descriptor)),\n\t\t'_created_at INTEGER NOT NULL',\n\t\t'_updated_at INTEGER NOT NULL',\n\t\t'_deleted INTEGER NOT NULL DEFAULT 0',\n\t]\n\n\tconst statements: string[] = []\n\tstatements.push(`CREATE TABLE ${tempTable} (\\n ${targetColumns.join(',\\n ')}\\n)`)\n\n\tconst toFields = Object.keys(to.fields)\n\tconst columns = ['id', ...toFields, '_created_at', '_updated_at', '_deleted']\n\tconst selectExpressions = columns.map((column) =>\n\t\tprojectionForColumn(column, from.fields, to.fields[column] ?? null),\n\t)\n\n\tstatements.push(\n\t\t`INSERT INTO ${tempTable} (${columns.map(quoteIdentifier).join(', ')}) SELECT ${selectExpressions.join(', ')} FROM ${table}`,\n\t)\n\tstatements.push(`DROP TABLE ${table}`)\n\tstatements.push(`ALTER TABLE ${tempTable} RENAME TO ${table}`)\n\n\tfor (const indexField of to.indexes) {\n\t\tstatements.push(\n\t\t\t`CREATE INDEX IF NOT EXISTS idx_${collection}_${indexField} ON ${table} (${quoteIdentifier(indexField)})`,\n\t\t)\n\t}\n\n\treturn statements\n}\n\nfunction validateRebuildSafety(\n\tcollection: string,\n\tfrom: CollectionDefinition,\n\tto: CollectionDefinition,\n): void {\n\tfor (const [fieldName, descriptor] of Object.entries(to.fields)) {\n\t\tif (fieldName in from.fields) continue\n\t\tif (descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot auto-migrate collection \"${collection}\": added required field \"${fieldName}\" has no default value.`,\n\t\t\t)\n\t\t}\n\t}\n\n\tfor (const [fieldName, targetDescriptor] of Object.entries(to.fields)) {\n\t\tconst sourceDescriptor = from.fields[fieldName]\n\t\tif (!sourceDescriptor) continue\n\t\tif (canTransformField(sourceDescriptor, targetDescriptor)) continue\n\n\t\tif (\n\t\t\ttargetDescriptor.required &&\n\t\t\ttargetDescriptor.defaultValue === undefined &&\n\t\t\t!targetDescriptor.auto\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot auto-migrate collection \"${collection}\": changed required field \"${fieldName}\" from ${sourceDescriptor.kind} to ${targetDescriptor.kind} without a safe transform/default.`,\n\t\t\t)\n\t\t}\n\t}\n}\n\nfunction projectionForColumn(\n\tcolumn: string,\n\tfromFields: Record<string, FieldDescriptor>,\n\ttargetDescriptor: FieldDescriptor | null,\n): string {\n\tif (\n\t\tcolumn === 'id' ||\n\t\tcolumn === '_created_at' ||\n\t\tcolumn === '_updated_at' ||\n\t\tcolumn === '_deleted'\n\t) {\n\t\treturn quoteIdentifier(column)\n\t}\n\n\tconst sourceDescriptor = fromFields[column]\n\tif (sourceDescriptor && targetDescriptor) {\n\t\treturn projectionForFieldTransform(column, sourceDescriptor, targetDescriptor)\n\t}\n\n\tif (sourceDescriptor) {\n\t\treturn quoteIdentifier(column)\n\t}\n\n\tif (!targetDescriptor) {\n\t\treturn 'NULL'\n\t}\n\n\tif (targetDescriptor.auto && targetDescriptor.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\tif (targetDescriptor.defaultValue !== undefined) {\n\t\treturn sqlLiteral(targetDescriptor.defaultValue)\n\t}\n\n\treturn 'NULL'\n}\n\nfunction projectionForFieldTransform(\n\tcolumn: string,\n\tsource: FieldDescriptor,\n\ttarget: FieldDescriptor,\n): string {\n\tconst sourceColumn = quoteIdentifier(column)\n\tif (source.kind === target.kind && source.itemKind === target.itemKind) {\n\t\tif (target.kind === 'enum' && target.enumValues && target.enumValues.length > 0) {\n\t\t\tconst allowed = target.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\t\tconst fallback =\n\t\t\t\ttarget.defaultValue !== undefined ? sqlLiteral(target.defaultValue) : sourceColumn\n\t\t\treturn `CASE WHEN ${sourceColumn} IN (${allowed}) THEN ${sourceColumn} ELSE ${fallback} END`\n\t\t}\n\t\treturn sourceColumn\n\t}\n\n\tif (target.kind === 'string') {\n\t\treturn `CAST(${sourceColumn} AS TEXT)`\n\t}\n\n\tif (target.kind === 'number' || target.kind === 'timestamp') {\n\t\tif (\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum' ||\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean'\n\t\t) {\n\t\t\tconst castType = target.kind === 'number' ? 'REAL' : 'INTEGER'\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL ELSE CAST(${sourceColumn} AS ${castType}) END`\n\t\t}\n\t}\n\n\tif (target.kind === 'boolean') {\n\t\tif (source.kind === 'number' || source.kind === 'timestamp' || source.kind === 'boolean') {\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL WHEN CAST(${sourceColumn} AS REAL) = 0 THEN 0 ELSE 1 END`\n\t\t}\n\n\t\tif (source.kind === 'string' || source.kind === 'enum') {\n\t\t\treturn `CASE WHEN ${sourceColumn} IS NULL THEN NULL WHEN LOWER(TRIM(CAST(${sourceColumn} AS TEXT))) IN ('1','true','t','yes','y','on') THEN 1 WHEN LOWER(TRIM(CAST(${sourceColumn} AS TEXT))) IN ('0','false','f','no','n','off') THEN 0 ELSE ${projectionFallback(target)} END`\n\t\t}\n\t}\n\n\tif (target.kind === 'enum' && target.enumValues && target.enumValues.length > 0) {\n\t\tif (source.kind === 'string' || source.kind === 'enum') {\n\t\t\tconst allowed = target.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\t\treturn `CASE WHEN ${sourceColumn} IN (${allowed}) THEN ${sourceColumn} ELSE ${projectionFallback(target)} END`\n\t\t}\n\t}\n\n\tif (target.kind === 'array' && source.kind === 'array' && source.itemKind === target.itemKind) {\n\t\treturn sourceColumn\n\t}\n\n\tif (target.auto && target.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\treturn projectionFallback(target)\n}\n\nfunction canTransformField(source: FieldDescriptor, target: FieldDescriptor): boolean {\n\tif (source.kind === target.kind && source.itemKind === target.itemKind) {\n\t\treturn true\n\t}\n\n\tif (target.kind === 'string') {\n\t\treturn true\n\t}\n\n\tif (target.kind === 'number' || target.kind === 'timestamp') {\n\t\treturn (\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum' ||\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean'\n\t\t)\n\t}\n\n\tif (target.kind === 'boolean') {\n\t\treturn (\n\t\t\tsource.kind === 'number' ||\n\t\t\tsource.kind === 'timestamp' ||\n\t\t\tsource.kind === 'boolean' ||\n\t\t\tsource.kind === 'string' ||\n\t\t\tsource.kind === 'enum'\n\t\t)\n\t}\n\n\tif (target.kind === 'enum') {\n\t\treturn source.kind === 'string' || source.kind === 'enum'\n\t}\n\n\tif (target.kind === 'array') {\n\t\treturn source.kind === 'array' && source.itemKind === target.itemKind\n\t}\n\n\tif (target.kind === 'richtext') {\n\t\treturn source.kind === 'richtext'\n\t}\n\n\treturn false\n}\n\nfunction projectionFallback(target: FieldDescriptor): string {\n\tif (target.auto && target.kind === 'timestamp') {\n\t\treturn \"CAST(strftime('%s','now') AS INTEGER) * 1000\"\n\t}\n\n\tif (target.defaultValue !== undefined) {\n\t\treturn sqlLiteral(target.defaultValue)\n\t}\n\n\treturn 'NULL'\n}\n\nfunction dropCollectionStatements(collection: string): string[] {\n\tconst table = quoteIdentifier(collection)\n\tconst opsTable = quoteIdentifier(`_kora_ops_${collection}`)\n\treturn [`DROP TABLE IF EXISTS ${table}`, `DROP TABLE IF EXISTS ${opsTable}`]\n}\n\nfunction columnDefinition(fieldName: string, descriptor: FieldDescriptor): string {\n\tconst sqlType = mapFieldType(descriptor)\n\tconst parts = [quoteIdentifier(fieldName), sqlType]\n\n\tif (descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto) {\n\t\tparts.push('NOT NULL')\n\t}\n\n\tif (descriptor.defaultValue !== undefined) {\n\t\tparts.push(`DEFAULT ${sqlLiteral(descriptor.defaultValue)}`)\n\t}\n\n\tif (descriptor.kind === 'enum' && descriptor.enumValues) {\n\t\tconst values = descriptor.enumValues.map((value) => sqlLiteral(value)).join(', ')\n\t\tparts.push(`CHECK (${quoteIdentifier(fieldName)} IN (${values}))`)\n\t}\n\n\treturn parts.join(' ')\n}\n\nfunction mapFieldType(descriptor: FieldDescriptor): string {\n\tswitch (descriptor.kind) {\n\t\tcase 'string':\n\t\t\treturn 'TEXT'\n\t\tcase 'number':\n\t\t\treturn 'REAL'\n\t\tcase 'boolean':\n\t\t\treturn 'INTEGER'\n\t\tcase 'enum':\n\t\t\treturn 'TEXT'\n\t\tcase 'timestamp':\n\t\t\treturn 'INTEGER'\n\t\tcase 'array':\n\t\t\treturn 'TEXT'\n\t\tcase 'richtext':\n\t\t\treturn 'BLOB'\n\t}\n}\n\nfunction sqlLiteral(value: unknown): string {\n\tif (value === null) return 'NULL'\n\tif (typeof value === 'number') return String(value)\n\tif (typeof value === 'boolean') return value ? '1' : '0'\n\tif (typeof value === 'string') return `'${value.replaceAll(\"'\", \"''\")}'`\n\treturn `'${JSON.stringify(value).replaceAll(\"'\", \"''\")}'`\n}\n\nfunction quoteIdentifier(identifier: string): string {\n\tif (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier)) {\n\t\tthrow new Error(`Invalid SQL identifier: ${identifier}`)\n\t}\n\treturn identifier\n}\n\nfunction formatChange(change: SchemaDiff['changes'][number]): string {\n\tswitch (change.type) {\n\t\tcase 'collection-added':\n\t\t\treturn `+ collection ${change.collection}`\n\t\tcase 'collection-removed':\n\t\t\treturn `- collection ${change.collection}`\n\t\tcase 'field-added':\n\t\t\treturn `+ ${change.collection}.${change.field}`\n\t\tcase 'field-removed':\n\t\t\treturn `- ${change.collection}.${change.field}`\n\t\tcase 'field-changed':\n\t\t\treturn `~ ${change.collection}.${change.field}`\n\t\tcase 'index-added':\n\t\t\treturn `+ index ${change.collection}.${change.index}`\n\t\tcase 'index-removed':\n\t\t\treturn `- index ${change.collection}.${change.index}`\n\t}\n}\n","import type { FieldDescriptor, SchemaDefinition } from '@korajs/core'\n\nexport type SchemaChange =\n\t| { type: 'collection-added'; collection: string }\n\t| { type: 'collection-removed'; collection: string }\n\t| { type: 'field-added'; collection: string; field: string; descriptor: FieldDescriptor }\n\t| { type: 'field-removed'; collection: string; field: string; descriptor: FieldDescriptor }\n\t| {\n\t\t\ttype: 'field-changed'\n\t\t\tcollection: string\n\t\t\tfield: string\n\t\t\tbefore: FieldDescriptor\n\t\t\tafter: FieldDescriptor\n\t }\n\t| { type: 'index-added'; collection: string; index: string }\n\t| { type: 'index-removed'; collection: string; index: string }\n\nexport interface SchemaDiff {\n\tfromVersion: number\n\ttoVersion: number\n\tchanges: SchemaChange[]\n\thasChanges: boolean\n\thasBreakingChanges: boolean\n}\n\n/**\n * Computes a structural schema diff.\n */\nexport function diffSchemas(previous: SchemaDefinition, current: SchemaDefinition): SchemaDiff {\n\tconst changes: SchemaChange[] = []\n\n\tconst previousCollections = new Set(Object.keys(previous.collections))\n\tconst currentCollections = new Set(Object.keys(current.collections))\n\n\tfor (const collection of currentCollections) {\n\t\tif (!previousCollections.has(collection)) {\n\t\t\tchanges.push({ type: 'collection-added', collection })\n\t\t}\n\t}\n\n\tfor (const collection of previousCollections) {\n\t\tif (!currentCollections.has(collection)) {\n\t\t\tchanges.push({ type: 'collection-removed', collection })\n\t\t}\n\t}\n\n\tfor (const collection of currentCollections) {\n\t\tif (!previousCollections.has(collection)) continue\n\n\t\tconst previousDef = previous.collections[collection]\n\t\tconst currentDef = current.collections[collection]\n\t\tif (!previousDef || !currentDef) continue\n\n\t\tconst previousFields = previousDef.fields\n\t\tconst currentFields = currentDef.fields\n\n\t\tfor (const [fieldName, currentField] of Object.entries(currentFields)) {\n\t\t\tconst previousField = previousFields[fieldName]\n\t\t\tif (!previousField) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-added',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tdescriptor: currentField,\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!fieldDescriptorsEqual(previousField, currentField)) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-changed',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tbefore: previousField,\n\t\t\t\t\tafter: currentField,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tfor (const [fieldName, previousField] of Object.entries(previousFields)) {\n\t\t\tif (!(fieldName in currentFields)) {\n\t\t\t\tchanges.push({\n\t\t\t\t\ttype: 'field-removed',\n\t\t\t\t\tcollection,\n\t\t\t\t\tfield: fieldName,\n\t\t\t\t\tdescriptor: previousField,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst previousIndexes = new Set(previousDef.indexes)\n\t\tconst currentIndexes = new Set(currentDef.indexes)\n\n\t\tfor (const index of currentIndexes) {\n\t\t\tif (!previousIndexes.has(index)) {\n\t\t\t\tchanges.push({ type: 'index-added', collection, index })\n\t\t\t}\n\t\t}\n\n\t\tfor (const index of previousIndexes) {\n\t\t\tif (!currentIndexes.has(index)) {\n\t\t\t\tchanges.push({ type: 'index-removed', collection, index })\n\t\t\t}\n\t\t}\n\t}\n\n\tchanges.sort(compareChanges)\n\n\treturn {\n\t\tfromVersion: previous.version,\n\t\ttoVersion: current.version,\n\t\tchanges,\n\t\thasChanges: changes.length > 0,\n\t\thasBreakingChanges: changes.some(isBreakingChange),\n\t}\n}\n\nexport function getChangedCollections(diff: SchemaDiff): string[] {\n\tconst collections = new Set<string>()\n\tfor (const change of diff.changes) {\n\t\tcollections.add(change.collection)\n\t}\n\treturn [...collections].sort()\n}\n\nfunction isBreakingChange(change: SchemaChange): boolean {\n\tif (change.type === 'collection-removed' || change.type === 'field-removed') return true\n\tif (change.type === 'field-changed') {\n\t\tif (change.before.kind !== change.after.kind) return true\n\t\tif (change.before.itemKind !== change.after.itemKind) return true\n\t\tif (serializeEnum(change.before.enumValues) !== serializeEnum(change.after.enumValues))\n\t\t\treturn true\n\t\tif (change.before.required !== change.after.required && change.after.required) return true\n\t\treturn false\n\t}\n\tif (change.type === 'field-added') {\n\t\tconst descriptor = change.descriptor\n\t\treturn descriptor.required && descriptor.defaultValue === undefined && !descriptor.auto\n\t}\n\treturn false\n}\n\nfunction fieldDescriptorsEqual(left: FieldDescriptor, right: FieldDescriptor): boolean {\n\treturn (\n\t\tleft.kind === right.kind &&\n\t\tleft.required === right.required &&\n\t\tleft.defaultValue === right.defaultValue &&\n\t\tleft.auto === right.auto &&\n\t\tleft.itemKind === right.itemKind &&\n\t\tserializeEnum(left.enumValues) === serializeEnum(right.enumValues)\n\t)\n}\n\nfunction serializeEnum(values: readonly string[] | null): string {\n\tif (!values) return ''\n\treturn values.join('|')\n}\n\nfunction compareChanges(left: SchemaChange, right: SchemaChange): number {\n\tif (left.collection < right.collection) return -1\n\tif (left.collection > right.collection) return 1\n\n\tif (left.type < right.type) return -1\n\tif (left.type > right.type) return 1\n\n\tconst leftKey = 'field' in left ? left.field : 'index' in left ? left.index : ''\n\tconst rightKey = 'field' in right ? right.field : 'index' in right ? right.index : ''\n\n\tif (leftKey < rightKey) return -1\n\tif (leftKey > rightKey) return 1\n\treturn 0\n}\n","export interface RunMigrationOptions {\n\tupStatements: string[]\n\tmigrationId?: string\n\tfromVersion?: number\n\ttoVersion?: number\n\tsqlitePath?: string\n\tpostgresConnectionString?: string\n\tprojectRoot?: string\n\tsqliteDriver?: {\n\t\topen(path: string): {\n\t\t\texec(sql: string): void\n\t\t\tisMigrationApplied?(id: string): boolean\n\t\t\tclose?(): void\n\t\t}\n\t}\n\tpostgresClientFactory?: (connectionString: string) => {\n\t\tunsafe(query: string): Promise<unknown>\n\t\tend?(): Promise<void>\n\t}\n}\n\nexport interface BackendApplyReport {\n\tbackend: 'sqlite' | 'postgres'\n\tstatementsApplied: number\n\thistoryRecorded: boolean\n\tskipped: boolean\n}\n\nexport interface RunMigrationReport {\n\tbackends: BackendApplyReport[]\n}\n\nexport class MigrationApplyError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly backend: 'sqlite' | 'postgres',\n\t\tpublic readonly report: RunMigrationReport,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'MigrationApplyError'\n\t}\n}\n\n/**\n * Applies migration statements to configured backends.\n */\nexport async function runMigration(options: RunMigrationOptions): Promise<RunMigrationReport> {\n\tconst report: RunMigrationReport = { backends: [] }\n\tconst migrationId = options.migrationId ?? `migration-${Date.now()}`\n\tconst fromVersion = options.fromVersion ?? 0\n\tconst toVersion = options.toVersion ?? 0\n\n\tif (options.sqlitePath) {\n\t\ttry {\n\t\t\tconst sqliteReport = await runSqliteMigration(\n\t\t\t\toptions.sqlitePath,\n\t\t\t\toptions.upStatements,\n\t\t\t\tmigrationId,\n\t\t\t\tfromVersion,\n\t\t\t\ttoVersion,\n\t\t\t\toptions.projectRoot,\n\t\t\t\toptions.sqliteDriver,\n\t\t\t)\n\t\t\treport.backends.push(sqliteReport)\n\t\t} catch (error) {\n\t\t\tthrow new MigrationApplyError((error as Error).message, 'sqlite', report)\n\t\t}\n\t}\n\n\tif (options.postgresConnectionString) {\n\t\ttry {\n\t\t\tconst postgresReport = await runPostgresMigration(\n\t\t\t\toptions.postgresConnectionString,\n\t\t\t\toptions.upStatements,\n\t\t\t\tmigrationId,\n\t\t\t\tfromVersion,\n\t\t\t\ttoVersion,\n\t\t\t\toptions.postgresClientFactory,\n\t\t\t)\n\t\t\treport.backends.push(postgresReport)\n\t\t} catch (error) {\n\t\t\tthrow new MigrationApplyError((error as Error).message, 'postgres', report)\n\t\t}\n\t}\n\n\treturn report\n}\n\nasync function runSqliteMigration(\n\tpath: string,\n\tstatements: string[],\n\tmigrationId: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tprojectRoot?: string,\n\tdriverOverride?: RunMigrationOptions['sqliteDriver'],\n): Promise<BackendApplyReport> {\n\tconst driver = driverOverride ?? (await loadSqliteDriver(projectRoot))\n\tconst db = driver.open(path)\n\tlet statementsApplied = 0\n\n\ttry {\n\t\tdb.exec('BEGIN')\n\t\tdb.exec(\n\t\t\t'CREATE TABLE IF NOT EXISTS _kora_migrations (id TEXT PRIMARY KEY NOT NULL, from_version INTEGER NOT NULL, to_version INTEGER NOT NULL, applied_at INTEGER NOT NULL)',\n\t\t)\n\t\tconst alreadyApplied =\n\t\t\ttypeof db.isMigrationApplied === 'function' ? db.isMigrationApplied(migrationId) : false\n\t\tif (alreadyApplied) {\n\t\t\tdb.exec('COMMIT')\n\t\t\treturn {\n\t\t\t\tbackend: 'sqlite',\n\t\t\t\tstatementsApplied: 0,\n\t\t\t\thistoryRecorded: true,\n\t\t\t\tskipped: true,\n\t\t\t}\n\t\t}\n\t\tfor (const statement of statements) {\n\t\t\tdb.exec(statement)\n\t\t\tstatementsApplied++\n\t\t}\n\t\tdb.exec(\n\t\t\t`INSERT OR REPLACE INTO _kora_migrations (id, from_version, to_version, applied_at) VALUES (${sqlLiteral(migrationId)}, ${fromVersion}, ${toVersion}, ${Date.now()})`,\n\t\t)\n\t\tdb.exec('COMMIT')\n\n\t\treturn {\n\t\t\tbackend: 'sqlite',\n\t\t\tstatementsApplied,\n\t\t\thistoryRecorded: true,\n\t\t\tskipped: false,\n\t\t}\n\t} catch (error) {\n\t\ttry {\n\t\t\tdb.exec('ROLLBACK')\n\t\t} catch {\n\t\t\t// best effort\n\t\t}\n\t\tthrow error\n\t} finally {\n\t\tif (typeof db.close === 'function') {\n\t\t\tdb.close()\n\t\t}\n\t}\n}\n\nasync function loadSqliteDriver(projectRoot?: string): Promise<{\n\topen(path: string): {\n\t\texec(sql: string): void\n\t\tisMigrationApplied(id: string): boolean\n\t\tclose(): void\n\t}\n}> {\n\ttry {\n\t\tconst { createRequire } = await import('node:module')\n\t\tconst requireFrom = createRequire(projectRoot ? `${projectRoot}/package.json` : import.meta.url)\n\t\tconst Database = requireFrom('better-sqlite3') as new (\n\t\t\tpath: string,\n\t\t) => {\n\t\t\texec(sql: string): void\n\t\t\tprepare(sql: string): {\n\t\t\t\tget(...params: unknown[]): { count?: number } | undefined\n\t\t\t}\n\t\t\tclose(): void\n\t\t}\n\n\t\treturn {\n\t\t\topen(path: string) {\n\t\t\t\tconst db = new Database(path)\n\t\t\t\treturn {\n\t\t\t\t\texec(sql: string) {\n\t\t\t\t\t\tdb.exec(sql)\n\t\t\t\t\t},\n\t\t\t\t\tisMigrationApplied(id: string) {\n\t\t\t\t\t\tconst row = db\n\t\t\t\t\t\t\t.prepare('SELECT COUNT(*) AS count FROM _kora_migrations WHERE id = ?')\n\t\t\t\t\t\t\t.get(id)\n\t\t\t\t\t\treturn (row?.count ?? 0) > 0\n\t\t\t\t\t},\n\t\t\t\t\tclose() {\n\t\t\t\t\t\tdb.close()\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t} catch {\n\t\tthrow new Error(\n\t\t\t'SQLite migration apply requires the \"better-sqlite3\" package in the target project dependencies.',\n\t\t)\n\t}\n}\n\nasync function runPostgresMigration(\n\tconnectionString: string,\n\tstatements: string[],\n\tmigrationId: string,\n\tfromVersion: number,\n\ttoVersion: number,\n\tclientFactoryOverride?: RunMigrationOptions['postgresClientFactory'],\n): Promise<BackendApplyReport> {\n\tconst sql =\n\t\ttypeof clientFactoryOverride === 'function'\n\t\t\t? clientFactoryOverride(connectionString)\n\t\t\t: (await loadPostgresModule()).default(connectionString)\n\tlet statementsApplied = 0\n\n\ttry {\n\t\tawait sql.unsafe('BEGIN')\n\t\tawait sql.unsafe(\n\t\t\t'CREATE TABLE IF NOT EXISTS _kora_migrations (id TEXT PRIMARY KEY, from_version INTEGER NOT NULL, to_version INTEGER NOT NULL, applied_at BIGINT NOT NULL)',\n\t\t)\n\t\tconst existing = (await sql.unsafe(\n\t\t\t`SELECT COUNT(*)::int AS count FROM _kora_migrations WHERE id = ${sqlLiteral(migrationId)}`,\n\t\t)) as Array<{ count: number }>\n\t\tif ((existing[0]?.count ?? 0) > 0) {\n\t\t\tawait sql.unsafe('COMMIT')\n\t\t\treturn {\n\t\t\t\tbackend: 'postgres',\n\t\t\t\tstatementsApplied: 0,\n\t\t\t\thistoryRecorded: true,\n\t\t\t\tskipped: true,\n\t\t\t}\n\t\t}\n\t\tfor (const statement of statements) {\n\t\t\tawait sql.unsafe(statement)\n\t\t\tstatementsApplied++\n\t\t}\n\t\tawait sql.unsafe(\n\t\t\t`INSERT INTO _kora_migrations (id, from_version, to_version, applied_at) VALUES (${sqlLiteral(migrationId)}, ${fromVersion}, ${toVersion}, ${Date.now()}) ON CONFLICT (id) DO UPDATE SET from_version = EXCLUDED.from_version, to_version = EXCLUDED.to_version, applied_at = EXCLUDED.applied_at`,\n\t\t)\n\t\tawait sql.unsafe('COMMIT')\n\n\t\treturn {\n\t\t\tbackend: 'postgres',\n\t\t\tstatementsApplied,\n\t\t\thistoryRecorded: true,\n\t\t\tskipped: false,\n\t\t}\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait sql.unsafe('ROLLBACK')\n\t\t} catch {\n\t\t\t// best effort\n\t\t}\n\t\tthrow error\n\t} finally {\n\t\tif (typeof sql.end === 'function') {\n\t\t\tawait sql.end()\n\t\t}\n\t}\n}\n\nfunction sqlLiteral(value: string): string {\n\treturn `'${value.replaceAll(\"'\", \"''\")}'`\n}\n\nasync function loadPostgresModule(): Promise<{\n\tdefault: (connectionString: string) => {\n\t\tunsafe: (query: string) => Promise<unknown>\n\t\tend?: () => Promise<void>\n\t}\n}> {\n\ttry {\n\t\tconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n\t\t\tspecifier: string,\n\t\t) => Promise<unknown>\n\t\tconst mod = await dynamicImport('postgres')\n\t\tif (typeof mod === 'object' && mod !== null && 'default' in mod) {\n\t\t\treturn mod as {\n\t\t\t\tdefault: (connectionString: string) => {\n\t\t\t\t\tunsafe: (query: string) => Promise<unknown>\n\t\t\t\t\tend?: () => Promise<void>\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthrow new Error('Invalid postgres module')\n\t} catch {\n\t\tthrow new Error(\n\t\t\t'PostgreSQL migration apply requires the \"postgres\" package in the target project dependencies.',\n\t\t)\n\t}\n}\n","/**\n * Generates a stub operation-transform module for sync-time op log migration.\n */\nexport function generateOperationTransformModule(fromVersion: number, toVersion: number): string {\n\treturn [\n\t\t\"import type { Operation, OperationTransform } from '@korajs/core'\",\n\t\t'',\n\t\t'/**',\n\t\t` * Operation transforms for schema v${fromVersion} → v${toVersion}.`,\n\t\t' * Implement `transform` to rewrite or drop legacy operations during sync.',\n\t\t' * @see https://korajs.dev/docs/migrations',\n\t\t' */',\n\t\t'export const operationTransforms: OperationTransform[] = [',\n\t\t' {',\n\t\t` fromVersion: ${fromVersion},`,\n\t\t` toVersion: ${toVersion},`,\n\t\t' transform(operation: Operation): Operation | null {',\n\t\t' // Return null to drop unmigratable operations.',\n\t\t' return operation',\n\t\t' },',\n\t\t' },',\n\t\t']',\n\t\t'',\n\t].join('\\n')\n}\n","import { defineCommand } from 'citty'\nimport { createLogger } from '../../utils/logger'\n\nconst DEFAULT_SYNC_PORT = 3001\nconst STATUS_ENDPOINT = '/__kora/status'\n\ninterface ServerStatusResponse {\n\trunning: boolean\n\tconnectedClients: number\n\tport: number | null\n\ttotalOperations: number\n\tuptime: number\n\tversion: string\n\tschemaVersion: number\n\tconnectedNodeIds: string[]\n\tpeakConnections: number\n\tconnectionsTotal: number\n\toperationsReceived: number\n\toperationsSent: number\n\terrorCount: number\n}\n\n/**\n * Fetch server status from a Kora sync server.\n */\nasync function fetchServerStatus(url: string, token?: string): Promise<ServerStatusResponse> {\n\tconst statusUrl = `${url.replace(/\\/$/, '')}${STATUS_ENDPOINT}`\n\tconst response = await fetch(statusUrl, {\n\t\theaders: token ? { Authorization: `Bearer ${token}` } : undefined,\n\t})\n\tif (!response.ok) {\n\t\tthrow new Error(\n\t\t\t`Failed to fetch status from ${statusUrl}: ${response.status} ${response.statusText}`,\n\t\t)\n\t}\n\n\treturn (await response.json()) as ServerStatusResponse\n}\n\nfunction formatUptime(ms: number): string {\n\tconst seconds = Math.floor(ms / 1000)\n\tconst minutes = Math.floor(seconds / 60)\n\tconst hours = Math.floor(minutes / 60)\n\tconst days = Math.floor(hours / 24)\n\tconst parts: string[] = []\n\tif (days > 0) parts.push(`${days}d`)\n\tif (hours % 24 > 0) parts.push(`${hours % 24}h`)\n\tif (minutes % 60 > 0) parts.push(`${minutes % 60}m`)\n\tparts.push(`${seconds % 60}s`)\n\treturn parts.join(' ')\n}\n\n/**\n * The `status` command — shows the current status of a Kora sync server.\n */\nexport const statusCommand = defineCommand({\n\tmeta: {\n\t\tname: 'status',\n\t\tdescription: 'Show Kora sync server status',\n\t},\n\targs: {\n\t\turl: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Sync server URL (default: http://localhost:3001)',\n\t\t\tdefault: `http://localhost:${DEFAULT_SYNC_PORT}`,\n\t\t},\n\t\twatch: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Live-updating status (like htop)',\n\t\t\tdefault: false,\n\t\t\talias: 'w',\n\t\t},\n\t\ttoken: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Admin token (defaults to KORA_ADMIN_TOKEN)',\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst logger = createLogger()\n\t\tconst url = typeof args.url === 'string' ? args.url : `http://localhost:${DEFAULT_SYNC_PORT}`\n\t\tconst watch = args.watch === true\n\t\tconst token =\n\t\t\ttypeof args.token === 'string' ? args.token : (process.env.KORA_ADMIN_TOKEN ?? undefined)\n\n\t\ttry {\n\t\t\tif (watch) {\n\t\t\t\t// Live-updating mode\n\t\t\t\tconsole.clear()\n\t\t\t\tlogger.banner()\n\t\t\t\tlogger.info(`Connecting to ${url}...`)\n\n\t\t\t\tconst interval = setInterval(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst status = await fetchServerStatus(url, token)\n\t\t\t\t\t\tprintStatus(status, url, logger)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Clear the previous status output\n\t\t\t\t\t\t// On next iteration, we'll try again\n\t\t\t\t\t}\n\t\t\t\t}, 2000)\n\n\t\t\t\t// Initial fetch\n\t\t\t\ttry {\n\t\t\t\t\tconst status = await fetchServerStatus(url, token)\n\t\t\t\t\tprintStatus(status, url, logger)\n\t\t\t\t} catch {\n\t\t\t\t\t// Will retry on interval\n\t\t\t\t}\n\n\t\t\t\t// Keep running until Ctrl+C\n\t\t\t\tawait new Promise(() => {\n\t\t\t\t\tprocess.on('SIGINT', () => {\n\t\t\t\t\t\tclearInterval(interval)\n\t\t\t\t\t\tprocess.exit(0)\n\t\t\t\t\t})\n\t\t\t\t\tprocess.on('SIGTERM', () => {\n\t\t\t\t\t\tclearInterval(interval)\n\t\t\t\t\t\tprocess.exit(0)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tconst status = await fetchServerStatus(url, token)\n\t\t\t\tprintStatus(status, url, logger)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error(`Failed to connect to ${url}`)\n\t\t\tif (error instanceof Error) {\n\t\t\t\tlogger.error(error.message)\n\t\t\t}\n\t\t\tlogger.blank()\n\t\t\tlogger.step('Make sure the Kora sync server is running.')\n\t\t\tlogger.step('Start it with: kora dev')\n\t\t\tprocess.exit(1)\n\t\t}\n\t},\n})\n\nfunction printStatus(\n\tstatus: ServerStatusResponse,\n\turl: string,\n\tlogger: ReturnType<typeof createLogger>,\n): void {\n\tconsole.clear()\n\tlogger.banner()\n\tlogger.info(`Kora Sync Server — ${url}`)\n\tlogger.blank()\n\n\tif (!status.running) {\n\t\tlogger.error('Server is not running')\n\t\treturn\n\t}\n\n\t// Server info\n\tlogger.step(`Status: Running (uptime: ${formatUptime(status.uptime)}) — v${status.version}`)\n\tlogger.step(`Schema: v${status.schemaVersion}`)\n\tlogger.blank()\n\n\t// Connections\n\tlogger.step(`Connections: ${status.connectedClients} connected`)\n\tlogger.step(` Peak: ${status.peakConnections}`)\n\tlogger.step(` Total: ${status.connectionsTotal}`)\n\n\tif (status.connectedNodeIds.length > 0) {\n\t\tlogger.step(' Active nodes:')\n\t\tfor (const nodeId of status.connectedNodeIds) {\n\t\t\tlogger.step(` • ${nodeId}`)\n\t\t}\n\t}\n\tlogger.blank()\n\n\t// Operations\n\tlogger.step('Operations:')\n\tlogger.step(` Received: ${status.operationsReceived.toLocaleString()}`)\n\tlogger.step(` Sent: ${status.operationsSent.toLocaleString()}`)\n\tlogger.step(` Total: ${status.totalOperations.toLocaleString()}`)\n\tlogger.blank()\n\n\t// Errors\n\tif (status.errorCount > 0) {\n\t\tlogger.warn(`Errors: ${status.errorCount}`)\n\t} else {\n\t\tlogger.step('Errors: 0')\n\t}\n}\n"],"mappings":"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","names":["defineCommand","defineCommand","join","loaded","join","resolve","spawn","extname","pathToFileURL","extname","pathToFileURL","runCommand","resolve","spawn","defineCommand","access","join","resolve","defineCommand","resolve","spawn","join","join","resolve","spawn","defineCommand","join","resolve","access","defineCommand","access","readFile","join","resolve","resolve","access","join","readFile","defineCommand","writeFile","resolve","defineCommand","defineCommand","resolve","extractSchema","writeFile","isSchemaDefinition","defineCommand","DEFAULT_SYNC_PORT","defineCommand","mkdir","readFile","writeFile","dirname","join","resolve","defineCommand","sqlLiteral","defineCommand","resolve","join","mkdir","readFile","dirname","writeFile","defineCommand","DEFAULT_SYNC_PORT","STATUS_ENDPOINT","defineCommand","watch","defineCommand"]}