@open-mercato/cli 0.4.2-canary-0d5782b643 → 0.4.2-canary-f80d1bfa83

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.
@@ -478,8 +478,9 @@ async function generateModuleRegistry(options) {
478
478
  if (e.isDirectory()) {
479
479
  if (e.name === "__tests__" || e.name === "__mocks__") continue;
480
480
  walk(path.join(dir, e.name), [...rel, e.name]);
481
- } else if (e.isFile() && e.name.endsWith(".ts")) {
482
- if (/\.(test|spec)\.ts$/.test(e.name)) continue;
481
+ } else if (e.isFile() && (e.name.endsWith(".ts") || e.name.endsWith(".js"))) {
482
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue;
483
+ if (e.name.endsWith(".d.ts")) continue;
483
484
  found.push([...rel, e.name].join("/"));
484
485
  }
485
486
  }
@@ -490,11 +491,12 @@ async function generateModuleRegistry(options) {
490
491
  for (const rel of files) {
491
492
  const segs = rel.split("/");
492
493
  const file = segs.pop();
493
- const name = file.replace(/\.ts$/, "");
494
+ const name = file.replace(/\.(ts|js)$/, "");
494
495
  const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
495
496
  const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
496
- const appFile = path.join(subApp, ...segs, `${name}.ts`);
497
- const fromApp = fs.existsSync(appFile);
497
+ const appFileTs = path.join(subApp, ...segs, `${name}.ts`);
498
+ const appFileJs = path.join(subApp, ...segs, `${name}.js`);
499
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs);
498
500
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join("/")}`;
499
501
  imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`);
500
502
  const sid = [modId, ...segs, name].filter(Boolean).join(":");
@@ -513,8 +515,9 @@ async function generateModuleRegistry(options) {
513
515
  if (e.isDirectory()) {
514
516
  if (e.name === "__tests__" || e.name === "__mocks__") continue;
515
517
  walk(path.join(dir, e.name), [...rel, e.name]);
516
- } else if (e.isFile() && e.name.endsWith(".ts")) {
517
- if (/\.(test|spec)\.ts$/.test(e.name)) continue;
518
+ } else if (e.isFile() && (e.name.endsWith(".ts") || e.name.endsWith(".js"))) {
519
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue;
520
+ if (e.name.endsWith(".d.ts")) continue;
518
521
  found.push([...rel, e.name].join("/"));
519
522
  }
520
523
  }
