@ykdz/template 0.0.18 → 0.0.20

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 (77) hide show
  1. package/dist/cli.js +61 -24
  2. package/node_modules/@ykdz/template-builtin-source/dist/templates/registry.js +0 -2
  3. package/node_modules/@ykdz/template-builtin-source/dist/templates/vike-app/projection.js +13 -2
  4. package/node_modules/@ykdz/template-builtin-source/dist/templates/vue-app/projection.js +5 -73
  5. package/node_modules/@ykdz/template-builtin-source/dist/templates/vue-hono-app/projection.js +3 -2
  6. package/node_modules/@ykdz/template-builtin-source/package.json +36 -3
  7. package/node_modules/@ykdz/template-builtin-source/templates/preset-source.json +69 -282
  8. package/node_modules/@ykdz/template-builtin-source/templates/rust-bin/src/main.rs +5 -2
  9. package/node_modules/@ykdz/template-builtin-source/templates/rust-bin/turbo.json +2 -1
  10. package/node_modules/@ykdz/template-builtin-source/templates/ts-lib/turbo.json +2 -1
  11. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{drizzle.config.ts → db/drizzle.config.ts} +2 -2
  12. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{database → db/src}/db.ts +1 -1
  13. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/db/src/index.ts +1 -0
  14. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{database → db/src}/queries/todos.ts +4 -8
  15. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{test → db/test}/todos.test.ts +2 -2
  16. package/node_modules/@ykdz/template-builtin-source/templates/{hono-api → vike-app/db}/turbo.json +2 -1
  17. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{pages → web/pages}/index/+Page.telefunc.ts +3 -1
  18. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{pages → web/pages}/index/+Page.vue +1 -2
  19. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/web/playwright.config.ts +43 -0
  20. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/web/scripts/run-playwright.ts +62 -0
  21. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{server → web/server}/app.ts +1 -1
  22. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{test → web/test}/e2e/app.spec.ts +1 -1
  23. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/web/turbo.json +12 -0
  24. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{types → web/types}/global.d.ts +1 -1
  25. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{vite.config.ts → web/vite.config.ts} +1 -0
  26. package/node_modules/@ykdz/template-builtin-source/templates/vue-app/playwright.config.ts +16 -3
  27. package/node_modules/@ykdz/template-builtin-source/templates/vue-app/scripts/run-playwright.ts +38 -1
  28. package/node_modules/@ykdz/template-builtin-source/templates/vue-app/turbo.json +1 -0
  29. package/node_modules/@ykdz/template-builtin-source/templates/vue-hono-app/api/turbo.json +1 -0
  30. package/node_modules/@ykdz/template-builtin-source/templates/vue-hono-app/web/playwright.config.ts +7 -9
  31. package/node_modules/@ykdz/template-builtin-source/templates/vue-hono-app/web/scripts/run-playwright.ts +79 -1
  32. package/node_modules/@ykdz/template-builtin-source/templates/vue-hono-app/web/src/App.vue +4 -5
  33. package/node_modules/@ykdz/template-builtin-source/templates/vue-hono-app/web/src/api.ts +9 -3
  34. package/node_modules/@ykdz/template-builtin-source/templates/vue-hono-app/web/test/e2e/app.spec.ts +1 -1
  35. package/node_modules/@ykdz/template-builtin-source/templates/vue-hono-app/web/turbo.json +1 -0
  36. package/node_modules/@ykdz/template-core/dist/Cargo.lock +16 -0
  37. package/node_modules/@ykdz/template-core/dist/Cargo.toml +12 -0
  38. package/node_modules/@ykdz/template-core/dist/dependency-catalog.d.ts +8 -0
  39. package/node_modules/@ykdz/template-core/dist/dependency-catalog.js +63 -2
  40. package/node_modules/@ykdz/template-core/dist/generated-scenarios.d.ts +1 -1
  41. package/node_modules/@ykdz/template-core/dist/generated-scenarios.js +104 -26
  42. package/node_modules/@ykdz/template-core/dist/next-step-instructions.d.ts +8 -0
  43. package/node_modules/@ykdz/template-core/dist/next-step-instructions.js +65 -0
  44. package/node_modules/@ykdz/template-core/dist/package-addition.js +5 -9
  45. package/node_modules/@ykdz/template-core/dist/package-linking.d.ts +24 -0
  46. package/node_modules/@ykdz/template-core/dist/package-linking.js +35 -0
  47. package/node_modules/@ykdz/template-core/dist/preset-source.d.ts +2 -2
  48. package/node_modules/@ykdz/template-core/dist/projection-capabilities.js +225 -139
  49. package/node_modules/@ykdz/template-core/dist/template-boundary-check.js +46 -10
  50. package/node_modules/@ykdz/template-core/package.json +5 -1
  51. package/node_modules/@ykdz/template-shared/dist/index.d.ts +3 -152
  52. package/node_modules/@ykdz/template-shared/dist/index.js +49 -305
  53. package/node_modules/@ykdz/template-shared/package.json +4 -0
  54. package/package.json +2 -2
  55. package/node_modules/@ykdz/template-builtin-source/dist/templates/hono-api/projection.d.ts +0 -6
  56. package/node_modules/@ykdz/template-builtin-source/dist/templates/hono-api/projection.js +0 -213
  57. package/node_modules/@ykdz/template-builtin-source/templates/hono-api/.github/dependabot.yml +0 -23
  58. package/node_modules/@ykdz/template-builtin-source/templates/hono-api/.github/workflows/check.yml +0 -19
  59. package/node_modules/@ykdz/template-builtin-source/templates/hono-api/src/app.ts +0 -5
  60. package/node_modules/@ykdz/template-builtin-source/templates/hono-api/src/server.ts +0 -15
  61. package/node_modules/@ykdz/template-builtin-source/templates/hono-api/test/app.test.ts +0 -10
  62. package/node_modules/@ykdz/template-builtin-source/templates/hono-api/vitest.config.ts +0 -15
  63. package/node_modules/@ykdz/template-builtin-source/templates/vike-app/playwright.config.ts +0 -23
  64. package/node_modules/@ykdz/template-builtin-source/templates/vue-app/playwright.package-addition.config.ts +0 -22
  65. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{database → db/src}/schema.ts +0 -0
  66. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{+server.ts → web/+server.ts} +0 -0
  67. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{.env.example → web/.env.example} +0 -0
  68. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{assets → web/assets}/logo.svg +0 -0
  69. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{components → web/components}/CounterButton.vue +0 -0
  70. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{components → web/components}/PageShell.vue +0 -0
  71. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{pages → web/pages}/+Head.vue +0 -0
  72. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{pages → web/pages}/+Layout.vue +0 -0
  73. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{pages → web/pages}/+config.ts +0 -0
  74. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{pages → web/pages}/tailwind.css +0 -0
  75. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{server → web/server}/api.ts +0 -0
  76. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{types → web/types}/env.d.ts +0 -0
  77. /package/node_modules/@ykdz/template-builtin-source/templates/vike-app/{vitest.config.ts → web/vitest.config.ts} +0 -0
