@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"
|
|
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
|
|
348
|
-
const
|
|
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
|
|
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")
|
|
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
|
|
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
|
|
383
|
-
const
|
|
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
|
|
387
|
-
const
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
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'
|
|
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
|
|
398
|
-
const
|
|
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
|
|
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')
|
|
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
|
|
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
|
|
435
|
-
const
|
|
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
|
|
439
|
-
const
|
|
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
|
|
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
|
|
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}'`)
|