@@ -525,9 +528,10 @@ async function generateModuleRegistry(options) {
525
528
  for (const rel of files) {
526
529
  const segs = rel.split("/");
527
530
  const file = segs.pop();
528
- const name = file.replace(/\.ts$/, "");
529
- const appFile = path.join(wrkApp, ...segs, `${name}.ts`);
530
- const fromApp = fs.existsSync(appFile);
531
+ const name = file.replace(/\.(ts|js)$/, "");
532
+ const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`);
533
+ const appFileJs = path.join(wrkApp, ...segs, `${name}.js`);
534
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs);
531
535
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join("/")}`;
532
536
  if (!await moduleHasExport(importPath, "metadata")) continue;
533
537
  const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
@@ -952,8 +956,9 @@ async function generateModuleRegistryCli(options) {
952
956
  if (e.isDirectory()) {
953
957
  if (e.name === "__tests__" || e.name === "__mocks__") continue;
954
958
  walk(path.join(dir, e.name), [...rel, e.name]);
955
- } else if (e.isFile() && e.name.endsWith(".ts")) {
956
- if (/\.(test|spec)\.ts$/.test(e.name)) continue;
959
+ } else if (e.isFile() && (e.name.endsWith(".ts") || e.name.endsWith(".js"))) {
960
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue;
961
+ if (e.name.endsWith(".d.ts")) continue;
957
962
  found.push([...rel, e.name].join("/"));
958
963
  }
959
964
  }
@@ -964,11 +969,12 @@ async function generateModuleRegistryCli(options) {
964
969
  for (const rel of files) {
965
970
  const segs = rel.split("/");
966
971
  const file = segs.pop();
967
- const name = file.replace(/\.ts$/, "");
972
+ const name = file.replace(/\.(ts|js)$/, "");
968
973
  const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
969
974
  const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
970
- const appFile = path.join(subApp, ...segs, `${name}.ts`);
971
- const fromApp = fs.existsSync(appFile);
975
+ const appFileTs = path.join(subApp, ...segs, `${name}.ts`);
976
+ const appFileJs = path.join(subApp, ...segs, `${name}.js`);
977
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs);
972
978
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join("/")}`;
973
979
  imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`);
974
980
  const sid = [modId, ...segs, name].filter(Boolean).join(":");
@@ -987,8 +993,9 @@ async function generateModuleRegistryCli(options) {
987
993
  if (e.isDirectory()) {
988
994
  if (e.name === "__tests__" || e.name === "__mocks__") continue;
989
995
  walk(path.join(dir, e.name), [...rel, e.name]);
990
- } else if (e.isFile() && e.name.endsWith(".ts")) {
991
- if (/\.(test|spec)\.ts$/.test(e.name)) continue;
996
+ } else if (e.isFile() && (e.name.endsWith(".ts") || e.name.endsWith(".js"))) {
997
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue;
998
+ if (e.name.endsWith(".d.ts")) continue;
992
999
  found.push([...rel, e.name].join("/"));
993
1000
  }
994
1001
  }
@@ -999,9 +1006,10 @@ async function generateModuleRegistryCli(options) {
999
1006
  for (const rel of files) {
1000
1007
  const segs = rel.split("/");
1001
1008
  const file = segs.pop();
1002
- const name = file.replace(/\.ts$/, "");
1003
- const appFile = path.join(wrkApp, ...segs, `${name}.ts`);
1004
- const fromApp = fs.existsSync(appFile);
1009
+ const name = file.replace(/\.(ts|js)$/, "");
1010
+ const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`);
1011
+ const appFileJs = path.join(wrkApp, ...segs, `${name}.js`);
1012
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs);
1005
1013
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join("/")}`;
1006
1014
  if (!await moduleHasExport(importPath, "metadata")) continue;
1007
1015
  const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/generators/module-registry.ts"],
4
- "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageResolver } from '../resolver'\nimport {\n calculateChecksum,\n calculateStructureChecksum,\n readChecksumRecord,\n writeChecksumRecord,\n toVar,\n moduleHasExport,\n logGenerationResult,\n type GeneratorResult,\n createGeneratorResult,\n} from '../utils'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\n/**\n * Find a module file, checking for both .ts (src) and .js (dist) extensions.\n * Supports both simple names (e.g., 'cli') and nested paths (e.g., 'data/extensions').\n * Returns the path if found, null otherwise.\n */\nfunction findModuleFile(basePath: string, ...segments: string[]): string | null {\n const name = segments.pop()!\n const dir = segments.length ? path.join(basePath, ...segments) : basePath\n const tsPath = path.join(dir, `${name}.ts`)\n if (fs.existsSync(tsPath)) return tsPath\n const jsPath = path.join(dir, `${name}.js`)\n if (fs.existsSync(jsPath)) return jsPath\n return null\n}\n\nexport interface ModuleRegistryOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleRegistry(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.generated.checksum')\n const widgetsOutFile = path.join(outputDir, 'dashboard-widgets.generated.ts')\n const widgetsChecksumFile = path.join(outputDir, 'dashboard-widgets.generated.checksum')\n const injectionWidgetsOutFile = path.join(outputDir, 'injection-widgets.generated.ts')\n const injectionWidgetsChecksumFile = path.join(outputDir, 'injection-widgets.generated.checksum')\n const injectionTablesOutFile = path.join(outputDir, 'injection-tables.generated.ts')\n const injectionTablesChecksumFile = path.join(outputDir, 'injection-tables.generated.checksum')\n const searchOutFile = path.join(outputDir, 'search.generated.ts')\n const searchChecksumFile = path.join(outputDir, 'search.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n let importId = 0\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n const allDashboardWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionTables: Array<{ moduleId: string; importPath: string; importName: string }> = []\n const searchConfigs: string[] = []\n const searchImports: string[] = []\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n // For @app modules, use relative paths since @/ alias doesn't work in Node.js runtime\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : imps.appBase\n\n const frontendRoutes: string[] = []\n const backendRoutes: string[] = []\n const apis: string[] = []\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let searchImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n const dashboardWidgets: string[] = []\n const injectionWidgets: string[] = []\n let injectionTableImportName: string | null = null\n\n // Module metadata: index.ts (overrideable)\n const appIndex = findModuleFile(roots.appBase, 'index')\n const pkgIndex = findModuleFile(roots.pkgBase, 'index')\n const indexTs = appIndex ?? pkgIndex\n if (indexTs) {\n infoImportName = `I${importId++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n // Try to eagerly read ModuleInfo.requires for dependency validation\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // Pages: frontend\n const feApp = path.join(roots.appBase, 'frontend')\n const fePkg = path.join(roots.pkgBase, 'frontend')\n if (fs.existsSync(feApp) || fs.existsSync(fePkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.tsx')) found.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(fePkg)) walk(fePkg)\n if (fs.existsSync(feApp)) walk(feApp)\n let files = Array.from(new Set(found))\n // Ensure static routes win over dynamic ones (e.g., 'create' before '[id]')\n const isDynamic = (p: string) => /\\/(\\[|\\[\\[\\.\\.\\.)/.test(p) || /^\\[/.test(p)\n files.sort((a, b) => {\n const ad = isDynamic(a) ? 1 : 0\n const bd = isDynamic(b) ? 1 : 0\n if (ad !== bd) return ad - bd // static first\n // Longer, more specific paths later to not shadow peers\n return a.localeCompare(b)\n })\n // Next-style page.tsx\n for (const rel of files.filter((f) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = rel.split('/')\n segs.pop()\n const importName = `C${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `CM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(feApp, ...segs, 'page.tsx')\n const fromApp = fs.existsSync(appFile)\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${sub}`\n const routePath = '/' + (segs.join('/') || '')\n const metaCandidates = [\n path.join(fromApp ? feApp : fePkg, ...segs, 'page.meta.ts'),\n path.join(fromApp ? feApp : fePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `M${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, path.basename(metaPath).replace(/\\.ts$/, '')].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n frontendRoutes.push(\n `{ pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n // Back-compat direct files\n for (const rel of files.filter((f) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const routeSegs = [...segs, name].filter(Boolean)\n const importName = `C${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const pageModName = `CM${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const appFile = path.join(feApp, ...segs, `${name}.tsx`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, name].join('/')}`\n const routePath = '/' + (routeSegs.join('/') || '')\n const metaCandidates = [\n path.join(fromApp ? feApp : fePkg, ...segs, name + '.meta.ts'),\n path.join(fromApp ? feApp : fePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `M${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const metaBase = path.basename(metaPath)\n const metaImportSub = metaBase === 'meta.ts' ? 'meta' : name + '.meta'\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n frontendRoutes.push(\n `{ pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, Component: ${importName} }`\n )\n }\n }\n\n // Entity extensions: src/modules/<module>/data/extensions.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'extensions')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'extensions')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `X_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`\n imports.push(`import * as ${importName} from '${importPath}'`)\n extensionsImportName = importName\n }\n }\n\n // RBAC feature declarations: module root acl.ts\n {\n const rootApp = findModuleFile(roots.appBase, 'acl')\n const rootPkg = findModuleFile(roots.pkgBase, 'acl')\n const hasRoot = rootApp || rootPkg\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importId++}`\n const useApp = rootApp ?? rootPkg!\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities declarations: module root ce.ts\n {\n const appFile = findModuleFile(roots.appBase, 'ce')\n const pkgFile = findModuleFile(roots.pkgBase, 'ce')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `CE_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`\n imports.push(`import * as ${importName} from '${importPath}'`)\n customEntitiesImportName = importName\n }\n }\n\n // Search module configuration: module root search.ts\n {\n const appFile = findModuleFile(roots.appBase, 'search')\n const pkgFile = findModuleFile(roots.pkgBase, 'search')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `SEARCH_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/search` : `${imps.pkgBase}/search`\n const importStmt = `import * as ${importName} from '${importPath}'`\n imports.push(importStmt)\n searchImports.push(importStmt)\n searchImportName = importName\n }\n }\n\n // Custom field declarations: src/modules/<module>/data/fields.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'fields')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'fields')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `F_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`\n imports.push(`import * as ${importName} from '${importPath}'`)\n fieldsImportName = importName\n }\n }\n\n // Pages: backend\n const beApp = path.join(roots.appBase, 'backend')\n const bePkg = path.join(roots.pkgBase, 'backend')\n if (fs.existsSync(beApp) || fs.existsSync(bePkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.tsx')) found.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(bePkg)) walk(bePkg)\n if (fs.existsSync(beApp)) walk(beApp)\n let files = Array.from(new Set(found))\n const isDynamic = (p: string) => /\\/(\\[|\\[\\[\\.\\.\\.)/.test(p) || /^\\[/.test(p)\n files.sort((a, b) => {\n const ad = isDynamic(a) ? 1 : 0\n const bd = isDynamic(b) ? 1 : 0\n if (ad !== bd) return ad - bd\n return a.localeCompare(b)\n })\n // Next-style\n for (const rel of files.filter((f) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = rel.split('/')\n segs.pop()\n const importName = `B${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `BM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(beApp, ...segs, 'page.tsx')\n const fromApp = fs.existsSync(appFile)\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${sub}`\n const basePath = segs.join('/') || modId\n const routePath = '/backend/' + basePath\n const metaCandidates = [\n path.join(fromApp ? beApp : bePkg, ...segs, 'page.meta.ts'),\n path.join(fromApp ? beApp : bePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `BM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, path.basename(metaPath).replace(/\\.ts$/, '')].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n backendRoutes.push(\n `{ pattern: '${routePath}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n // Direct files\n for (const rel of files.filter((f) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const importName = `B${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const pageModName = `BM${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFile = path.join(beApp, ...segs, `${name}.tsx`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, name].join('/')}`\n const routePath = '/backend/' + [modId, ...segs, name].filter(Boolean).join('/')\n const metaCandidates = [\n path.join(fromApp ? beApp : bePkg, ...segs, name + '.meta.ts'),\n path.join(fromApp ? beApp : bePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `BM${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaBase = path.basename(metaPath)\n const metaImportSub = metaBase === 'meta.ts' ? 'meta' : name + '.meta'\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `${metaImportName}.metadata`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n backendRoutes.push(\n `{ pattern: '${routePath}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n }\n\n // APIs\n const apiApp = path.join(roots.appBase, 'api')\n const apiPkg = path.join(roots.pkgBase, 'api')\n if (fs.existsSync(apiApp) || fs.existsSync(apiPkg)) {\n // route.ts aggregations\n const routeFiles: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name === 'route.ts') routeFiles.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(apiPkg)) walk(apiPkg)\n if (fs.existsSync(apiApp)) walk(apiApp)\n const routeList = Array.from(new Set(routeFiles))\n const isDynamicRoute = (p: string) => p.split('/').some((seg) => /\\[|\\[\\[\\.\\.\\./.test(seg))\n routeList.sort((a, b) => {\n const ad = isDynamicRoute(a) ? 1 : 0\n const bd = isDynamicRoute(b) ? 1 : 0\n if (ad !== bd) return ad - bd\n return a.localeCompare(b)\n })\n for (const rel of routeList) {\n const segs = rel.split('/')\n segs.pop()\n const reqSegs = [modId, ...segs]\n const importName = `R${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...segs, 'route.ts')\n const fromApp = fs.existsSync(appFile)\n const apiSegPath = segs.join('/')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${apiSegPath ? `/${apiSegPath}` : ''}/route`\n const routePath = '/' + reqSegs.filter(Boolean).join('/')\n const sourceFile = fromApp ? appFile : path.join(apiPkg, ...segs, 'route.ts')\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n\n // Single files\n const plainFiles: string[] = []\n const methodNames = new Set(['get', 'post', 'put', 'patch', 'delete'])\n const walkPlain = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (methodNames.has(e.name.toLowerCase())) continue\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walkPlain(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts') && e.name !== 'route.ts') {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n plainFiles.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(apiPkg)) walkPlain(apiPkg)\n if (fs.existsSync(apiApp)) walkPlain(apiApp)\n const plainList = Array.from(new Set(plainFiles))\n for (const rel of plainList) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `R${importId++}_${toVar(modId)}_${toVar(fullSegs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...fullSegs) + '.ts'\n const fromApp = fs.existsSync(appFile)\n const plainSegPath = fullSegs.join('/')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${plainSegPath ? `/${plainSegPath}` : ''}`\n const pkgFile = path.join(apiPkg, ...fullSegs) + '.ts'\n const sourceFile = fromApp ? appFile : pkgFile\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n // Legacy per-method\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']\n for (const method of methods) {\n const coreMethodDir = path.join(apiPkg, method.toLowerCase())\n const appMethodDir = path.join(apiApp, method.toLowerCase())\n const methodDir = fs.existsSync(appMethodDir) ? appMethodDir : coreMethodDir\n if (!fs.existsSync(methodDir)) continue\n const apiFiles: string[] = []\n const walk2 = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk2(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n apiFiles.push([...rel, e.name].join('/'))\n }\n }\n }\n walk2(methodDir)\n const methodList = Array.from(new Set(apiFiles))\n for (const rel of methodList) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `H${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const fromApp = methodDir === appMethodDir\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api/${method.toLowerCase()}/${fullSegs.join('/')}`\n const metaName = `RM${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const sourceFile = path.join(methodDir, ...segs, file)\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${metaName}.openApi` : ''\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n apis.push(`{ method: '${method}', path: '${routePath}', handler: ${importName}, metadata: ${metaName}.metadata${docsPart} }`)\n }\n }\n }\n\n // CLI\n const cliApp = findModuleFile(roots.appBase, 'cli')\n const cliPkg = findModuleFile(roots.pkgBase, 'cli')\n const cliPath = cliApp ?? cliPkg\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n\n // Translations: merge core + app with app overriding\n const i18nApp = path.join(roots.appBase, 'i18n')\n const i18nCore = path.join(roots.pkgBase, 'i18n')\n const locales = new Set<string>()\n if (fs.existsSync(i18nCore))\n for (const e of fs.readdirSync(i18nCore, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n if (fs.existsSync(i18nApp))\n for (const e of fs.readdirSync(i18nApp, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n for (const locale of locales) {\n const coreHas = fs.existsSync(path.join(i18nCore, `${locale}.json`))\n const appHas = fs.existsSync(path.join(i18nApp, `${locale}.json`))\n if (coreHas && appHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(\n `'${locale}': { ...( ${cName} as unknown as Record<string,string> ), ...( ${aName} as unknown as Record<string,string> ) }`\n )\n } else if (appHas) {\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${aName} as unknown as Record<string,string>`)\n } else if (coreHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n\n // Subscribers: src/modules/<module>/subscribers/*.ts\n const subApp = path.join(roots.appBase, 'subscribers')\n const subPkg = path.join(roots.pkgBase, 'subscribers')\n if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(subPkg)) walk(subPkg)\n if (fs.existsSync(subApp)) walk(subApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFile = path.join(subApp, ...segs, `${name}.ts`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const sid = [modId, ...segs, name].filter(Boolean).join(':')\n subscribers.push(\n `{ id: (((${metaName}.metadata) as any)?.id || '${sid}'), event: ((${metaName}.metadata) as any)?.event, persistent: ((${metaName}.metadata) as any)?.persistent, handler: ${importName} }`\n )\n }\n }\n\n // Workers: src/modules/<module>/workers/*.ts\n // Only includes files that export `metadata` with a `queue` property\n {\n const wrkApp = path.join(roots.appBase, 'workers')\n const wrkPkg = path.join(roots.pkgBase, 'workers')\n if (fs.existsSync(wrkApp) || fs.existsSync(wrkPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(wrkPkg)) walk(wrkPkg)\n if (fs.existsSync(wrkApp)) walk(wrkApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const appFile = path.join(wrkApp, ...segs, `${name}.ts`)\n const fromApp = fs.existsSync(appFile)\n // Use package import path for checking exports (file path fails due to relative imports)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`\n // Only include files that export metadata with a queue property\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const wid = [modId, 'workers', ...segs, name].filter(Boolean).join(':')\n workers.push(\n `{ id: (${metaName}.metadata as { id?: string })?.id || '${wid}', queue: (${metaName}.metadata as { queue: string }).queue, concurrency: (${metaName}.metadata as { concurrency?: number })?.concurrency ?? 1, handler: ${importName} as (job: unknown, ctx: unknown) => Promise<void> }`\n )\n }\n }\n }\n\n // Build combined customFieldSets expression from data/fields.ts and ce.ts (entities[].fields)\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n // Dashboard widgets: src/modules/<module>/widgets/dashboard/**/widget.ts(x)\n {\n const widgetApp = path.join(roots.appBase, 'widgets', 'dashboard')\n const widgetPkg = path.join(roots.pkgBase, 'widgets', 'dashboard')\n if (fs.existsSync(widgetApp) || fs.existsSync(widgetPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && /^widget\\.(t|j)sx?$/.test(e.name)) {\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(widgetPkg)) walk(widgetPkg)\n if (fs.existsSync(widgetApp)) walk(widgetApp)\n const files = Array.from(new Set(found)).sort()\n for (const rel of files) {\n const appFile = path.join(widgetApp, ...rel.split('/'))\n const fromApp = fs.existsSync(appFile)\n const segs = rel.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/dashboard/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n dashboardWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allDashboardWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allDashboardWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n }\n\n // Injection widgets: src/modules/<module>/widgets/injection/**/widget.ts(x)\n {\n const widgetApp = path.join(roots.appBase, 'widgets', 'injection')\n const widgetPkg = path.join(roots.pkgBase, 'widgets', 'injection')\n if (fs.existsSync(widgetApp) || fs.existsSync(widgetPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && /^widget\\.(t|j)sx?$/.test(e.name)) {\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(widgetPkg)) walk(widgetPkg)\n if (fs.existsSync(widgetApp)) walk(widgetApp)\n const files = Array.from(new Set(found)).sort()\n for (const rel of files) {\n const appFile = path.join(widgetApp, ...rel.split('/'))\n const fromApp = fs.existsSync(appFile)\n const segs = rel.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/injection/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n injectionWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allInjectionWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allInjectionWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n }\n\n // Injection table: src/modules/<module>/widgets/injection-table.ts\n {\n const appFile = path.join(roots.appBase, 'widgets', 'injection-table.ts')\n const pkgFile = path.join(roots.pkgBase, 'widgets', 'injection-table.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(pkgFile)\n if (hasApp || hasPkg) {\n const importName = `InjTable_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/widgets/injection-table` : `${imps.pkgBase}/widgets/injection-table`\n imports.push(`import * as ${importName} from '${importPath}'`)\n injectionTableImportName = importName\n allInjectionTables.push({ moduleId: modId, importPath, importName })\n }\n }\n\n if (searchImportName) {\n searchConfigs.push(`{ moduleId: '${modId}', config: (${searchImportName}.default ?? ${searchImportName}.searchConfig ?? ${searchImportName}.config ?? null) }`)\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${frontendRoutes.length ? `frontendRoutes: [${frontendRoutes.join(', ')}],` : ''}\n ${backendRoutes.length ? `backendRoutes: [${backendRoutes.join(', ')}],` : ''}\n ${apis.length ? `apis: [${apis.join(', ')}],` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as import('@open-mercato/shared/modules/entities').EntityExtension[]) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${dashboardWidgets.length ? `dashboardWidgets: [${dashboardWidgets.join(', ')}],` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n const widgetEntriesList = Array.from(allDashboardWidgets.entries()).sort(([a], [b]) => a.localeCompare(b))\n const widgetDecls = widgetEntriesList.map(\n ([key, data]) =>\n ` { moduleId: '${data.moduleId}', key: '${key}', source: '${data.source}', loader: () => import('${data.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const widgetsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleDashboardWidgetEntry } from '@open-mercato/shared/modules/registry'\n\nexport const dashboardWidgetEntries: ModuleDashboardWidgetEntry[] = [\n${widgetDecls.join(',\\n')}\n]\n`\n const searchEntriesLiteral = searchConfigs.join(',\\n ')\n const searchImportSection = searchImports.join('\\n')\n const searchOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { SearchModuleConfig } from '@open-mercato/shared/modules/search'\n${searchImportSection ? `\\n${searchImportSection}\\n` : '\\n'}type SearchConfigEntry = { moduleId: string; config: SearchModuleConfig | null }\n\nconst entriesRaw: SearchConfigEntry[] = [\n${searchEntriesLiteral ? ` ${searchEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((entry): entry is { moduleId: string; config: SearchModuleConfig } => entry.config != null)\n\nexport const searchModuleConfigEntries = entries\nexport const searchModuleConfigs: SearchModuleConfig[] = entries.map((entry) => entry.config)\n`\n\n // Validate module dependencies declared via ModuleInfo.requires\n {\n const enabledIds = new Set(enabled.map((e) => e.id))\n const problems: string[] = []\n for (const [modId, reqs] of requiresByModule.entries()) {\n const missing = reqs.filter((r) => !enabledIds.has(r))\n if (missing.length) {\n problems.push(`- Module \"${modId}\" requires: ${missing.join(', ')}`)\n }\n }\n if (problems.length) {\n console.error('\\nModule dependency check failed:')\n for (const p of problems) console.error(p)\n console.error('\\nFix: Enable required module(s) in src/modules.ts. Example:')\n console.error(\n ' export const enabledModules = [ { id: \\'' +\n Array.from(new Set(requiresByModule.values()).values()).join(\"' }, { id: '\") +\n \"' } ]\"\n )\n process.exit(1)\n }\n }\n\n const structureChecksum = calculateStructureChecksum(Array.from(trackedRoots))\n\n const modulesChecksum = { content: calculateChecksum(output), structure: structureChecksum }\n const existingModulesChecksum = readChecksumRecord(checksumFile)\n const shouldWriteModules =\n !existingModulesChecksum ||\n existingModulesChecksum.content !== modulesChecksum.content ||\n existingModulesChecksum.structure !== modulesChecksum.structure\n if (shouldWriteModules) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true })\n fs.writeFileSync(outFile, output)\n writeChecksumRecord(checksumFile, modulesChecksum)\n result.filesWritten.push(outFile)\n } else {\n result.filesUnchanged.push(outFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), outFile), shouldWriteModules)\n\n const widgetsChecksum = { content: calculateChecksum(widgetsOutput), structure: structureChecksum }\n const existingWidgetsChecksum = readChecksumRecord(widgetsChecksumFile)\n const shouldWriteWidgets =\n !existingWidgetsChecksum ||\n existingWidgetsChecksum.content !== widgetsChecksum.content ||\n existingWidgetsChecksum.structure !== widgetsChecksum.structure\n if (shouldWriteWidgets) {\n fs.writeFileSync(widgetsOutFile, widgetsOutput)\n writeChecksumRecord(widgetsChecksumFile, widgetsChecksum)\n result.filesWritten.push(widgetsOutFile)\n } else {\n result.filesUnchanged.push(widgetsOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), widgetsOutFile), shouldWriteWidgets)\n\n const injectionWidgetEntriesList = Array.from(allInjectionWidgets.entries()).sort(([a], [b]) => a.localeCompare(b))\n const injectionWidgetDecls = injectionWidgetEntriesList.map(\n ([key, data]) =>\n ` { moduleId: '${data.moduleId}', key: '${key}', source: '${data.source}', loader: () => import('${data.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const injectionWidgetsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleInjectionWidgetEntry } from '@open-mercato/shared/modules/registry'\n\nexport const injectionWidgetEntries: ModuleInjectionWidgetEntry[] = [\n${injectionWidgetDecls.join(',\\n')}\n]\n`\n const injectionTableImports = allInjectionTables.map(\n (entry) => `import * as ${entry.importName} from '${entry.importPath}'`\n )\n const injectionTableDecls = allInjectionTables.map(\n (entry) =>\n ` { moduleId: '${entry.moduleId}', table: ((${entry.importName}.default ?? ${entry.importName}.injectionTable) as any) || {} }`\n )\n const injectionTablesOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleInjectionTable } from '@open-mercato/shared/modules/widgets/injection'\n${injectionTableImports.join('\\n')}\n\nexport const injectionTables: Array<{ moduleId: string; table: ModuleInjectionTable }> = [\n${injectionTableDecls.join(',\\n')}\n]\n`\n const injectionWidgetsChecksum = { content: calculateChecksum(injectionWidgetsOutput), structure: structureChecksum }\n const existingInjectionWidgetsChecksum = readChecksumRecord(injectionWidgetsChecksumFile)\n const shouldWriteInjectionWidgets =\n !existingInjectionWidgetsChecksum ||\n existingInjectionWidgetsChecksum.content !== injectionWidgetsChecksum.content ||\n existingInjectionWidgetsChecksum.structure !== injectionWidgetsChecksum.structure\n if (shouldWriteInjectionWidgets) {\n fs.writeFileSync(injectionWidgetsOutFile, injectionWidgetsOutput)\n writeChecksumRecord(injectionWidgetsChecksumFile, injectionWidgetsChecksum)\n result.filesWritten.push(injectionWidgetsOutFile)\n } else {\n result.filesUnchanged.push(injectionWidgetsOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), injectionWidgetsOutFile), shouldWriteInjectionWidgets)\n\n const injectionTablesChecksum = { content: calculateChecksum(injectionTablesOutput), structure: structureChecksum }\n const existingInjectionTablesChecksum = readChecksumRecord(injectionTablesChecksumFile)\n const shouldWriteInjectionTables =\n !existingInjectionTablesChecksum ||\n existingInjectionTablesChecksum.content !== injectionTablesChecksum.content ||\n existingInjectionTablesChecksum.structure !== injectionTablesChecksum.structure\n if (shouldWriteInjectionTables) {\n fs.writeFileSync(injectionTablesOutFile, injectionTablesOutput)\n writeChecksumRecord(injectionTablesChecksumFile, injectionTablesChecksum)\n result.filesWritten.push(injectionTablesOutFile)\n } else {\n result.filesUnchanged.push(injectionTablesOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), injectionTablesOutFile), shouldWriteInjectionTables)\n\n const searchChecksum = { content: calculateChecksum(searchOutput), structure: structureChecksum }\n const existingSearchChecksum = readChecksumRecord(searchChecksumFile)\n const shouldWriteSearch =\n !existingSearchChecksum ||\n existingSearchChecksum.content !== searchChecksum.content ||\n existingSearchChecksum.structure !== searchChecksum.structure\n if (shouldWriteSearch) {\n fs.writeFileSync(searchOutFile, searchOutput)\n writeChecksumRecord(searchChecksumFile, searchChecksum)\n result.filesWritten.push(searchOutFile)\n } else {\n result.filesUnchanged.push(searchOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), searchOutFile), shouldWriteSearch)\n\n return result\n}\n\n/**\n * Generate a CLI-specific module registry that excludes Next.js dependent code.\n * This produces modules.cli.generated.ts which can be loaded without Next.js runtime.\n *\n * Includes: module metadata, CLI commands, translations, subscribers, workers, entity extensions,\n * features/ACL, custom entities, vector config, custom fields\n * Excludes: frontend routes, backend routes, API handlers, dashboard/injection widgets\n */\nexport async function generateModuleRegistryCli(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.cli.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.cli.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n let importId = 0\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n // For @app modules, use relative paths since @/ alias doesn't work in Node.js runtime\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : imps.appBase\n\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let vectorImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n\n // Module metadata: index.ts (overrideable)\n const appIndex = findModuleFile(roots.appBase, 'index')\n const pkgIndex = findModuleFile(roots.pkgBase, 'index')\n const indexTs = appIndex ?? pkgIndex\n if (indexTs) {\n infoImportName = `I${importId++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n // Try to eagerly read ModuleInfo.requires for dependency validation\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // Entity extensions: src/modules/<module>/data/extensions.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'extensions')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'extensions')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `X_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`\n imports.push(`import * as ${importName} from '${importPath}'`)\n extensionsImportName = importName\n }\n }\n\n // RBAC feature declarations: module root acl.ts\n {\n const rootApp = findModuleFile(roots.appBase, 'acl')\n const rootPkg = findModuleFile(roots.pkgBase, 'acl')\n const hasRoot = rootApp || rootPkg\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importId++}`\n const useApp = rootApp ?? rootPkg!\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities declarations: module root ce.ts\n {\n const appFile = findModuleFile(roots.appBase, 'ce')\n const pkgFile = findModuleFile(roots.pkgBase, 'ce')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `CE_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`\n imports.push(`import * as ${importName} from '${importPath}'`)\n customEntitiesImportName = importName\n }\n }\n\n // Vector search configuration: module root vector.ts\n {\n const appFile = findModuleFile(roots.appBase, 'vector')\n const pkgFile = findModuleFile(roots.pkgBase, 'vector')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `VECTOR_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/vector` : `${imps.pkgBase}/vector`\n imports.push(`import * as ${importName} from '${importPath}'`)\n vectorImportName = importName\n }\n }\n\n // Custom field declarations: src/modules/<module>/data/fields.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'fields')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'fields')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `F_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`\n imports.push(`import * as ${importName} from '${importPath}'`)\n fieldsImportName = importName\n }\n }\n\n // CLI\n const cliApp = findModuleFile(roots.appBase, 'cli')\n const cliPkg = findModuleFile(roots.pkgBase, 'cli')\n const cliPath = cliApp ?? cliPkg\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n\n // Translations: merge core + app with app overriding\n const i18nApp = path.join(roots.appBase, 'i18n')\n const i18nCore = path.join(roots.pkgBase, 'i18n')\n const locales = new Set<string>()\n if (fs.existsSync(i18nCore))\n for (const e of fs.readdirSync(i18nCore, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n if (fs.existsSync(i18nApp))\n for (const e of fs.readdirSync(i18nApp, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n for (const locale of locales) {\n const coreHas = fs.existsSync(path.join(i18nCore, `${locale}.json`))\n const appHas = fs.existsSync(path.join(i18nApp, `${locale}.json`))\n if (coreHas && appHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(\n `'${locale}': { ...( ${cName} as unknown as Record<string,string> ), ...( ${aName} as unknown as Record<string,string> ) }`\n )\n } else if (appHas) {\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${aName} as unknown as Record<string,string>`)\n } else if (coreHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n\n // Subscribers: src/modules/<module>/subscribers/*.ts\n const subApp = path.join(roots.appBase, 'subscribers')\n const subPkg = path.join(roots.pkgBase, 'subscribers')\n if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(subPkg)) walk(subPkg)\n if (fs.existsSync(subApp)) walk(subApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFile = path.join(subApp, ...segs, `${name}.ts`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const sid = [modId, ...segs, name].filter(Boolean).join(':')\n subscribers.push(\n `{ id: (((${metaName}.metadata) as any)?.id || '${sid}'), event: ((${metaName}.metadata) as any)?.event, persistent: ((${metaName}.metadata) as any)?.persistent, handler: ${importName} }`\n )\n }\n }\n\n // Workers: src/modules/<module>/workers/*.ts\n // Only includes files that export `metadata` with a `queue` property\n {\n const wrkApp = path.join(roots.appBase, 'workers')\n const wrkPkg = path.join(roots.pkgBase, 'workers')\n if (fs.existsSync(wrkApp) || fs.existsSync(wrkPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(wrkPkg)) walk(wrkPkg)\n if (fs.existsSync(wrkApp)) walk(wrkApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const appFile = path.join(wrkApp, ...segs, `${name}.ts`)\n const fromApp = fs.existsSync(appFile)\n // Use package import path for checking exports (file path fails due to relative imports)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`\n // Only include files that export metadata with a queue property\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const wid = [modId, 'workers', ...segs, name].filter(Boolean).join(':')\n workers.push(\n `{ id: (${metaName}.metadata as { id?: string })?.id || '${wid}', queue: (${metaName}.metadata as { queue: string }).queue, concurrency: (${metaName}.metadata as { concurrency?: number })?.concurrency ?? 1, handler: ${importName} as (job: unknown, ctx: unknown) => Promise<void> }`\n )\n }\n }\n }\n\n // Build combined customFieldSets expression from data/fields.ts and ce.ts (entities[].fields)\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as any) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${vectorImportName ? `vector: (${vectorImportName}.default ?? ${vectorImportName}.vectorConfig ?? ${vectorImportName}.config ?? undefined),` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry (CLI version)\n// This file excludes Next.js dependent code (routes, APIs, widgets)\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n\n // Validate module dependencies declared via ModuleInfo.requires\n {\n const enabledIds = new Set(enabled.map((e) => e.id))\n const problems: string[] = []\n for (const [modId, reqs] of requiresByModule.entries()) {\n const missing = reqs.filter((r) => !enabledIds.has(r))\n if (missing.length) {\n problems.push(`- Module \"${modId}\" requires: ${missing.join(', ')}`)\n }\n }\n if (problems.length) {\n console.error('\\nModule dependency check failed:')\n for (const p of problems) console.error(p)\n console.error('\\nFix: Enable required module(s) in src/modules.ts. Example:')\n console.error(\n ' export const enabledModules = [ { id: \\'' +\n Array.from(new Set(requiresByModule.values()).values()).join(\"' }, { id: '\") +\n \"' } ]\"\n )\n process.exit(1)\n }\n }\n\n const structureChecksum = calculateStructureChecksum(Array.from(trackedRoots))\n\n const checksum = { content: calculateChecksum(output), structure: structureChecksum }\n const existingChecksum = readChecksumRecord(checksumFile)\n const shouldWrite =\n !existingChecksum ||\n existingChecksum.content !== checksum.content ||\n existingChecksum.structure !== checksum.structure\n if (shouldWrite) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true })\n fs.writeFileSync(outFile, output)\n writeChecksumRecord(checksumFile, checksum)\n result.filesWritten.push(outFile)\n } else {\n result.filesUnchanged.push(outFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), outFile), shouldWrite)\n\n return result\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageResolver } from '../resolver'\nimport {\n calculateChecksum,\n calculateStructureChecksum,\n readChecksumRecord,\n writeChecksumRecord,\n toVar,\n moduleHasExport,\n logGenerationResult,\n type GeneratorResult,\n createGeneratorResult,\n} from '../utils'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\n/**\n * Find a module file, checking for both .ts (src) and .js (dist) extensions.\n * Supports both simple names (e.g., 'cli') and nested paths (e.g., 'data/extensions').\n * Returns the path if found, null otherwise.\n */\nfunction findModuleFile(basePath: string, ...segments: string[]): string | null {\n const name = segments.pop()!\n const dir = segments.length ? path.join(basePath, ...segments) : basePath\n const tsPath = path.join(dir, `${name}.ts`)\n if (fs.existsSync(tsPath)) return tsPath\n const jsPath = path.join(dir, `${name}.js`)\n if (fs.existsSync(jsPath)) return jsPath\n return null\n}\n\nexport interface ModuleRegistryOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleRegistry(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.generated.checksum')\n const widgetsOutFile = path.join(outputDir, 'dashboard-widgets.generated.ts')\n const widgetsChecksumFile = path.join(outputDir, 'dashboard-widgets.generated.checksum')\n const injectionWidgetsOutFile = path.join(outputDir, 'injection-widgets.generated.ts')\n const injectionWidgetsChecksumFile = path.join(outputDir, 'injection-widgets.generated.checksum')\n const injectionTablesOutFile = path.join(outputDir, 'injection-tables.generated.ts')\n const injectionTablesChecksumFile = path.join(outputDir, 'injection-tables.generated.checksum')\n const searchOutFile = path.join(outputDir, 'search.generated.ts')\n const searchChecksumFile = path.join(outputDir, 'search.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n let importId = 0\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n const allDashboardWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionTables: Array<{ moduleId: string; importPath: string; importName: string }> = []\n const searchConfigs: string[] = []\n const searchImports: string[] = []\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n // For @app modules, use relative paths since @/ alias doesn't work in Node.js runtime\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : imps.appBase\n\n const frontendRoutes: string[] = []\n const backendRoutes: string[] = []\n const apis: string[] = []\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let searchImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n const dashboardWidgets: string[] = []\n const injectionWidgets: string[] = []\n let injectionTableImportName: string | null = null\n\n // Module metadata: index.ts (overrideable)\n const appIndex = findModuleFile(roots.appBase, 'index')\n const pkgIndex = findModuleFile(roots.pkgBase, 'index')\n const indexTs = appIndex ?? pkgIndex\n if (indexTs) {\n infoImportName = `I${importId++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n // Try to eagerly read ModuleInfo.requires for dependency validation\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // Pages: frontend\n const feApp = path.join(roots.appBase, 'frontend')\n const fePkg = path.join(roots.pkgBase, 'frontend')\n if (fs.existsSync(feApp) || fs.existsSync(fePkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.tsx')) found.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(fePkg)) walk(fePkg)\n if (fs.existsSync(feApp)) walk(feApp)\n let files = Array.from(new Set(found))\n // Ensure static routes win over dynamic ones (e.g., 'create' before '[id]')\n const isDynamic = (p: string) => /\\/(\\[|\\[\\[\\.\\.\\.)/.test(p) || /^\\[/.test(p)\n files.sort((a, b) => {\n const ad = isDynamic(a) ? 1 : 0\n const bd = isDynamic(b) ? 1 : 0\n if (ad !== bd) return ad - bd // static first\n // Longer, more specific paths later to not shadow peers\n return a.localeCompare(b)\n })\n // Next-style page.tsx\n for (const rel of files.filter((f) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = rel.split('/')\n segs.pop()\n const importName = `C${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `CM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(feApp, ...segs, 'page.tsx')\n const fromApp = fs.existsSync(appFile)\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${sub}`\n const routePath = '/' + (segs.join('/') || '')\n const metaCandidates = [\n path.join(fromApp ? feApp : fePkg, ...segs, 'page.meta.ts'),\n path.join(fromApp ? feApp : fePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `M${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, path.basename(metaPath).replace(/\\.ts$/, '')].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n frontendRoutes.push(\n `{ pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n // Back-compat direct files\n for (const rel of files.filter((f) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const routeSegs = [...segs, name].filter(Boolean)\n const importName = `C${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const pageModName = `CM${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const appFile = path.join(feApp, ...segs, `${name}.tsx`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, name].join('/')}`\n const routePath = '/' + (routeSegs.join('/') || '')\n const metaCandidates = [\n path.join(fromApp ? feApp : fePkg, ...segs, name + '.meta.ts'),\n path.join(fromApp ? feApp : fePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `M${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const metaBase = path.basename(metaPath)\n const metaImportSub = metaBase === 'meta.ts' ? 'meta' : name + '.meta'\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n frontendRoutes.push(\n `{ pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, Component: ${importName} }`\n )\n }\n }\n\n // Entity extensions: src/modules/<module>/data/extensions.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'extensions')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'extensions')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `X_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`\n imports.push(`import * as ${importName} from '${importPath}'`)\n extensionsImportName = importName\n }\n }\n\n // RBAC feature declarations: module root acl.ts\n {\n const rootApp = findModuleFile(roots.appBase, 'acl')\n const rootPkg = findModuleFile(roots.pkgBase, 'acl')\n const hasRoot = rootApp || rootPkg\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importId++}`\n const useApp = rootApp ?? rootPkg!\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities declarations: module root ce.ts\n {\n const appFile = findModuleFile(roots.appBase, 'ce')\n const pkgFile = findModuleFile(roots.pkgBase, 'ce')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `CE_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`\n imports.push(`import * as ${importName} from '${importPath}'`)\n customEntitiesImportName = importName\n }\n }\n\n // Search module configuration: module root search.ts\n {\n const appFile = findModuleFile(roots.appBase, 'search')\n const pkgFile = findModuleFile(roots.pkgBase, 'search')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `SEARCH_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/search` : `${imps.pkgBase}/search`\n const importStmt = `import * as ${importName} from '${importPath}'`\n imports.push(importStmt)\n searchImports.push(importStmt)\n searchImportName = importName\n }\n }\n\n // Custom field declarations: src/modules/<module>/data/fields.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'fields')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'fields')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `F_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`\n imports.push(`import * as ${importName} from '${importPath}'`)\n fieldsImportName = importName\n }\n }\n\n // Pages: backend\n const beApp = path.join(roots.appBase, 'backend')\n const bePkg = path.join(roots.pkgBase, 'backend')\n if (fs.existsSync(beApp) || fs.existsSync(bePkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.tsx')) found.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(bePkg)) walk(bePkg)\n if (fs.existsSync(beApp)) walk(beApp)\n let files = Array.from(new Set(found))\n const isDynamic = (p: string) => /\\/(\\[|\\[\\[\\.\\.\\.)/.test(p) || /^\\[/.test(p)\n files.sort((a, b) => {\n const ad = isDynamic(a) ? 1 : 0\n const bd = isDynamic(b) ? 1 : 0\n if (ad !== bd) return ad - bd\n return a.localeCompare(b)\n })\n // Next-style\n for (const rel of files.filter((f) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = rel.split('/')\n segs.pop()\n const importName = `B${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `BM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(beApp, ...segs, 'page.tsx')\n const fromApp = fs.existsSync(appFile)\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${sub}`\n const basePath = segs.join('/') || modId\n const routePath = '/backend/' + basePath\n const metaCandidates = [\n path.join(fromApp ? beApp : bePkg, ...segs, 'page.meta.ts'),\n path.join(fromApp ? beApp : bePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `BM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, path.basename(metaPath).replace(/\\.ts$/, '')].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n backendRoutes.push(\n `{ pattern: '${routePath}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n // Direct files\n for (const rel of files.filter((f) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const importName = `B${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const pageModName = `BM${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFile = path.join(beApp, ...segs, `${name}.tsx`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, name].join('/')}`\n const routePath = '/backend/' + [modId, ...segs, name].filter(Boolean).join('/')\n const metaCandidates = [\n path.join(fromApp ? beApp : bePkg, ...segs, name + '.meta.ts'),\n path.join(fromApp ? beApp : bePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `BM${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaBase = path.basename(metaPath)\n const metaImportSub = metaBase === 'meta.ts' ? 'meta' : name + '.meta'\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `${metaImportName}.metadata`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n backendRoutes.push(\n `{ pattern: '${routePath}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n }\n\n // APIs\n const apiApp = path.join(roots.appBase, 'api')\n const apiPkg = path.join(roots.pkgBase, 'api')\n if (fs.existsSync(apiApp) || fs.existsSync(apiPkg)) {\n // route.ts aggregations\n const routeFiles: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name === 'route.ts') routeFiles.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(apiPkg)) walk(apiPkg)\n if (fs.existsSync(apiApp)) walk(apiApp)\n const routeList = Array.from(new Set(routeFiles))\n const isDynamicRoute = (p: string) => p.split('/').some((seg) => /\\[|\\[\\[\\.\\.\\./.test(seg))\n routeList.sort((a, b) => {\n const ad = isDynamicRoute(a) ? 1 : 0\n const bd = isDynamicRoute(b) ? 1 : 0\n if (ad !== bd) return ad - bd\n return a.localeCompare(b)\n })\n for (const rel of routeList) {\n const segs = rel.split('/')\n segs.pop()\n const reqSegs = [modId, ...segs]\n const importName = `R${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...segs, 'route.ts')\n const fromApp = fs.existsSync(appFile)\n const apiSegPath = segs.join('/')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${apiSegPath ? `/${apiSegPath}` : ''}/route`\n const routePath = '/' + reqSegs.filter(Boolean).join('/')\n const sourceFile = fromApp ? appFile : path.join(apiPkg, ...segs, 'route.ts')\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n\n // Single files\n const plainFiles: string[] = []\n const methodNames = new Set(['get', 'post', 'put', 'patch', 'delete'])\n const walkPlain = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (methodNames.has(e.name.toLowerCase())) continue\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walkPlain(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts') && e.name !== 'route.ts') {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n plainFiles.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(apiPkg)) walkPlain(apiPkg)\n if (fs.existsSync(apiApp)) walkPlain(apiApp)\n const plainList = Array.from(new Set(plainFiles))\n for (const rel of plainList) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `R${importId++}_${toVar(modId)}_${toVar(fullSegs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...fullSegs) + '.ts'\n const fromApp = fs.existsSync(appFile)\n const plainSegPath = fullSegs.join('/')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${plainSegPath ? `/${plainSegPath}` : ''}`\n const pkgFile = path.join(apiPkg, ...fullSegs) + '.ts'\n const sourceFile = fromApp ? appFile : pkgFile\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n // Legacy per-method\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']\n for (const method of methods) {\n const coreMethodDir = path.join(apiPkg, method.toLowerCase())\n const appMethodDir = path.join(apiApp, method.toLowerCase())\n const methodDir = fs.existsSync(appMethodDir) ? appMethodDir : coreMethodDir\n if (!fs.existsSync(methodDir)) continue\n const apiFiles: string[] = []\n const walk2 = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk2(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n apiFiles.push([...rel, e.name].join('/'))\n }\n }\n }\n walk2(methodDir)\n const methodList = Array.from(new Set(apiFiles))\n for (const rel of methodList) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `H${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const fromApp = methodDir === appMethodDir\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api/${method.toLowerCase()}/${fullSegs.join('/')}`\n const metaName = `RM${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const sourceFile = path.join(methodDir, ...segs, file)\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${metaName}.openApi` : ''\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n apis.push(`{ method: '${method}', path: '${routePath}', handler: ${importName}, metadata: ${metaName}.metadata${docsPart} }`)\n }\n }\n }\n\n // CLI\n const cliApp = findModuleFile(roots.appBase, 'cli')\n const cliPkg = findModuleFile(roots.pkgBase, 'cli')\n const cliPath = cliApp ?? cliPkg\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n\n // Translations: merge core + app with app overriding\n const i18nApp = path.join(roots.appBase, 'i18n')\n const i18nCore = path.join(roots.pkgBase, 'i18n')\n const locales = new Set<string>()\n if (fs.existsSync(i18nCore))\n for (const e of fs.readdirSync(i18nCore, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n if (fs.existsSync(i18nApp))\n for (const e of fs.readdirSync(i18nApp, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n for (const locale of locales) {\n const coreHas = fs.existsSync(path.join(i18nCore, `${locale}.json`))\n const appHas = fs.existsSync(path.join(i18nApp, `${locale}.json`))\n if (coreHas && appHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(\n `'${locale}': { ...( ${cName} as unknown as Record<string,string> ), ...( ${aName} as unknown as Record<string,string> ) }`\n )\n } else if (appHas) {\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${aName} as unknown as Record<string,string>`)\n } else if (coreHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n\n // Subscribers: src/modules/<module>/subscribers/*.ts or *.js\n const subApp = path.join(roots.appBase, 'subscribers')\n const subPkg = path.join(roots.pkgBase, 'subscribers')\n if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {\n if (/\\.(test|spec)\\.(ts|js)$/.test(e.name)) continue\n if (e.name.endsWith('.d.ts')) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(subPkg)) walk(subPkg)\n if (fs.existsSync(subApp)) walk(subApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.(ts|js)$/, '')\n const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFileTs = path.join(subApp, ...segs, `${name}.ts`)\n const appFileJs = path.join(subApp, ...segs, `${name}.js`)\n const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const sid = [modId, ...segs, name].filter(Boolean).join(':')\n subscribers.push(\n `{ id: (((${metaName}.metadata) as any)?.id || '${sid}'), event: ((${metaName}.metadata) as any)?.event, persistent: ((${metaName}.metadata) as any)?.persistent, handler: ${importName} }`\n )\n }\n }\n\n // Workers: src/modules/<module>/workers/*.ts or *.js\n // Only includes files that export `metadata` with a `queue` property\n {\n const wrkApp = path.join(roots.appBase, 'workers')\n const wrkPkg = path.join(roots.pkgBase, 'workers')\n if (fs.existsSync(wrkApp) || fs.existsSync(wrkPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {\n if (/\\.(test|spec)\\.(ts|js)$/.test(e.name)) continue\n if (e.name.endsWith('.d.ts')) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(wrkPkg)) walk(wrkPkg)\n if (fs.existsSync(wrkApp)) walk(wrkApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.(ts|js)$/, '')\n const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`)\n const appFileJs = path.join(wrkApp, ...segs, `${name}.js`)\n const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)\n // Use package import path for checking exports (file path fails due to relative imports)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`\n // Only include files that export metadata with a queue property\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const wid = [modId, 'workers', ...segs, name].filter(Boolean).join(':')\n workers.push(\n `{ id: (${metaName}.metadata as { id?: string })?.id || '${wid}', queue: (${metaName}.metadata as { queue: string }).queue, concurrency: (${metaName}.metadata as { concurrency?: number })?.concurrency ?? 1, handler: ${importName} as (job: unknown, ctx: unknown) => Promise<void> }`\n )\n }\n }\n }\n\n // Build combined customFieldSets expression from data/fields.ts and ce.ts (entities[].fields)\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n // Dashboard widgets: src/modules/<module>/widgets/dashboard/**/widget.ts(x)\n {\n const widgetApp = path.join(roots.appBase, 'widgets', 'dashboard')\n const widgetPkg = path.join(roots.pkgBase, 'widgets', 'dashboard')\n if (fs.existsSync(widgetApp) || fs.existsSync(widgetPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && /^widget\\.(t|j)sx?$/.test(e.name)) {\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(widgetPkg)) walk(widgetPkg)\n if (fs.existsSync(widgetApp)) walk(widgetApp)\n const files = Array.from(new Set(found)).sort()\n for (const rel of files) {\n const appFile = path.join(widgetApp, ...rel.split('/'))\n const fromApp = fs.existsSync(appFile)\n const segs = rel.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/dashboard/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n dashboardWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allDashboardWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allDashboardWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n }\n\n // Injection widgets: src/modules/<module>/widgets/injection/**/widget.ts(x)\n {\n const widgetApp = path.join(roots.appBase, 'widgets', 'injection')\n const widgetPkg = path.join(roots.pkgBase, 'widgets', 'injection')\n if (fs.existsSync(widgetApp) || fs.existsSync(widgetPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && /^widget\\.(t|j)sx?$/.test(e.name)) {\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(widgetPkg)) walk(widgetPkg)\n if (fs.existsSync(widgetApp)) walk(widgetApp)\n const files = Array.from(new Set(found)).sort()\n for (const rel of files) {\n const appFile = path.join(widgetApp, ...rel.split('/'))\n const fromApp = fs.existsSync(appFile)\n const segs = rel.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/injection/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n injectionWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allInjectionWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allInjectionWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n }\n\n // Injection table: src/modules/<module>/widgets/injection-table.ts\n {\n const appFile = path.join(roots.appBase, 'widgets', 'injection-table.ts')\n const pkgFile = path.join(roots.pkgBase, 'widgets', 'injection-table.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(pkgFile)\n if (hasApp || hasPkg) {\n const importName = `InjTable_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/widgets/injection-table` : `${imps.pkgBase}/widgets/injection-table`\n imports.push(`import * as ${importName} from '${importPath}'`)\n injectionTableImportName = importName\n allInjectionTables.push({ moduleId: modId, importPath, importName })\n }\n }\n\n if (searchImportName) {\n searchConfigs.push(`{ moduleId: '${modId}', config: (${searchImportName}.default ?? ${searchImportName}.searchConfig ?? ${searchImportName}.config ?? null) }`)\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${frontendRoutes.length ? `frontendRoutes: [${frontendRoutes.join(', ')}],` : ''}\n ${backendRoutes.length ? `backendRoutes: [${backendRoutes.join(', ')}],` : ''}\n ${apis.length ? `apis: [${apis.join(', ')}],` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as import('@open-mercato/shared/modules/entities').EntityExtension[]) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${dashboardWidgets.length ? `dashboardWidgets: [${dashboardWidgets.join(', ')}],` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n const widgetEntriesList = Array.from(allDashboardWidgets.entries()).sort(([a], [b]) => a.localeCompare(b))\n const widgetDecls = widgetEntriesList.map(\n ([key, data]) =>\n ` { moduleId: '${data.moduleId}', key: '${key}', source: '${data.source}', loader: () => import('${data.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const widgetsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleDashboardWidgetEntry } from '@open-mercato/shared/modules/registry'\n\nexport const dashboardWidgetEntries: ModuleDashboardWidgetEntry[] = [\n${widgetDecls.join(',\\n')}\n]\n`\n const searchEntriesLiteral = searchConfigs.join(',\\n ')\n const searchImportSection = searchImports.join('\\n')\n const searchOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { SearchModuleConfig } from '@open-mercato/shared/modules/search'\n${searchImportSection ? `\\n${searchImportSection}\\n` : '\\n'}type SearchConfigEntry = { moduleId: string; config: SearchModuleConfig | null }\n\nconst entriesRaw: SearchConfigEntry[] = [\n${searchEntriesLiteral ? ` ${searchEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((entry): entry is { moduleId: string; config: SearchModuleConfig } => entry.config != null)\n\nexport const searchModuleConfigEntries = entries\nexport const searchModuleConfigs: SearchModuleConfig[] = entries.map((entry) => entry.config)\n`\n\n // Validate module dependencies declared via ModuleInfo.requires\n {\n const enabledIds = new Set(enabled.map((e) => e.id))\n const problems: string[] = []\n for (const [modId, reqs] of requiresByModule.entries()) {\n const missing = reqs.filter((r) => !enabledIds.has(r))\n if (missing.length) {\n problems.push(`- Module \"${modId}\" requires: ${missing.join(', ')}`)\n }\n }\n if (problems.length) {\n console.error('\\nModule dependency check failed:')\n for (const p of problems) console.error(p)\n console.error('\\nFix: Enable required module(s) in src/modules.ts. Example:')\n console.error(\n ' export const enabledModules = [ { id: \\'' +\n Array.from(new Set(requiresByModule.values()).values()).join(\"' }, { id: '\") +\n \"' } ]\"\n )\n process.exit(1)\n }\n }\n\n const structureChecksum = calculateStructureChecksum(Array.from(trackedRoots))\n\n const modulesChecksum = { content: calculateChecksum(output), structure: structureChecksum }\n const existingModulesChecksum = readChecksumRecord(checksumFile)\n const shouldWriteModules =\n !existingModulesChecksum ||\n existingModulesChecksum.content !== modulesChecksum.content ||\n existingModulesChecksum.structure !== modulesChecksum.structure\n if (shouldWriteModules) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true })\n fs.writeFileSync(outFile, output)\n writeChecksumRecord(checksumFile, modulesChecksum)\n result.filesWritten.push(outFile)\n } else {\n result.filesUnchanged.push(outFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), outFile), shouldWriteModules)\n\n const widgetsChecksum = { content: calculateChecksum(widgetsOutput), structure: structureChecksum }\n const existingWidgetsChecksum = readChecksumRecord(widgetsChecksumFile)\n const shouldWriteWidgets =\n !existingWidgetsChecksum ||\n existingWidgetsChecksum.content !== widgetsChecksum.content ||\n existingWidgetsChecksum.structure !== widgetsChecksum.structure\n if (shouldWriteWidgets) {\n fs.writeFileSync(widgetsOutFile, widgetsOutput)\n writeChecksumRecord(widgetsChecksumFile, widgetsChecksum)\n result.filesWritten.push(widgetsOutFile)\n } else {\n result.filesUnchanged.push(widgetsOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), widgetsOutFile), shouldWriteWidgets)\n\n const injectionWidgetEntriesList = Array.from(allInjectionWidgets.entries()).sort(([a], [b]) => a.localeCompare(b))\n const injectionWidgetDecls = injectionWidgetEntriesList.map(\n ([key, data]) =>\n ` { moduleId: '${data.moduleId}', key: '${key}', source: '${data.source}', loader: () => import('${data.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const injectionWidgetsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleInjectionWidgetEntry } from '@open-mercato/shared/modules/registry'\n\nexport const injectionWidgetEntries: ModuleInjectionWidgetEntry[] = [\n${injectionWidgetDecls.join(',\\n')}\n]\n`\n const injectionTableImports = allInjectionTables.map(\n (entry) => `import * as ${entry.importName} from '${entry.importPath}'`\n )\n const injectionTableDecls = allInjectionTables.map(\n (entry) =>\n ` { moduleId: '${entry.moduleId}', table: ((${entry.importName}.default ?? ${entry.importName}.injectionTable) as any) || {} }`\n )\n const injectionTablesOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleInjectionTable } from '@open-mercato/shared/modules/widgets/injection'\n${injectionTableImports.join('\\n')}\n\nexport const injectionTables: Array<{ moduleId: string; table: ModuleInjectionTable }> = [\n${injectionTableDecls.join(',\\n')}\n]\n`\n const injectionWidgetsChecksum = { content: calculateChecksum(injectionWidgetsOutput), structure: structureChecksum }\n const existingInjectionWidgetsChecksum = readChecksumRecord(injectionWidgetsChecksumFile)\n const shouldWriteInjectionWidgets =\n !existingInjectionWidgetsChecksum ||\n existingInjectionWidgetsChecksum.content !== injectionWidgetsChecksum.content ||\n existingInjectionWidgetsChecksum.structure !== injectionWidgetsChecksum.structure\n if (shouldWriteInjectionWidgets) {\n fs.writeFileSync(injectionWidgetsOutFile, injectionWidgetsOutput)\n writeChecksumRecord(injectionWidgetsChecksumFile, injectionWidgetsChecksum)\n result.filesWritten.push(injectionWidgetsOutFile)\n } else {\n result.filesUnchanged.push(injectionWidgetsOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), injectionWidgetsOutFile), shouldWriteInjectionWidgets)\n\n const injectionTablesChecksum = { content: calculateChecksum(injectionTablesOutput), structure: structureChecksum }\n const existingInjectionTablesChecksum = readChecksumRecord(injectionTablesChecksumFile)\n const shouldWriteInjectionTables =\n !existingInjectionTablesChecksum ||\n existingInjectionTablesChecksum.content !== injectionTablesChecksum.content ||\n existingInjectionTablesChecksum.structure !== injectionTablesChecksum.structure\n if (shouldWriteInjectionTables) {\n fs.writeFileSync(injectionTablesOutFile, injectionTablesOutput)\n writeChecksumRecord(injectionTablesChecksumFile, injectionTablesChecksum)\n result.filesWritten.push(injectionTablesOutFile)\n } else {\n result.filesUnchanged.push(injectionTablesOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), injectionTablesOutFile), shouldWriteInjectionTables)\n\n const searchChecksum = { content: calculateChecksum(searchOutput), structure: structureChecksum }\n const existingSearchChecksum = readChecksumRecord(searchChecksumFile)\n const shouldWriteSearch =\n !existingSearchChecksum ||\n existingSearchChecksum.content !== searchChecksum.content ||\n existingSearchChecksum.structure !== searchChecksum.structure\n if (shouldWriteSearch) {\n fs.writeFileSync(searchOutFile, searchOutput)\n writeChecksumRecord(searchChecksumFile, searchChecksum)\n result.filesWritten.push(searchOutFile)\n } else {\n result.filesUnchanged.push(searchOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), searchOutFile), shouldWriteSearch)\n\n return result\n}\n\n/**\n * Generate a CLI-specific module registry that excludes Next.js dependent code.\n * This produces modules.cli.generated.ts which can be loaded without Next.js runtime.\n *\n * Includes: module metadata, CLI commands, translations, subscribers, workers, entity extensions,\n * features/ACL, custom entities, vector config, custom fields\n * Excludes: frontend routes, backend routes, API handlers, dashboard/injection widgets\n */\nexport async function generateModuleRegistryCli(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.cli.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.cli.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n let importId = 0\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n // For @app modules, use relative paths since @/ alias doesn't work in Node.js runtime\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : imps.appBase\n\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let vectorImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n\n // Module metadata: index.ts (overrideable)\n const appIndex = findModuleFile(roots.appBase, 'index')\n const pkgIndex = findModuleFile(roots.pkgBase, 'index')\n const indexTs = appIndex ?? pkgIndex\n if (indexTs) {\n infoImportName = `I${importId++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n // Try to eagerly read ModuleInfo.requires for dependency validation\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // Entity extensions: src/modules/<module>/data/extensions.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'extensions')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'extensions')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `X_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`\n imports.push(`import * as ${importName} from '${importPath}'`)\n extensionsImportName = importName\n }\n }\n\n // RBAC feature declarations: module root acl.ts\n {\n const rootApp = findModuleFile(roots.appBase, 'acl')\n const rootPkg = findModuleFile(roots.pkgBase, 'acl')\n const hasRoot = rootApp || rootPkg\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importId++}`\n const useApp = rootApp ?? rootPkg!\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities declarations: module root ce.ts\n {\n const appFile = findModuleFile(roots.appBase, 'ce')\n const pkgFile = findModuleFile(roots.pkgBase, 'ce')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `CE_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`\n imports.push(`import * as ${importName} from '${importPath}'`)\n customEntitiesImportName = importName\n }\n }\n\n // Vector search configuration: module root vector.ts\n {\n const appFile = findModuleFile(roots.appBase, 'vector')\n const pkgFile = findModuleFile(roots.pkgBase, 'vector')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `VECTOR_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/vector` : `${imps.pkgBase}/vector`\n imports.push(`import * as ${importName} from '${importPath}'`)\n vectorImportName = importName\n }\n }\n\n // Custom field declarations: src/modules/<module>/data/fields.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'fields')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'fields')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `F_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`\n imports.push(`import * as ${importName} from '${importPath}'`)\n fieldsImportName = importName\n }\n }\n\n // CLI\n const cliApp = findModuleFile(roots.appBase, 'cli')\n const cliPkg = findModuleFile(roots.pkgBase, 'cli')\n const cliPath = cliApp ?? cliPkg\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n\n // Translations: merge core + app with app overriding\n const i18nApp = path.join(roots.appBase, 'i18n')\n const i18nCore = path.join(roots.pkgBase, 'i18n')\n const locales = new Set<string>()\n if (fs.existsSync(i18nCore))\n for (const e of fs.readdirSync(i18nCore, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n if (fs.existsSync(i18nApp))\n for (const e of fs.readdirSync(i18nApp, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n for (const locale of locales) {\n const coreHas = fs.existsSync(path.join(i18nCore, `${locale}.json`))\n const appHas = fs.existsSync(path.join(i18nApp, `${locale}.json`))\n if (coreHas && appHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(\n `'${locale}': { ...( ${cName} as unknown as Record<string,string> ), ...( ${aName} as unknown as Record<string,string> ) }`\n )\n } else if (appHas) {\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${aName} as unknown as Record<string,string>`)\n } else if (coreHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n\n // Subscribers: src/modules/<module>/subscribers/*.ts or *.js\n const subApp = path.join(roots.appBase, 'subscribers')\n const subPkg = path.join(roots.pkgBase, 'subscribers')\n if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {\n if (/\\.(test|spec)\\.(ts|js)$/.test(e.name)) continue\n if (e.name.endsWith('.d.ts')) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(subPkg)) walk(subPkg)\n if (fs.existsSync(subApp)) walk(subApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.(ts|js)$/, '')\n const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFileTs = path.join(subApp, ...segs, `${name}.ts`)\n const appFileJs = path.join(subApp, ...segs, `${name}.js`)\n const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const sid = [modId, ...segs, name].filter(Boolean).join(':')\n subscribers.push(\n `{ id: (((${metaName}.metadata) as any)?.id || '${sid}'), event: ((${metaName}.metadata) as any)?.event, persistent: ((${metaName}.metadata) as any)?.persistent, handler: ${importName} }`\n )\n }\n }\n\n // Workers: src/modules/<module>/workers/*.ts or *.js\n // Only includes files that export `metadata` with a `queue` property\n {\n const wrkApp = path.join(roots.appBase, 'workers')\n const wrkPkg = path.join(roots.pkgBase, 'workers')\n if (fs.existsSync(wrkApp) || fs.existsSync(wrkPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {\n if (/\\.(test|spec)\\.(ts|js)$/.test(e.name)) continue\n if (e.name.endsWith('.d.ts')) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(wrkPkg)) walk(wrkPkg)\n if (fs.existsSync(wrkApp)) walk(wrkApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.(ts|js)$/, '')\n const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`)\n const appFileJs = path.join(wrkApp, ...segs, `${name}.js`)\n const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)\n // Use package import path for checking exports (file path fails due to relative imports)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`\n // Only include files that export metadata with a queue property\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const wid = [modId, 'workers', ...segs, name].filter(Boolean).join(':')\n workers.push(\n `{ id: (${metaName}.metadata as { id?: string })?.id || '${wid}', queue: (${metaName}.metadata as { queue: string }).queue, concurrency: (${metaName}.metadata as { concurrency?: number })?.concurrency ?? 1, handler: ${importName} as (job: unknown, ctx: unknown) => Promise<void> }`\n )\n }\n }\n }\n\n // Build combined customFieldSets expression from data/fields.ts and ce.ts (entities[].fields)\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as any) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${vectorImportName ? `vector: (${vectorImportName}.default ?? ${vectorImportName}.vectorConfig ?? ${vectorImportName}.config ?? undefined),` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry (CLI version)\n// This file excludes Next.js dependent code (routes, APIs, widgets)\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n\n // Validate module dependencies declared via ModuleInfo.requires\n {\n const enabledIds = new Set(enabled.map((e) => e.id))\n const problems: string[] = []\n for (const [modId, reqs] of requiresByModule.entries()) {\n const missing = reqs.filter((r) => !enabledIds.has(r))\n if (missing.length) {\n problems.push(`- Module \"${modId}\" requires: ${missing.join(', ')}`)\n }\n }\n if (problems.length) {\n console.error('\\nModule dependency check failed:')\n for (const p of problems) console.error(p)\n console.error('\\nFix: Enable required module(s) in src/modules.ts. Example:')\n console.error(\n ' export const enabledModules = [ { id: \\'' +\n Array.from(new Set(requiresByModule.values()).values()).join(\"' }, { id: '\") +\n \"' } ]\"\n )\n process.exit(1)\n }\n }\n\n const structureChecksum = calculateStructureChecksum(Array.from(trackedRoots))\n\n const checksum = { content: calculateChecksum(output), structure: structureChecksum }\n const existingChecksum = readChecksumRecord(checksumFile)\n const shouldWrite =\n !existingChecksum ||\n existingChecksum.content !== checksum.content ||\n existingChecksum.structure !== checksum.structure\n if (shouldWrite) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true })\n fs.writeFileSync(outFile, output)\n writeChecksumRecord(checksumFile, checksum)\n result.filesWritten.push(outFile)\n } else {\n result.filesUnchanged.push(outFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), outFile), shouldWrite)\n\n return result\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/cli",
3
- "version": "0.4.2-canary-0d5782b643",
3
+ "version": "0.4.2-canary-f80d1bfa83",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -55,7 +55,7 @@
55
55
  "@mikro-orm/core": "^6.6.2",
56
56
  "@mikro-orm/migrations": "^6.6.2",
57
57
  "@mikro-orm/postgresql": "^6.6.2",
58
- "@open-mercato/shared": "0.4.2-canary-0d5782b643",
58
+ "@open-mercato/shared": "0.4.2-canary-f80d1bfa83",
59
59
  "pg": "^8.16.3",
60
60
  "typescript": "^5.9.3"
61
61
  },
@@ -525,7 +525,7 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
525
525
  }
526
526
  }
