@open-mercato/cli 0.6.8-develop.6889.1.af4501ca97 → 0.6.8-develop.6892.1.f179677788

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 (106) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/AGENTS.md +6 -1
  3. package/dist/agentic/guides/module-facts.json +113 -113
  4. package/dist/agentic/guides/modules/ai_assistant.md +1 -1
  5. package/dist/agentic/guides/modules/api_docs.md +1 -1
  6. package/dist/agentic/guides/modules/api_keys.md +1 -1
  7. package/dist/agentic/guides/modules/attachments.md +1 -1
  8. package/dist/agentic/guides/modules/audit_logs.md +1 -1
  9. package/dist/agentic/guides/modules/auth.md +1 -1
  10. package/dist/agentic/guides/modules/business_rules.md +1 -1
  11. package/dist/agentic/guides/modules/catalog.md +1 -1
  12. package/dist/agentic/guides/modules/channel_gmail.md +1 -1
  13. package/dist/agentic/guides/modules/channel_imap.md +1 -1
  14. package/dist/agentic/guides/modules/checkout.md +1 -1
  15. package/dist/agentic/guides/modules/communication_channels.md +3 -3
  16. package/dist/agentic/guides/modules/configs.md +1 -1
  17. package/dist/agentic/guides/modules/content.md +1 -1
  18. package/dist/agentic/guides/modules/currencies.md +1 -1
  19. package/dist/agentic/guides/modules/customer_accounts.md +1 -1
  20. package/dist/agentic/guides/modules/customers.md +1 -1
  21. package/dist/agentic/guides/modules/dashboards.md +1 -1
  22. package/dist/agentic/guides/modules/data_sync.md +1 -1
  23. package/dist/agentic/guides/modules/design_system.md +1 -1
  24. package/dist/agentic/guides/modules/dictionaries.md +1 -1
  25. package/dist/agentic/guides/modules/directory.md +1 -1
  26. package/dist/agentic/guides/modules/entities.md +1 -1
  27. package/dist/agentic/guides/modules/events.md +1 -1
  28. package/dist/agentic/guides/modules/feature_toggles.md +1 -1
  29. package/dist/agentic/guides/modules/gateway_stripe.md +1 -1
  30. package/dist/agentic/guides/modules/generators.md +1 -1
  31. package/dist/agentic/guides/modules/inbox_ops.md +1 -1
  32. package/dist/agentic/guides/modules/integrations.md +1 -1
  33. package/dist/agentic/guides/modules/messages.md +1 -1
  34. package/dist/agentic/guides/modules/notifications.md +1 -1
  35. package/dist/agentic/guides/modules/onboarding.md +1 -1
  36. package/dist/agentic/guides/modules/payment_gateways.md +1 -1
  37. package/dist/agentic/guides/modules/perspectives.md +1 -1
  38. package/dist/agentic/guides/modules/planner.md +1 -1
  39. package/dist/agentic/guides/modules/portal.md +1 -1
  40. package/dist/agentic/guides/modules/progress.md +1 -1
  41. package/dist/agentic/guides/modules/query_index.md +1 -1
  42. package/dist/agentic/guides/modules/record_locks.md +1 -1
  43. package/dist/agentic/guides/modules/resources.md +1 -1
  44. package/dist/agentic/guides/modules/sales.md +1 -1
  45. package/dist/agentic/guides/modules/scheduler.md +1 -1
  46. package/dist/agentic/guides/modules/search.md +1 -1
  47. package/dist/agentic/guides/modules/security.md +1 -1
  48. package/dist/agentic/guides/modules/shipping_carriers.md +1 -1
  49. package/dist/agentic/guides/modules/sso.md +1 -1
  50. package/dist/agentic/guides/modules/staff.md +1 -1
  51. package/dist/agentic/guides/modules/storage_s3.md +1 -1
  52. package/dist/agentic/guides/modules/sync_akeneo.md +1 -1
  53. package/dist/agentic/guides/modules/sync_excel.md +1 -1
  54. package/dist/agentic/guides/modules/system_status_overlays.md +1 -1
  55. package/dist/agentic/guides/modules/translations.md +1 -1
  56. package/dist/agentic/guides/modules/webhooks.md +1 -1
  57. package/dist/agentic/guides/modules/wms.md +1 -1
  58. package/dist/agentic/guides/modules/workflows.md +1 -1
  59. package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +1 -0
  60. package/dist/agentic/guides/upstream/manifest.json +2 -2
  61. package/dist/bin.js +20 -34
  62. package/dist/bin.js.map +2 -2
  63. package/dist/lib/cli-bootstrap-mode.js +32 -0
  64. package/dist/lib/cli-bootstrap-mode.js.map +7 -0
  65. package/dist/lib/dev-supervisor-manifest.js +105 -0
  66. package/dist/lib/dev-supervisor-manifest.js.map +7 -0
  67. package/dist/lib/generators/entity-ids.js +11 -24
  68. package/dist/lib/generators/entity-ids.js.map +2 -2
  69. package/dist/lib/generators/module-di.js +10 -23
  70. package/dist/lib/generators/module-di.js.map +2 -2
  71. package/dist/lib/generators/module-entities.js +10 -23
  72. package/dist/lib/generators/module-entities.js.map +2 -2
  73. package/dist/lib/generators/module-registry.js +394 -31
  74. package/dist/lib/generators/module-registry.js.map +2 -2
  75. package/dist/lib/generators/route-manifest-shards.js +170 -0
  76. package/dist/lib/generators/route-manifest-shards.js.map +7 -0
  77. package/dist/lib/queue-worker-supervisor.js.map +2 -2
  78. package/dist/lib/resolver.js +26 -3
  79. package/dist/lib/resolver.js.map +2 -2
  80. package/dist/lib/utils.js +15 -8
  81. package/dist/lib/utils.js.map +2 -2
  82. package/dist/mercato.js +9 -6
  83. package/dist/mercato.js.map +2 -2
  84. package/package.json +6 -6
  85. package/src/__tests__/mercato.test.ts +144 -0
  86. package/src/bin.ts +28 -42
  87. package/src/lib/__tests__/cli-bootstrap-mode.test.ts +22 -0
  88. package/src/lib/__tests__/content-stable-writes.test.ts +74 -0
  89. package/src/lib/__tests__/dev-supervisor-manifest.test.ts +131 -0
  90. package/src/lib/__tests__/queue-worker-supervisor.test.ts +33 -0
  91. package/src/lib/__tests__/resolver.enterprise.test.ts +50 -0
  92. package/src/lib/cli-bootstrap-mode.ts +31 -0
  93. package/src/lib/dev-supervisor-manifest.ts +142 -0
  94. package/src/lib/generators/__tests__/entity-ids.test.ts +32 -0
  95. package/src/lib/generators/__tests__/module-subset.test.ts +248 -0
  96. package/src/lib/generators/__tests__/output-snapshots.test.ts +3 -3
  97. package/src/lib/generators/__tests__/route-manifest-shards.test.ts +62 -0
  98. package/src/lib/generators/entity-ids.ts +10 -26
  99. package/src/lib/generators/module-di.ts +9 -25
  100. package/src/lib/generators/module-entities.ts +9 -25
  101. package/src/lib/generators/module-registry.ts +432 -29
  102. package/src/lib/generators/route-manifest-shards.ts +146 -0
  103. package/src/lib/queue-worker-supervisor.ts +7 -2
  104. package/src/lib/resolver.ts +31 -3
  105. package/src/lib/utils.ts +24 -16
  106. package/src/mercato.ts +15 -6
package/dist/bin.js CHANGED
@@ -3,28 +3,7 @@ import {
3
3
  getTelemetryRuntime,
4
4
  isTelemetryBackendEnabled
5
5
  } from "@open-mercato/shared/lib/telemetry/runtime";
6
- const BOOTSTRAP_FREE_COMMANDS = [
7
- "generate",
8
- "module",
9
- "deploy",
10
- "db",
11
- "init",
12
- "agentic:init",
13
- "telemetry",
14
- "eject",
15
- "test",
16
- "test:integration",
17
- "test:integration:coverage",
18
- "test:integration:spec-coverage",
19
- "test:ephemeral",
20
- "test:integration:interactive",
21
- "umes:list",
22
- "umes:inspect",
23
- "umes:check",
24
- "help",
25
- "--help",
26
- "-h"
27
- ];
6
+ import { resolveCliBootstrapMode } from "./lib/cli-bootstrap-mode.js";
28
7
  function assertNode24Runtime() {
29
8
  const detectedNodeVersion = process.versions.node;
30
9
  const majorVersion = Number.parseInt(detectedNodeVersion.split(".")[0] ?? "0", 10);
@@ -39,24 +18,31 @@ function assertNode24Runtime() {
39
18
  ].join(" ")
40
19
  );
41
20
  }
