@holo-js/cli 0.1.4 → 0.1.5

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 (56) hide show
  1. package/dist/bin/holo.mjs +192 -35
  2. package/dist/{broadcast-CSSARTSA.mjs → broadcast-RT5KVZWP.mjs} +5 -5
  3. package/dist/{cache-4G6QGIZO.mjs → cache-NHCCHT44.mjs} +5 -5
  4. package/dist/{cache-migrations-NATT5WPQ.mjs → cache-migrations-R2RL2RVD.mjs} +15 -16
  5. package/dist/{chunk-EUIVXVJL.mjs → chunk-57SJ566R.mjs} +1 -1
  6. package/dist/chunk-5BLEC66P.mjs +284 -0
  7. package/dist/{chunk-JX2ZH6XY.mjs → chunk-5EU32E7X.mjs} +3 -3
  8. package/dist/{chunk-Q5F6C2D4.mjs → chunk-BAFQ2GOA.mjs} +1 -1
  9. package/dist/{chunk-CUL4RJTG.mjs → chunk-F4MT6GBK.mjs} +1 -1
  10. package/dist/{chunk-3OTCSFDG.mjs → chunk-MXKNQACM.mjs} +544 -82
  11. package/dist/{chunk-QYLSMF7V.mjs → chunk-OZUDZEAW.mjs} +142 -28
  12. package/dist/{chunk-66FHW725.mjs → chunk-R6BWRY3E.mjs} +28 -2
  13. package/dist/{chunk-ZLRO7HXY.mjs → chunk-SCCPDJGO.mjs} +156 -15
  14. package/dist/{chunk-VT5IDQG6.mjs → chunk-UZTDQKIY.mjs} +61 -44
  15. package/dist/{chunk-MZXN2YMI.mjs → chunk-VCEO6N5T.mjs} +3542 -2517
  16. package/dist/{config-LS5USBRB.mjs → config-5JSC6KJG.mjs} +3 -3
  17. package/dist/{dev-LZ3O2E3U.mjs → dev-OSLYSBTL.mjs} +7 -7
  18. package/dist/{discovery-GBLAUTXS.mjs → discovery-JLT2EOGH.mjs} +3 -3
  19. package/dist/{generators-DSN4GWJI.mjs → generators-ZIWACCBE.mjs} +134 -16
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.mjs +189 -32
  22. package/dist/media-migrations-UBAL2YVV.mjs +117 -0
  23. package/dist/{queue-FV35LLPR.mjs → queue-I66EISVS.mjs} +14 -14
  24. package/dist/{queue-migrations-SSIYKK5S.mjs → queue-migrations-UIAMAB6E.mjs} +24 -20
  25. package/dist/{runtime-EFZ5H5IL.mjs → runtime-MMQGO4PP.mjs} +9 -7
  26. package/dist/{runtime-OOSJ5JBY.mjs → runtime-ZKD6URAV.mjs} +1 -1
  27. package/dist/{scaffold-7OTDH4UR.mjs → scaffold-ISDVICNQ.mjs} +18 -5
  28. package/dist/{security-ATKDC26E.mjs → security-OZXTMYXF.mjs} +10 -7
  29. package/package.json +13 -12
  30. package/dist/broadcast-YSIJCL3R.mjs +0 -85
  31. package/dist/cache-OWQY4E7W.mjs +0 -67
  32. package/dist/cache-migrations-RVEA6CEU.mjs +0 -155
  33. package/dist/chunk-BWW5TDFI.mjs +0 -4
  34. package/dist/chunk-D4GG556Y.mjs +0 -23
  35. package/dist/chunk-DMH2B4UQ.mjs +0 -343
  36. package/dist/chunk-ET7UXHHQ.mjs +0 -166
  37. package/dist/chunk-G5ADO27Q.mjs +0 -463
  38. package/dist/chunk-GSQ3HTRO.mjs +0 -165
  39. package/dist/chunk-H7TJ4FB3.mjs +0 -848
  40. package/dist/chunk-ICJR7TS4.mjs +0 -66
  41. package/dist/chunk-M7J3YTHR.mjs +0 -26
  42. package/dist/chunk-QFUSWV3J.mjs +0 -3237
  43. package/dist/chunk-S7P7EBM3.mjs +0 -787
  44. package/dist/chunk-SRWJU3A5.mjs +0 -11
  45. package/dist/chunk-URK7C3VQ.mjs +0 -538
  46. package/dist/chunk-XUYKPU5Q.mjs +0 -272
  47. package/dist/config-DMWBMMGD.mjs +0 -26
  48. package/dist/dev-KQFT7RHR.mjs +0 -43
  49. package/dist/discovery-R733D2PO.mjs +0 -29
  50. package/dist/generators-WX45BI4U.mjs +0 -426
  51. package/dist/queue-6OG7VJ34.mjs +0 -626
  52. package/dist/queue-migrations-NK2EYX3J.mjs +0 -163
  53. package/dist/runtime-4BV3JODY.mjs +0 -56
  54. package/dist/runtime-ANBO7VQM.mjs +0 -33
  55. package/dist/scaffold-DRKBGS2K.mjs +0 -120
  56. package/dist/security-R7VH6W5H.mjs +0 -69