527
527
 
528
- // Subscribers: src/modules/<module>/subscribers/*.ts
528
+ // Subscribers: src/modules/<module>/subscribers/*.ts or *.js
529
529
  const subApp = path.join(roots.appBase, 'subscribers')
530
530
  const subPkg = path.join(roots.pkgBase, 'subscribers')
531
531
  if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {
@@ -535,8 +535,9 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
535
535
  if (e.isDirectory()) {
536
536
  if (e.name === '__tests__' || e.name === '__mocks__') continue
537
537
  walk(path.join(dir, e.name), [...rel, e.name])
538
- } else if (e.isFile() && e.name.endsWith('.ts')) {
539
- if (/\.(test|spec)\.ts$/.test(e.name)) continue
538
+ } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {
539
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue
540
+ if (e.name.endsWith('.d.ts')) continue
540
541
  found.push([...rel, e.name].join('/'))
541
542
  }
542
543
  }
@@ -547,11 +548,12 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
547
548
  for (const rel of files) {
548
549
  const segs = rel.split('/')
549
550
  const file = segs.pop()!
550
- const name = file.replace(/\.ts$/, '')
551
+ const name = file.replace(/\.(ts|js)$/, '')
551
552
  const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`
552
553
  const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`
553
- const appFile = path.join(subApp, ...segs, `${name}.ts`)
554
- const fromApp = fs.existsSync(appFile)
554
+ const appFileTs = path.join(subApp, ...segs, `${name}.ts`)
555
+ const appFileJs = path.join(subApp, ...segs, `${name}.js`)
556
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)
555
557
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`
556
558
  imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)
557
559
  const sid = [modId, ...segs, name].filter(Boolean).join(':')
@@ -561,7 +563,7 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
561
563
  }
562
564
  }
563
565
 
564
- // Workers: src/modules/<module>/workers/*.ts
566
+ // Workers: src/modules/<module>/workers/*.ts or *.js
565
567
  // Only includes files that export `metadata` with a `queue` property
566
568
  {
567
569
  const wrkApp = path.join(roots.appBase, 'workers')
@@ -573,8 +575,9 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
573
575
  if (e.isDirectory()) {
574
576
  if (e.name === '__tests__' || e.name === '__mocks__') continue
575
577
  walk(path.join(dir, e.name), [...rel, e.name])
576
- } else if (e.isFile() && e.name.endsWith('.ts')) {
577
- if (/\.(test|spec)\.ts$/.test(e.name)) continue
578
+ } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {
579
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue
580
+ if (e.name.endsWith('.d.ts')) continue
578
581
  found.push([...rel, e.name].join('/'))
579
582
  }
580
583
  }
@@ -585,9 +588,10 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
585
588
  for (const rel of files) {
586
589
  const segs = rel.split('/')
587
590
  const file = segs.pop()!
588
- const name = file.replace(/\.ts$/, '')
589
- const appFile = path.join(wrkApp, ...segs, `${name}.ts`)
590
- const fromApp = fs.existsSync(appFile)
591
+ const name = file.replace(/\.(ts|js)$/, '')
592
+ const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`)
593
+ const appFileJs = path.join(wrkApp, ...segs, `${name}.js`)
594
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)
591
595
  // Use package import path for checking exports (file path fails due to relative imports)
