@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
@@ -0,0 +1,5 @@
1
+ import type { CollectionAccessor } from 'korajs'
2
+
3
+ export function orderedTodos(todos: CollectionAccessor) {
4
+ return todos.where({}).orderBy('createdAt', 'desc')
5
+ }
@@ -0,0 +1,10 @@
1
+ import { t } from 'korajs'
2
+
3
+ export const todos = {
4
+ fields: {
5
+ title: t.string(),
6
+ completed: t.boolean().default(false),
7
+ createdAt: t.timestamp().auto(),
8
+ },
9
+ indexes: ['completed', 'createdAt'],
10
+ }
@@ -0,0 +1,31 @@
1
+ import { useCollection, useMutation, useQuery } from '@korajs/react'
2
+ import {
3
+ type CreateTodoInput,
4
+ type UpdateTodoStatusInput,
5
+ createTodo,
6
+ deleteTodo,
7
+ updateTodoStatus,
8
+ } from './todo.mutations'
9
+ import { orderedTodos } from './todo.queries'
10
+
11
+ export function useTodos() {
12
+ const todos = useCollection('todos')
13
+ const allTodos = useQuery(orderedTodos(todos))
14
+ const addTodo = useMutation((data: CreateTodoInput) => createTodo(todos, data))
15
+ const toggleTodo = useMutation((id: string, data: UpdateTodoStatusInput) =>
16
+ updateTodoStatus(todos, id, data),
17
+ )
18
+ const removeTodo = useMutation((id: string) => deleteTodo(todos, id))
19
+
20
+ const activeTodos = allTodos.filter((todo) => !todo.completed)
21
+ const completedTodos = allTodos.filter((todo) => !!todo.completed)
22
+
23
+ return {
24
+ allTodos,
25
+ activeTodos,
26
+ completedTodos,
27
+ addTodo,
28
+ toggleTodo,
29
+ deleteTodo: removeTodo,
30
+ }
31
+ }
@@ -1,15 +1,9 @@
1
- import { defineSchema, t } from 'korajs'
1
+ import { defineSchema } from 'korajs'
2
+ import { todos } from './modules/todos/todo.schema'
2
3
 
3
4
  export default defineSchema({
4
- version: 1,
5
- collections: {
6
- todos: {
7
- fields: {
8
- title: t.string(),
9
- completed: t.boolean().default(false),
10
- createdAt: t.timestamp().auto(),
11
- },
12
- indexes: ['completed'],
13
- },
14
- },
5
+ version: 1,
6
+ collections: {
7
+ todos,
8
+ },
15
9
  })
@@ -0,0 +1,17 @@
1
+ interface ImportMetaEnv {
2
+ readonly VITE_SYNC_URL?: string
3
+ }
4
+
5
+ interface ImportMeta {
6
+ readonly env: ImportMetaEnv
7
+ }
8
+
9
+ declare module '*?worker&url' {
10
+ const url: string
11
+ export default url
12
+ }
13
+
14
+ declare module '*?url' {
15
+ const url: string
16
+ export default url
17
+ }
@@ -8,8 +8,7 @@
8
8
  "noUncheckedIndexedAccess": true,
9
9
  "esModuleInterop": true,
10
10
  "skipLibCheck": true,
11
- "outDir": "dist",
12
- "types": ["vite/client"]
11
+ "outDir": "dist"
13
12
  },
14
13
  "include": ["src"]
15
14
  }
@@ -1,5 +1,5 @@
1
- import { existsSync, readdirSync, copyFileSync } from 'node:fs'
2
- import { resolve, join } from 'node:path'
1
+ import { copyFileSync, existsSync, readdirSync } from 'node:fs'
2
+ import { join, resolve } from 'node:path'
3
3
  import tailwindcss from '@tailwindcss/vite'
4
4
  import react from '@vitejs/plugin-react'
5
5
  import type { Plugin } from 'vite'
@@ -11,23 +11,23 @@ import { defineConfig } from 'vite'
11
11
  * cannot be used and SQLite WASM falls back to in-memory storage (no persistence).
12
12
  */
13
13
  function crossOriginIsolation(): Plugin {
14
- return {
15
- name: 'cross-origin-isolation',
16
- configureServer(server) {
17
- server.middlewares.use((_req, res, next) => {
18
- res.setHeader('Cross-Origin-Opener-Policy', 'same-origin')
19
- res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp')
20
- next()
21
- })
22
- },
23
- configurePreviewServer(server) {
24
- server.middlewares.use((_req, res, next) => {
25
- res.setHeader('Cross-Origin-Opener-Policy', 'same-origin')
26
- res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp')
27
- next()
28
- })
29
- },
30
- }
14
+ return {
15
+ name: 'cross-origin-isolation',
16
+ configureServer(server) {
17
+ server.middlewares.use((_req, res, next) => {
18
+ res.setHeader('Cross-Origin-Opener-Policy', 'same-origin')
19
+ res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp')
20
+ next()
21
+ })
22
+ },
23
+ configurePreviewServer(server) {
24
+ server.middlewares.use((_req, res, next) => {
25
+ res.setHeader('Cross-Origin-Opener-Policy', 'same-origin')
26
+ res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp')
27
+ next()
28
+ })
29
+ },
30
+ }
31
31
  }
