@holo-js/cli 0.2.6 → 0.3.1

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 (51) hide show
  1. package/dist/bin/holo.mjs +417 -109
  2. package/dist/{broadcast-JBQWQZSO.mjs → broadcast-PJLFVZH4.mjs} +12 -12
  3. package/dist/cache-KR4ACOYD.mjs +137 -0
  4. package/dist/{cache-migrations-77TLXIVG.mjs → cache-migrations-J34RE4WH.mjs} +13 -13
  5. package/dist/{chunk-LXGQCG56.mjs → chunk-2XXJ76YC.mjs} +1 -1
  6. package/dist/chunk-3ICVWL2M.mjs +491 -0
  7. package/dist/{chunk-YEFJBN56.mjs → chunk-4VYR2ARA.mjs} +11 -8
  8. package/dist/{chunk-VP2E62DF.mjs → chunk-7KZVFDSI.mjs} +49 -349
  9. package/dist/chunk-AZ6NVJAP.mjs +360 -0
  10. package/dist/chunk-CT23GSEC.mjs +156 -0
  11. package/dist/{chunk-7B2RVYLL.mjs → chunk-FFTJKBQF.mjs} +293 -399
  12. package/dist/{chunk-KS5TWO75.mjs → chunk-I3RRWDLV.mjs} +7 -7
  13. package/dist/{chunk-J76GH2DR.mjs → chunk-L3YATEQY.mjs} +129 -86
  14. package/dist/{chunk-4K4CWMMP.mjs → chunk-L6FF22IV.mjs} +76 -61
  15. package/dist/{chunk-ILU426CF.mjs → chunk-PVVGQSUP.mjs} +482 -2
  16. package/dist/chunk-XBOVM6LO.mjs +41 -0
  17. package/dist/{chunk-I7QBCEV7.mjs → chunk-Y355VYRN.mjs} +5 -3
  18. package/dist/{chunk-VRGB6DIS.mjs → chunk-YJWHIQ45.mjs} +2 -0
  19. package/dist/{config-MD27U4FM.mjs → config-XVPV6DJW.mjs} +3 -3
  20. package/dist/{dev-L4Y2GU2E.mjs → dev-NTQTEY5B.mjs} +9 -8
  21. package/dist/{discovery-GWTBF5RZ.mjs → discovery-TMPUQQHI.mjs} +8 -6
  22. package/dist/{generators-VCYISHWO.mjs → generators-3FDCCJDC.mjs} +16 -15
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.mjs +419 -111
  25. package/dist/{media-migrations-BNVAPYEM.mjs → media-migrations-UJ6BMUSZ.mjs} +12 -12
  26. package/dist/plugins-USHY6SPF.mjs +24 -0
  27. package/dist/{queue-5BXSDFCO.mjs → queue-6U7JU4T6.mjs} +53 -17
  28. package/dist/{queue-D4LSWNS2.mjs → queue-VJEFD6SE.mjs} +55 -19
  29. package/dist/{queue-migrations-EF4AMMSY.mjs → queue-migrations-6YUUOKMH.mjs} +17 -14
  30. package/dist/{runtime-RPMZMTD4.mjs → runtime-FVRB4O2M.mjs} +8 -8
  31. package/dist/{runtime-GSXF4NB3.mjs → runtime-P5R7H3B4.mjs} +1 -1
  32. package/dist/runtime-worker.mjs +7 -1
  33. package/dist/{scaffold-NJ5VH73M.mjs → scaffold-F3AZDNPG.mjs} +9 -4
  34. package/dist/{security-K5PZS3E3.mjs → security-X4274RHX.mjs} +8 -7
  35. package/package.json +35 -8
  36. package/dist/broadcast-YGJFCEPP.mjs +0 -204
  37. package/dist/cache-HUGRWOHQ.mjs +0 -66
  38. package/dist/cache-OSJ4PD52.mjs +0 -66
  39. package/dist/cache-migrations-FKAHRP24.mjs +0 -173
  40. package/dist/chunk-AJLRAC5M.mjs +0 -497
  41. package/dist/chunk-C624G3R2.mjs +0 -3306
  42. package/dist/chunk-D7O4SU6N.mjs +0 -2
  43. package/dist/chunk-FGQ2I2YH.mjs +0 -22
  44. package/dist/chunk-LBJAJLKU.mjs +0 -25
  45. package/dist/dev-YPBQBEOE.mjs +0 -44
  46. package/dist/generators-H4NTV4DB.mjs +0 -520
  47. package/dist/media-migrations-NNB3DAQR.mjs +0 -106
  48. package/dist/queue-migrations-LXEWXJYT.mjs +0 -168
  49. package/dist/runtime-UKBJQFXM.mjs +0 -57
  50. package/dist/scaffold-VV3KTYGO.mjs +0 -139
  51. package/dist/security-JR4P7L2C.mjs +0 -71
@@ -3,12 +3,440 @@ import { mkdtemp, mkdir, readFile, rm, writeFile } from "fs/promises";
3
3
  import { existsSync } from "fs";