592
596
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`
593
597
  // Only include files that export metadata with a queue property
@@ -1075,7 +1079,7 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
1075
1079
  }
1076
1080
  }
1077
1081
 
1078
- // Subscribers: src/modules/<module>/subscribers/*.ts
1082
+ // Subscribers: src/modules/<module>/subscribers/*.ts or *.js
1079
1083
  const subApp = path.join(roots.appBase, 'subscribers')
1080
1084
  const subPkg = path.join(roots.pkgBase, 'subscribers')
1081
1085
  if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {
@@ -1085,8 +1089,9 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
1085
1089
  if (e.isDirectory()) {
1086
1090
  if (e.name === '__tests__' || e.name === '__mocks__') continue
1087
1091
  walk(path.join(dir, e.name), [...rel, e.name])
1088
- } else if (e.isFile() && e.name.endsWith('.ts')) {
1089
- if (/\.(test|spec)\.ts$/.test(e.name)) continue
1092
+ } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {
1093
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue
1094
+ if (e.name.endsWith('.d.ts')) continue
1090
1095
  found.push([...rel, e.name].join('/'))
1091
1096
  }
1092
1097
  }
@@ -1097,11 +1102,12 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
1097
1102
  for (const rel of files) {
1098
1103
  const segs = rel.split('/')
1099
1104
  const file = segs.pop()!
1100
- const name = file.replace(/\.ts$/, '')
1105
+ const name = file.replace(/\.(ts|js)$/, '')
1101
1106
  const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`