@@ -27,161 +27,6 @@
27
27
  "path": "shared/oxc/vue"
28
28
  }
29
29
  ],
30
- "fixtureMatrix": {
31
- "initSupport": [
32
- { "preset": "ts-lib" },
33
- { "preset": "hono-api" },
34
- { "preset": "vue-app" },
35
- { "preset": "vike-app" },
36
- { "preset": "vue-hono-app" },
37
- { "preset": "rust-bin" }
38
- ],
39
- "packageAdditionSupport": [
40
- {
41
- "preset": "ts-lib",
42
- "packageLeafName": "fixture-lib"
43
- },
44
- {
45
- "preset": "hono-api",
46
- "packageLeafName": "fixture-api"
47
- },
48
- {
49
- "preset": "vue-app",
50
- "packageLeafName": "fixture-web"
51
- }
52
- ],
53
- "supportedCombinations": [
54
- { "basePreset": "ts-lib", "addedPreset": "ts-lib" },
55
- { "basePreset": "ts-lib", "addedPreset": "hono-api" },
56
- { "basePreset": "ts-lib", "addedPreset": "vue-app" },
57
- { "basePreset": "hono-api", "addedPreset": "ts-lib" },
58
- { "basePreset": "hono-api", "addedPreset": "hono-api" },
59
- { "basePreset": "hono-api", "addedPreset": "vue-app" },
60
- { "basePreset": "vue-app", "addedPreset": "ts-lib" },
61
- { "basePreset": "vue-app", "addedPreset": "hono-api" },
62
- { "basePreset": "vue-app", "addedPreset": "vue-app" },
63
- { "basePreset": "vue-hono-app", "addedPreset": "ts-lib" },
64
- {
65
- "basePreset": "vue-hono-app",
66
- "addedPreset": "ts-lib",
67
- "linkFrom": ["apps/web"]
68
- },
69
- { "basePreset": "vue-hono-app", "addedPreset": "hono-api" },
70
- { "basePreset": "vue-hono-app", "addedPreset": "vue-app" },
71
- { "basePreset": "rust-bin", "addedPreset": "ts-lib" },
72
- { "basePreset": "rust-bin", "addedPreset": "hono-api" },
73
- { "basePreset": "rust-bin", "addedPreset": "vue-app" }
74
- ],
75
- "semanticSkips": [
76
- {
77
- "basePreset": "ts-lib",
78
- "addedPreset": "vue-hono-app",
79
- "reason": "vue-hono-app is an initialization-only full-stack preset."
80
- },
81
- {
82
- "basePreset": "ts-lib",
83
- "addedPreset": "vike-app",
84
- "reason": "vike-app is an initialization-only root application preset."
85
- },
86
- {
87
- "basePreset": "ts-lib",
88
- "addedPreset": "rust-bin",
89
- "reason": "rust-bin is an initialization-only native binary preset."
90
- },
91
- {
92
- "basePreset": "hono-api",
93
- "addedPreset": "vue-hono-app",
94
- "reason": "vue-hono-app is an initialization-only full-stack preset."
95
- },
96
- {
97
- "basePreset": "hono-api",
98
- "addedPreset": "vike-app",
99
- "reason": "vike-app is an initialization-only root application preset."
100
- },
101
- {
102
- "basePreset": "hono-api",
103
- "addedPreset": "rust-bin",
104
- "reason": "rust-bin is an initialization-only native binary preset."
105
- },
106
- {
107
- "basePreset": "vue-app",
108
- "addedPreset": "vue-hono-app",
109
- "reason": "vue-hono-app is an initialization-only full-stack preset."
110
- },
111
- {
112
- "basePreset": "vue-app",
113
- "addedPreset": "vike-app",
114
- "reason": "vike-app is an initialization-only root application preset."
115
- },
116
- {
117
- "basePreset": "vike-app",
118
- "addedPreset": "ts-lib",
119
- "reason": "vike-app is an initialization-only root application preset."
120
- },
121
- {
122
- "basePreset": "vike-app",
123
- "addedPreset": "hono-api",
124
- "reason": "vike-app is an initialization-only root application preset."
125
- },
126
- {
127
- "basePreset": "vike-app",
128
- "addedPreset": "vue-app",
129
- "reason": "vike-app is an initialization-only root application preset."
130
- },
131
- {
132
- "basePreset": "vike-app",
133
- "addedPreset": "vike-app",
134
- "reason": "vike-app is an initialization-only root application preset."
135
- },
136
- {
137
- "basePreset": "vike-app",
138
- "addedPreset": "vue-hono-app",
139
- "reason": "vue-hono-app is an initialization-only full-stack preset."
140
- },
141
- {
142
- "basePreset": "vike-app",
143
- "addedPreset": "rust-bin",
144
- "reason": "rust-bin is an initialization-only native binary preset."
145
- },
146
- {
147
- "basePreset": "vue-hono-app",
148
- "addedPreset": "vike-app",
149
- "reason": "vike-app is an initialization-only root application preset."
150
- },
151
- {
152
- "basePreset": "rust-bin",
153
- "addedPreset": "vike-app",
154
- "reason": "vike-app is an initialization-only root application preset."
155
- },
156
- {
157
- "basePreset": "vue-app",
158
- "addedPreset": "rust-bin",
159
- "reason": "rust-bin is an initialization-only native binary preset."
160
- },
161
- {
162
- "basePreset": "vue-hono-app",
163
- "addedPreset": "vue-hono-app",
164
- "reason": "vue-hono-app is an initialization-only full-stack preset."
165
- },
166
- {
167
- "basePreset": "vue-hono-app",
168
- "addedPreset": "rust-bin",
169
- "reason": "rust-bin is an initialization-only native binary preset."
170
- },
171
- {
172
- "basePreset": "rust-bin",
173
- "addedPreset": "vue-hono-app",
174
- "reason": "vue-hono-app is an initialization-only full-stack preset."
175
- },
176
- {
177
- "basePreset": "rust-bin",
178
- "addedPreset": "rust-bin",
179
- "reason": "rust-bin is an initialization-only native binary preset."
180
- }
181
- ],
182
- "checkRequirements": ["machine-verifiable-next-steps", "root-check-ci"],
183
- "environmentPreparation": ["playwright-browser-assets"]
184
- },
185
30
  "presets": [
186
31
  {
187
32
  "name": "ts-lib",
@@ -219,80 +64,9 @@
219
64
  "packageSourcePreset": "ts-lib",
220
65
  "sourceFiles": ["turbo.json", "src/index.ts", "src/name-schema.ts"]
221
66
  },
222
- { "kind": "strict-typescript-root" },
223
67
  {
224
- "kind": "oxc-format-lint",
225
- "editorCustomizationResourceId": "shared-editor-customization"
68
+ "kind": "strict-typescript-root"
226
69
  },
227
- {
228
- "kind": "node-pnpm-devcontainer",
229
- "devcontainerResourceId": "shared-devcontainer"
230
- },
231
- { "kind": "github-maintenance" }
232
- ]
233
- },
234
- "source": {
235
- "roots": ["ts-lib/.github", "ts-lib/src"],
236
- "files": ["ts-lib/turbo.json"],
237
- "sharedResources": [
238
- "shared-devcontainer",
239
- "shared-editor-customization",
240
- "shared-oxc-node",
241
- "shared-oxc-format",
242
- "shared-oxc-root-tsconfig"
243
- ]
244
- }
245
- },
246
- {
247
- "name": "hono-api",
248
- "title": "Hono API",
249
- "description": "Hono Node API workspace with strict TypeScript tooling.",
250
- "generation": "supported",
251
- "supportedPackageManagers": ["pnpm"],
252
- "supportedProjectKinds": ["multi-package"],
253
- "packageAdditionSupport": "supported",
254
- "features": [
255
- "pnpm-catalog",
256
- "oxc-format-lint",
257
- "strict-typescript",
258
- "root-check",
259
- "fix-command",
260
- "devcontainer",
261
- "github-actions",
262
- "dependabot"
263
- ],
264
- "dependencyCatalog": [
265
- "@hono/node-server",
266
- "@types/node",
267
- "hono",
268
- "oxfmt",
269
- "oxlint",
270
- "oxlint-tsgolint",
271
- "tsc-alias",
272
- "turbo",
273
- "typescript",
274
- "vitest"
275
- ],
276
- "projection": {
277
- "capabilities": [
278
- {
279
- "kind": "workspace-node-packages",
280
- "workspacePackageGlob": "apps/*",
281
- "packages": [
282
- {
283
- "kind": "hono-api",
284
- "path": "apps/api",
285
- "sourceFiles": [
286
- "turbo.json",
287
- "src/app.ts",
288
- "src/server.ts",
289
- "test/app.test.ts",
290
- "vitest.config.ts"
291
- ]
292
- }
293
- ]
294
- },
295
- { "kind": "strict-typescript-root" },
296
70
  {
297
71
  "kind": "oxc-format-lint",
298
72
  "editorCustomizationResourceId": "shared-editor-customization"
@@ -301,12 +75,14 @@
301
75
  "kind": "node-pnpm-devcontainer",
302
76
  "devcontainerResourceId": "shared-devcontainer"
303
77
  },
304
- { "kind": "github-maintenance" }
78
+ {
79
+ "kind": "github-maintenance"
80
+ }
305
81
  ]
306
82
  },
307
83
  "source": {
308
- "roots": ["hono-api/.github", "hono-api/src", "hono-api/test"],
309
- "files": ["hono-api/turbo.json", "hono-api/vitest.config.ts"],
84
+ "roots": ["ts-lib/.github", "ts-lib/src"],
85
+ "files": ["ts-lib/turbo.json"],
310
86
  "sharedResources": [
311
87
  "shared-devcontainer",
312
88
  "shared-editor-customization",
@@ -380,7 +156,9 @@
380
156
  }
381
157
  ]
382
158
  },