32
32
 
33
33
  /**
@@ -37,50 +37,57 @@ function crossOriginIsolation(): Plugin {
37
37
  * sqlite3 loads it dynamically) so the full OPFS VFS can initialize without errors
38
38
  */
39
39
  function sqliteWasmHotfix(): Plugin {
40
- return {
41
- name: 'sqlite-wasm-hotfix',
42
- apply: 'build',
43
- closeBundle() {
44
- const assetsDir = resolve('dist', 'assets')
45
- if (!existsSync(assetsDir)) return
40
+ return {
41
+ name: 'sqlite-wasm-hotfix',
42
+ apply: 'build',
43
+ closeBundle() {
44
+ const assetsDir = resolve('dist', 'assets')
45
+ if (!existsSync(assetsDir)) return
46
46
 
47
- // Copy hashed sqlite3.wasm to unhashed name
48
- for (const file of readdirSync(assetsDir)) {
49
- if (/^sqlite3-.+\.wasm$/.test(file)) {
50
- copyFileSync(join(assetsDir, file), join(assetsDir, 'sqlite3.wasm'))
51
- break
52
- }
53
- }
47
+ // Copy hashed sqlite3.wasm to unhashed name
48
+ for (const file of readdirSync(assetsDir)) {
49
+ if (/^sqlite3-.+\.wasm$/.test(file)) {
50
+ copyFileSync(join(assetsDir, file), join(assetsDir, 'sqlite3.wasm'))
51
+ break
52
+ }
53
+ }
54
54
 
55
- // Copy OPFS async proxy worker (dynamically loaded by sqlite3, not detected by Vite)
56
- const proxyFile = resolve('node_modules', '@sqlite.org', 'sqlite-wasm', 'sqlite-wasm', 'jswasm', 'sqlite3-opfs-async-proxy.js')
57
- if (existsSync(proxyFile)) {
58
- copyFileSync(proxyFile, join(assetsDir, 'sqlite3-opfs-async-proxy.js'))
59
- }
60
- },
61
- }
55
+ // Copy OPFS async proxy worker (dynamically loaded by sqlite3, not detected by Vite)
56
+ const proxyFile = resolve(
57
+ 'node_modules',
58
+ '@sqlite.org',
59
+ 'sqlite-wasm',
60
+ 'sqlite-wasm',
61
+ 'jswasm',
62
+ 'sqlite3-opfs-async-proxy.js',
63
+ )
64
+ if (existsSync(proxyFile)) {
65
+ copyFileSync(proxyFile, join(assetsDir, 'sqlite3-opfs-async-proxy.js'))
66
+ }
67
+ },
68
+ }
62
69
  }
63
70
 
64
71
  export default defineConfig({
65
- plugins: [react(), tailwindcss(), crossOriginIsolation(), sqliteWasmHotfix()],
66
- worker: {
67
- format: 'es',
68
- },
69
- optimizeDeps: {
70
- exclude: ['@sqlite.org/sqlite-wasm', '@korajs/store'],
71
- include: ['yjs'],
72
- },
73
- resolve: {
74
- dedupe: ['yjs'],
75
- },
76
- server: {
77
- allowedHosts: true,
78
- proxy: {
79
- '/kora-sync': {
80
- target: 'ws://localhost:3001',
81
- ws: true,
82
- rewriteWsOrigin: true,
83
- },
84
- },
85
- },
72
+ plugins: [react(), tailwindcss(), crossOriginIsolation(), sqliteWasmHotfix()],
73
+ worker: {
74
+ format: 'es',
75
+ },
76
+ optimizeDeps: {
77
+ exclude: ['@sqlite.org/sqlite-wasm', '@korajs/store'],
78
+ include: ['yjs'],
79
+ },
80
+ resolve: {
81
+ dedupe: ['yjs'],
82
+ },
83
+ server: {
84
+ allowedHosts: true,
85
+ proxy: {
86
+ '/kora-sync': {
87
+ target: 'ws://localhost:3001',
88
+ ws: true,
89
+ rewriteWsOrigin: true,
90
+ },
91
+ },
92
+ },
86
93
  })