42
- function needsBootstrap(argv) {
43
- const [, , first] = argv;
44
- if (!first) return false;
45
- return !BOOTSTRAP_FREE_COMMANDS.includes(first);
46
- }
47
- async function tryBootstrap() {
21
+ async function tryBootstrap(mode) {
48
22
  try {
49
- const { bootstrapFromAppRoot } = await import("@open-mercato/shared/lib/bootstrap/dynamicLoader");
50
- const { registerCliModules } = await import("./mercato.js");
51
23
  const { createResolver } = await import("./lib/resolver.js");
52
24
  const resolver = createResolver();
53
25
  const appDir = resolver.getAppDir();
26
+ if (mode === "dev-supervisor") {
27
+ const {
28
+ canUseLightweightDevSupervisor,
29
+ loadDevSupervisorManifest,
30
+ registerDevSupervisorManifest
31
+ } = await import("./lib/dev-supervisor-manifest.js");
32
+ const manifest = loadDevSupervisorManifest(appDir);
33
+ if (canUseLightweightDevSupervisor(manifest)) {
34
+ registerDevSupervisorManifest(manifest);
35
+ return true;
36
+ }
37
+ }
38
+ const { bootstrapFromAppRoot } = await import("@open-mercato/shared/lib/bootstrap/dynamicLoader");
39
+ const { registerCliModules } = await import("./mercato.js");
54
40
  const data = await bootstrapFromAppRoot(appDir);
55
41
  registerCliModules(data.modules);
56
42
  return true;
57
43
  } catch (err) {
58
44
  const message = err instanceof Error ? err.message : String(err);
59
- if (message.includes("Cannot find module") && (message.includes("/generated/") || message.includes(".generated") || message.includes(".mercato"))) {
45
+ if (message.includes("dev-supervisor.generated.json") || message.includes("Cannot find module") && (message.includes("/generated/") || message.includes(".generated") || message.includes(".mercato"))) {
60
46
  return false;
61
47
  }
62
48
  throw err;
@@ -64,15 +50,15 @@ async function tryBootstrap() {
64
50
  }
65
51
  async function main() {
66
52
  assertNode24Runtime();
67
- const requiresBootstrap = needsBootstrap(process.argv);
68
- if (requiresBootstrap) {
53
+ const bootstrapMode = resolveCliBootstrapMode(process.argv);
54
+ if (bootstrapMode !== "none") {
69
55
  const { loadAppEnv } = await import("./lib/load-env.js");
70
56
  await loadAppEnv();
71
57
  if (isTelemetryBackendEnabled()) {
72
58
  const { initTelemetry } = await import("@open-mercato/telemetry");
73
59
  await initTelemetry();
74
60
  }
75
- const bootstrapSucceeded = await tryBootstrap();
61
+ const bootstrapSucceeded = await tryBootstrap(bootstrapMode);
76
62
  if (!bootstrapSucceeded) {
77
63
  console.error("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557");
78
64
  console.error("\u2551 Generated files not found! \u2551");
package/dist/bin.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/bin.ts"],
4
- "sourcesContent": ["/**\n * CLI binary entry point for @open-mercato/cli package.\n *\n * Called from within a Next.js app directory as: yarn mercato <command>\n * Uses dynamic app resolution to find generated files at .mercato/generated/\n */\nimport {\n getTelemetryRuntime,\n isTelemetryBackendEnabled,\n} from '@open-mercato/shared/lib/telemetry/runtime'\n// `run` is imported dynamically inside `main()` so telemetry can initialize\n// before the mercato entry (and its Postgres driver) loads \u2014 see main().\n\n// Commands that can run without bootstrap (without generated files)\n// - generate: creates the generated files\n// - db: uses resolver directly to find modules and migrations\n// - init: runs yarn commands to set up the app\n// - help: just shows help text\nconst BOOTSTRAP_FREE_COMMANDS = [\n 'generate',\n 'module',\n 'deploy',\n 'db',\n 'init',\n 'agentic:init',\n 'telemetry',\n 'eject',\n 'test',\n 'test:integration',\n 'test:integration:coverage',\n 'test:integration:spec-coverage',\n 'test:ephemeral',\n 'test:integration:interactive',\n 'umes:list',\n 'umes:inspect',\n 'umes:check',\n 'help',\n '--help',\n '-h',\n]\n\nfunction assertNode24Runtime(): void {\n const detectedNodeVersion = process.versions.node\n const majorVersion = Number.parseInt(detectedNodeVersion.split('.')[0] ?? '0', 10)\n if (majorVersion >= 24) {\n return\n }\n throw new Error(\n [\n 'Unsupported Node.js runtime.',\n `Cause: Detected Node ${detectedNodeVersion}, but Open Mercato requires Node 24.x.`,\n 'What to do: switch your shell to Node 24 (for example `nvm use 24`), run `yarn install`, then retry.',\n ].join(' '),\n )\n}\n\nfunction needsBootstrap(argv: string[]): boolean {\n const [, , first] = argv\n if (!first) return false // help screen\n return !BOOTSTRAP_FREE_COMMANDS.includes(first)\n}\n\nasync function tryBootstrap(): Promise<boolean> {\n try {\n const { bootstrapFromAppRoot } = await import('@open-mercato/shared/lib/bootstrap/dynamicLoader')\n const { registerCliModules } = await import('./mercato.js')\n // Use the CLI resolver to find the app directory (handles monorepo detection)\n const { createResolver } = await import('./lib/resolver.js')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n const data = await bootstrapFromAppRoot(appDir)\n // Register CLI modules directly to avoid module resolution issues\n registerCliModules(data.modules)\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n // Check if the error is about missing generated files\n if (\n message.includes('Cannot find module') &&\n (message.includes('/generated/') || message.includes('.generated') || message.includes('.mercato'))\n ) {\n return false\n }\n // Re-throw other errors\n throw err\n }\n}\n\nasync function main(): Promise<void> {\n assertNode24Runtime()\n const requiresBootstrap = needsBootstrap(process.argv)\n\n if (requiresBootstrap) {\n // Load the app's `.env` BEFORE initTelemetry(): `run()` only dotenv-loads it\n // later (ensureEnvLoaded), which is too late \u2014 TELEMETRY_BACKEND set only in\n // `.env` would silently resolve to `noop` for worker/scheduler processes.\n // The loader touches only the resolver + dotenv (no `pg`), preserving the\n // instrumentation load-order guarantee below.\n const { loadAppEnv } = await import('./lib/load-env.js')\n await loadAppEnv()\n\n // Initialize telemetry BEFORE bootstrapping the app graph. Bootstrap and the\n // per-command handlers load MikroORM's Postgres driver \u2192 `pg`, and the\n // OpenTelemetry pg/undici auto-instrumentation only records spans for a\n // driver required AFTER the SDK has started. Registering here \u2014 ahead of any\n // app module \u2014 is what lets long-running worker/scheduler processes emit DB\n // spans (not just the bullmq-otel add/process envelope). The package itself\n // is not imported unless an explicit supported backend is selected.\n if (isTelemetryBackendEnabled()) {\n const { initTelemetry } = await import('@open-mercato/telemetry')\n await initTelemetry()\n }\n\n const bootstrapSucceeded = await tryBootstrap()\n if (!bootstrapSucceeded) {\n console.error('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557')\n console.error('\u2551 Generated files not found! \u2551')\n console.error('\u2551 \u2551')\n console.error('\u2551 The CLI requires generated files to discover modules. \u2551')\n console.error('\u2551 Please run the following command first: \u2551')\n console.error('\u2551 \u2551')\n console.error('\u2551 yarn mercato generate \u2551')\n console.error('\u2551 \u2551')\n console.error('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D')\n process.exit(1)\n }\n }\n\n // Dynamic import (not a top-level static import) so the mercato entry \u2014 and the\n // Postgres driver it pulls in \u2014 loads only after initTelemetry() above.\n const { run } = await import('./mercato.js')\n const code = await run(process.argv)\n // Flush spans/logs for commands that return (workers block forever and flush via\n // their own shutdown handler instead).\n await getTelemetryRuntime()?.shutdown()\n process.exit(code ?? 0)\n}\n\nmain().catch((error: unknown) => {\n if (error instanceof Error) {\n console.error(error.message)\n } else {\n console.error(error)\n }\n process.exit(1)\n})\n"],
5
- "mappings": "AAMA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AASP,MAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,sBAA4B;AACnC,QAAM,sBAAsB,QAAQ,SAAS;AAC7C,QAAM,eAAe,OAAO,SAAS,oBAAoB,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE;AACjF,MAAI,gBAAgB,IAAI;AACtB;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR;AAAA,MACE;AAAA,MACA,wBAAwB,mBAAmB;AAAA,MAC3C;AAAA,IACF,EAAE,KAAK,GAAG;AAAA,EACZ;AACF;AAEA,SAAS,eAAe,MAAyB;AAC/C,QAAM,CAAC,EAAE,EAAE,KAAK,IAAI;AACpB,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,CAAC,wBAAwB,SAAS,KAAK;AAChD;AAEA,eAAe,eAAiC;AAC9C,MAAI;AACF,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,kDAAkD;AAChG,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,cAAc;AAE1D,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,mBAAmB;AAC3D,UAAM,WAAW,eAAe;AAChC,UAAM,SAAS,SAAS,UAAU;AAClC,UAAM,OAAO,MAAM,qBAAqB,MAAM;AAE9C,uBAAmB,KAAK,OAAO;AAC/B,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAE/D,QACE,QAAQ,SAAS,oBAAoB,MACpC,QAAQ,SAAS,aAAa,KAAK,QAAQ,SAAS,YAAY,KAAK,QAAQ,SAAS,UAAU,IACjG;AACA,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,OAAsB;AACnC,sBAAoB;AACpB,QAAM,oBAAoB,eAAe,QAAQ,IAAI;AAErD,MAAI,mBAAmB;AAMrB,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,mBAAmB;AACvD,UAAM,WAAW;AASjB,QAAI,0BAA0B,GAAG;AAC/B,YAAM,EAAE,cAAc,IAAI,MAAM,OAAO,yBAAyB;AAChE,YAAM,cAAc;AAAA,IACtB;AAEA,UAAM,qBAAqB,MAAM,aAAa;AAC9C,QAAI,CAAC,oBAAoB;AACvB,cAAQ,MAAM,gaAAuE;AACrF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gaAAuE;AACrF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAIA,QAAM,EAAE,IAAI,IAAI,MAAM,OAAO,cAAc;AAC3C,QAAM,OAAO,MAAM,IAAI,QAAQ,IAAI;AAGnC,QAAM,oBAAoB,GAAG,SAAS;AACtC,UAAQ,KAAK,QAAQ,CAAC;AACxB;AAEA,KAAK,EAAE,MAAM,CAAC,UAAmB;AAC/B,MAAI,iBAAiB,OAAO;AAC1B,YAAQ,MAAM,MAAM,OAAO;AAAA,EAC7B,OAAO;AACL,YAAQ,MAAM,KAAK;AAAA,EACrB;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;",
4
+ "sourcesContent": ["/**\n * CLI binary entry point for @open-mercato/cli package.\n *\n * Called from within a Next.js app directory as: yarn mercato <command>\n * Uses dynamic app resolution to find generated files at .mercato/generated/\n */\nimport {\n getTelemetryRuntime,\n isTelemetryBackendEnabled,\n} from '@open-mercato/shared/lib/telemetry/runtime'\nimport { resolveCliBootstrapMode, type CliBootstrapMode } from './lib/cli-bootstrap-mode.js'\n// `run` is imported dynamically inside `main()` so telemetry can initialize\n// before the mercato entry (and its Postgres driver) loads \u2014 see main().\n\nfunction assertNode24Runtime(): void {\n const detectedNodeVersion = process.versions.node\n const majorVersion = Number.parseInt(detectedNodeVersion.split('.')[0] ?? '0', 10)\n if (majorVersion >= 24) {\n return\n }\n throw new Error(\n [\n 'Unsupported Node.js runtime.',\n `Cause: Detected Node ${detectedNodeVersion}, but Open Mercato requires Node 24.x.`,\n 'What to do: switch your shell to Node 24 (for example `nvm use 24`), run `yarn install`, then retry.',\n ].join(' '),\n )\n}\n\nasync function tryBootstrap(mode: Exclude<CliBootstrapMode, 'none'>): Promise<boolean> {\n try {\n // Use the CLI resolver to find the app directory (handles monorepo detection)\n const { createResolver } = await import('./lib/resolver.js')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n\n if (mode === 'dev-supervisor') {\n const {\n canUseLightweightDevSupervisor,\n loadDevSupervisorManifest,\n registerDevSupervisorManifest,\n } = await import(\n './lib/dev-supervisor-manifest.js'\n )\n const manifest = loadDevSupervisorManifest(appDir)\n if (canUseLightweightDevSupervisor(manifest)) {\n registerDevSupervisorManifest(manifest)\n return true\n }\n }\n\n const { bootstrapFromAppRoot } = await import('@open-mercato/shared/lib/bootstrap/dynamicLoader')\n const { registerCliModules } = await import('./mercato.js')\n const data = await bootstrapFromAppRoot(appDir)\n // Register CLI modules directly to avoid module resolution issues\n registerCliModules(data.modules)\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n // Check if the error is about missing generated files\n if (\n message.includes('dev-supervisor.generated.json') ||\n (\n message.includes('Cannot find module') &&\n (message.includes('/generated/') || message.includes('.generated') || message.includes('.mercato'))\n )\n ) {\n return false\n }\n // Re-throw other errors\n throw err\n }\n}\n\nasync function main(): Promise<void> {\n assertNode24Runtime()\n const bootstrapMode = resolveCliBootstrapMode(process.argv)\n\n if (bootstrapMode !== 'none') {\n // Load the app's `.env` BEFORE initTelemetry(): `run()` only dotenv-loads it\n // later (ensureEnvLoaded), which is too late \u2014 TELEMETRY_BACKEND set only in\n // `.env` would silently resolve to `noop` for worker/scheduler processes.\n // The loader touches only the resolver + dotenv (no `pg`), preserving the\n // instrumentation load-order guarantee below.\n const { loadAppEnv } = await import('./lib/load-env.js')\n await loadAppEnv()\n\n // Initialize telemetry BEFORE bootstrapping the app graph. Bootstrap and the\n // per-command handlers load MikroORM's Postgres driver \u2192 `pg`, and the\n // OpenTelemetry pg/undici auto-instrumentation only records spans for a\n // driver required AFTER the SDK has started. Registering here \u2014 ahead of any\n // app module \u2014 is what lets long-running worker/scheduler processes emit DB\n // spans (not just the bullmq-otel add/process envelope). The package itself\n // is not imported unless an explicit supported backend is selected.\n if (isTelemetryBackendEnabled()) {\n const { initTelemetry } = await import('@open-mercato/telemetry')\n await initTelemetry()\n }\n\n const bootstrapSucceeded = await tryBootstrap(bootstrapMode)\n if (!bootstrapSucceeded) {\n console.error('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557')\n console.error('\u2551 Generated files not found! \u2551')\n console.error('\u2551 \u2551')\n console.error('\u2551 The CLI requires generated files to discover modules. \u2551')\n console.error('\u2551 Please run the following command first: \u2551')\n console.error('\u2551 \u2551')\n console.error('\u2551 yarn mercato generate \u2551')\n console.error('\u2551 \u2551')\n console.error('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D')\n process.exit(1)\n }\n }\n\n // Dynamic import (not a top-level static import) so the mercato entry \u2014 and the\n // Postgres driver it pulls in \u2014 loads only after initTelemetry() above.\n const { run } = await import('./mercato.js')\n const code = await run(process.argv)\n // Flush spans/logs for commands that return (workers block forever and flush via\n // their own shutdown handler instead).\n await getTelemetryRuntime()?.shutdown()\n process.exit(code ?? 0)\n}\n\nmain().catch((error: unknown) => {\n if (error instanceof Error) {\n console.error(error.message)\n } else {\n console.error(error)\n }\n process.exit(1)\n})\n"],
5
+ "mappings": "AAMA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,+BAAsD;AAI/D,SAAS,sBAA4B;AACnC,QAAM,sBAAsB,QAAQ,SAAS;AAC7C,QAAM,eAAe,OAAO,SAAS,oBAAoB,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE;AACjF,MAAI,gBAAgB,IAAI;AACtB;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR;AAAA,MACE;AAAA,MACA,wBAAwB,mBAAmB;AAAA,MAC3C;AAAA,IACF,EAAE,KAAK,GAAG;AAAA,EACZ;AACF;AAEA,eAAe,aAAa,MAA2D;AACrF,MAAI;AAEF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,mBAAmB;AAC3D,UAAM,WAAW,eAAe;AAChC,UAAM,SAAS,SAAS,UAAU;AAElC,QAAI,SAAS,kBAAkB;AAC7B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI,MAAM,OACR,kCACF;AACA,YAAM,WAAW,0BAA0B,MAAM;AACjD,UAAI,+BAA+B,QAAQ,GAAG;AAC5C,sCAA8B,QAAQ;AACtC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,kDAAkD;AAChG,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,cAAc;AAC1D,UAAM,OAAO,MAAM,qBAAqB,MAAM;AAE9C,uBAAmB,KAAK,OAAO;AAC/B,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAE/D,QACE,QAAQ,SAAS,+BAA+B,KAE9C,QAAQ,SAAS,oBAAoB,MACpC,QAAQ,SAAS,aAAa,KAAK,QAAQ,SAAS,YAAY,KAAK,QAAQ,SAAS,UAAU,IAEnG;AACA,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,OAAsB;AACnC,sBAAoB;AACpB,QAAM,gBAAgB,wBAAwB,QAAQ,IAAI;AAE1D,MAAI,kBAAkB,QAAQ;AAM5B,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,mBAAmB;AACvD,UAAM,WAAW;AASjB,QAAI,0BAA0B,GAAG;AAC/B,YAAM,EAAE,cAAc,IAAI,MAAM,OAAO,yBAAyB;AAChE,YAAM,cAAc;AAAA,IACtB;AAEA,UAAM,qBAAqB,MAAM,aAAa,aAAa;AAC3D,QAAI,CAAC,oBAAoB;AACvB,cAAQ,MAAM,gaAAuE;AACrF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gaAAuE;AACrF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAIA,QAAM,EAAE,IAAI,IAAI,MAAM,OAAO,cAAc;AAC3C,QAAM,OAAO,MAAM,IAAI,QAAQ,IAAI;AAGnC,QAAM,oBAAoB,GAAG,SAAS;AACtC,UAAQ,KAAK,QAAQ,CAAC;AACxB;AAEA,KAAK,EAAE,MAAM,CAAC,UAAmB;AAC/B,MAAI,iBAAiB,OAAO;AAC1B,YAAQ,MAAM,MAAM,OAAO;AAAA,EAC7B,OAAO;AACL,YAAQ,MAAM,KAAK;AAAA,EACrB;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,32 @@
1
+ const BOOTSTRAP_FREE_COMMANDS = /* @__PURE__ */ new Set([
2
+ "generate",
3
+ "module",
4
+ "deploy",
5
+ "db",
6
+ "init",
7
+ "agentic:init",
8
+ "telemetry",
9
+ "eject",
10
+ "test",
11
+ "test:integration",
12
+ "test:integration:coverage",
13
+ "test:integration:spec-coverage",
14
+ "test:ephemeral",
15
+ "test:integration:interactive",
16
+ "umes:list",
17
+ "umes:inspect",
18
+ "umes:check",
19
+ "help",
20
+ "--help",
21
+ "-h"
22
+ ]);
23
+ function resolveCliBootstrapMode(argv) {
24
+ const [, , first, second] = argv;
25
+ if (!first || BOOTSTRAP_FREE_COMMANDS.has(first)) return "none";
26
+ if (first === "server" && second === "dev") return "dev-supervisor";
27
+ return "full";
28
+ }
29
+ export {
30
+ resolveCliBootstrapMode
31
+ };
32
+ //# sourceMappingURL=cli-bootstrap-mode.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/cli-bootstrap-mode.ts"],
4
+ "sourcesContent": ["export type CliBootstrapMode = 'none' | 'dev-supervisor' | 'full'\n\nconst BOOTSTRAP_FREE_COMMANDS = new Set([\n 'generate',\n 'module',\n 'deploy',\n 'db',\n 'init',\n 'agentic:init',\n 'telemetry',\n 'eject',\n 'test',\n 'test:integration',\n 'test:integration:coverage',\n 'test:integration:spec-coverage',\n 'test:ephemeral',\n 'test:integration:interactive',\n 'umes:list',\n 'umes:inspect',\n 'umes:check',\n 'help',\n '--help',\n '-h',\n])\n\nexport function resolveCliBootstrapMode(argv: readonly string[]): CliBootstrapMode {\n const [, , first, second] = argv\n if (!first || BOOTSTRAP_FREE_COMMANDS.has(first)) return 'none'\n if (first === 'server' && second === 'dev') return 'dev-supervisor'\n return 'full'\n}\n"],
5
+ "mappings": "AAEA,MAAM,0BAA0B,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,wBAAwB,MAA2C;AACjF,QAAM,CAAC,EAAE,EAAE,OAAO,MAAM,IAAI;AAC5B,MAAI,CAAC,SAAS,wBAAwB,IAAI,KAAK,EAAG,QAAO;AACzD,MAAI,UAAU,YAAY,WAAW,MAAO,QAAO;AACnD,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,105 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ const DEV_SUPERVISOR_MANIFEST_FILE = "dev-supervisor.generated.json";
4
+ const DEV_SUPERVISOR_MANIFEST_VERSION = 1;
5
+ let registeredManifest = null;
6
+ function manifestError(filePath, detail) {
7
+ return new Error(
8
+ `Invalid generated dev supervisor manifest at ${filePath}: ${detail}. Run \`yarn generate\` and retry.`
9
+ );
10
+ }
11
+ function isNonEmptyString(value) {
12
+ return typeof value === "string" && value.trim().length > 0;
13
+ }
14
+ function parseWorkerDescriptor(value, index, filePath) {
15
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
16
+ throw manifestError(filePath, `workers[${index}] must be an object`);
17
+ }
18
+ const worker = value;
19
+ if (!isNonEmptyString(worker.id)) {
20
+ throw manifestError(filePath, `workers[${index}].id must be a non-empty string`);
21
+ }
22
+ if (!isNonEmptyString(worker.queue)) {
23
+ throw manifestError(filePath, `workers[${index}].queue must be a non-empty string`);
24
+ }
25
+ if (typeof worker.concurrency !== "number" || !Number.isFinite(worker.concurrency)) {
26
+ throw manifestError(filePath, `workers[${index}].concurrency must be a finite number`);
27
+ }
28
+ if (worker.moduleId !== void 0 && !isNonEmptyString(worker.moduleId)) {
29
+ throw manifestError(filePath, `workers[${index}].moduleId must be a non-empty string when present`);
30
+ }
31
+ return {
32
+ id: worker.id,
33
+ ...worker.moduleId === void 0 ? {} : { moduleId: worker.moduleId },
34
+ queue: worker.queue,
35
+ concurrency: worker.concurrency
36
+ };
37
+ }
38
+ function parseManifest(value, filePath) {
39
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
40
+ throw manifestError(filePath, "root value must be an object");
41
+ }
42
+ const manifest = value;
43
+ if (manifest.version !== DEV_SUPERVISOR_MANIFEST_VERSION) {
44
+ throw manifestError(
45
+ filePath,
46
+ `unsupported version ${String(manifest.version)} (expected ${DEV_SUPERVISOR_MANIFEST_VERSION})`
47
+ );
48
+ }
49
+ if (!Array.isArray(manifest.workers)) {
50
+ throw manifestError(filePath, "workers must be an array");
51
+ }
52
+ const schedulerStartStatus = manifest.schedulerStartStatus;
53
+ if (schedulerStartStatus !== "ok" && schedulerStartStatus !== "missing-module" && schedulerStartStatus !== "missing-cli" && schedulerStartStatus !== "missing-command") {
54
+ throw manifestError(filePath, "schedulerStartStatus is invalid");
55
+ }
56
+ return {
57
+ version: DEV_SUPERVISOR_MANIFEST_VERSION,
58
+ workers: manifest.workers.map((worker, index) => parseWorkerDescriptor(worker, index, filePath)),
59
+ schedulerStartStatus,
60
+ // Version-1 manifests produced before this safety marker existed cannot
61
+ // prove that worker/CLI overrides were accounted for. Preserve the old
62
+ // full-bootstrap behavior until `yarn generate` writes an explicit false.
63
+ requiresFullBootstrap: manifest.requiresFullBootstrap !== false
64
+ };
65
+ }
66
+ function canUseLightweightDevSupervisor(manifest) {
67
+ return manifest.requiresFullBootstrap === false;
68
+ }
69
+ function loadDevSupervisorManifest(appDir) {
70
+ const filePath = path.join(appDir, ".mercato", "generated", DEV_SUPERVISOR_MANIFEST_FILE);
71
+ let source;
72
+ try {
73
+ source = fs.readFileSync(filePath, "utf8");
74
+ } catch (error) {
75
+ const detail = error instanceof Error ? error.message : String(error);
76
+ throw manifestError(filePath, `file could not be read (${detail})`);
77
+ }
78
+ let parsed;
79
+ try {
80
+ parsed = JSON.parse(source);
81
+ } catch (error) {
82
+ const detail = error instanceof Error ? error.message : String(error);
83
+ throw manifestError(filePath, `JSON could not be parsed (${detail})`);
84
+ }
85
+ return parseManifest(parsed, filePath);
86
+ }
87
+ function registerDevSupervisorManifest(manifest) {
88
+ registeredManifest = manifest;
89
+ }
90
+ function getRegisteredDevSupervisorManifest() {
91
+ return registeredManifest;
92
+ }
93
+ function resetDevSupervisorManifestForTests() {
94
+ registeredManifest = null;
95
+ }
96
+ export {
97
+ DEV_SUPERVISOR_MANIFEST_FILE,
98
+ DEV_SUPERVISOR_MANIFEST_VERSION,
99
+ canUseLightweightDevSupervisor,
100
+ getRegisteredDevSupervisorManifest,
101
+ loadDevSupervisorManifest,
102
+ registerDevSupervisorManifest,
103
+ resetDevSupervisorManifestForTests
104
+ };
105
+ //# sourceMappingURL=dev-supervisor-manifest.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/dev-supervisor-manifest.ts"],
4
+ "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { ModuleWorker } from '@open-mercato/shared/modules/registry'\n\nexport const DEV_SUPERVISOR_MANIFEST_FILE = 'dev-supervisor.generated.json'\nexport const DEV_SUPERVISOR_MANIFEST_VERSION = 1\n\nexport type DevSupervisorWorkerDescriptor = Pick<\n ModuleWorker,\n 'id' | 'moduleId' | 'queue' | 'concurrency'\n>\n\nexport type DevSupervisorSchedulerStartStatus =\n | 'ok'\n | 'missing-module'\n | 'missing-cli'\n | 'missing-command'\n\nexport type DevSupervisorManifest = {\n version: typeof DEV_SUPERVISOR_MANIFEST_VERSION\n workers: DevSupervisorWorkerDescriptor[]\n schedulerStartStatus: DevSupervisorSchedulerStartStatus\n requiresFullBootstrap: boolean\n}\n\nlet registeredManifest: DevSupervisorManifest | null = null\n\nfunction manifestError(filePath: string, detail: string): Error {\n return new Error(\n `Invalid generated dev supervisor manifest at ${filePath}: ${detail}. ` +\n 'Run `yarn generate` and retry.',\n )\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0\n}\n\nfunction parseWorkerDescriptor(\n value: unknown,\n index: number,\n filePath: string,\n): DevSupervisorWorkerDescriptor {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw manifestError(filePath, `workers[${index}] must be an object`)\n }\n\n const worker = value as Record<string, unknown>\n if (!isNonEmptyString(worker.id)) {\n throw manifestError(filePath, `workers[${index}].id must be a non-empty string`)\n }\n if (!isNonEmptyString(worker.queue)) {\n throw manifestError(filePath, `workers[${index}].queue must be a non-empty string`)\n }\n if (typeof worker.concurrency !== 'number' || !Number.isFinite(worker.concurrency)) {\n throw manifestError(filePath, `workers[${index}].concurrency must be a finite number`)\n }\n if (worker.moduleId !== undefined && !isNonEmptyString(worker.moduleId)) {\n throw manifestError(filePath, `workers[${index}].moduleId must be a non-empty string when present`)\n }\n\n return {\n id: worker.id,\n ...(worker.moduleId === undefined ? {} : { moduleId: worker.moduleId }),\n queue: worker.queue,\n concurrency: worker.concurrency,\n }\n}\n\nfunction parseManifest(value: unknown, filePath: string): DevSupervisorManifest {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw manifestError(filePath, 'root value must be an object')\n }\n\n const manifest = value as Record<string, unknown>\n if (manifest.version !== DEV_SUPERVISOR_MANIFEST_VERSION) {\n throw manifestError(\n filePath,\n `unsupported version ${String(manifest.version)} (expected ${DEV_SUPERVISOR_MANIFEST_VERSION})`,\n )\n }\n if (!Array.isArray(manifest.workers)) {\n throw manifestError(filePath, 'workers must be an array')\n }\n\n const schedulerStartStatus = manifest.schedulerStartStatus\n if (\n schedulerStartStatus !== 'ok' &&\n schedulerStartStatus !== 'missing-module' &&\n schedulerStartStatus !== 'missing-cli' &&\n schedulerStartStatus !== 'missing-command'\n ) {\n throw manifestError(filePath, 'schedulerStartStatus is invalid')\n }\n\n return {\n version: DEV_SUPERVISOR_MANIFEST_VERSION,\n workers: manifest.workers.map((worker, index) => parseWorkerDescriptor(worker, index, filePath)),\n schedulerStartStatus,\n // Version-1 manifests produced before this safety marker existed cannot\n // prove that worker/CLI overrides were accounted for. Preserve the old\n // full-bootstrap behavior until `yarn generate` writes an explicit false.\n requiresFullBootstrap: manifest.requiresFullBootstrap !== false,\n }\n}\n\nexport function canUseLightweightDevSupervisor(manifest: DevSupervisorManifest): boolean {\n return manifest.requiresFullBootstrap === false\n}\n\nexport function loadDevSupervisorManifest(appDir: string): DevSupervisorManifest {\n const filePath = path.join(appDir, '.mercato', 'generated', DEV_SUPERVISOR_MANIFEST_FILE)\n let source: string\n try {\n source = fs.readFileSync(filePath, 'utf8')\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n throw manifestError(filePath, `file could not be read (${detail})`)\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(source)\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n throw manifestError(filePath, `JSON could not be parsed (${detail})`)\n }\n\n return parseManifest(parsed, filePath)\n}\n\nexport function registerDevSupervisorManifest(manifest: DevSupervisorManifest): void {\n registeredManifest = manifest\n}\n\nexport function getRegisteredDevSupervisorManifest(): DevSupervisorManifest | null {\n return registeredManifest\n}\n\nexport function resetDevSupervisorManifestForTests(): void {\n registeredManifest = null\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -4,16 +4,12 @@ import ts from "typescript-js";
4
4
  import { VariableDeclarationKind } from "ts-morph";
5
5
  import { MODULE_CODE_EXTENSIONS } from "./scanner.js";
6
6
  import {
7
- calculateChecksum,
8
- readChecksumRecord,
9
- writeChecksumRecord,
10
- ensureDir,
11
7
  toVar,
12
8
  toSnake,
13
9
  rimrafDir,
14
- logGenerationResult,
15
- writeIfChanged,
16
- createGeneratorResult
10
+ createGeneratorResult,
11
+ writeGeneratedFile,
12
+ writeIfChanged
17
13
  } from "../utils.js";
18
14
  import { addAutoGeneratedComment, createGeneratedSourceFile, elementAccess, getSourceText, identifier, returnStatement } from "./ast/index.js";
19
15
  function parseExportedClassNamesFromFile(filePath) {
@@ -323,23 +319,14 @@ async function generateEntityIds(options) {
323
319
  type: "typeof E"
324
320
  });
325
321
  const consolidatedSrc = getSourceText(consolidatedSourceFile);
326
- const newChecksum = calculateChecksum(consolidatedSrc);
327
- let shouldWrite = true;
328
- const existingRecord = readChecksumRecord(checksumFile);
329
- if (existingRecord && existingRecord.content === newChecksum) {
330
- shouldWrite = false;
331
- }
332
- if (shouldWrite) {
333
- ensureDir(outFile);
334
- fs.writeFileSync(outFile, consolidatedSrc);
335
- writeChecksumRecord(checksumFile, { content: newChecksum, structure: "" });
336
- result.filesWritten.push(outFile);
337
- if (!quiet) {
338
- logGenerationResult(path.relative(process.cwd(), outFile), true);
339
- }
340
- } else {
341
- result.filesUnchanged.push(outFile);
342
- }
322
+ writeGeneratedFile({
323
+ outFile,
324
+ checksumFile,
325
+ content: consolidatedSrc,
326
+ structureChecksum: "",
327
+ result,
328
+ quiet
329
+ });
343
330
  const groups = Object.keys(grouped);
344
331
  for (const g of groups) {
345
332
  if (!resolver.isMonorepo() && g !== "@app") {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/generators/entity-ids.ts"],
4
- "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport ts from 'typescript-js'\nimport { VariableDeclarationKind } from 'ts-morph'\nimport type { PackageResolver, ModuleEntry } from '../resolver'\nimport { MODULE_CODE_EXTENSIONS } from './scanner'\nimport {\n calculateChecksum,\n readChecksumRecord,\n writeChecksumRecord,\n ensureDir,\n toVar,\n toSnake,\n rimrafDir,\n logGenerationResult,\n writeIfChanged,\n type GeneratorResult,\n createGeneratorResult,\n} from '../utils'\nimport { addAutoGeneratedComment, createGeneratedSourceFile, elementAccess, getSourceText, identifier, returnStatement } from './ast'\n\ntype GroupKey = '@app' | '@open-mercato/core' | string\ntype EntityFieldMap = Record<string, string[]>\n\nexport interface EntityIdsOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\n/**\n * Extract exported class names from a TypeScript source file without dynamic import.\n * This is used for @app modules since Node.js can't import TypeScript files directly.\n */\nfunction parseExportedClassNamesFromFile(filePath: string): string[] {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n const classNames: string[] = []\n\n sf.forEachChild((node) => {\n // Check for exported class declarations\n if (ts.isClassDeclaration(node) && node.name) {\n const hasExport = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n if (hasExport) {\n classNames.push(node.name.text)\n }\n }\n })\n\n return classNames\n}\n\nfunction unwrapObjectLiteralExpression(\n expression: ts.Expression | undefined,\n): ts.ObjectLiteralExpression | undefined {\n if (!expression) return undefined\n if (ts.isObjectLiteralExpression(expression)) return expression\n if (ts.isAsExpression(expression) || ts.isTypeAssertionExpression(expression)) {\n return unwrapObjectLiteralExpression(expression.expression)\n }\n if (ts.isParenthesizedExpression(expression)) {\n return unwrapObjectLiteralExpression(expression.expression)\n }\n return undefined\n}\n\nfunction readPropertyInitializer(\n objectLiteral: ts.ObjectLiteralExpression,\n propertyName: string,\n): ts.Expression | undefined {\n for (const property of objectLiteral.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const name = ts.isIdentifier(property.name)\n ? property.name.text\n : ts.isStringLiteralLike(property.name)\n ? property.name.text\n : undefined\n if (name === propertyName) {\n return property.initializer\n }\n }\n return undefined\n}\n\nfunction parseGeneratedModuleEntityNames(filePath: string, moduleId: string): string[] {\n if (!fs.existsSync(filePath)) return []\n\n const source = fs.readFileSync(filePath, 'utf8')\n const scriptKind = filePath.endsWith('.js') ? ts.ScriptKind.JS : ts.ScriptKind.TS\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.ES2020, true, scriptKind)\n\n for (const statement of sf.statements) {\n if (!ts.isVariableStatement(statement)) continue\n const declaration = statement.declarationList.declarations.find((candidate) =>\n ts.isIdentifier(candidate.name) && candidate.name.text === 'E')\n if (!declaration) continue\n\n const eObject = unwrapObjectLiteralExpression(declaration.initializer)\n if (!eObject) continue\n\n const moduleObject = unwrapObjectLiteralExpression(readPropertyInitializer(eObject, moduleId))\n if (!moduleObject) return []\n\n const names: string[] = []\n for (const property of moduleObject.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const name = ts.isIdentifier(property.name)\n ? property.name.text\n : ts.isStringLiteralLike(property.name)\n ? property.name.text\n : undefined\n if (name) names.push(name)\n }\n return names\n }\n\n return []\n}\n\nfunction parseGeneratedEntityFieldsFile(filePath: string): string[] {\n if (!fs.existsSync(filePath)) return []\n\n const source = fs.readFileSync(filePath, 'utf8')\n const scriptKind = filePath.endsWith('.js') ? ts.ScriptKind.JS : ts.ScriptKind.TS\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.ES2020, true, scriptKind)\n const fields: string[] = []\n\n for (const statement of sf.statements) {\n if (!ts.isVariableStatement(statement)) continue\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name) || !declaration.initializer) continue\n if (!ts.isStringLiteralLike(declaration.initializer)) continue\n fields.push(declaration.initializer.text)\n }\n }\n\n return Array.from(new Set(fields))\n}\n\nfunction resolveExistingFile(candidates: string[]): string | null {\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n\nfunction loadStandaloneGeneratedPackageEntities(\n resolver: PackageResolver,\n entry: ModuleEntry,\n): { entityNames: string[]; entityFieldMap: EntityFieldMap } | null {\n if (resolver.isMonorepo() || !entry.from || entry.from === '@app') return null\n\n const packageRoot = resolver.getPackageRoot(entry.from)\n const generatedRoot = fs.existsSync(path.join(packageRoot, 'generated'))\n ? path.join(packageRoot, 'generated')\n : path.join(packageRoot, 'dist', 'generated')\n const idsFile = resolveExistingFile([\n path.join(generatedRoot, 'entities.ids.generated.ts'),\n path.join(generatedRoot, 'entities.ids.generated.js'),\n ])\n if (!idsFile) return null\n const entityNames = parseGeneratedModuleEntityNames(idsFile, entry.id)\n\n if (entityNames.length === 0) return null\n\n const entityFieldMap: EntityFieldMap = {}\n for (const entityName of entityNames) {\n const fieldsFile = resolveExistingFile([\n path.join(generatedRoot, 'entities', entityName, 'index.ts'),\n path.join(generatedRoot, 'entities', entityName, 'index.js'),\n ])\n if (!fieldsFile) continue\n const fields = parseGeneratedEntityFieldsFile(fieldsFile)\n entityFieldMap[entityName] = fields\n }\n\n return { entityNames, entityFieldMap }\n}\n\nfunction parseEntityFieldsFromFile(filePath: string, exportedClassNames: string[]): EntityFieldMap {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n\n const exported = new Set(exportedClassNames)\n const result: EntityFieldMap = {}\n\n function getDecoratorArgNameLiteral(dec: ts.Decorator | undefined): string | undefined {\n if (!dec) return undefined\n const expr = dec.expression\n if (!ts.isCallExpression(expr)) return undefined\n if (!expr.arguments.length) return undefined\n const first = expr.arguments[0]\n if (!ts.isObjectLiteralExpression(first)) return undefined\n for (const prop of first.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === 'name') {\n if (ts.isStringLiteral(prop.initializer)) return prop.initializer.text\n }\n }\n return undefined\n }\n\n function normalizeDbName(propertyName: string, _decoratorName?: string, nameOverride?: string): string {\n if (nameOverride) return nameOverride\n return toSnake(propertyName)\n }\n\n sf.forEachChild((node) => {\n if (!ts.isClassDeclaration(node) || !node.name) return\n const clsName = node.name.text\n if (!exported.has(clsName)) return\n const entityKey = toSnake(clsName)\n const fields: string[] = []\n\n for (const member of node.members) {\n if (!ts.isPropertyDeclaration(member) || !member.name) continue\n const name = ts.isIdentifier(member.name)\n ? member.name.text\n : ts.isStringLiteral(member.name)\n ? member.name.text\n : undefined\n if (!name) continue\n if (member.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword)) continue\n const decorators = ts.canHaveDecorators(member)\n ? ts.getDecorators(member) ?? []\n : []\n let dbName: string | undefined\n if (decorators && decorators.length) {\n for (const d of decorators) {\n const nameOverride = getDecoratorArgNameLiteral(d)\n dbName = normalizeDbName(name, undefined, nameOverride)\n if (dbName) break\n }\n }\n if (!dbName) dbName = normalizeDbName(name)\n fields.push(dbName)\n }\n result[entityKey] = Array.from(new Set(fields))\n })\n\n return result\n}\n\nfunction writeTrackedFile(\n filePath: string,\n content: string,\n result: GeneratorResult,\n): void {\n if (writeIfChanged(filePath, content)) {\n result.filesWritten.push(filePath)\n } else {\n result.filesUnchanged.push(filePath)\n }\n}\n\nfunction writePerEntityFieldFiles(\n outRoot: string,\n fieldsByEntity: EntityFieldMap,\n result: GeneratorResult,\n): void {\n fs.mkdirSync(outRoot, { recursive: true })\n const desiredEntities = new Set(Object.keys(fieldsByEntity))\n for (const [entity, fields] of Object.entries(fieldsByEntity)) {\n const entDir = path.join(outRoot, entity)\n fs.mkdirSync(entDir, { recursive: true })\n const sourceFile = createGeneratedSourceFile(`${entity}/index.ts`)\n for (const field of fields) {\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: toVar(field),\n initializer: JSON.stringify(field),\n },\n ],\n })\n }\n writeTrackedFile(path.join(entDir, 'index.ts'), getSourceText(sourceFile), result)\n }\n\n const existingEntries = fs.existsSync(outRoot) ? fs.readdirSync(outRoot, { withFileTypes: true }) : []\n for (const entry of existingEntries) {\n if (!entry.isDirectory()) continue\n if (desiredEntities.has(entry.name)) continue\n const staleDirectory = path.join(outRoot, entry.name)\n rimrafDir(staleDirectory)\n result.filesWritten.push(staleDirectory)\n }\n}\n\nfunction writeEntityFieldsRegistry(\n generatedRoot: string,\n fieldsByEntity: EntityFieldMap,\n result: GeneratorResult,\n): void {\n const entities = Object.keys(fieldsByEntity).sort((a, b) => a.localeCompare(b))\n const registry: Record<string, Record<string, string>> = {}\n for (const entity of entities) {\n registry[toVar(entity)] = {}\n for (const field of fieldsByEntity[entity] ?? []) {\n registry[toVar(entity)][toVar(field)] = field\n }\n }\n\n const sourceFile = createGeneratedSourceFile('entity-fields-registry.ts')\n addAutoGeneratedComment(sourceFile, 'entity-ids')\n sourceFile.insertText(sourceFile.getFullText().length, '// Static registry for entity fields - eliminates dynamic imports for Turbopack compatibility\\n')\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: 'entityFieldsRegistry',\n type: 'Record<string, Record<string, string>>',\n initializer: JSON.stringify(registry, null, 2),\n },\n ],\n })\n sourceFile.addFunction({\n name: 'getEntityFields',\n isExported: true,\n parameters: [{ name: 'slug', type: 'string' }],\n returnType: 'Record<string, string> | undefined',\n statements: [returnStatement(elementAccess(identifier('entityFieldsRegistry'), identifier('slug')))],\n })\n const outPath = path.join(generatedRoot, 'entity-fields-registry.ts')\n writeTrackedFile(outPath, getSourceText(sourceFile), result)\n}\n\nexport async function generateEntityIds(options: EntityIdsOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'entities.ids.generated.ts')\n const checksumFile = path.join(outputDir, 'entities.ids.generated.checksum')\n\n const entries = resolver.loadEnabledModules()\n\n const consolidated: Record<string, Record<string, string>> = {}\n const grouped: Record<GroupKey, Record<string, Record<string, string>>> = {}\n const modulesDict: Record<string, string> = {}\n const groupedModulesDict: Record<GroupKey, Record<string, string>> = {}\n\n const fieldsByGroup: Record<GroupKey, Record<string, EntityFieldMap>> = {}\n\n for (const entry of entries) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n const group: GroupKey = (entry.from as GroupKey) || '@open-mercato/core'\n\n const standaloneGeneratedPackageEntities = loadStandaloneGeneratedPackageEntities(resolver, entry)\n\n // Locate entities definition file (prefer app override)\n const appData = path.join(roots.appBase, 'data')\n const pkgData = path.join(roots.pkgBase, 'data')\n const appDb = path.join(roots.appBase, 'db')\n const pkgDb = path.join(roots.pkgBase, 'db')\n const bases = [appData, pkgData, appDb, pkgDb]\n const candidates = ['entities.override', 'entities', 'schema']\n let importPath: string | null = null\n let filePath: string | null = null\n\n for (const base of bases) {\n for (const f of candidates) {\n const p = resolveConventionFile(base, f)\n if (p) {\n const fromApp = base.startsWith(roots.appBase)\n const sub = path.basename(base) // 'data' | 'db'\n importPath = `${fromApp ? imps.appBase : imps.pkgBase}/${sub}/${f}`\n filePath = p\n break\n }\n }\n if (importPath) break\n }\n\n // No entities file found -> still register module id\n if (!filePath && !standaloneGeneratedPackageEntities) {\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n continue\n }\n\n const exportNames = filePath ? parseExportedClassNamesFromFile(filePath) : []\n\n const entityNames = standaloneGeneratedPackageEntities\n ? standaloneGeneratedPackageEntities.entityNames\n : exportNames\n .map((k) => toSnake(k))\n .filter((k, idx, arr) => arr.indexOf(k) === idx)\n\n // Build dictionaries\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n\n consolidated[modId] = consolidated[modId] || {}\n grouped[group] = grouped[group] || {}\n grouped[group][modId] = grouped[group][modId] || {}\n\n for (const en of entityNames) {\n consolidated[modId][en] = `${modId}:${en}`\n grouped[group][modId][en] = `${modId}:${en}`\n }\n\n // Parse entity fields from TypeScript source\n const entityFieldMap = standaloneGeneratedPackageEntities\n ? standaloneGeneratedPackageEntities.entityFieldMap\n : parseEntityFieldsFromFile(filePath!, exportNames)\n fieldsByGroup[group] = fieldsByGroup[group] || {}\n fieldsByGroup[group][modId] = entityFieldMap\n }\n\n // Write consolidated output\n const consolidatedSourceFile = createGeneratedSourceFile('entities.ids.generated.ts')\n addAutoGeneratedComment(consolidatedSourceFile, 'entity-ids')\n consolidatedSourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n { name: 'M', initializer: `${JSON.stringify(modulesDict, null, 2)} as const` },\n { name: 'E', initializer: `${JSON.stringify(consolidated, null, 2)} as const` },\n ],\n })\n consolidatedSourceFile.addTypeAlias({\n name: 'KnownModuleId',\n isExported: true,\n type: 'keyof typeof M',\n })\n consolidatedSourceFile.addTypeAlias({\n name: 'KnownEntities',\n isExported: true,\n type: 'typeof E',\n })\n const consolidatedSrc = getSourceText(consolidatedSourceFile)\n\n // Check if content has changed\n const newChecksum = calculateChecksum(consolidatedSrc)\n let shouldWrite = true\n\n const existingRecord = readChecksumRecord(checksumFile)\n if (existingRecord && existingRecord.content === newChecksum) {\n shouldWrite = false\n }\n\n if (shouldWrite) {\n ensureDir(outFile)\n fs.writeFileSync(outFile, consolidatedSrc)\n writeChecksumRecord(checksumFile, { content: newChecksum, structure: '' })\n result.filesWritten.push(outFile)\n if (!quiet) {\n logGenerationResult(path.relative(process.cwd(), outFile), true)\n }\n } else {\n result.filesUnchanged.push(outFile)\n }\n\n // Write per-group outputs\n const groups = Object.keys(grouped) as GroupKey[]\n for (const g of groups) {\n if (!resolver.isMonorepo() && g !== '@app') {\n continue\n }\n\n const pkgOutputDir = resolver.getPackageOutputDir(g)\n // Skip @app group since it writes to the same location as the consolidated output\n if (g === '@app' && pkgOutputDir === outputDir) {\n continue\n }\n const out = path.join(pkgOutputDir, 'entities.ids.generated.ts')\n\n const groupSourceFile = createGeneratedSourceFile(`${String(g)}/entities.ids.generated.ts`)\n addAutoGeneratedComment(groupSourceFile, 'entity-ids')\n groupSourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n { name: 'M', initializer: `${JSON.stringify(groupedModulesDict[g] || {}, null, 2)} as const` },\n { name: 'E', initializer: `${JSON.stringify(grouped[g] || {}, null, 2)} as const` },\n ],\n })\n groupSourceFile.addTypeAlias({\n name: 'KnownModuleId',\n isExported: true,\n type: 'keyof typeof M',\n })\n groupSourceFile.addTypeAlias({\n name: 'KnownEntities',\n isExported: true,\n type: 'typeof E',\n })\n const src = getSourceText(groupSourceFile)\n writeTrackedFile(out, src, result)\n\n const fieldsRoot = path.join(pkgOutputDir, 'entities')\n const fieldsByModule = fieldsByGroup[g] || {}\n const combined: EntityFieldMap = {}\n for (const mId of Object.keys(fieldsByModule)) {\n const mMap = fieldsByModule[mId]\n for (const [entity, fields] of Object.entries(mMap)) {\n combined[entity] = Array.from(new Set([...(combined[entity] || []), ...fields]))\n }\n }\n writePerEntityFieldFiles(fieldsRoot, combined, result)\n\n // Generate static entity fields registry for Turbopack compatibility\n writeEntityFieldsRegistry(pkgOutputDir, combined, result)\n }\n\n // Write combined entity fields to root generated/ folder\n const combinedAll: EntityFieldMap = {}\n for (const groupFields of Object.values(fieldsByGroup)) {\n for (const mMap of Object.values(groupFields)) {\n for (const [entity, fields] of Object.entries(mMap)) {\n combinedAll[entity] = Array.from(new Set([...(combinedAll[entity] || []), ...fields]))\n }\n }\n }\n writePerEntityFieldFiles(path.join(outputDir, 'entities'), combinedAll, result)\n writeEntityFieldsRegistry(outputDir, combinedAll, result)\n\n return result\n}\n\nfunction resolveConventionFile(baseDir: string, basename: string): string | null {\n for (const extension of MODULE_CODE_EXTENSIONS) {\n const candidate = path.join(baseDir, `${basename}${extension}`)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport ts from 'typescript-js'\nimport { VariableDeclarationKind } from 'ts-morph'\nimport type { PackageResolver, ModuleEntry } from '../resolver'\nimport { MODULE_CODE_EXTENSIONS } from './scanner'\nimport {\n toVar,\n toSnake,\n rimrafDir,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n writeIfChanged,\n} from '../utils'\nimport { addAutoGeneratedComment, createGeneratedSourceFile, elementAccess, getSourceText, identifier, returnStatement } from './ast'\n\ntype GroupKey = '@app' | '@open-mercato/core' | string\ntype EntityFieldMap = Record<string, string[]>\n\nexport interface EntityIdsOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\n/**\n * Extract exported class names from a TypeScript source file without dynamic import.\n * This is used for @app modules since Node.js can't import TypeScript files directly.\n */\nfunction parseExportedClassNamesFromFile(filePath: string): string[] {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n const classNames: string[] = []\n\n sf.forEachChild((node) => {\n // Check for exported class declarations\n if (ts.isClassDeclaration(node) && node.name) {\n const hasExport = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n if (hasExport) {\n classNames.push(node.name.text)\n }\n }\n })\n\n return classNames\n}\n\nfunction unwrapObjectLiteralExpression(\n expression: ts.Expression | undefined,\n): ts.ObjectLiteralExpression | undefined {\n if (!expression) return undefined\n if (ts.isObjectLiteralExpression(expression)) return expression\n if (ts.isAsExpression(expression) || ts.isTypeAssertionExpression(expression)) {\n return unwrapObjectLiteralExpression(expression.expression)\n }\n if (ts.isParenthesizedExpression(expression)) {\n return unwrapObjectLiteralExpression(expression.expression)\n }\n return undefined\n}\n\nfunction readPropertyInitializer(\n objectLiteral: ts.ObjectLiteralExpression,\n propertyName: string,\n): ts.Expression | undefined {\n for (const property of objectLiteral.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const name = ts.isIdentifier(property.name)\n ? property.name.text\n : ts.isStringLiteralLike(property.name)\n ? property.name.text\n : undefined\n if (name === propertyName) {\n return property.initializer\n }\n }\n return undefined\n}\n\nfunction parseGeneratedModuleEntityNames(filePath: string, moduleId: string): string[] {\n if (!fs.existsSync(filePath)) return []\n\n const source = fs.readFileSync(filePath, 'utf8')\n const scriptKind = filePath.endsWith('.js') ? ts.ScriptKind.JS : ts.ScriptKind.TS\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.ES2020, true, scriptKind)\n\n for (const statement of sf.statements) {\n if (!ts.isVariableStatement(statement)) continue\n const declaration = statement.declarationList.declarations.find((candidate) =>\n ts.isIdentifier(candidate.name) && candidate.name.text === 'E')\n if (!declaration) continue\n\n const eObject = unwrapObjectLiteralExpression(declaration.initializer)\n if (!eObject) continue\n\n const moduleObject = unwrapObjectLiteralExpression(readPropertyInitializer(eObject, moduleId))\n if (!moduleObject) return []\n\n const names: string[] = []\n for (const property of moduleObject.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const name = ts.isIdentifier(property.name)\n ? property.name.text\n : ts.isStringLiteralLike(property.name)\n ? property.name.text\n : undefined\n if (name) names.push(name)\n }\n return names\n }\n\n return []\n}\n\nfunction parseGeneratedEntityFieldsFile(filePath: string): string[] {\n if (!fs.existsSync(filePath)) return []\n\n const source = fs.readFileSync(filePath, 'utf8')\n const scriptKind = filePath.endsWith('.js') ? ts.ScriptKind.JS : ts.ScriptKind.TS\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.ES2020, true, scriptKind)\n const fields: string[] = []\n\n for (const statement of sf.statements) {\n if (!ts.isVariableStatement(statement)) continue\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name) || !declaration.initializer) continue\n if (!ts.isStringLiteralLike(declaration.initializer)) continue\n fields.push(declaration.initializer.text)\n }\n }\n\n return Array.from(new Set(fields))\n}\n\nfunction resolveExistingFile(candidates: string[]): string | null {\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n\nfunction loadStandaloneGeneratedPackageEntities(\n resolver: PackageResolver,\n entry: ModuleEntry,\n): { entityNames: string[]; entityFieldMap: EntityFieldMap } | null {\n if (resolver.isMonorepo() || !entry.from || entry.from === '@app') return null\n\n const packageRoot = resolver.getPackageRoot(entry.from)\n const generatedRoot = fs.existsSync(path.join(packageRoot, 'generated'))\n ? path.join(packageRoot, 'generated')\n : path.join(packageRoot, 'dist', 'generated')\n const idsFile = resolveExistingFile([\n path.join(generatedRoot, 'entities.ids.generated.ts'),\n path.join(generatedRoot, 'entities.ids.generated.js'),\n ])\n if (!idsFile) return null\n const entityNames = parseGeneratedModuleEntityNames(idsFile, entry.id)\n\n if (entityNames.length === 0) return null\n\n const entityFieldMap: EntityFieldMap = {}\n for (const entityName of entityNames) {\n const fieldsFile = resolveExistingFile([\n path.join(generatedRoot, 'entities', entityName, 'index.ts'),\n path.join(generatedRoot, 'entities', entityName, 'index.js'),\n ])\n if (!fieldsFile) continue\n const fields = parseGeneratedEntityFieldsFile(fieldsFile)\n entityFieldMap[entityName] = fields\n }\n\n return { entityNames, entityFieldMap }\n}\n\nfunction parseEntityFieldsFromFile(filePath: string, exportedClassNames: string[]): EntityFieldMap {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n\n const exported = new Set(exportedClassNames)\n const result: EntityFieldMap = {}\n\n function getDecoratorArgNameLiteral(dec: ts.Decorator | undefined): string | undefined {\n if (!dec) return undefined\n const expr = dec.expression\n if (!ts.isCallExpression(expr)) return undefined\n if (!expr.arguments.length) return undefined\n const first = expr.arguments[0]\n if (!ts.isObjectLiteralExpression(first)) return undefined\n for (const prop of first.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === 'name') {\n if (ts.isStringLiteral(prop.initializer)) return prop.initializer.text\n }\n }\n return undefined\n }\n\n function normalizeDbName(propertyName: string, _decoratorName?: string, nameOverride?: string): string {\n if (nameOverride) return nameOverride\n return toSnake(propertyName)\n }\n\n sf.forEachChild((node) => {\n if (!ts.isClassDeclaration(node) || !node.name) return\n const clsName = node.name.text\n if (!exported.has(clsName)) return\n const entityKey = toSnake(clsName)\n const fields: string[] = []\n\n for (const member of node.members) {\n if (!ts.isPropertyDeclaration(member) || !member.name) continue\n const name = ts.isIdentifier(member.name)\n ? member.name.text\n : ts.isStringLiteral(member.name)\n ? member.name.text\n : undefined\n if (!name) continue\n if (member.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword)) continue\n const decorators = ts.canHaveDecorators(member)\n ? ts.getDecorators(member) ?? []\n : []\n let dbName: string | undefined\n if (decorators && decorators.length) {\n for (const d of decorators) {\n const nameOverride = getDecoratorArgNameLiteral(d)\n dbName = normalizeDbName(name, undefined, nameOverride)\n if (dbName) break\n }\n }\n if (!dbName) dbName = normalizeDbName(name)\n fields.push(dbName)\n }\n result[entityKey] = Array.from(new Set(fields))\n })\n\n return result\n}\n\nfunction writeTrackedFile(\n filePath: string,\n content: string,\n result: GeneratorResult,\n): void {\n if (writeIfChanged(filePath, content)) {\n result.filesWritten.push(filePath)\n } else {\n result.filesUnchanged.push(filePath)\n }\n}\n\nfunction writePerEntityFieldFiles(\n outRoot: string,\n fieldsByEntity: EntityFieldMap,\n result: GeneratorResult,\n): void {\n fs.mkdirSync(outRoot, { recursive: true })\n const desiredEntities = new Set(Object.keys(fieldsByEntity))\n for (const [entity, fields] of Object.entries(fieldsByEntity)) {\n const entDir = path.join(outRoot, entity)\n fs.mkdirSync(entDir, { recursive: true })\n const sourceFile = createGeneratedSourceFile(`${entity}/index.ts`)\n for (const field of fields) {\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: toVar(field),\n initializer: JSON.stringify(field),\n },\n ],\n })\n }\n writeTrackedFile(path.join(entDir, 'index.ts'), getSourceText(sourceFile), result)\n }\n\n const existingEntries = fs.existsSync(outRoot) ? fs.readdirSync(outRoot, { withFileTypes: true }) : []\n for (const entry of existingEntries) {\n if (!entry.isDirectory()) continue\n if (desiredEntities.has(entry.name)) continue\n const staleDirectory = path.join(outRoot, entry.name)\n rimrafDir(staleDirectory)\n result.filesWritten.push(staleDirectory)\n }\n}\n\nfunction writeEntityFieldsRegistry(\n generatedRoot: string,\n fieldsByEntity: EntityFieldMap,\n result: GeneratorResult,\n): void {\n const entities = Object.keys(fieldsByEntity).sort((a, b) => a.localeCompare(b))\n const registry: Record<string, Record<string, string>> = {}\n for (const entity of entities) {\n registry[toVar(entity)] = {}\n for (const field of fieldsByEntity[entity] ?? []) {\n registry[toVar(entity)][toVar(field)] = field\n }\n }\n\n const sourceFile = createGeneratedSourceFile('entity-fields-registry.ts')\n addAutoGeneratedComment(sourceFile, 'entity-ids')\n sourceFile.insertText(sourceFile.getFullText().length, '// Static registry for entity fields - eliminates dynamic imports for Turbopack compatibility\\n')\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: 'entityFieldsRegistry',\n type: 'Record<string, Record<string, string>>',\n initializer: JSON.stringify(registry, null, 2),\n },\n ],\n })\n sourceFile.addFunction({\n name: 'getEntityFields',\n isExported: true,\n parameters: [{ name: 'slug', type: 'string' }],\n returnType: 'Record<string, string> | undefined',\n statements: [returnStatement(elementAccess(identifier('entityFieldsRegistry'), identifier('slug')))],\n })\n const outPath = path.join(generatedRoot, 'entity-fields-registry.ts')\n writeTrackedFile(outPath, getSourceText(sourceFile), result)\n}\n\nexport async function generateEntityIds(options: EntityIdsOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'entities.ids.generated.ts')\n const checksumFile = path.join(outputDir, 'entities.ids.generated.checksum')\n\n const entries = resolver.loadEnabledModules()\n\n const consolidated: Record<string, Record<string, string>> = {}\n const grouped: Record<GroupKey, Record<string, Record<string, string>>> = {}\n const modulesDict: Record<string, string> = {}\n const groupedModulesDict: Record<GroupKey, Record<string, string>> = {}\n\n const fieldsByGroup: Record<GroupKey, Record<string, EntityFieldMap>> = {}\n\n for (const entry of entries) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n const group: GroupKey = (entry.from as GroupKey) || '@open-mercato/core'\n\n const standaloneGeneratedPackageEntities = loadStandaloneGeneratedPackageEntities(resolver, entry)\n\n // Locate entities definition file (prefer app override)\n const appData = path.join(roots.appBase, 'data')\n const pkgData = path.join(roots.pkgBase, 'data')\n const appDb = path.join(roots.appBase, 'db')\n const pkgDb = path.join(roots.pkgBase, 'db')\n const bases = [appData, pkgData, appDb, pkgDb]\n const candidates = ['entities.override', 'entities', 'schema']\n let importPath: string | null = null\n let filePath: string | null = null\n\n for (const base of bases) {\n for (const f of candidates) {\n const p = resolveConventionFile(base, f)\n if (p) {\n const fromApp = base.startsWith(roots.appBase)\n const sub = path.basename(base) // 'data' | 'db'\n importPath = `${fromApp ? imps.appBase : imps.pkgBase}/${sub}/${f}`\n filePath = p\n break\n }\n }\n if (importPath) break\n }\n\n // No entities file found -> still register module id\n if (!filePath && !standaloneGeneratedPackageEntities) {\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n continue\n }\n\n const exportNames = filePath ? parseExportedClassNamesFromFile(filePath) : []\n\n const entityNames = standaloneGeneratedPackageEntities\n ? standaloneGeneratedPackageEntities.entityNames\n : exportNames\n .map((k) => toSnake(k))\n .filter((k, idx, arr) => arr.indexOf(k) === idx)\n\n // Build dictionaries\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n\n consolidated[modId] = consolidated[modId] || {}\n grouped[group] = grouped[group] || {}\n grouped[group][modId] = grouped[group][modId] || {}\n\n for (const en of entityNames) {\n consolidated[modId][en] = `${modId}:${en}`\n grouped[group][modId][en] = `${modId}:${en}`\n }\n\n // Parse entity fields from TypeScript source\n const entityFieldMap = standaloneGeneratedPackageEntities\n ? standaloneGeneratedPackageEntities.entityFieldMap\n : parseEntityFieldsFromFile(filePath!, exportNames)\n fieldsByGroup[group] = fieldsByGroup[group] || {}\n fieldsByGroup[group][modId] = entityFieldMap\n }\n\n // Write consolidated output\n const consolidatedSourceFile = createGeneratedSourceFile('entities.ids.generated.ts')\n addAutoGeneratedComment(consolidatedSourceFile, 'entity-ids')\n consolidatedSourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n { name: 'M', initializer: `${JSON.stringify(modulesDict, null, 2)} as const` },\n { name: 'E', initializer: `${JSON.stringify(consolidated, null, 2)} as const` },\n ],\n })\n consolidatedSourceFile.addTypeAlias({\n name: 'KnownModuleId',\n isExported: true,\n type: 'keyof typeof M',\n })\n consolidatedSourceFile.addTypeAlias({\n name: 'KnownEntities',\n isExported: true,\n type: 'typeof E',\n })\n const consolidatedSrc = getSourceText(consolidatedSourceFile)\n\n writeGeneratedFile({\n outFile,\n checksumFile,\n content: consolidatedSrc,\n structureChecksum: '',\n result,\n quiet,\n })\n\n // Write per-group outputs\n const groups = Object.keys(grouped) as GroupKey[]\n for (const g of groups) {\n if (!resolver.isMonorepo() && g !== '@app') {\n continue\n }\n\n const pkgOutputDir = resolver.getPackageOutputDir(g)\n // Skip @app group since it writes to the same location as the consolidated output\n if (g === '@app' && pkgOutputDir === outputDir) {\n continue\n }\n const out = path.join(pkgOutputDir, 'entities.ids.generated.ts')\n\n const groupSourceFile = createGeneratedSourceFile(`${String(g)}/entities.ids.generated.ts`)\n addAutoGeneratedComment(groupSourceFile, 'entity-ids')\n groupSourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n { name: 'M', initializer: `${JSON.stringify(groupedModulesDict[g] || {}, null, 2)} as const` },\n { name: 'E', initializer: `${JSON.stringify(grouped[g] || {}, null, 2)} as const` },\n ],\n })\n groupSourceFile.addTypeAlias({\n name: 'KnownModuleId',\n isExported: true,\n type: 'keyof typeof M',\n })\n groupSourceFile.addTypeAlias({\n name: 'KnownEntities',\n isExported: true,\n type: 'typeof E',\n })\n const src = getSourceText(groupSourceFile)\n writeTrackedFile(out, src, result)\n\n const fieldsRoot = path.join(pkgOutputDir, 'entities')\n const fieldsByModule = fieldsByGroup[g] || {}\n const combined: EntityFieldMap = {}\n for (const mId of Object.keys(fieldsByModule)) {\n const mMap = fieldsByModule[mId]\n for (const [entity, fields] of Object.entries(mMap)) {\n combined[entity] = Array.from(new Set([...(combined[entity] || []), ...fields]))\n }\n }\n writePerEntityFieldFiles(fieldsRoot, combined, result)\n\n // Generate static entity fields registry for Turbopack compatibility\n writeEntityFieldsRegistry(pkgOutputDir, combined, result)\n }\n\n // Write combined entity fields to root generated/ folder\n const combinedAll: EntityFieldMap = {}\n for (const groupFields of Object.values(fieldsByGroup)) {\n for (const mMap of Object.values(groupFields)) {\n for (const [entity, fields] of Object.entries(mMap)) {\n combinedAll[entity] = Array.from(new Set([...(combinedAll[entity] || []), ...fields]))\n }\n }\n }\n writePerEntityFieldFiles(path.join(outputDir, 'entities'), combinedAll, result)\n writeEntityFieldsRegistry(outputDir, combinedAll, result)\n\n return result\n}\n\nfunction resolveConventionFile(baseDir: string, basename: string): string | null {\n for (const extension of MODULE_CODE_EXTENSIONS) {\n const candidate = path.join(baseDir, `${basename}${extension}`)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,13 +3,9 @@ import path from "node:path";
3
3
  import { StructureKind, VariableDeclarationKind } from "ts-morph";
4
4
  import { MODULE_CODE_EXTENSIONS } from "./scanner.js";
5
5
  import {
6
- calculateChecksum,
7
- readChecksumRecord,
8
- writeChecksumRecord,
9
- ensureDir,
10
6
  toVar,
11
- logGenerationResult,
12
- createGeneratorResult
7
+ createGeneratorResult,
8
+ writeGeneratedFile
13
9
  } from "../utils.js";
14
10
  import {
15
11
  addAutoGeneratedComment,
@@ -79,23 +75,14 @@ async function generateModuleDi(options) {
79
75
  expression: "diRegistrars"
80
76
  });
81
77
  const output = getSourceText(sourceFile);
82
- const newChecksum = calculateChecksum(output);
83
- let shouldWrite = true;
84
- const existingRecord = readChecksumRecord(checksumFile);
85
- if (existingRecord && existingRecord.content === newChecksum) {
86
- shouldWrite = false;
87
- }
88
- if (shouldWrite) {
89
- ensureDir(outFile);
90
- fs.writeFileSync(outFile, output);
91
- writeChecksumRecord(checksumFile, { content: newChecksum, structure: "" });
92
- result.filesWritten.push(outFile);
93
- if (!quiet) {
94
- logGenerationResult(path.relative(process.cwd(), outFile), true);
95
- }
96
- } else {
97
- result.filesUnchanged.push(outFile);
98
- }
78
+ writeGeneratedFile({
79
+ outFile,
80
+ checksumFile,
81
+ content: output,
82
+ structureChecksum: "",
83
+ result,
84
+ quiet
85
+ });
99
86
  return result;
100
87
  }
101
88
  function resolveModuleConventionFile(baseDir, basename) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/generators/module-di.ts"],
4
- "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport { StructureKind, VariableDeclarationKind } from 'ts-morph'\nimport type { PackageResolver } from '../resolver'\nimport { MODULE_CODE_EXTENSIONS } from './scanner'\nimport {\n calculateChecksum,\n readChecksumRecord,\n writeChecksumRecord,\n ensureDir,\n toVar,\n logGenerationResult,\n type GeneratorResult,\n createGeneratorResult,\n} from '../utils'\nimport {\n addAutoGeneratedComment,\n addImportSpec,\n arrayLiteral,\n createGeneratedSourceFile,\n getSourceText,\n identifier,\n methodCall,\n parenthesized,\n} from './ast'\n\nexport interface ModuleDiOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleDi(options: ModuleDiOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'di.generated.ts')\n const checksumFile = path.join(outputDir, 'di.generated.checksum')\n\n const mods = resolver.loadEnabledModules()\n const imports: Array<{ name: string; moduleSpecifier: string }> = []\n const registrars: string[] = []\n let i = 0\n\n for (const entry of mods) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imp = resolver.getModuleImportBase(entry)\n const isAppModule = entry.from === '@app'\n\n const useApp = resolveModuleConventionFile(roots.appBase, 'di')\n const usePkg = resolveModuleConventionFile(roots.pkgBase, 'di')\n const importName = `D_${toVar(modId)}_${i++}`\n\n if (useApp) {\n // For @app modules, use relative path to work in both Next.js and Node.js CLI context\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const importPath = isAppModule ? `../../src/modules/${modId}/di` : `${imp.appBase}/di`\n imports.push({ name: importName, moduleSpecifier: importPath })\n registrars.push(`${importName}.register`)\n } else if (usePkg) {\n imports.push({ name: importName, moduleSpecifier: `${imp.pkgBase}/di` })\n registrars.push(`${importName}.register`)\n }\n }\n\n const sourceFile = createGeneratedSourceFile('di.generated.ts')\n addAutoGeneratedComment(sourceFile, 'di')\n imports.forEach((entry) => {\n addImportSpec(sourceFile, {\n kind: StructureKind.ImportDeclaration,\n namespaceImport: entry.name,\n moduleSpecifier: entry.moduleSpecifier,\n })\n })\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: 'diRegistrars',\n type: '(((c: any) => void) | undefined)[]',\n initializer: methodCall(\n parenthesized(arrayLiteral(registrars, (currentWriter, registrar) => identifier(registrar)(currentWriter))),\n 'filter',\n [identifier('Boolean')],\n ),\n },\n ],\n })\n sourceFile.addExportDeclaration({\n namedExports: ['diRegistrars'],\n })\n sourceFile.addExportAssignment({\n isExportEquals: false,\n expression: 'diRegistrars',\n })\n const output = getSourceText(sourceFile)\n\n // Check if content has changed\n const newChecksum = calculateChecksum(output)\n let shouldWrite = true\n\n const existingRecord = readChecksumRecord(checksumFile)\n if (existingRecord && existingRecord.content === newChecksum) {\n shouldWrite = false\n }\n\n if (shouldWrite) {\n ensureDir(outFile)\n fs.writeFileSync(outFile, output)\n writeChecksumRecord(checksumFile, { content: newChecksum, structure: '' })\n result.filesWritten.push(outFile)\n if (!quiet) {\n logGenerationResult(path.relative(process.cwd(), outFile), true)\n }\n } else {\n result.filesUnchanged.push(outFile)\n }\n\n return result\n}\n\nfunction resolveModuleConventionFile(baseDir: string, basename: string): boolean {\n return MODULE_CODE_EXTENSIONS.some((extension) => fs.existsSync(path.join(baseDir, `${basename}${extension}`)))\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport { StructureKind, VariableDeclarationKind } from 'ts-morph'\nimport type { PackageResolver } from '../resolver'\nimport { MODULE_CODE_EXTENSIONS } from './scanner'\nimport {\n toVar,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n} from '../utils'\nimport {\n addAutoGeneratedComment,\n addImportSpec,\n arrayLiteral,\n createGeneratedSourceFile,\n getSourceText,\n identifier,\n methodCall,\n parenthesized,\n} from './ast'\n\nexport interface ModuleDiOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleDi(options: ModuleDiOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'di.generated.ts')\n const checksumFile = path.join(outputDir, 'di.generated.checksum')\n\n const mods = resolver.loadEnabledModules()\n const imports: Array<{ name: string; moduleSpecifier: string }> = []\n const registrars: string[] = []\n let i = 0\n\n for (const entry of mods) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imp = resolver.getModuleImportBase(entry)\n const isAppModule = entry.from === '@app'\n\n const useApp = resolveModuleConventionFile(roots.appBase, 'di')\n const usePkg = resolveModuleConventionFile(roots.pkgBase, 'di')\n const importName = `D_${toVar(modId)}_${i++}`\n\n if (useApp) {\n // For @app modules, use relative path to work in both Next.js and Node.js CLI context\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const importPath = isAppModule ? `../../src/modules/${modId}/di` : `${imp.appBase}/di`\n imports.push({ name: importName, moduleSpecifier: importPath })\n registrars.push(`${importName}.register`)\n } else if (usePkg) {\n imports.push({ name: importName, moduleSpecifier: `${imp.pkgBase}/di` })\n registrars.push(`${importName}.register`)\n }\n }\n\n const sourceFile = createGeneratedSourceFile('di.generated.ts')\n addAutoGeneratedComment(sourceFile, 'di')\n imports.forEach((entry) => {\n addImportSpec(sourceFile, {\n kind: StructureKind.ImportDeclaration,\n namespaceImport: entry.name,\n moduleSpecifier: entry.moduleSpecifier,\n })\n })\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: 'diRegistrars',\n type: '(((c: any) => void) | undefined)[]',\n initializer: methodCall(\n parenthesized(arrayLiteral(registrars, (currentWriter, registrar) => identifier(registrar)(currentWriter))),\n 'filter',\n [identifier('Boolean')],\n ),\n },\n ],\n })\n sourceFile.addExportDeclaration({\n namedExports: ['diRegistrars'],\n })\n sourceFile.addExportAssignment({\n isExportEquals: false,\n expression: 'diRegistrars',\n })\n const output = getSourceText(sourceFile)\n\n writeGeneratedFile({\n outFile,\n checksumFile,\n content: output,\n structureChecksum: '',\n result,\n quiet,\n })\n\n return result\n}\n\nfunction resolveModuleConventionFile(baseDir: string, basename: string): boolean {\n return MODULE_CODE_EXTENSIONS.some((extension) => fs.existsSync(path.join(baseDir, `${basename}${extension}`)))\n}\n"],
5
+ "mappings": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,eAAe,+BAA+B;AAEvD,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAOP,eAAsB,iBAAiB,SAAoD;AACzF,QAAM,EAAE,UAAU,QAAQ,MAAM,IAAI;AACpC,QAAM,SAAS,sBAAsB;AAErC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,UAAU,KAAK,KAAK,WAAW,iBAAiB;AACtD,QAAM,eAAe,KAAK,KAAK,WAAW,uBAAuB;AAEjE,QAAM,OAAO,SAAS,mBAAmB;AACzC,QAAM,UAA4D,CAAC;AACnE,QAAM,aAAuB,CAAC;AAC9B,MAAI,IAAI;AAER,aAAW,SAAS,MAAM;AACxB,UAAM,QAAQ,MAAM;AACpB,UAAM,QAAQ,SAAS,eAAe,KAAK;AAC3C,UAAM,MAAM,SAAS,oBAAoB,KAAK;AAC9C,UAAM,cAAc,MAAM,SAAS;AAEnC,UAAM,SAAS,4BAA4B,MAAM,SAAS,IAAI;AAC9D,UAAM,SAAS,4BAA4B,MAAM,SAAS,IAAI;AAC9D,UAAM,aAAa,KAAK,MAAM,KAAK,CAAC,IAAI,GAAG;AAE3C,QAAI,QAAQ;AAGV,YAAM,aAAa,cAAc,qBAAqB,KAAK,QAAQ,GAAG,IAAI,OAAO;AACjF,cAAQ,KAAK,EAAE,MAAM,YAAY,iBAAiB,WAAW,CAAC;AAC9D,iBAAW,KAAK,GAAG,UAAU,WAAW;AAAA,IAC1C,WAAW,QAAQ;AACjB,cAAQ,KAAK,EAAE,MAAM,YAAY,iBAAiB,GAAG,IAAI,OAAO,MAAM,CAAC;AACvE,iBAAW,KAAK,GAAG,UAAU,WAAW;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,aAAa,0BAA0B,iBAAiB;AAC9D,0BAAwB,YAAY,IAAI;AACxC,UAAQ,QAAQ,CAAC,UAAU;AACzB,kBAAc,YAAY;AAAA,MACxB,MAAM,cAAc;AAAA,MACpB,iBAAiB,MAAM;AAAA,MACvB,iBAAiB,MAAM;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AACD,aAAW,qBAAqB;AAAA,IAC9B,iBAAiB,wBAAwB;AAAA,IACzC,cAAc;AAAA,MACZ;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,UACX,cAAc,aAAa,YAAY,CAAC,eAAe,cAAc,WAAW,SAAS,EAAE,aAAa,CAAC,CAAC;AAAA,UAC1G;AAAA,UACA,CAAC,WAAW,SAAS,CAAC;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACD,aAAW,qBAAqB;AAAA,IAC9B,cAAc,CAAC,cAAc;AAAA,EAC/B,CAAC;AACD,aAAW,oBAAoB;AAAA,IAC7B,gBAAgB;AAAA,IAChB,YAAY;AAAA,EACd,CAAC;AACD,QAAM,SAAS,cAAc,UAAU;AAEvC,qBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,4BAA4B,SAAiB,UAA2B;AAC/E,SAAO,uBAAuB,KAAK,CAAC,cAAc,GAAG,WAAW,KAAK,KAAK,SAAS,GAAG,QAAQ,GAAG,SAAS,EAAE,CAAC,CAAC;AAChH;",
6
6
  "names": []
7
7
  }