383
- { "kind": "strict-typescript-root" },
159
+ {
160
+ "kind": "strict-typescript-root"
161
+ },
384
162
  {
385
163
  "kind": "oxc-format-lint",
386
164
  "editorCustomizationResourceId": "shared-editor-customization"
@@ -389,7 +167,9 @@
389
167
  "kind": "node-pnpm-devcontainer",
390
168
  "devcontainerResourceId": "shared-devcontainer"
391
169
  },
392
- { "kind": "github-maintenance" }
170
+ {
171
+ "kind": "github-maintenance"
172
+ }
393
173
  ]
394
174
  },
395
175
  "source": {
@@ -397,7 +177,6 @@
397
177
  "files": [
398
178
  "vue-app/env.d.ts",
399
179
  "vue-app/index.html",
400
- "vue-app/playwright.package-addition.config.ts",
401
180
  "vue-app/playwright.config.ts",
402
181
  "vue-app/scripts/run-playwright.ts",
403
182
  "vue-app/turbo.json",
@@ -416,7 +195,7 @@
416
195
  {
417
196
  "name": "vike-app",
418
197
  "title": "Vike app",
419
- "description": "Single-package Vike, Hono, Telefunc, Drizzle, and Vue application.",
198
+ "description": "Vike, Hono, Telefunc, Drizzle, and Vue workspace with a separate database package.",
420
199
  "generation": "supported",
421
200
  "supportedPackageManagers": ["pnpm"],
422
201
  "supportedProjectKinds": ["multi-package"],
@@ -459,40 +238,45 @@
459
238
  {
460
239
  "kind": "workspace-node-packages",
461
240
  "workspacePackageGlob": "apps/*",
241
+ "packageLinks": [
242
+ {
243
+ "consumerPackagePath": "apps/web",
244
+ "providerPackagePath": "packages/db"
245
+ }
246
+ ],
462
247
  "packages": [
463
248
  {
464
249
  "kind": "vike-app",
465
250
  "path": "apps/web",
466
251
  "sourceFiles": [
467
- "+server.ts",
468
- ".env.example",
469
- "assets/logo.svg",
470
- "components/CounterButton.vue",
471
- "components/PageShell.vue",
472
- "database/db.ts",
473
- "database/queries/todos.ts",
474
- "database/schema.ts",
475
- "drizzle.config.ts",
476
- "pages/+Head.vue",
477
- "pages/+Layout.vue",
478
- "pages/+config.ts",
479
- "pages/index/+Page.vue",
480
- "pages/index/+Page.telefunc.ts",
481
- "pages/tailwind.css",
482
- "playwright.config.ts",
483
- "server/api.ts",
484
- "server/app.ts",
485
- "test/e2e/app.spec.ts",
486
- "test/todos.test.ts",
487
- "types/env.d.ts",
488
- "types/global.d.ts",
489
- "vite.config.ts",
490
- "vitest.config.ts"
252
+ "web/+server.ts",
253
+ "web/.env.example",
254
+ "web/assets/logo.svg",
255
+ "web/components/CounterButton.vue",
256
+ "web/components/PageShell.vue",
257
+ "web/pages/+Head.vue",
258
+ "web/pages/+Layout.vue",
259
+ "web/pages/+config.ts",
260
+ "web/pages/index/+Page.vue",
261
+ "web/pages/index/+Page.telefunc.ts",
262
+ "web/pages/tailwind.css",
263
+ "web/playwright.config.ts",
264
+ "web/scripts/run-playwright.ts",
265
+ "web/turbo.json",
266
+ "web/server/api.ts",
267
+ "web/server/app.ts",
268
+ "web/test/e2e/app.spec.ts",
269
+ "web/types/env.d.ts",
270
+ "web/types/global.d.ts",
271
+ "web/vite.config.ts",
272
+ "web/vitest.config.ts"
491
273
  ]
492
274
  }
493
275
  ]
494
276
  },
495
- { "kind": "strict-typescript-root" },
277
+ {
278
+ "kind": "strict-typescript-root"
279
+ },
496
280
  {
497
281
  "kind": "oxc-format-lint",
498
282
  "editorCustomizationResourceId": "shared-editor-customization"
@@ -501,27 +285,31 @@
501
285
  "kind": "node-pnpm-devcontainer",
502
286
  "devcontainerResourceId": "shared-devcontainer"
503
287
  },
504
- { "kind": "github-maintenance" }
288
+ {
289
+ "kind": "github-maintenance"
290
+ }
505
291
  ]
506
292
  },
507
293
  "source": {
508
294
  "roots": [
509
295
  "vike-app/.github",
510
- "vike-app/assets",
511
- "vike-app/components",
512
- "vike-app/database",
513
- "vike-app/pages",
514
- "vike-app/server",
515
- "vike-app/test",
516
- "vike-app/types"
296
+ "vike-app/db",
297
+ "vike-app/web/assets",
298
+ "vike-app/web/components",
299
+ "vike-app/web/pages",
300
+ "vike-app/web/scripts",
301
+ "vike-app/web/server",
302
+ "vike-app/web/test",
303
+ "vike-app/web/types"
517
304
  ],
518
305
  "files": [
519
- "vike-app/+server.ts",
520
- "vike-app/.env.example",
521
- "vike-app/drizzle.config.ts",
522
- "vike-app/playwright.config.ts",
523
- "vike-app/vite.config.ts",
524
- "vike-app/vitest.config.ts"
306
+ "vike-app/db/turbo.json",
307
+ "vike-app/web/+server.ts",
308
+ "vike-app/web/.env.example",
309
+ "vike-app/web/playwright.config.ts",
310
+ "vike-app/web/vite.config.ts",
311
+ "vike-app/web/turbo.json",
312
+ "vike-app/web/vitest.config.ts"
525
313
  ],
526
314
  "sharedResources": [
527
315
  "shared-devcontainer",
@@ -535,7 +323,7 @@
535
323
  {
536
324
  "name": "vue-hono-app",
537
325
  "title": "Vue Hono app",
538
- "description": "Full-stack Vue and Hono workspace with Hono RPC typing.",
326
+ "description": "Full-stack Vue and Hono workspace with separated app package boundaries.",
539
327
  "generation": "supported",
540
328
  "supportedPackageManagers": ["pnpm"],
541
329
  "supportedProjectKinds": ["multi-package"],
@@ -611,15 +399,11 @@
611
399
  "api/vitest.config.ts"
612
400
  ]
613
401
  }
614
- ],
615
- "packageLinks": [
616
- {
617
- "consumerPackagePath": "apps/web",
618
- "providerPackagePath": "apps/api"
619
- }
620
402
  ]
621
403
  },
