@open-mercato/cli 0.4.2-canary-f80d1bfa83 → 0.4.2-canary-eb5f87d5f9

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.
@@ -326,12 +326,14 @@ async function generateModuleRegistry(options) {
326
326
  if (e.isDirectory()) {
327
327
  if (e.name === "__tests__" || e.name === "__mocks__") continue;
328
328
  walk(path.join(dir, e.name), [...rel, e.name]);
329
- } else if (e.isFile() && e.name === "route.ts") routeFiles.push([...rel, e.name].join("/"));
329
+ } else if (e.isFile() && (e.name === "route.ts" || e.name === "route.js")) {
330
+ routeFiles.push([...rel, e.name].join("/"));
331
+ }
330
332
  }
331
333
  };
332
334
  if (fs.existsSync(apiPkg)) walk(apiPkg);
333
335
  if (fs.existsSync(apiApp)) walk(apiApp);
334
- const routeList = Array.from(new Set(routeFiles));
336
+ const routeList = Array.from(new Set(routeFiles.map((f) => f.replace(/\.(ts|js)$/, ""))));
335
337
  const isDynamicRoute = (p) => p.split("/").some((seg) => /\[|\[\[\.\.\./.test(seg));
336
338
  routeList.sort((a, b) => {
337
339
  const ad = isDynamicRoute(a) ? 1 : 0;
@@ -344,12 +346,15 @@ async function generateModuleRegistry(options) {
344
346
  segs.pop();
345
347
  const reqSegs = [modId, ...segs];
346
348
  const importName = `R${importId++}_${toVar(modId)}_${toVar(segs.join("_") || "index")}`;
347
- const appFile = path.join(apiApp, ...segs, "route.ts");
348
- const fromApp = fs.existsSync(appFile);
349
+ const appFileTs = path.join(apiApp, ...segs, "route.ts");
350
+ const appFileJs = path.join(apiApp, ...segs, "route.js");
351
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs);
349
352
  const apiSegPath = segs.join("/");
350
353
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${apiSegPath ? `/${apiSegPath}` : ""}/route`;
351
354
  const routePath = "/" + reqSegs.filter(Boolean).join("/");
352
- const sourceFile = fromApp ? appFile : path.join(apiPkg, ...segs, "route.ts");
355
+ const pkgFileTs = path.join(apiPkg, ...segs, "route.ts");
356
+ const pkgFileJs = path.join(apiPkg, ...segs, "route.js");
357
+ const sourceFile = fromApp ? fs.existsSync(appFileTs) ? appFileTs : appFileJs : fs.existsSync(pkgFileTs) ? pkgFileTs : pkgFileJs;
353
358
  const hasOpenApi = await moduleHasExport(sourceFile, "openApi");
354
359
  const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : "";
355
360
  imports.push(`import * as ${importName} from '${importPath}'`);
@@ -363,28 +368,30 @@ async function generateModuleRegistry(options) {
363
368
  if (methodNames.has(e.name.toLowerCase())) continue;
364
369
  if (e.name === "__tests__" || e.name === "__mocks__") continue;
365
370
  walkPlain(path.join(dir, e.name), [...rel, e.name]);
366
- } else if (e.isFile() && e.name.endsWith(".ts") && e.name !== "route.ts") {
367
- if (/\.(test|spec)\.ts$/.test(e.name)) continue;
371
+ } else if (e.isFile() && (e.name.endsWith(".ts") || e.name.endsWith(".js")) && !e.name.startsWith("route.")) {
372
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue;
373
+ if (e.name.endsWith(".d.ts")) continue;
368
374
  plainFiles.push([...rel, e.name].join("/"));
369
375
  }
370
376
  }
371
377
  };
372
378
  if (fs.existsSync(apiPkg)) walkPlain(apiPkg);
373
379
  if (fs.existsSync(apiApp)) walkPlain(apiApp);
374
- const plainList = Array.from(new Set(plainFiles));
380
+ const plainList = Array.from(new Set(plainFiles.map((f) => f.replace(/\.(ts|js)$/, ""))));
375
381
  for (const rel of plainList) {
376
382
  const segs = rel.split("/");
377
- const file = segs.pop();
378
- const pathWithoutExt = file.replace(/\.ts$/, "");
383
+ const pathWithoutExt = segs.pop();
379
384
  const fullSegs = [...segs, pathWithoutExt];
380
385
  const routePath = "/" + [modId, ...fullSegs].filter(Boolean).join("/");
381
386
  const importName = `R${importId++}_${toVar(modId)}_${toVar(fullSegs.join("_") || "index")}`;
382
- const appFile = path.join(apiApp, ...fullSegs) + ".ts";
383
- const fromApp = fs.existsSync(appFile);
387
+ const appFileTs = path.join(apiApp, ...fullSegs) + ".ts";
388
+ const appFileJs = path.join(apiApp, ...fullSegs) + ".js";
389
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs);
384
390
  const plainSegPath = fullSegs.join("/");
385
391
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${plainSegPath ? `/${plainSegPath}` : ""}`;
386
- const pkgFile = path.join(apiPkg, ...fullSegs) + ".ts";
387
- const sourceFile = fromApp ? appFile : pkgFile;
392
+ const pkgFileTs = path.join(apiPkg, ...fullSegs) + ".ts";
393
+ const pkgFileJs = path.join(apiPkg, ...fullSegs) + ".js";
394
+ const sourceFile = fromApp ? fs.existsSync(appFileTs) ? appFileTs : appFileJs : fs.existsSync(pkgFileTs) ? pkgFileTs : pkgFileJs;
388
395
  const hasOpenApi = await moduleHasExport(sourceFile, "openApi");
389
396
  const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : "";
390
397
  imports.push(`import * as ${importName} from '${importPath}'`);
@@ -402,25 +409,27 @@ async function generateModuleRegistry(options) {
402
409
  if (e.isDirectory()) {
403
410
  if (e.name === "__tests__" || e.name === "__mocks__") continue;
404
411
  walk2(path.join(dir, e.name), [...rel, e.name]);
405
- } else if (e.isFile() && e.name.endsWith(".ts")) {
406
- if (/\.(test|spec)\.ts$/.test(e.name)) continue;
412
+ } else if (e.isFile() && (e.name.endsWith(".ts") || e.name.endsWith(".js"))) {
413
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue;
414
+ if (e.name.endsWith(".d.ts")) continue;
407
415
  apiFiles.push([...rel, e.name].join("/"));
408
416
  }
409
417
  }
410
418
  };
411
419
  walk2(methodDir);
412
- const methodList = Array.from(new Set(apiFiles));
420
+ const methodList = Array.from(new Set(apiFiles.map((f) => f.replace(/\.(ts|js)$/, ""))));
413
421
  for (const rel of methodList) {
414
422
  const segs = rel.split("/");
415
- const file = segs.pop();
416
- const pathWithoutExt = file.replace(/\.ts$/, "");
423
+ const pathWithoutExt = segs.pop();
417
424
  const fullSegs = [...segs, pathWithoutExt];
418
425
  const routePath = "/" + [modId, ...fullSegs].filter(Boolean).join("/");
419
426
  const importName = `H${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join("_"))}`;
420
427
  const fromApp = methodDir === appMethodDir;
421
428
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api/${method.toLowerCase()}/${fullSegs.join("/")}`;
422
429
  const metaName = `RM${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join("_"))}`;
423
- const sourceFile = path.join(methodDir, ...segs, file);
430
+ const sourceFileTs = path.join(methodDir, ...segs, `${pathWithoutExt}.ts`);
431
+ const sourceFileJs = path.join(methodDir, ...segs, `${pathWithoutExt}.js`);
432
+ const sourceFile = fs.existsSync(sourceFileTs) ? sourceFileTs : sourceFileJs;
424
433
  const hasOpenApi = await moduleHasExport(sourceFile, "openApi");
425
434
  const docsPart = hasOpenApi ? `, docs: ${metaName}.openApi` : "";
426
435
  imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`);
@@ -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 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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",
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 or route.js 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' || e.name === 'route.js')) {\n routeFiles.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(apiPkg)) walk(apiPkg)\n if (fs.existsSync(apiApp)) walk(apiApp)\n const routeList = Array.from(new Set(routeFiles.map(f => f.replace(/\\.(ts|js)$/, ''))))\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() // remove 'route'\n const reqSegs = [modId, ...segs]\n const importName = `R${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFileTs = path.join(apiApp, ...segs, 'route.ts')\n const appFileJs = path.join(apiApp, ...segs, 'route.js')\n const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)\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 pkgFileTs = path.join(apiPkg, ...segs, 'route.ts')\n const pkgFileJs = path.join(apiPkg, ...segs, 'route.js')\n const sourceFile = fromApp\n ? (fs.existsSync(appFileTs) ? appFileTs : appFileJs)\n : (fs.existsSync(pkgFileTs) ? pkgFileTs : pkgFileJs)\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 (non-route API 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.endsWith('.js')) && !e.name.startsWith('route.')) {\n if (/\\.(test|spec)\\.(ts|js)$/.test(e.name)) continue\n if (e.name.endsWith('.d.ts')) 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.map(f => f.replace(/\\.(ts|js)$/, ''))))\n for (const rel of plainList) {\n const segs = rel.split('/')\n const pathWithoutExt = segs.pop()!\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 appFileTs = path.join(apiApp, ...fullSegs) + '.ts'\n const appFileJs = path.join(apiApp, ...fullSegs) + '.js'\n const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)\n const plainSegPath = fullSegs.join('/')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${plainSegPath ? `/${plainSegPath}` : ''}`\n const pkgFileTs = path.join(apiPkg, ...fullSegs) + '.ts'\n const pkgFileJs = path.join(apiPkg, ...fullSegs) + '.js'\n const sourceFile = fromApp\n ? (fs.existsSync(appFileTs) ? appFileTs : appFileJs)\n : (fs.existsSync(pkgFileTs) ? pkgFileTs : pkgFileJs)\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') || e.name.endsWith('.js'))) {\n if (/\\.(test|spec)\\.(ts|js)$/.test(e.name)) continue\n if (e.name.endsWith('.d.ts')) continue\n apiFiles.push([...rel, e.name].join('/'))\n }\n }\n }\n walk2(methodDir)\n const methodList = Array.from(new Set(apiFiles.map(f => f.replace(/\\.(ts|js)$/, ''))))\n for (const rel of methodList) {\n const segs = rel.split('/')\n const pathWithoutExt = segs.pop()!\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 sourceFileTs = path.join(methodDir, ...segs, `${pathWithoutExt}.ts`)\n const sourceFileJs = path.join(methodDir, ...segs, `${pathWithoutExt}.js`)\n const sourceFile = fs.existsSync(sourceFileTs) ? sourceFileTs : sourceFileJs\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-f80d1bfa83",
3
+ "version": "0.4.2-canary-eb5f87d5f9",
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-f80d1bfa83",
58
+ "@open-mercato/shared": "0.4.2-canary-eb5f87d5f9",
59
59
  "pg": "^8.16.3",
60
60
  "typescript": "^5.9.3"
61
61
  },