4
4
  import { createRequire } from "module";
5
5
  import { basename, dirname, extname as extname2, join as join2, resolve as resolve2 } from "path";
6
- import { pathToFileURL } from "url";
6
+ import { fileURLToPath, pathToFileURL } from "url";
7
7
  import { build } from "esbuild";
8
8
 
9
9
  // src/project/shared.ts
10
10
  import { stat } from "fs/promises";
11
11
  import { extname, join, relative, resolve } from "path";
12
+
13
+ // package.json
14
+ var package_default = {
15
+ name: "@holo-js/cli",
16
+ version: "0.3.1",
17
+ description: "Holo-JS Framework - project creation, discovery, and operational CLI",
18
+ type: "module",
19
+ license: "MIT",
20
+ bin: {
21
+ holo: "./dist/bin/holo.mjs",
22
+ "holo-js": "./dist/bin/holo.mjs"
23
+ },
24
+ exports: {
25
+ ".": {
26
+ types: "./dist/index.d.ts",
27
+ import: "./dist/index.mjs"
28
+ }
29
+ },
30
+ main: "./dist/index.mjs",
31
+ types: "./dist/index.d.ts",
32
+ files: [
33
+ "dist"
34
+ ],
35
+ scripts: {
36
+ build: "node ../../scripts/generate-cli-workspace-catalog.mjs && tsup",
37
+ stub: "node ../../scripts/generate-cli-workspace-catalog.mjs && tsup --watch",
38
+ typecheck: "tsc -p tsconfig.json --noEmit",
39
+ test: "vitest --run && HOLO_CLI_INCLUDE_INTEGRATION=1 vitest --run tests/cli.test.ts",
40
+ "test:integration": "HOLO_CLI_INCLUDE_INTEGRATION=1 vitest --run tests/cli.test.ts"
41
+ },
42
+ dependencies: {
43
+ "@clack/prompts": "catalog:",
44
+ "@holo-js/auth": "catalog:",
45
+ "@holo-js/cache-db": "catalog:",
46
+ "@holo-js/config": "catalog:",
47
+ "@holo-js/core": "catalog:",
48
+ "@holo-js/db": "catalog:",
49
+ "@holo-js/kernel": "catalog:",
50
+ "@holo-js/security": "catalog:",
51
+ "@holo-js/storage": "catalog:",
52
+ esbuild: "catalog:",
53
+ inflection: "catalog:"
54
+ },
55
+ peerDependencies: {
56
+ "@holo-js/broadcast": "catalog:",
57
+ "@holo-js/mail": "catalog:",
58
+ "@holo-js/session": "catalog:",
59
+ "@holo-js/queue": "catalog:"
60
+ },
61
+ peerDependenciesMeta: {
62
+ "@holo-js/broadcast": {
63
+ optional: true
64
+ },
65
+ "@holo-js/mail": {
66
+ optional: true
67
+ },
68
+ "@holo-js/queue": {
69
+ optional: true
70
+ },
71
+ "@holo-js/session": {
72
+ optional: true
73
+ }
74
+ },
75
+ devDependencies: {
76
+ "@holo-js/broadcast": "catalog:",
77
+ "@holo-js/events": "catalog:",
78
+ "@holo-js/mail": "catalog:",
79
+ "@holo-js/queue": "catalog:",
80
+ "@holo-js/queue-db": "catalog:",
81
+ "@holo-js/session": "catalog:",
82
+ "@types/node": "catalog:",
83
+ tsup: "catalog:",
84
+ typescript: "catalog:",
85
+ vitest: "catalog:"
86
+ },
87
+ engines: {
88
+ node: ">=20.11.0"
89
+ }
90
+ };
91
+
92
+ // src/generated/workspaceCatalog.ts
93
+ var WORKSPACE_CATALOG = Object.freeze({
94
+ "@clerk/backend": "^3.4.7",
95
+ "@clack/prompts": "^1.5.1",
96
+ "@eslint/js": "^9.17.0",
97
+ "@holo-js/adapter-next": "^0.3.1",
98
+ "@holo-js/adapter-nuxt": "^0.3.1",
99
+ "@holo-js/adapter-sveltekit": "^0.3.1",
100
+ "@holo-js/adapter-shared": "^0.3.1",
101
+ "@holo-js/auth": "^0.3.1",
102
+ "@holo-js/auth-clerk": "^0.3.1",
103
+ "@holo-js/auth-social": "^0.3.1",
104
+ "@holo-js/auth-social-apple": "^0.3.1",
105
+ "@holo-js/auth-social-discord": "^0.3.1",
106
+ "@holo-js/auth-social-facebook": "^0.3.1",
107
+ "@holo-js/auth-social-github": "^0.3.1",
108
+ "@holo-js/auth-social-google": "^0.3.1",
109
+ "@holo-js/auth-social-linkedin": "^0.3.1",
110
+ "@holo-js/auth-workos": "^0.3.1",
111
+ "@holo-js/authorization": "^0.3.1",
112
+ "@holo-js/broadcast": "^0.3.1",
113
+ "@holo-js/cache": "^0.3.1",
114
+ "@holo-js/cache-db": "^0.3.1",
115
+ "@holo-js/cache-redis": "^0.3.1",
116
+ "@holo-js/cli": "^0.3.1",
117
+ "@holo-js/config": "^0.3.1",
118
+ "@holo-js/core": "^0.3.1",
119
+ "@holo-js/db": "^0.3.1",
120
+ "@holo-js/db-mysql": "^0.3.1",
121
+ "@holo-js/db-postgres": "^0.3.1",
122
+ "@holo-js/db-sqlite": "^0.3.1",
123
+ "@holo-js/events": "^0.3.1",
124
+ "@holo-js/flux": "^0.3.1",
125
+ "@holo-js/flux-react": "^0.3.1",
126
+ "@holo-js/flux-svelte": "^0.3.1",
127
+ "@holo-js/flux-vue": "^0.3.1",
128
+ "@holo-js/forms": "^0.3.1",
129
+ "@holo-js/kernel": "^0.3.1",
130
+ "@holo-js/mail": "^0.3.1",
131
+ "@holo-js/media": "^0.3.1",
132
+ "@holo-js/notifications": "^0.3.1",
133
+ "@holo-js/queue": "^0.3.1",
134
+ "@holo-js/queue-db": "^0.3.1",
135
+ "@holo-js/queue-redis": "^0.3.1",
136
+ "@holo-js/realtime": "^0.3.1",
137
+ "@holo-js/security": "^0.3.1",
138
+ "@holo-js/session": "^0.3.1",
139
+ "@holo-js/storage": "^0.3.1",
140
+ "@holo-js/storage-s3": "^0.3.1",
141
+ "@holo-js/validation": "^0.3.1",
142
+ "@nuxt/kit": "^4.4.4",
143
+ "@nuxt/module-builder": "^1.0.2",
144
+ "@sveltejs/adapter-node": "^5.5.4",
145
+ "@sveltejs/kit": "^2.59.1",
146
+ "@sveltejs/vite-plugin-svelte": "^7.1.0",
147
+ "@types/better-sqlite3": "^7.6.12",
148
+ "@types/node": "^22.10.2",
149
+ "@types/pg": "^8.11.0",
150
+ "@types/react": "^19.2.14",
151
+ "@types/react-dom": "^19.2.3",
152
+ "@types/react-test-renderer": "^19.1.0",
153
+ "@types/ws": "^8.18.1",
154
+ "@vitest/coverage-istanbul": "^4.1.5",
155
+ "@vitest/coverage-v8": "^4.1.5",
156
+ "better-sqlite3": "^11.7.0",
157
+ "bullmq": "^5.71.0",
158
+ "create-holo-js": "^0.3.1",
159
+ "esbuild": "^0.27.4",
160
+ "eslint": "^9.17.0",
161
+ "fast-check": "^4.5.3",
162
+ "globals": "^15.14.0",
163
+ "h3": "^1.15.11",
164
+ "inflection": "^3.0.2",
165
+ "ioredis": "^5.4.2",
166
+ "mysql2": "^3.17.1",
167
+ "next": "^16.2.4",
168
+ "nodemailer": "^6.10.1",
169
+ "nuxt": "^4.4.4",
170
+ "pg": "^8.13.0",
171
+ "playwright": "^1.57.0",
172
+ "react": "^19.2.6",
173
+ "react-dom": "^19.2.6",
174
+ "react-test-renderer": "^19.2.6",
175
+ "sharp": "^0.34.4",
176
+ "svelte": "^5.55.5",
177
+ "svelte-check": "^4.4.6",
178
+ "tslib": "^2.8.1",
179
+ "tsup": "^8.3.5",
180
+ "typescript": "^5.7.2",
181
+ "typescript-eslint": "^8.30.1",
182
+ "ulid": "^3.0.1",
183
+ "uuid": "^12.0.0",
184
+ "valibot": "^1.1.0",
185
+ "vite": "^8.0.10",
186
+ "vitepress": "^1.6.3",
187
+ "vitest": "^4.1.5",
188
+ "vue": "^3.5.13",
189
+ "vue-router": "^5.0.4",
190
+ "vue-tsc": "^2.2.0",
191
+ "ws": "^8.18.3"
192
+ });
193
+
194
+ // src/metadata.ts
195
+ var HOLO_PACKAGE_VERSION = package_default.version;
196
+ var HOLO_PACKAGE_RANGE = `^${HOLO_PACKAGE_VERSION}`;
197
+ function catalogVersion(packageName) {
198
+ return WORKSPACE_CATALOG[packageName];
199
+ }
200
+ var ESBUILD_PACKAGE_VERSION = catalogVersion("esbuild");
201
+ var SCAFFOLD_PACKAGE_MANAGER_VERSIONS = Object.freeze({
202
+ npm: "npm@latest",
203
+ pnpm: "pnpm@latest",
204
+ yarn: "yarn@stable",
205
+ bun: "bun@1.3.9"
206
+ });
207
+ var SCAFFOLD_FRAMEWORK_VERSIONS = Object.freeze({
208
+ nuxt: catalogVersion("nuxt"),
209
+ next: catalogVersion("next"),
210
+ sveltekit: catalogVersion("@sveltejs/kit")
211
+ });
212
+ var SCAFFOLD_NEXT_REACT_VERSIONS = Object.freeze({
213
+ react: catalogVersion("react"),
214
+ "react-dom": catalogVersion("react-dom"),
215
+ "@types/react": catalogVersion("@types/react"),
216
+ "@types/react-dom": catalogVersion("@types/react-dom")
217
+ });
218
+ var SCAFFOLD_BASE_DEV_DEPENDENCY_VERSIONS = Object.freeze({
219
+ typescript: catalogVersion("typescript"),
220
+ "@types/node": catalogVersion("@types/node"),
221
+ "@eslint/js": catalogVersion("@eslint/js"),
222
+ eslint: catalogVersion("eslint"),
223
+ globals: catalogVersion("globals"),
224
+ "typescript-eslint": catalogVersion("typescript-eslint")
225
+ });
226
+ var SCAFFOLD_NUXT_DEPENDENCY_VERSIONS = Object.freeze({
227
+ vue: catalogVersion("vue"),
228
+ "vue-router": catalogVersion("vue-router"),
229
+ "vue-tsc": catalogVersion("vue-tsc")
230
+ });
231
+ var SCAFFOLD_SVELTEKIT_DEPENDENCY_VERSIONS = Object.freeze({
232
+ "@sveltejs/adapter-node": catalogVersion("@sveltejs/adapter-node"),
233
+ "@sveltejs/vite-plugin-svelte": catalogVersion("@sveltejs/vite-plugin-svelte"),
234
+ svelte: catalogVersion("svelte"),
235
+ "svelte-check": catalogVersion("svelte-check"),
236
+ vite: catalogVersion("vite")
237
+ });
238
+ var IOREDIS_PACKAGE_VERSION = catalogVersion("ioredis");
239
+ var SCAFFOLD_FRAMEWORK_ADAPTER_VERSIONS = Object.freeze({
240
+ nuxt: HOLO_PACKAGE_RANGE,
241
+ next: HOLO_PACKAGE_RANGE,
242
+ sveltekit: HOLO_PACKAGE_RANGE
243
+ });
244
+ var SCAFFOLD_FRAMEWORK_RUNTIME_VERSIONS = Object.freeze({
245
+ nuxt: {
246
+ "@holo-js/storage": HOLO_PACKAGE_RANGE
247
+ },
248
+ next: {
249
+ "@holo-js/storage": HOLO_PACKAGE_RANGE
250
+ },
251
+ sveltekit: {
252
+ "@holo-js/storage": HOLO_PACKAGE_RANGE
253
+ }
254
+ });
255
+
256
+ // src/project/frameworks.ts
257
+ var FRAMEWORK_DESCRIPTORS = {
258
+ nuxt: {
259
+ id: "nuxt",
260
+ displayName: "Nuxt",
261
+ detectPackages: ["nuxt"],
262
+ adapterPackage: "@holo-js/adapter-nuxt",
263
+ fluxPackage: "@holo-js/flux-vue",
264
+ scaffold: {
265
+ dependencies: {
266
+ nuxt: SCAFFOLD_FRAMEWORK_VERSIONS.nuxt,
267
+ vue: SCAFFOLD_NUXT_DEPENDENCY_VERSIONS.vue,
268
+ "vue-router": SCAFFOLD_NUXT_DEPENDENCY_VERSIONS["vue-router"],
269
+ "@holo-js/adapter-nuxt": SCAFFOLD_FRAMEWORK_ADAPTER_VERSIONS.nuxt
270
+ },
271
+ devDependencies: {
272
+ "vue-tsc": SCAFFOLD_NUXT_DEPENDENCY_VERSIONS["vue-tsc"]
273
+ },
274
+ scripts: {
275
+ postinstall: "nuxt prepare"
276
+ },
277
+ lintScript: "eslint app config server shared tests *.d.ts --fix --no-warn-ignored --no-error-on-unmatched-pattern",
278
+ typecheckScript: "nuxt typecheck",
279
+ defaultUrl: "http://localhost:3000",
280
+ tsconfig: "nuxt",
281
+ vscodeVueHybridMode: true
282
+ },
283
+ runner: {
284
+ commandName: "nuxt",
285
+ buildArgs: ["build"],
286
+ start: [".output/server/index.mjs"],
287
+ startUsesFrameworkBinary: false,
288
+ preloadNextRuntime: false,
289
+ suppressSvelteKitOutput: false,
290
+ nextDevServerConflictHandling: false
291
+ },
292
+ sync: {
293
+ commands: {
294
+ bun: ["bun", "x", "nuxt", "prepare"],
295
+ npm: ["npm", "exec", "--", "nuxt", "prepare"],
296
+ pnpm: ["pnpm", "exec", "nuxt", "prepare"],
297
+ yarn: ["yarn", "run", "nuxt", "prepare"]
298
+ },
299
+ errorLabel: "nuxt prepare"
300
+ },
301
+ capabilities: {
302
+ managedBroadcastAuthRoute: false
303
+ }
304
+ },
305
+ next: {
306
+ id: "next",
307
+ displayName: "Next.js",
308
+ detectPackages: ["next"],
309
+ adapterPackage: "@holo-js/adapter-next",
310
+ fluxPackage: "@holo-js/flux-react",
311
+ scaffold: {
312
+ dependencies: {
313
+ next: SCAFFOLD_FRAMEWORK_VERSIONS.next,
314
+ react: SCAFFOLD_NEXT_REACT_VERSIONS.react,
315
+ "react-dom": SCAFFOLD_NEXT_REACT_VERSIONS["react-dom"],
316
+ "@holo-js/adapter-next": SCAFFOLD_FRAMEWORK_ADAPTER_VERSIONS.next
317
+ },
318
+ devDependencies: {
319
+ "@types/react": SCAFFOLD_NEXT_REACT_VERSIONS["@types/react"],
320
+ "@types/react-dom": SCAFFOLD_NEXT_REACT_VERSIONS["@types/react-dom"]
321
+ },
322
+ scripts: {},
323
+ lintScript: "eslint app config server tests --fix --no-warn-ignored --no-error-on-unmatched-pattern",
324
+ typecheckScript: "tsc -p tsconfig.json --noEmit",
325
+ defaultUrl: "http://localhost:3000",
326
+ tsconfig: "next"
327
+ },
328
+ runner: {
329
+ commandName: "next",
330
+ buildArgs: ["build"],
331
+ start: ["start"],
332
+ startUsesFrameworkBinary: true,
333
+ preloadNextRuntime: true,
334
+ suppressSvelteKitOutput: false,
335
+ nextDevServerConflictHandling: true
336
+ },
337
+ capabilities: {
338
+ managedBroadcastAuthRoute: true
339
+ }
340
+ },
341
+ sveltekit: {
342
+ id: "sveltekit",
343
+ displayName: "SvelteKit",
344
+ detectPackages: ["@sveltejs/kit"],
345
+ adapterPackage: "@holo-js/adapter-sveltekit",
346
+ fluxPackage: "@holo-js/flux-svelte",
347
+ scaffold: {
348
+ dependencies: {
349
+ "@holo-js/adapter-sveltekit": SCAFFOLD_FRAMEWORK_ADAPTER_VERSIONS.sveltekit,
350
+ "@sveltejs/adapter-node": SCAFFOLD_SVELTEKIT_DEPENDENCY_VERSIONS["@sveltejs/adapter-node"],
351
+ "@sveltejs/kit": SCAFFOLD_FRAMEWORK_VERSIONS.sveltekit,
352
+ "@sveltejs/vite-plugin-svelte": SCAFFOLD_SVELTEKIT_DEPENDENCY_VERSIONS["@sveltejs/vite-plugin-svelte"],
353
+ svelte: SCAFFOLD_SVELTEKIT_DEPENDENCY_VERSIONS.svelte,
354
+ vite: SCAFFOLD_SVELTEKIT_DEPENDENCY_VERSIONS.vite
355
+ },
356
+ devDependencies: {
357
+ "svelte-check": SCAFFOLD_SVELTEKIT_DEPENDENCY_VERSIONS["svelte-check"]
358
+ },
359
+ scripts: {},
360
+ lintScript: "eslint src config server tests --fix --no-warn-ignored --no-error-on-unmatched-pattern",
361
+ typecheckScript: "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
362
+ defaultUrl: "http://localhost:5173",
363
+ tsconfig: "sveltekit"
364
+ },
365
+ runner: {
366
+ commandName: "vite",
367
+ buildArgs: ["build", "--logLevel", "error"],
368
+ start: ["build/index.js"],
369
+ startUsesFrameworkBinary: false,
370
+ preloadNextRuntime: false,
371
+ suppressSvelteKitOutput: true,
372
+ nextDevServerConflictHandling: false
373
+ },
374
+ sync: {
375
+ commands: {
376
+ bun: ["bun", "x", "svelte-kit", "sync"],
377
+ npm: ["npm", "exec", "--", "svelte-kit", "sync"],
378
+ pnpm: ["pnpm", "exec", "svelte-kit", "sync"],
379
+ yarn: ["yarn", "run", "svelte-kit", "sync"]
380
+ },
381
+ errorLabel: "svelte-kit sync"
382
+ },
383
+ capabilities: {
384
+ managedBroadcastAuthRoute: false
385
+ }
386
+ }
387
+ };
388
+ var SUPPORTED_FRAMEWORK_IDS = Object.keys(FRAMEWORK_DESCRIPTORS);
389
+ function getFrameworkDescriptor(framework) {
390
+ return FRAMEWORK_DESCRIPTORS[framework];
391
+ }
392
+ function getFrameworkDescriptorById(framework) {
393
+ return Object.values(FRAMEWORK_DESCRIPTORS).find((descriptor) => descriptor.id === framework);
394
+ }
395
+ function isSupportedFrameworkId(framework) {
396
+ return Object.prototype.hasOwnProperty.call(FRAMEWORK_DESCRIPTORS, framework);
397
+ }
398
+ function getFrameworkDescriptorByIdFrom(framework, descriptors) {
399
+ return descriptors.find((descriptor) => descriptor.id === framework) ?? getFrameworkDescriptorById(framework);
400
+ }
401
+ function getFrameworkDescriptorsWith(descriptors) {
402
+ return Object.freeze([
403
+ ...descriptors,
404
+ ...Object.values(FRAMEWORK_DESCRIPTORS)
405
+ ]);
406
+ }
407
+ function detectFrameworkDescriptorFromPackageJson(dependencies, devDependencies, descriptors = Object.values(FRAMEWORK_DESCRIPTORS)) {
408
+ return descriptors.find(
409
+ (descriptor) => descriptor.detectPackages.some((packageName) => dependencies[packageName] || devDependencies[packageName])
410
+ );
411
+ }
412
+ function getFrameworkRuntimeDependencies(framework) {
413
+ return SCAFFOLD_FRAMEWORK_RUNTIME_VERSIONS[framework];
414
+ }
415
+ function getFrameworkRuntimeDependencyVersion(framework, packageName) {
416
+ const version = getFrameworkRuntimeDependencies(framework)[packageName];
417
+ if (!version) {
418
+ throw new Error(`Missing runtime dependency "${packageName}" for framework "${framework}".`);
419
+ }
420
+ return version;
421
+ }
422
+ function getFrameworkBroadcastPackages(framework) {
423
+ const descriptor = getFrameworkDescriptor(framework);
424
+ return descriptor.fluxPackage ? [descriptor.fluxPackage, descriptor.adapterPackage] : [descriptor.adapterPackage];
425
+ }
426
+ function getFrameworkBroadcastPackagesFromDescriptor(descriptor) {
427
+ return descriptor.fluxPackage ? [descriptor.fluxPackage, descriptor.adapterPackage] : [descriptor.adapterPackage];
428
+ }
429
+ function frameworkDescriptorSupportsManagedBroadcastAuthRoute(framework) {
430
+ return framework?.capabilities.managedBroadcastAuthRoute === true;
431
+ }
432
+ function getManagedFrameworkPackageNames() {
433
+ return Object.values(FRAMEWORK_DESCRIPTORS).flatMap((descriptor) => [
434
+ descriptor.adapterPackage,
435
+ ...descriptor.fluxPackage ? [descriptor.fluxPackage] : []
436
+ ]);
437
+ }
438
+
439
+ // src/project/shared.ts
12
440
  var SUPPORTED_AUTH_SOCIAL_PROVIDERS = [
13
441
  "google",
14
442
  "github",
@@ -238,6 +666,42 @@ function resolveDefaultArtifactPath(projectRoot, relativeDir, fileName) {
238
666
 
239
667
  // src/project/runtime.ts
240
668
  var projectModuleBundler = build;
669
+ function createHoloPackageBundlerPlugin(projectRoot) {
670
+ const projectRequire = createRequire(join2(projectRoot, "package.json"));
671
+ const cliRequire = createRequire(import.meta.url);
672
+ return {
673
+ name: "holo-package-bundler",
674
+ setup(buildContext) {
675
+ buildContext.onResolve({ filter: /^@holo-js\// }, ({ importer, path }) => {
676
+ const importerRequire = importer ? createRequire(importer) : void 0;
677
+ const resolvers = [
678
+ ...importerRequire ? [importerRequire.resolve.bind(importerRequire)] : [],
679
+ projectRequire.resolve.bind(projectRequire),
680
+ cliRequire.resolve.bind(cliRequire)
681
+ ];
682
+ for (const resolvePackage of resolvers) {
683
+ try {
684
+ const resolved = resolvePackage(path);
685
+ return {
686
+ path: resolved.startsWith("file:") ? fileURLToPath(resolved) : resolved,
687
+ external: true
688
+ };
689
+ } catch {
690
+ continue;
691
+ }
692
+ }
693
+ const workspaceSpecifier = resolveWorkspacePackageImportSpecifier(path);
694
+ if (workspaceSpecifier) {
695
+ return {
696
+ path: fileURLToPath(workspaceSpecifier),
697
+ external: true
698
+ };
699
+ }
700
+ return void 0;
701
+ });
702
+ }
703
+ };
704
+ }
241
705
  function resolveWorkspacePackageImportSpecifier(specifier) {
242
706
  if (!specifier.startsWith("@holo-js/")) {
243
707
  return void 0;
@@ -341,11 +805,12 @@ async function bundleProjectModule(projectRoot, entryPath, options = {}) {
341
805
  outfile,
342
806
  format: "esm",
343
807
  logLevel: "silent",
344
- packages: "external",
808
+ packages: options.bundleDependencies ? "bundle" : "external",
345
809
  platform: "node",
346
810
  target: "node20",
347
811
  tsconfig: tsconfigPath,
348
812
  sourcemap: false,
813
+ plugins: options.bundleDependencies ? [createHoloPackageBundlerPlugin(projectRoot)] : [],
349
814
  external: [...options.external ?? []]
350
815
  });
351
816
  return {
@@ -415,6 +880,21 @@ function setProjectModuleBundlerForTesting(bundler) {
415
880
  }
416
881
 
417
882
  export {
883
+ HOLO_PACKAGE_VERSION,
884
+ ESBUILD_PACKAGE_VERSION,
885
+ SCAFFOLD_PACKAGE_MANAGER_VERSIONS,
886
+ SCAFFOLD_BASE_DEV_DEPENDENCY_VERSIONS,
887
+ IOREDIS_PACKAGE_VERSION,
888
+ getFrameworkDescriptor,
889
+ isSupportedFrameworkId,
890
+ getFrameworkDescriptorByIdFrom,
891
+ getFrameworkDescriptorsWith,
892
+ detectFrameworkDescriptorFromPackageJson,
893
+ getFrameworkRuntimeDependencyVersion,
894
+ getFrameworkBroadcastPackages,
895
+ getFrameworkBroadcastPackagesFromDescriptor,
896
+ frameworkDescriptorSupportsManagedBroadcastAuthRoute,
897
+ getManagedFrameworkPackageNames,
418
898
  SUPPORTED_AUTH_SOCIAL_PROVIDERS,
419
899
  AUTH_SOCIAL_PROVIDER_PACKAGE_NAMES,
420
900
  APP_CONFIG_FILE_NAMES,
@@ -0,0 +1,41 @@
1
+ // src/database-drivers.ts
2
+ import { createRequire } from "module";
3
+ import { join } from "path";
4
+ import { pathToFileURL } from "url";
5
+ import { registerDatabaseDriverFactory } from "@holo-js/db";
6
+ async function loadProjectDatabaseDrivers(projectRoot, config) {
7
+ const packageByDriver = {
8
+ sqlite: { packageName: "@holo-js/db-sqlite", factoryExport: "sqliteDatabaseDriverFactory" },
9
+ postgres: { packageName: "@holo-js/db-postgres", factoryExport: "postgresDatabaseDriverFactory" },
10
+ mysql: { packageName: "@holo-js/db-mysql", factoryExport: "mysqlDatabaseDriverFactory" }
11
+ };
12
+ const connections = Object.values(config?.connections ?? { default: "./data/database.sqlite" });
13
+ const drivers = /* @__PURE__ */ new Set();
14
+ for (const connection of connections) {
15
+ const driver = (() => {
16
+ if (typeof connection === "string") {
17
+ if (connection.startsWith("postgres://") || connection.startsWith("postgresql://")) return "postgres";
18
+ if (connection.startsWith("mysql://") || connection.startsWith("mysql2://")) return "mysql";
19
+ return "sqlite";
20
+ }
21
+ return connection.driver ?? "sqlite";
22
+ })();
23
+ if (!(driver in packageByDriver)) throw new Error(`Unsupported Holo database driver "${driver}".`);
24
+ drivers.add(driver);
25
+ }
26
+ const require2 = createRequire(join(projectRoot, "package.json"));
27
+ const factories = [];
28
+ for (const driver of drivers) {
29
+ const { packageName, factoryExport } = packageByDriver[driver];
30
+ const module = await import(pathToFileURL(require2.resolve(packageName)).href);
31
+ const factory = module[factoryExport];
32
+ if (!factory) throw new Error(`Database driver package ${packageName} does not export ${factoryExport}.`);
33
+ registerDatabaseDriverFactory(factory);
34
+ factories.push(factory);
35
+ }
36
+ return factories;
37
+ }
38
+
39
+ export {
40
+ loadProjectDatabaseDrivers
41
+ };
@@ -6,7 +6,10 @@ function writeLine(stream, message = "") {
6
6
  }
7
7
  async function runWithSpinner(io, message, task, successMessage = message) {
8
8
  if (!supportsSpinner(io)) {
9
- return task();
9
+ writeLine(io.stdout, message);
10
+ const result = await task();
11
+ writeLine(io.stdout, successMessage);
12
+ return result;
10
13
  }
11
14
  const loading = spinner({
12
15
  input: io.stdin,
@@ -28,6 +31,5 @@ function supportsSpinner(io) {
28
31
 
29
32
  export {
30
33
  writeLine,
31
- runWithSpinner,
32
- supportsSpinner
34
+ runWithSpinner
33
35
  };
@@ -251,6 +251,7 @@ async function resolveNewProjectInput(io, input, prompts = {
251
251
  prompt: (label) => prompt(io, label),
252
252
  choose: (label, allowed, defaultValue) => promptChoice(io, label, allowed, defaultValue),
253
253
  optionalPackages: () => promptOptionalPackages(io)
254
+ }, validateProjectName = async () => {
254
255
  }) {
255
256
  const flagProjectName = resolveStringFlag(input.flags, "name");
256
257
  const positionalProjectName = input.args[0]?.trim();
@@ -262,6 +263,7 @@ async function resolveNewProjectInput(io, input, prompts = {
262
263
  if (!projectName) {
263
264
  throw new Error(interactive ? "Project creation cancelled." : "Missing required argument: Project name.");
264
265
  }
266
+ await validateProjectName(projectName);
265
267
  const framework = resolveStringFlag(input.flags, "framework") ? normalizeChoice(resolveStringFlag(input.flags, "framework"), SUPPORTED_NEW_FRAMEWORKS, "framework") : interactive ? await prompts.choose("Framework", SUPPORTED_NEW_FRAMEWORKS, "nuxt") : "nuxt";
266
268
  const databaseDriver = resolveStringFlag(input.flags, "database") ? normalizeChoice(resolveStringFlag(input.flags, "database"), SUPPORTED_NEW_DATABASE_DRIVERS, "database driver") : interactive ? await prompts.choose("Database driver", SUPPORTED_NEW_DATABASE_DRIVERS, "sqlite") : "sqlite";
267
269
  const packageManager = resolveStringFlag(input.flags, "package-manager") ? normalizeChoice(resolveStringFlag(input.flags, "package-manager"), SUPPORTED_NEW_PACKAGE_MANAGERS, "package manager") : interactive ? await prompts.choose("Package manager", SUPPORTED_NEW_PACKAGE_MANAGERS, "npm") : "npm";
@@ -7,11 +7,11 @@ import {
7
7
  serializeDatabaseConfig,
8
8
  serializeProjectConfig,
9
9
  writeProjectConfig
10
- } from "./chunk-YEFJBN56.mjs";
11
- import "./chunk-J76GH2DR.mjs";
10
+ } from "./chunk-4VYR2ARA.mjs";
11
+ import "./chunk-L3YATEQY.mjs";
12
12
  import {
13
13
  readTextFile
14
- } from "./chunk-ILU426CF.mjs";
14
+ } from "./chunk-PVVGQSUP.mjs";
15
15
  export {
16
16
  defaultProjectConfig,
17
17
  ensureGeneratedSchemaPlaceholder,
@@ -14,16 +14,17 @@ import {
14
14
  runProjectPrepare,
15
15
  runProjectStartServer,
16
16
  toPosixSlashes
17
- } from "./chunk-4K4CWMMP.mjs";
17
+ } from "./chunk-L6FF22IV.mjs";
18
18
  import {
19
19
  hasProjectDependency
20
- } from "./chunk-FGQ2I2YH.mjs";
21
- import "./chunk-D7O4SU6N.mjs";
22
- import "./chunk-VP2E62DF.mjs";
23
- import "./chunk-C624G3R2.mjs";
24
- import "./chunk-YEFJBN56.mjs";
25
- import "./chunk-J76GH2DR.mjs";
26
- import "./chunk-ILU426CF.mjs";
20
+ } from "./chunk-CT23GSEC.mjs";
21
+ import "./chunk-FFTJKBQF.mjs";
22
+ import "./chunk-4VYR2ARA.mjs";
23
+ import "./chunk-7KZVFDSI.mjs";
24
+ import "./chunk-L3YATEQY.mjs";
25
+ import "./chunk-3ICVWL2M.mjs";
26
+ import "./chunk-AZ6NVJAP.mjs";
27
+ import "./chunk-PVVGQSUP.mjs";
27
28
  export {
28
29
  collectDirectoryTree,
29
30
  collectDiscoveryWatchRoots,
@@ -1,18 +1,20 @@
1
1
  import {
2
- collectImportedBindingsBySource,
3
2
  discoverAppCommands,
4
- extractListensToItems,
5
3
  loadRegisteredMigrations,
6
4
  loadRegisteredModels,
7
5
  loadRegisteredSeeders,
8
- prepareProjectDiscovery,
6
+ prepareProjectDiscovery
7
+ } from "./chunk-7KZVFDSI.mjs";
8
+ import "./chunk-L3YATEQY.mjs";
9
+ import {
10
+ collectImportedBindingsBySource,
11
+ extractListensToItems,
9
12
  resolveListenerEventNamesForDiscovery,
10
13
  resolveListenerEventNamesFromSource,
11
14
  resolveNamedExport,
12
15
  resolveNamedExportEntry
13
- } from "./chunk-VP2E62DF.mjs";
14
- import "./chunk-J76GH2DR.mjs";
15
- import "./chunk-ILU426CF.mjs";
16
+ } from "./chunk-AZ6NVJAP.mjs";
17
+ import "./chunk-PVVGQSUP.mjs";
16
18
  export {
17
19
  collectImportedBindingsBySource,
18
20
  discoverAppCommands,