622
- { "kind": "strict-typescript-root" },
404
+ {
405
+ "kind": "strict-typescript-root"
406
+ },
623
407
  {
624
408
  "kind": "oxc-format-lint",
625
409
  "editorCustomizationResourceId": "shared-editor-customization"
@@ -628,7 +412,9 @@
628
412
  "kind": "node-pnpm-devcontainer",
629
413
  "devcontainerResourceId": "shared-devcontainer"
630
414
  },
631
- { "kind": "github-maintenance" }
415
+ {
416
+ "kind": "github-maintenance"
417
+ }
632
418
  ]
633
419
  },
634
420
  "source": {
@@ -684,6 +470,7 @@
684
470
  "kind": "rust-binary-workspace",
685
471
  "workspacePackageGlob": "packages/*",
686
472
  "sourceFiles": ["turbo.json", "src/main.rs"],
473
+ "cargoDependencies": ["anyhow"],
687
474
  "devcontainerResourceId": "shared-devcontainer",
688
475
  "editorCustomizationResourceId": "shared-editor-customization"
689
476
  }
@@ -2,8 +2,11 @@ fn greeting() -> String {
2
2
  format!("Hello from {}", env!("CARGO_PKG_NAME"))
3
3
  }
4
4
 
5
- fn main() {
6
- println!("{}", greeting());
5
+ fn main() -> anyhow::Result<()> {
6
+ use std::io::Write;
7
+
8
+ writeln!(std::io::stdout().lock(), "{}", greeting())?;
9
+ Ok(())
7
10
  }
8
11
 
9
12
  #[cfg(test)]
@@ -1,3 +1,4 @@
1
1
  {
2
- "extends": ["//"]
2
+ "extends": ["//"],
3
+ "tags": ["native"]
3
4
  }
@@ -1,3 +1,4 @@
1
1
  {
2
- "extends": ["//"]
2
+ "extends": ["//"],
3
+ "tags": ["library"]
3
4
  }
@@ -2,8 +2,8 @@ import { defineConfig } from "drizzle-kit";
2
2
 
3
3
  export default defineConfig({
4
4
  dialect: "sqlite",
5
- schema: "./database/schema.ts",
6
- out: "./database/migrations",
5
+ schema: "./src/schema.ts",
6
+ out: "./drizzle/migrations",
7
7
  dbCredentials: {
8
8
  url: process.env.DATABASE_FILE ?? "./data/app.sqlite",
9
9
  },
@@ -3,7 +3,7 @@ import path from "node:path";
3
3
 
4
4
  import { drizzle } from "drizzle-orm/node-sqlite";
5
5
 
6
- import * as schema from "#/database/schema";
6
+ import * as schema from "#db/schema";
7
7
 
8
8
  export type Database = ReturnType<typeof createDatabase>;
9
9
 
@@ -0,0 +1 @@
1
+ export { createDatabase, type Database } from "#db/db";
@@ -1,7 +1,7 @@
1
1
  import { desc, eq } from "drizzle-orm";
2
2
 
3
- import type { Database } from "#/database/db";
4
- import { todos, type NewTodo } from "#/database/schema";
3
+ import type { Database } from "#db/db";
4
+ import { todos, type NewTodo } from "#db/schema";
5
5
 
6
6
  export async function listTodos(db: Database) {
7
7
  return db.select().from(todos).orderBy(desc(todos.createdAt));
@@ -10,9 +10,7 @@ export async function listTodos(db: Database) {
10
10
  export async function createTodo(db: Database, values: NewTodo) {
11
11
  const [todo] = await db.insert(todos).values(values).returning();
12
12
 
13
- if (!todo) {
14
- throw new Error("Failed to create todo");
15
- }
13
+ if (!todo) throw new Error("Failed to create todo");
16
14
 
17
15
  return todo;
18
16
  }
@@ -24,9 +22,7 @@ export async function completeTodo(db: Database, id: number) {
24
22
  .where(eq(todos.id, id))
25
23
  .returning();
26
24
 
27
- if (!todo) {
28
- throw new Error(`Todo ${id} was not found`);
29
- }
25
+ if (!todo) throw new Error(`Todo ${id} was not found`);
30
26
 
31
27
  return todo;
32
28
  }
@@ -1,7 +1,7 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
 
3
- import { createDatabase } from "#/database/db";
4
- import { createTodo, listTodos } from "#/database/queries/todos";
3
+ import { createDatabase } from "#db/db";
4
+ import { createTodo, listTodos } from "#db/queries/todos";
5
5
 
6
6
  describe("todo queries", () => {
7
7
  it("creates and lists todos through Drizzle SQLite", async () => {
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "extends": ["//"],
3
+ "tags": ["library"],
3
4
  "tasks": {
4
5
  "build:run": {
5
- "outputs": ["dist/**"]
6
+ "outputs": []
6
7
  }
7
8
  }
8
9
  }
@@ -1,6 +1,8 @@
1
1
  import { getContext } from "telefunc";
2
2
 
3
- import { createTodo, listTodos } from "#/database/queries/todos";
3
+ // @template-anchor db-package-import
4
+
5
+ export type Todo = Awaited<ReturnType<typeof onLoadTodos>>[number];
4
6
 
5
7
  export async function onLoadTodos() {
6
8
  const { db } = getContext();
@@ -2,9 +2,8 @@
2
2
  import { ref } from "vue";
3
3
 
4
4
  import CounterButton from "#/components/CounterButton.vue";
5
- import type { Todo } from "#/database/schema";
6
5
 
7
- import { onAddTodo, onLoadTodos } from "./+Page.telefunc";
6
+ import { onAddTodo, onLoadTodos, type Todo } from "./+Page.telefunc";
8
7
 
9
8
  const title = ref("");
10
9
  const todos = ref<Todo[]>([]);
@@ -0,0 +1,43 @@
1
+ import { fileURLToPath } from "node:url";
2
+
3
+ import { defineConfig, devices } from "@playwright/test";
4
+
5
+ function requiredPort(name: string): number {
6
+ const value = process.env[name];
7
+
8
+ if (!value) {
9
+ throw new Error(`${name} must be set by scripts/run-playwright.ts`);
10
+ }
11
+
12
+ return Number(value);
13
+ }
14
+
15
+ const previewPort = requiredPort("PLAYWRIGHT_WEB_PORT");
16
+ const previewUrl = `http://127.0.0.1:${previewPort}`;
17
+ const databaseFile = fileURLToPath(
18
+ new URL("./node_modules/.tmp/e2e.sqlite", import.meta.url),
19
+ );
20
+
21
+ function shellValue(value: string): string {
22
+ return `'${value.replaceAll("'", "'\\''")}'`;
23
+ }
24
+
25
+ export default defineConfig({
26
+ testDir: "./test/e2e",
27
+ timeout: 60_000,
28
+ use: {
29
+ baseURL: previewUrl,
30
+ trace: "on-first-retry",
31
+ },
32
+ webServer: {
33
+ command: `DATABASE_FILE=${shellValue(databaseFile)} pnpm --dir ../../packages/db run db:push && DATABASE_FILE=${shellValue(databaseFile)} PORT=${previewPort} node dist/server/index.mjs`,
34
+ reuseExistingServer: !process.env.CI,
35
+ url: previewUrl,
36
+ },
37
+ projects: [
38
+ {
39
+ name: "chromium",
40
+ use: { ...devices["Desktop Chrome"] },
41
+ },
42
+ ],
43
+ });