1102
1107
  const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`
1103
- const appFile = path.join(subApp, ...segs, `${name}.ts`)
1104
- const fromApp = fs.existsSync(appFile)
1108
+ const appFileTs = path.join(subApp, ...segs, `${name}.ts`)
1109
+ const appFileJs = path.join(subApp, ...segs, `${name}.js`)
1110
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)
1105
1111
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`
1106
1112
  imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)
1107
1113
  const sid = [modId, ...segs, name].filter(Boolean).join(':')
@@ -1111,7 +1117,7 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
1111
1117
  }
1112
1118
  }
1113
1119
 
1114
- // Workers: src/modules/<module>/workers/*.ts
1120
+ // Workers: src/modules/<module>/workers/*.ts or *.js
1115
1121
  // Only includes files that export `metadata` with a `queue` property
1116
1122
  {
1117
1123
  const wrkApp = path.join(roots.appBase, 'workers')
@@ -1123,8 +1129,9 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
1123
1129
  if (e.isDirectory()) {
1124
1130
  if (e.name === '__tests__' || e.name === '__mocks__') continue
1125
1131
  walk(path.join(dir, e.name), [...rel, e.name])
1126
- } else if (e.isFile() && e.name.endsWith('.ts')) {
1127
- if (/\.(test|spec)\.ts$/.test(e.name)) continue
1132
+ } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {
1133
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue
1134
+ if (e.name.endsWith('.d.ts')) continue
1128
1135
  found.push([...rel, e.name].join('/'))
1129
1136
  }
1130
1137
  }
@@ -1135,9 +1142,10 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
1135
1142
  for (const rel of files) {
1136
1143
  const segs = rel.split('/')
1137
1144
  const file = segs.pop()!
1138
- const name = file.replace(/\.ts$/, '')
1139
- const appFile = path.join(wrkApp, ...segs, `${name}.ts`)
1140
- const fromApp = fs.existsSync(appFile)
1145
+ const name = file.replace(/\.(ts|js)$/, '')
1146
+ const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`)
1147
+ const appFileJs = path.join(wrkApp, ...segs, `${name}.js`)
1148
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)
1141
1149
  // Use package import path for checking exports (file path fails due to relative imports)
1142
1150
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`
1143
1151
  // Only include files that export metadata with a queue property