@@ -369,19 +369,21 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
369
369
  const apiApp = path.join(roots.appBase, 'api')
370
370
  const apiPkg = path.join(roots.pkgBase, 'api')
371
371
  if (fs.existsSync(apiApp) || fs.existsSync(apiPkg)) {
372
- // route.ts aggregations
372
+ // route.ts or route.js aggregations
373
373
  const routeFiles: string[] = []
374
374
  const walk = (dir: string, rel: string[] = []) => {
375
375
  for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
376
376
  if (e.isDirectory()) {
377
377
  if (e.name === '__tests__' || e.name === '__mocks__') continue
378
378
  walk(path.join(dir, e.name), [...rel, e.name])
379
- } else if (e.isFile() && e.name === 'route.ts') routeFiles.push([...rel, e.name].join('/'))
379
+ } else if (e.isFile() && (e.name === 'route.ts' || e.name === 'route.js')) {
380
+ routeFiles.push([...rel, e.name].join('/'))
381
+ }
380
382
  }
381
383
  }
382
384
  if (fs.existsSync(apiPkg)) walk(apiPkg)
383
385
  if (fs.existsSync(apiApp)) walk(apiApp)
384
- const routeList = Array.from(new Set(routeFiles))
386
+ const routeList = Array.from(new Set(routeFiles.map(f => f.replace(/\.(ts|js)$/, ''))))
385
387
  const isDynamicRoute = (p: string) => p.split('/').some((seg) => /\[|\[\[\.\.\./.test(seg))
386
388
  routeList.sort((a, b) => {
387
389
  const ad = isDynamicRoute(a) ? 1 : 0
@@ -391,22 +393,27 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
391
393
  })
392
394
  for (const rel of routeList) {
393
395
  const segs = rel.split('/')
394
- segs.pop()
396
+ segs.pop() // remove 'route'
395
397
  const reqSegs = [modId, ...segs]
396
398
  const importName = `R${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`
397
- const appFile = path.join(apiApp, ...segs, 'route.ts')
398
- const fromApp = fs.existsSync(appFile)
399
+ const appFileTs = path.join(apiApp, ...segs, 'route.ts')
400
+ const appFileJs = path.join(apiApp, ...segs, 'route.js')
401
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)
399
402
  const apiSegPath = segs.join('/')
400
403
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${apiSegPath ? `/${apiSegPath}` : ''}/route`
401
404
  const routePath = '/' + reqSegs.filter(Boolean).join('/')
402
- const sourceFile = fromApp ? appFile : path.join(apiPkg, ...segs, 'route.ts')
405
+ const pkgFileTs = path.join(apiPkg, ...segs, 'route.ts')
406
+ const pkgFileJs = path.join(apiPkg, ...segs, 'route.js')
407
+ const sourceFile = fromApp
408
+ ? (fs.existsSync(appFileTs) ? appFileTs : appFileJs)
409
+ : (fs.existsSync(pkgFileTs) ? pkgFileTs : pkgFileJs)
403
410
  const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')
404
411
  const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''
405
412
  imports.push(`import * as ${importName} from '${importPath}'`)
406
413
  apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)
407
414
  }
408
415
 
409
- // Single files
416
+ // Single files (non-route API files)
410
417
  const plainFiles: string[] = []
411
418
  const methodNames = new Set(['get', 'post', 'put', 'patch', 'delete'])
412
419
  const walkPlain = (dir: string, rel: string[] = []) => {
@@ -415,28 +422,32 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
415
422
  if (methodNames.has(e.name.toLowerCase())) continue
416
423
  if (e.name === '__tests__' || e.name === '__mocks__') continue
417
424
  walkPlain(path.join(dir, e.name), [...rel, e.name])
418
- } else if (e.isFile() && e.name.endsWith('.ts') && e.name !== 'route.ts') {
419
- if (/\.(test|spec)\.ts$/.test(e.name)) continue
425
+ } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js')) && !e.name.startsWith('route.')) {
426
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue
427
+ if (e.name.endsWith('.d.ts')) continue
420
428
  plainFiles.push([...rel, e.name].join('/'))
421
429
  }
422
430
  }
423
431
  }
424
432
  if (fs.existsSync(apiPkg)) walkPlain(apiPkg)
425
433
  if (fs.existsSync(apiApp)) walkPlain(apiApp)
426
- const plainList = Array.from(new Set(plainFiles))
434
+ const plainList = Array.from(new Set(plainFiles.map(f => f.replace(/\.(ts|js)$/, ''))))
427
435
  for (const rel of plainList) {
428
436
  const segs = rel.split('/')
429
- const file = segs.pop()!
430
- const pathWithoutExt = file.replace(/\.ts$/, '')
437
+ const pathWithoutExt = segs.pop()!
431
438
  const fullSegs = [...segs, pathWithoutExt]
432
439
  const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')
433
440
  const importName = `R${importId++}_${toVar(modId)}_${toVar(fullSegs.join('_') || 'index')}`
434
- const appFile = path.join(apiApp, ...fullSegs) + '.ts'
435
- const fromApp = fs.existsSync(appFile)
441
+ const appFileTs = path.join(apiApp, ...fullSegs) + '.ts'
442
+ const appFileJs = path.join(apiApp, ...fullSegs) + '.js'
443
+ const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)
436
444
  const plainSegPath = fullSegs.join('/')
437
445
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${plainSegPath ? `/${plainSegPath}` : ''}`
438
- const pkgFile = path.join(apiPkg, ...fullSegs) + '.ts'
439
- const sourceFile = fromApp ? appFile : pkgFile
446
+ const pkgFileTs = path.join(apiPkg, ...fullSegs) + '.ts'
447
+ const pkgFileJs = path.join(apiPkg, ...fullSegs) + '.js'
448
+ const sourceFile = fromApp
449
+ ? (fs.existsSync(appFileTs) ? appFileTs : appFileJs)
450
+ : (fs.existsSync(pkgFileTs) ? pkgFileTs : pkgFileJs)
440
451
  const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')
441
452
  const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''
442
453
  imports.push(`import * as ${importName} from '${importPath}'`)
@@ -455,25 +466,27 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
455
466
  if (e.isDirectory()) {
456
467
  if (e.name === '__tests__' || e.name === '__mocks__') continue
457
468
  walk2(path.join(dir, e.name), [...rel, e.name])
458
- } else if (e.isFile() && e.name.endsWith('.ts')) {
459
- if (/\.(test|spec)\.ts$/.test(e.name)) continue
469
+ } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {
470
+ if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue
471
+ if (e.name.endsWith('.d.ts')) continue
460
472
  apiFiles.push([...rel, e.name].join('/'))
461
473
  }
462
474
  }
463
475
  }
464
476
  walk2(methodDir)
465
- const methodList = Array.from(new Set(apiFiles))
477
+ const methodList = Array.from(new Set(apiFiles.map(f => f.replace(/\.(ts|js)$/, ''))))
466
478
  for (const rel of methodList) {
467
479
  const segs = rel.split('/')
468
- const file = segs.pop()!
469
- const pathWithoutExt = file.replace(/\.ts$/, '')
480
+ const pathWithoutExt = segs.pop()!
470
481
  const fullSegs = [...segs, pathWithoutExt]
471
482
  const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')
472
483
  const importName = `H${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`
473
484
  const fromApp = methodDir === appMethodDir
474
485
  const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api/${method.toLowerCase()}/${fullSegs.join('/')}`
475
486
  const metaName = `RM${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`
476
- const sourceFile = path.join(methodDir, ...segs, file)
487
+ const sourceFileTs = path.join(methodDir, ...segs, `${pathWithoutExt}.ts`)
488
+ const sourceFileJs = path.join(methodDir, ...segs, `${pathWithoutExt}.js`)
489
+ const sourceFile = fs.existsSync(sourceFileTs) ? sourceFileTs : sourceFileJs
477
490
  const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')
478
491
  const docsPart = hasOpenApi ? `, docs: ${metaName}.openApi` : ''
479
492
  imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)