@@ -0,0 +1,3 @@
1
+ # No environment variables required for local-only mode.
2
+ # To enable sync, see the README for instructions.
3
+ # VITE_SYNC_URL=ws://localhost:3001
@@ -0,0 +1,62 @@
1
+ # {{projectName}}
2
+
3
+ An offline-first application built with [Kora.js](https://ehoneahobed.github.io/kora/).
4
+
5
+ ## Getting Started
6
+
7
+ ```bash
8
+ npm run dev
9
+ ```
10
+
11
+ - **App**: http://localhost:5173
12
+
13
+ ## Project Structure
14
+
15
+ ```
16
+ src/
17
+ schema.ts # Schema entry point
18
+ main.tsx # App initialization and Kora setup
19
+ App.tsx # Main application component
20
+ modules/
21
+ todos/
22
+ todo.schema.ts # Todo collection definition
23
+ todo.queries.ts # Reusable todo query builders
24
+ todo.mutations.ts # Todo mutation helpers
25
+ useTodos.ts # React hook connecting todos to the UI
26
+ kora-worker.ts # SQLite WASM web worker
27
+ index.css # Styles
28
+ kora.config.ts # Kora configuration
29
+ ```
30
+
31
+ In a feature module, `schema` defines data shape, `queries` contain reads only, `mutations` contain
32
+ writes, and `useTodos.ts` is the React binding that exposes todo data and actions to components.
33
+
34
+ ## Scripts
35
+
36
+ | Script | Description |
37
+ |--------|-------------|
38
+ | `npm run dev` | Start dev server |
39
+ | `npm run build` | Build for production |
40
+ | `npm run preview` | Preview production build |
41
+
42
+ ## Adding Sync
43
+
44
+ To enable real-time sync across devices, update `src/main.tsx`:
45
+
46
+ ```typescript
47
+ const app = createApp({
48
+ schema,
49
+ sync: {
50
+ url: import.meta.env.VITE_SYNC_URL || 'ws://localhost:3001',
51
+ },
52
+ // ...
53
+ })
54
+ ```
55
+
56
+ Then create a `server.ts` and install `@korajs/server`. See the [Sync Configuration guide](https://ehoneahobed.github.io/kora/guide/sync-configuration).
57
+
58
+ ## Learn More
59
+
60
+ - [Documentation](https://ehoneahobed.github.io/kora/)
61
+ - [Storage Configuration](https://ehoneahobed.github.io/kora/guide/storage-configuration)
62
+ - [Schema Design](https://ehoneahobed.github.io/kora/guide/schema-design)
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>{{projectName}}</title>
7
+ </head>
8
+ <body>
9
+ <div id="app"></div>
10
+ <script type="module" src="/src/main.ts"></script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,12 @@
1
+ import { defineConfig } from 'korajs/config'
2
+
3
+ export default defineConfig({
4
+ schema: './src/schema.ts',
5
+ dev: {
6
+ port: 5173,
7
+ watch: {
8
+ enabled: true,
9
+ debounceMs: 300,
10
+ },
11
+ },
12
+ })
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "{{projectName}}",
3
+ "version": "0.0.1",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "kora dev",
8
+ "build": "vite build",
9
+ "check": "svelte-check --tsconfig ./tsconfig.json",
10
+ "preview": "vite preview"
11
+ },
12
+ "dependencies": {
13
+ "korajs": "{{koraVersion}}",
14
+ "@korajs/svelte": "{{koraVersion}}",
15
+ "@korajs/store": "{{koraVersion}}",
16
+ "@sqlite.org/sqlite-wasm": ">=3.51.0-build1",
17
+ "svelte": "^5.0.0",
18
+ "yjs": "^13.6.30"
19
+ },
20
+ "devDependencies": {
21
+ "@korajs/cli": "{{koraVersion}}",
22
+ "@sveltejs/vite-plugin-svelte": "^5.0.0",
23
+ "svelte-check": "^4.1.0",
24
+ "typescript": "^5.7.0",
25
+ "vite": "^6.0.0"
26
+ }
27
+ }
@@ -0,0 +1,131 @@
1
+ <script lang="ts">
2
+ import { createTodosStores } from './modules/todos/useTodos'
3
+
4
+ type Filter = 'all' | 'active' | 'completed'
5
+
6
+ const { allTodos, activeTodos, completedTodos, addTodo, toggleTodo, deleteTodo } =
7
+ createTodosStores()
8
+
9
+ let filter = $state<Filter>('all')
10
+ let input = $state('')
11
+
12
+ const filteredTodos = $derived(
13
+ filter === 'active'
14
+ ? $activeTodos
15
+ : filter === 'completed'
16
+ ? $completedTodos
17
+ : $allTodos,
18
+ )
19
+
20
+ function handleSubmit(event: SubmitEvent): void {
21
+ event.preventDefault()
22
+ const title = input.trim()
23
+ if (!title) return
24
+ addTodo.mutate({ title })
25
+ input = ''
26
+ }
27
+
28
+ function clearCompleted(): void {
29
+ for (const todo of $completedTodos) {
30
+ deleteTodo.mutate(todo.id)
31
+ }
32
+ }
33
+
34
+ function formatTime(timestamp: number): string {
35
+ const date = new Date(timestamp)
36
+ const now = new Date()
37
+ if (date.toDateString() === now.toDateString()) {
38
+ return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })
39
+ }
40
+ return date.toLocaleDateString([], { month: 'short', day: 'numeric' })
41
+ }
42
+ </script>
43
+
44
+ <div class="app">
45
+ <div class="header">
46
+ <h1>My Tasks</h1>
47
+ </div>
48
+
49
+ <div class="stats">
50
+ <div class="stat-card">
51
+ <div class="label">Total</div>
52
+ <div class="value muted">{$allTodos.length}</div>
53
+ </div>
54
+ <div class="stat-card">
55
+ <div class="label">Remaining</div>
56
+ <div class="value warning">{$activeTodos.length}</div>
57
+ </div>
58
+ <div class="stat-card">
59
+ <div class="label">Done</div>
60
+ <div class="value success">{$completedTodos.length}</div>
61
+ </div>
62
+ </div>
63
+
64
+ <form class="add-form" onsubmit={handleSubmit}>
65
+ <input bind:value={input} type="text" placeholder="What needs to be done?" />
66
+ <button type="submit" disabled={!input.trim()}>Add</button>
67
+ </form>
68
+
69
+ <div class="filters">
70
+ {#each ['all', 'active', 'completed'] as const as f}
71
+ <button
72
+ type="button"
73
+ class="filter-btn {filter === f ? 'active' : ''}"
74
+ onclick={() => (filter = f)}
75
+ >
76
+ {f.charAt(0).toUpperCase() + f.slice(1)}
77
+ <span class="badge">
78
+ {f === 'all'
79
+ ? $allTodos.length
80
+ : f === 'active'
81
+ ? $activeTodos.length
82
+ : $completedTodos.length}
83
+ </span>
84
+ </button>
85
+ {/each}
86
+ </div>
87
+
88
+ <div class="todo-list">
89
+ {#if filteredTodos.length === 0}
90
+ <div class="empty-state">
91
+ {#if filter === 'all'}
92
+ No tasks yet. Add one above!
93
+ {:else if filter === 'active'}
94
+ All caught up! No active tasks.
95
+ {:else}
96
+ No completed tasks yet.
97
+ {/if}
98
+ </div>
99
+ {:else}
100
+ {#each filteredTodos as todo (todo.id)}
101
+ <div class="todo-item">
102
+ <button
103
+ type="button"
104
+ class="toggle {todo.completed ? 'checked' : ''}"
105
+ onclick={() => toggleTodo.mutate(todo.id, { completed: !todo.completed })}
106
+ >
107
+ {todo.completed ? '✓' : ''}
108
+ </button>
109
+ <span class="title {todo.completed ? 'done' : ''}">{String(todo.title)}</span>
110
+ {#if todo.createdAt}
111
+ <span class="time">{formatTime(Number(todo.createdAt))}</span>
112
+ {/if}
113
+ <button type="button" class="delete-btn" onclick={() => deleteTodo.mutate(todo.id)}>
114
+ ×
115
+ </button>
116
+ </div>
117
+ {/each}
118
+ {/if}
119
+ </div>
120
+
121
+ {#if $allTodos.length > 0}
122
+ <div class="footer">
123
+ <span>{$activeTodos.length} item{$activeTodos.length !== 1 ? 's' : ''} left</span>
124
+ {#if $completedTodos.length > 0}
125
+ <button type="button" onclick={clearCompleted}>Clear completed</button>
126
+ {/if}
127
+ </div>
128
+ {/if}
129
+
130
+ <p class="branding">Powered by Kora — offline-first</p>
131
+ </div>
@@ -0,0 +1,14 @@
1
+ <script lang="ts">
2
+ import type { KoraAppLike } from '@korajs/svelte'
3
+ import KoraProvider from '@korajs/svelte/KoraProvider.svelte'
4
+ import App from './App.svelte'
5
+
6
+ let { kora }: { kora: KoraAppLike } = $props()
7
+ </script>
8
+
9
+ <KoraProvider app={kora}>
10
+ {#snippet fallback()}
11
+ <div>Loading...</div>
12
+ {/snippet}
13
+ <App />
14
+ </KoraProvider>