@@ -1,463 +0,0 @@
1
- // src/project/runtime.ts
2
- import { mkdtemp, mkdir, readFile, rm, writeFile } from "fs/promises";
3
- import { existsSync } from "fs";
4
- import { createRequire } from "module";
5
- import { basename, dirname, extname as extname2, join as join2, resolve as resolve2 } from "path";
6
- import { pathToFileURL } from "url";
7
- import { build } from "esbuild";
8
-
9
- // src/project/shared.ts
10
- import { stat } from "fs/promises";
11
- import { extname, join, relative, resolve } from "path";
12
- var SUPPORTED_AUTH_SOCIAL_PROVIDERS = [
13
- "google",
14
- "github",
15
- "discord",
16
- "facebook",
17
- "apple",
18
- "linkedin"
19
- ];
20
- var AUTH_SOCIAL_PROVIDER_PACKAGE_NAMES = {
21
- google: "@holo-js/auth-social-google",
22
- github: "@holo-js/auth-social-github",
23
- discord: "@holo-js/auth-social-discord",
24
- facebook: "@holo-js/auth-social-facebook",
25
- apple: "@holo-js/auth-social-apple",
26
- linkedin: "@holo-js/auth-social-linkedin"
27
- };
28
- var APP_CONFIG_FILE_NAMES = [
29
- "config/app.ts",
30
- "config/app.mts",
31
- "config/app.js",
32
- "config/app.mjs"
33
- ];
34
- var DATABASE_CONFIG_FILE_NAMES = [
35
- "config/database.ts",
36
- "config/database.mts",
37
- "config/database.js",
38
- "config/database.mjs"
39
- ];
40
- var AUTH_CONFIG_FILE_NAMES = [
41
- "config/auth.ts",
42
- "config/auth.mts",
43
- "config/auth.js",
44
- "config/auth.mjs",
45
- "config/auth.cts",
46
- "config/auth.cjs"
47
- ];
48
- var SESSION_CONFIG_FILE_NAMES = [
49
- "config/session.ts",
50
- "config/session.mts",
51
- "config/session.js",
52
- "config/session.mjs",
53
- "config/session.cts",
54
- "config/session.cjs"
55
- ];
56
- var QUEUE_CONFIG_FILE_NAMES = [
57
- "config/queue.ts",
58
- "config/queue.mts",
59
- "config/queue.js",
60
- "config/queue.mjs"
61
- ];
62
- var REDIS_CONFIG_FILE_NAMES = [
63
- "config/redis.ts",
64
- "config/redis.mts",
65
- "config/redis.js",
66
- "config/redis.mjs",
67
- "config/redis.cts",
68
- "config/redis.cjs"
69
- ];
70
- var CACHE_CONFIG_FILE_NAMES = [
71
- "config/cache.ts",
72
- "config/cache.mts",
73
- "config/cache.js",
74
- "config/cache.mjs",
75
- "config/cache.cts",
76
- "config/cache.cjs"
77
- ];
78
- var NOTIFICATIONS_CONFIG_FILE_NAMES = [
79
- "config/notifications.ts",
80
- "config/notifications.mts",
81
- "config/notifications.js",
82
- "config/notifications.mjs",
83
- "config/notifications.cts",
84
- "config/notifications.cjs"
85
- ];
86
- var MAIL_CONFIG_FILE_NAMES = [
87
- "config/mail.ts",
88
- "config/mail.mts",
89
- "config/mail.js",
90
- "config/mail.mjs",
91
- "config/mail.cts",
92
- "config/mail.cjs"
93
- ];
94
- var SECURITY_CONFIG_FILE_NAMES = [
95
- "config/security.ts",
96
- "config/security.mts",
97
- "config/security.js",
98
- "config/security.mjs",
99
- "config/security.cts",
100
- "config/security.cjs"
101
- ];
102
- var BROADCAST_CONFIG_FILE_NAMES = [
103
- "config/broadcast.ts",
104
- "config/broadcast.mts",
105
- "config/broadcast.js",
106
- "config/broadcast.mjs",
107
- "config/broadcast.cts",
108
- "config/broadcast.cjs"
109
- ];
110
- var DB_DRIVER_PACKAGE_NAMES = {
111
- sqlite: "@holo-js/db-sqlite",
112
- postgres: "@holo-js/db-postgres",
113
- mysql: "@holo-js/db-mysql"
114
- };
115
- var COMMAND_FILE_PATTERN = /\.(?:[cm]?ts|[cm]?js)$/;
116
- var MIGRATION_NAME_PATTERN = /^\d{4}_\d{2}_\d{2}_\d{6}_[a-z0-9_]+$/;
117
- var HOLO_RUNTIME_ROOT = join(".holo-js", "runtime");
118
- var CLI_RUNTIME_ROOT = join(HOLO_RUNTIME_ROOT, "cli");
119
- var GENERATED_ROOT = join(".holo-js", "generated");
120
- var GENERATED_INDEX_PATH = join(GENERATED_ROOT, "index.ts");
121
- var GENERATED_METADATA_PATH = join(GENERATED_ROOT, "metadata.ts");
122
- var GENERATED_MODELS_PATH = join(GENERATED_ROOT, "models.ts");
123
- var GENERATED_MIGRATIONS_PATH = join(GENERATED_ROOT, "migrations.ts");
124
- var GENERATED_SEEDERS_PATH = join(GENERATED_ROOT, "seeders.ts");
125
- var GENERATED_COMMANDS_PATH = join(GENERATED_ROOT, "commands.ts");
126
- var GENERATED_JOBS_PATH = join(GENERATED_ROOT, "jobs.ts");
127
- var GENERATED_EVENTS_PATH = join(GENERATED_ROOT, "events.ts");
128
- var GENERATED_LISTENERS_PATH = join(GENERATED_ROOT, "listeners.ts");
129
- var GENERATED_BROADCAST_PATH = join(GENERATED_ROOT, "broadcast.ts");
130
- var GENERATED_CHANNELS_PATH = join(GENERATED_ROOT, "channels.ts");
131
- var GENERATED_BROADCAST_MANIFEST_PATH = join(GENERATED_ROOT, "broadcast-manifest.ts");
132
- var GENERATED_AUTHORIZATION_ROOT = join(GENERATED_ROOT, "authorization");
133
- var GENERATED_AUTHORIZATION_REGISTRY_PATH = join(GENERATED_AUTHORIZATION_ROOT, "registry.ts");
134
- var GENERATED_AUTHORIZATION_TYPES_PATH = join(GENERATED_AUTHORIZATION_ROOT, "types.d.ts");
135
- var GENERATED_CONFIG_TYPES_PATH = join(GENERATED_ROOT, "config.d.ts");
136
- var GENERATED_QUEUE_TYPES_PATH = join(GENERATED_ROOT, "queue.d.ts");
137
- var GENERATED_EVENT_TYPES_PATH = join(GENERATED_ROOT, "events.d.ts");
138
- var GENERATED_BROADCAST_TYPES_PATH = join(GENERATED_ROOT, "broadcast.d.ts");
139
- var GENERATED_REGISTRY_JSON_PATH = join(GENERATED_ROOT, "registry.json");
140
- var GENERATED_TSCONFIG_PATH = join(GENERATED_ROOT, "tsconfig.json");
141
- var GENERATED_GITIGNORE_PATH = join(GENERATED_ROOT, ".gitignore");
142
- var CONFIG_EXTENSION_PRIORITY = [".ts", ".mts", ".js", ".mjs", ".cts", ".cjs"];
143
- var SUPPORTED_CONFIG_EXTENSIONS = new Set(CONFIG_EXTENSION_PRIORITY);
144
- var SUPPORTED_SCAFFOLD_OPTIONAL_PACKAGES = ["storage", "events", "queue", "validation", "forms", "auth", "authorization", "notifications", "mail", "broadcast", "security", "cache"];
145
- var SUPPORTED_QUEUE_INSTALLER_DRIVERS = ["sync", "redis", "database"];
146
- var SUPPORTED_CACHE_INSTALLER_DRIVERS = ["file", "redis", "database"];
147
- var HOLO_EVENT_DEFINITION_MARKER = /* @__PURE__ */ Symbol.for("holo-js.events.definition");
148
- var HOLO_LISTENER_DEFINITION_MARKER = /* @__PURE__ */ Symbol.for("holo-js.events.listener");
149
- function toPosixPath(value) {
150
- return value.replace(/\\/g, "/");
151
- }
152
- function hasEventDefinitionMarker(value) {
153
- return value !== null && typeof value === "object" && HOLO_EVENT_DEFINITION_MARKER in value;
154
- }
155
- function hasListenerDefinitionMarker(value) {
156
- return value !== null && typeof value === "object" && HOLO_LISTENER_DEFINITION_MARKER in value;
157
- }
158
- function isRecord(value) {
159
- return value !== null && typeof value === "object" && !Array.isArray(value);
160
- }
161
- async function pathExists(path) {
162
- try {
163
- await stat(path);
164
- return true;
165
- } catch {
166
- return false;
167
- }
168
- }
169
- function isSupportedScaffoldOptionalPackage(value) {
170
- return SUPPORTED_SCAFFOLD_OPTIONAL_PACKAGES.includes(value);
171
- }
172
- function normalizeScaffoldOptionalPackageName(value) {
173
- const current = value.trim().toLowerCase();
174
- if (current === "validate") {
175
- return "validation";
176
- }
177
- if (current === "form") {
178
- return "forms";
179
- }
180
- return current;
181
- }
182
- function normalizeScaffoldOptionalPackages(value) {
183
- if (!value || value.length === 0) {
184
- return [];
185
- }
186
- const normalized = /* @__PURE__ */ new Set();
187
- for (const entry of value) {
188
- const current = normalizeScaffoldOptionalPackageName(entry);
189
- if (!isSupportedScaffoldOptionalPackage(current)) {
190
- throw new Error(
191
- `Unsupported optional package: ${entry}. Expected one of ${SUPPORTED_SCAFFOLD_OPTIONAL_PACKAGES.join(", ")}.`
192
- );
193
- }
194
- normalized.add(current);
195
- if (current === "forms") {
196
- normalized.add("validation");
197
- }
198
- }
199
- return [...normalized].sort((left, right) => left.localeCompare(right));
200
- }
201
- function isSupportedQueueInstallerDriver(value) {
202
- return SUPPORTED_QUEUE_INSTALLER_DRIVERS.includes(value);
203
- }
204
- function isSupportedCacheInstallerDriver(value) {
205
- return SUPPORTED_CACHE_INSTALLER_DRIVERS.includes(value);
206
- }
207
- function sanitizePackageName(value) {
208
- return value.trim().toLowerCase().replace(/[^a-z0-9-_]+/g, "-").replace(/^-+|-+$/g, "");
209
- }
210
- function makeProjectRelativePath(projectRoot, absolutePath) {
211
- return toPosixPath(relative(projectRoot, absolutePath));
212
- }
213
- function resolveDefaultArtifactPath(projectRoot, relativeDir, fileName) {
214
- return resolve(projectRoot, relativeDir, fileName);
215
- }
216
-
217
- // src/project/runtime.ts
218
- var projectModuleBundler = build;
219
- function resolveWorkspacePackageImportSpecifier(specifier) {
220
- if (!specifier.startsWith("@holo-js/")) {
221
- return void 0;
222
- }
223
- const [, packageName, ...subpathSegments] = specifier.split("/");
224
- if (!packageName) {
225
- return void 0;
226
- }
227
- const subpath = subpathSegments.join("/");
228
- const candidateRoots = [
229
- resolve2(import.meta.dirname, "../../", packageName),
230
- resolve2(import.meta.dirname, "../../../", packageName)
231
- ];
232
- for (const candidateRoot of candidateRoots) {
233
- const candidatePath = join2(candidateRoot, "dist", subpath ? `${subpath}.mjs` : "index.mjs");
234
- if (existsSync(candidatePath)) {
235
- return pathToFileURL(candidatePath).href;
236
- }
237
- }
238
- return void 0;
239
- }
240
- function resolveProjectPackageImportSpecifier(projectRoot, specifier, resolveSpecifier) {
241
- try {
242
- const projectRequire = createRequire(join2(projectRoot, "package.json"));
243
- const resolved = (resolveSpecifier ?? projectRequire.resolve.bind(projectRequire))(specifier);
244
- return pathToFileURL(resolved).href;
245
- } catch {
246
- return resolveWorkspacePackageImportSpecifier(specifier) ?? specifier;
247
- }
248
- }
249
- async function loadQueueDiscoveryModule(projectRoot) {
250
- return await import(resolveProjectPackageImportSpecifier(projectRoot, "@holo-js/queue"));
251
- }
252
- async function loadEventsDiscoveryModule(projectRoot) {
253
- return await import(resolveProjectPackageImportSpecifier(projectRoot, "@holo-js/events"));
254
- }
255
- async function loadBroadcastDiscoveryModule(projectRoot) {
256
- return await import(resolveProjectPackageImportSpecifier(projectRoot, "@holo-js/broadcast"));
257
- }
258
- async function loadAuthorizationDiscoveryModule(projectRoot) {
259
- return await import(resolveProjectPackageImportSpecifier(projectRoot, "@holo-js/authorization"));
260
- }
261
- async function resolveFirstExistingPath(projectRoot, fileNames) {
262
- for (const fileName of fileNames) {
263
- const candidate = join2(projectRoot, fileName);
264
- if (await pathExists(candidate)) {
265
- return candidate;
266
- }
267
- }
268
- return void 0;
269
- }
270
- async function isModulePackage(projectRoot) {
271
- const packageJsonPath = join2(projectRoot, "package.json");
272
- if (!await pathExists(packageJsonPath)) {
273
- return false;
274
- }
275
- try {
276
- const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
277
- return packageJson.type === "module";
278
- } catch {
279
- return false;
280
- }
281
- }
282
- function getProjectTsconfigPath(projectRoot) {
283
- return join2(projectRoot, "tsconfig.json");
284
- }
285
- async function writeLoaderTsconfig(projectRoot, tempDir) {
286
- const projectTsconfigPath = getProjectTsconfigPath(projectRoot);
287
- if (await pathExists(projectTsconfigPath)) {
288
- return projectTsconfigPath;
289
- }
290
- const tsconfigPath = join2(tempDir, "tsconfig.json");
291
- const contents = JSON.stringify({
292
- compilerOptions: {
293
- baseUrl: projectRoot,
294
- paths: {
295
- "~/*": ["./*"],
296
- "@/*": ["./*"]
297
- }
298
- }
299
- }, null, 2);
300
- await writeFile(tsconfigPath, `${contents}
301
- `, "utf8");
302
- return tsconfigPath;
303
- }
304
- async function bundleProjectModule(projectRoot, entryPath, options = {}) {
305
- const runtimeTempRoot = join2(projectRoot, CLI_RUNTIME_ROOT);
306
- await mkdir(runtimeTempRoot, { recursive: true });
307
- const tempDir = await mkdtemp(join2(runtimeTempRoot, "bundle-"));
308
- const tsconfigPath = await writeLoaderTsconfig(projectRoot, tempDir);
309
- const outdir = join2(tempDir, "out");
310
- const outfile = join2(outdir, `${basename(entryPath, extname2(entryPath))}.mjs`);
311
- const cleanup = async () => {
312
- await rm(tempDir, { recursive: true, force: true });
313
- };
314
- try {
315
- await projectModuleBundler({
316
- absWorkingDir: projectRoot,
317
- bundle: true,
318
- entryPoints: [entryPath],
319
- outfile,
320
- format: "esm",
321
- logLevel: "silent",
322
- packages: "external",
323
- platform: "node",
324
- target: "node20",
325
- tsconfig: tsconfigPath,
326
- sourcemap: false,
327
- external: [...options.external ?? []]
328
- });
329
- return {
330
- path: outfile,
331
- cleanup
332
- };
333
- } catch (error) {
334
- await cleanup();
335
- if (error && typeof error === "object" && Array.isArray(error.errors)) {
336
- const message = error.errors.map((entry) => {
337
- if (typeof entry.text === "string" && entry.text.trim()) {
338
- return entry.text;
339
- }
340
- if (typeof entry.message === "string" && entry.message.trim()) {
341
- return entry.message;
342
- }
343
- return "Unknown build error.";
344
- }).join("\n");
345
- throw new Error(message);
346
- }
347
- if (error instanceof Error && error.message) {
348
- throw error;
349
- }
350
- throw new Error(`Failed to load ${entryPath}.`);
351
- }
352
- }
353
- async function importProjectModule(projectRoot, entryPath) {
354
- const bundled = await bundleProjectModule(projectRoot, entryPath);
355
- try {
356
- return await import(`${pathToFileURL(bundled.path).href}?t=${Date.now()}`);
357
- } finally {
358
- await bundled.cleanup();
359
- }
360
- }
361
- async function findProjectRoot(startDir) {
362
- let current = resolve2(startDir);
363
- let fallbackRoot;
364
- while (true) {
365
- if (await resolveFirstExistingPath(current, APP_CONFIG_FILE_NAMES)) {
366
- return current;
367
- }
368
- if (!fallbackRoot && (await pathExists(join2(current, "package.json")) || await pathExists(join2(current, "nuxt.config.ts")) || await pathExists(join2(current, "nuxt.config.js")) || await pathExists(join2(current, "bun.lock")))) {
369
- fallbackRoot = current;
370
- }
371
- const parent = dirname(current);
372
- if (parent === current) {
373
- return fallbackRoot ?? resolve2(startDir);
374
- }
375
- current = parent;
376
- }
377
- }
378
- async function readTextFile(path) {
379
- if (!await pathExists(path)) {
380
- return void 0;
381
- }
382
- return readFile(path, "utf8");
383
- }
384
- async function writeTextFile(path, contents) {
385
- await mkdir(dirname(path), { recursive: true });
386
- await writeFile(path, contents, "utf8");
387
- }
388
- function resetProjectModuleBundlerForTesting() {
389
- projectModuleBundler = build;
390
- }
391
- function setProjectModuleBundlerForTesting(bundler) {
392
- projectModuleBundler = bundler;
393
- }
394
-
395
- export {
396
- SUPPORTED_AUTH_SOCIAL_PROVIDERS,
397
- AUTH_SOCIAL_PROVIDER_PACKAGE_NAMES,
398
- APP_CONFIG_FILE_NAMES,
399
- DATABASE_CONFIG_FILE_NAMES,
400
- AUTH_CONFIG_FILE_NAMES,
401
- SESSION_CONFIG_FILE_NAMES,
402
- QUEUE_CONFIG_FILE_NAMES,
403
- REDIS_CONFIG_FILE_NAMES,
404
- CACHE_CONFIG_FILE_NAMES,
405
- NOTIFICATIONS_CONFIG_FILE_NAMES,
406
- MAIL_CONFIG_FILE_NAMES,
407
- SECURITY_CONFIG_FILE_NAMES,
408
- BROADCAST_CONFIG_FILE_NAMES,
409
- DB_DRIVER_PACKAGE_NAMES,
410
- COMMAND_FILE_PATTERN,
411
- MIGRATION_NAME_PATTERN,
412
- HOLO_RUNTIME_ROOT,
413
- CLI_RUNTIME_ROOT,
414
- GENERATED_ROOT,
415
- GENERATED_INDEX_PATH,
416
- GENERATED_METADATA_PATH,
417
- GENERATED_MODELS_PATH,
418
- GENERATED_MIGRATIONS_PATH,
419
- GENERATED_SEEDERS_PATH,
420
- GENERATED_COMMANDS_PATH,
421
- GENERATED_JOBS_PATH,
422
- GENERATED_EVENTS_PATH,
423
- GENERATED_LISTENERS_PATH,
424
- GENERATED_BROADCAST_PATH,
425
- GENERATED_CHANNELS_PATH,
426
- GENERATED_BROADCAST_MANIFEST_PATH,
427
- GENERATED_AUTHORIZATION_REGISTRY_PATH,
428
- GENERATED_AUTHORIZATION_TYPES_PATH,
429
- GENERATED_CONFIG_TYPES_PATH,
430
- GENERATED_QUEUE_TYPES_PATH,
431
- GENERATED_EVENT_TYPES_PATH,
432
- GENERATED_BROADCAST_TYPES_PATH,
433
- GENERATED_REGISTRY_JSON_PATH,
434
- GENERATED_TSCONFIG_PATH,
435
- GENERATED_GITIGNORE_PATH,
436
- CONFIG_EXTENSION_PRIORITY,
437
- SUPPORTED_CONFIG_EXTENSIONS,
438
- toPosixPath,
439
- hasEventDefinitionMarker,
440
- hasListenerDefinitionMarker,
441
- isRecord,
442
- pathExists,
443
- normalizeScaffoldOptionalPackages,
444
- isSupportedQueueInstallerDriver,
445
- isSupportedCacheInstallerDriver,
446
- sanitizePackageName,
447
- makeProjectRelativePath,
448
- resolveDefaultArtifactPath,
449
- resolveProjectPackageImportSpecifier,
450
- loadQueueDiscoveryModule,
451
- loadEventsDiscoveryModule,
452
- loadBroadcastDiscoveryModule,
453
- loadAuthorizationDiscoveryModule,
454
- resolveFirstExistingPath,
455
- isModulePackage,
456
- bundleProjectModule,
457
- importProjectModule,
458
- findProjectRoot,
459
- readTextFile,
460
- writeTextFile,
461
- resetProjectModuleBundlerForTesting,
462
- setProjectModuleBundlerForTesting
463
- };
@@ -1,165 +0,0 @@
1
- import {
2
- loadGeneratedProjectRegistry
3
- } from "./chunk-H7TJ4FB3.mjs";
4
- import {
5
- APP_CONFIG_FILE_NAMES,
6
- DATABASE_CONFIG_FILE_NAMES,
7
- isModulePackage,
8
- pathExists,
9
- resolveFirstExistingPath
10
- } from "./chunk-G5ADO27Q.mjs";
11
-
12
- // src/project/config.ts
13
- import { mkdir, writeFile } from "fs/promises";
14
- import { dirname, extname, join, resolve } from "path";
15
- import {
16
- loadConfigDirectory,
17
- holoAppDefaults,
18
- holoDatabaseDefaults
19
- } from "@holo-js/config";
20
- import {
21
- DEFAULT_HOLO_PROJECT_PATHS,
22
- normalizeHoloProjectConfig,
23
- renderGeneratedSchemaPlaceholder
24
- } from "@holo-js/db";
25
- async function loadProjectConfig(projectRoot, options = {}) {
26
- const appConfigPath = await resolveFirstExistingPath(projectRoot, APP_CONFIG_FILE_NAMES);
27
- if (!appConfigPath) {
28
- if (options.required) {
29
- throw new Error(`Missing config/app.(ts|mts|js|mjs) in ${projectRoot}. Run a generator command first to create it.`);
30
- }
31
- return {
32
- config: normalizeHoloProjectConfig()
33
- };
34
- }
35
- const loaded = await loadConfigDirectory(projectRoot, {
36
- processEnv: process.env
37
- });
38
- const baseConfig = normalizeHoloProjectConfig({
39
- paths: loaded.app.paths,
40
- database: loaded.database
41
- });
42
- const registry = await loadGeneratedProjectRegistry(projectRoot);
43
- return {
44
- manifestPath: appConfigPath,
45
- config: registry ? normalizeHoloProjectConfig({
46
- paths: baseConfig.paths,
47
- models: registry.models.map((entry) => entry.sourcePath),
48
- migrations: registry.migrations.map((entry) => entry.sourcePath),
49
- seeders: registry.seeders.map((entry) => entry.sourcePath),
50
- database: loaded.database
51
- }) : baseConfig
52
- };
53
- }
54
- async function serializeProjectConfig(projectRoot, config, manifestPath) {
55
- const loaded = await loadConfigDirectory(projectRoot, {
56
- processEnv: process.env
57
- }).catch(() => void 0);
58
- const appConfig = loaded?.app ?? holoAppDefaults;
59
- const contents = JSON.stringify({
60
- name: appConfig.name,
61
- key: appConfig.key,
62
- url: appConfig.url,
63
- debug: appConfig.debug,
64
- env: appConfig.env,
65
- paths: config.paths
66
- }, null, 2);
67
- const extension = extname(manifestPath);
68
- const isCommonJs = extension === ".js" && !await isModulePackage(projectRoot);
69
- if (isCommonJs) {
70
- return [
71
- "const { defineAppConfig } = require('@holo-js/config')",
72
- "",
73
- "module.exports = defineAppConfig(",
74
- contents,
75
- ")",
76
- ""
77
- ].join("\n");
78
- }
79
- return [
80
- "import { defineAppConfig } from '@holo-js/config'",
81
- "",
82
- "export default defineAppConfig(",
83
- contents,
84
- ")",
85
- ""
86
- ].join("\n");
87
- }
88
- async function serializeDatabaseConfig(projectRoot, _targetPath) {
89
- const loaded = await loadConfigDirectory(projectRoot, {
90
- processEnv: process.env
91
- }).catch(() => void 0);
92
- const databaseConfig = loaded?.database ?? holoDatabaseDefaults;
93
- const contents = JSON.stringify({
94
- defaultConnection: databaseConfig.defaultConnection,
95
- connections: databaseConfig.connections
96
- }, null, 2);
97
- return [
98
- "import { defineDatabaseConfig } from '@holo-js/config'",
99
- "",
100
- "export default defineDatabaseConfig(",
101
- contents,
102
- ")",
103
- ""
104
- ].join("\n");
105
- }
106
- async function writeProjectConfig(projectRoot, config, manifestPath) {
107
- const targetPath = manifestPath ?? join(projectRoot, "config/app.ts");
108
- await mkdir(dirname(targetPath), { recursive: true });
109
- await writeFile(targetPath, await serializeProjectConfig(projectRoot, config, targetPath), "utf8");
110
- return targetPath;
111
- }
112
- function resolveGeneratedSchemaPath(projectRoot, config) {
113
- return resolve(projectRoot, config.paths.generatedSchema);
114
- }
115
- async function ensureGeneratedSchemaPlaceholder(projectRoot, config) {
116
- const filePath = resolveGeneratedSchemaPath(projectRoot, config);
117
- if (await pathExists(filePath)) {
118
- return filePath;
119
- }
120
- await mkdir(dirname(filePath), { recursive: true });
121
- await writeFile(filePath, renderGeneratedSchemaPlaceholder(), "utf8");
122
- return filePath;
123
- }
124
- async function ensureProjectConfig(projectRoot) {
125
- const loaded = await loadProjectConfig(projectRoot);
126
- if (loaded.manifestPath) {
127
- await ensureDatabaseConfig(projectRoot);
128
- return loaded;
129
- }
130
- const manifestPath = await writeProjectConfig(projectRoot, normalizeHoloProjectConfig());
131
- await ensureDatabaseConfig(projectRoot);
132
- return {
133
- manifestPath,
134
- config: normalizeHoloProjectConfig()
135
- };
136
- }
137
- async function ensureDatabaseConfig(projectRoot) {
138
- const existingPath = await resolveFirstExistingPath(projectRoot, DATABASE_CONFIG_FILE_NAMES);
139
- if (existingPath) {
140
- return existingPath;
141
- }
142
- const targetPath = join(projectRoot, "config/database.ts");
143
- await mkdir(dirname(targetPath), { recursive: true });
144
- await writeFile(targetPath, await serializeDatabaseConfig(projectRoot, targetPath), "utf8");
145
- return targetPath;
146
- }
147
- function defaultProjectConfig() {
148
- return normalizeHoloProjectConfig({
149
- paths: DEFAULT_HOLO_PROJECT_PATHS,
150
- models: [],
151
- migrations: [],
152
- seeders: []
153
- });
154
- }
155
-
156
- export {
157
- loadProjectConfig,
158
- serializeProjectConfig,
159
- serializeDatabaseConfig,
160
- writeProjectConfig,
161
- resolveGeneratedSchemaPath,
162
- ensureGeneratedSchemaPlaceholder,
163
- ensureProjectConfig,
164
- defaultProjectConfig
165
- };