@open-mercato/cli 0.4.6-develop-ce2a0728a5 → 0.4.6-develop-77fa3b7ed8

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.
@@ -295,6 +295,10 @@ async function generateModuleRegistry(options) {
295
295
  const transFieldsChecksumFile = path.join(outputDir, "translations-fields.generated.checksum");
296
296
  const enrichersOutFile = path.join(outputDir, "enrichers.generated.ts");
297
297
  const enrichersChecksumFile = path.join(outputDir, "enrichers.generated.checksum");
298
+ const interceptorsOutFile = path.join(outputDir, "interceptors.generated.ts");
299
+ const interceptorsChecksumFile = path.join(outputDir, "interceptors.generated.checksum");
300
+ const componentOverridesOutFile = path.join(outputDir, "component-overrides.generated.ts");
301
+ const componentOverridesChecksumFile = path.join(outputDir, "component-overrides.generated.checksum");
298
302
  const inboxActionsOutFile = path.join(outputDir, "inbox-actions.generated.ts");
299
303
  const inboxActionsChecksumFile = path.join(outputDir, "inbox-actions.generated.checksum");
300
304
  const enabled = resolver.loadEnabledModules();
@@ -326,6 +330,10 @@ async function generateModuleRegistry(options) {
326
330
  const transFieldsImports = [];
327
331
  const enricherConfigs = [];
328
332
  const enricherImports = [];
333
+ const interceptorConfigs = [];
334
+ const interceptorImports = [];
335
+ const componentOverrideConfigs = [];
336
+ const componentOverrideImports = [];
329
337
  const inboxActionsConfigs = [];
330
338
  const inboxActionsImports = [];
331
339
  for (const entry of enabled) {
@@ -520,6 +528,28 @@ async function generateModuleRegistry(options) {
520
528
  standaloneConfigs: enricherConfigs,
521
529
  configExpr: (n, id) => `{ moduleId: '${id}', enrichers: ((${n} as any).enrichers ?? (${n} as any).default ?? []) }`
522
530
  });
531
+ processStandaloneConfig({
532
+ roots,
533
+ imps,
534
+ modId,
535
+ importIdRef,
536
+ relativePath: "api/interceptors.ts",
537
+ prefix: "INTERCEPTORS",
538
+ standaloneImports: interceptorImports,
539
+ standaloneConfigs: interceptorConfigs,
540
+ configExpr: (n, id) => `{ moduleId: '${id}', interceptors: ((${n} as any).interceptors ?? (${n} as any).default ?? []) }`
541
+ });
542
+ processStandaloneConfig({
543
+ roots,
544
+ imps,
545
+ modId,
546
+ importIdRef,
547
+ relativePath: "widgets/components.ts",
548
+ prefix: "COMPONENT_OVERRIDES",
549
+ standaloneImports: componentOverrideImports,
550
+ standaloneConfigs: componentOverrideConfigs,
551
+ configExpr: (n, id) => `{ moduleId: '${id}', componentOverrides: ((${n} as any).componentOverrides ?? (${n} as any).default ?? []) }`
552
+ });
523
553
  let transFieldsImportName = null;
524
554
  transFieldsImportName = processStandaloneConfig({
525
555
  roots,
@@ -1107,6 +1137,39 @@ export function getRegisteredActionTypes(): string[] {
1107
1137
  }
1108
1138
  `;
1109
1139
  writeGeneratedFile({ outFile: inboxActionsOutFile, checksumFile: inboxActionsChecksumFile, content: inboxActionsOutput, structureChecksum, result, quiet });
1140
+ const interceptorEntriesLiteral = interceptorConfigs.join(",\n ");
1141
+ const interceptorImportSection = interceptorImports.join("\n");
1142
+ const interceptorsOutput = `// AUTO-GENERATED by mercato generate registry
1143
+ import type { ApiInterceptor } from '@open-mercato/shared/lib/crud/api-interceptor'
1144
+ ${interceptorImportSection ? `
1145
+ ${interceptorImportSection}
1146
+ ` : "\n"}type InterceptorEntry = { moduleId: string; interceptors: ApiInterceptor[] }
1147
+
1148
+ export const interceptorEntries: InterceptorEntry[] = [
1149
+ ${interceptorEntriesLiteral ? ` ${interceptorEntriesLiteral}
1150
+ ` : ""}]
1151
+ `;
1152
+ writeGeneratedFile({ outFile: interceptorsOutFile, checksumFile: interceptorsChecksumFile, content: interceptorsOutput, structureChecksum, result, quiet });
1153
+ const componentOverrideEntriesLiteral = componentOverrideConfigs.join(",\n ");
1154
+ const componentOverrideImportSection = componentOverrideImports.join("\n");
1155
+ const componentOverridesOutput = `// AUTO-GENERATED by mercato generate registry
1156
+ import type { ComponentOverride } from '@open-mercato/shared/modules/widgets/component-registry'
1157
+ ${componentOverrideImportSection ? `
1158
+ ${componentOverrideImportSection}
1159
+ ` : "\n"}type ComponentOverrideEntry = { moduleId: string; componentOverrides: ComponentOverride[] }
1160
+
1161
+ export const componentOverrideEntries: ComponentOverrideEntry[] = [
1162
+ ${componentOverrideEntriesLiteral ? ` ${componentOverrideEntriesLiteral}
1163
+ ` : ""}]
1164
+ `;
1165
+ writeGeneratedFile({
1166
+ outFile: componentOverridesOutFile,
1167
+ checksumFile: componentOverridesChecksumFile,
1168
+ content: componentOverridesOutput,
1169
+ structureChecksum,
1170
+ result,
1171
+ quiet
1172
+ });
1110
1173
  return result;
1111
1174
  }
1112
1175
  async function generateModuleRegistryCli(options) {
@@ -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 calculateStructureChecksum,\n toVar,\n moduleHasExport,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n} from '../utils'\nimport {\n scanModuleDir,\n resolveModuleFile,\n SCAN_CONFIGS,\n type ModuleRoots,\n type ModuleImports,\n} from './scanner'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\nexport interface ModuleRegistryOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\ntype DashboardWidgetEntry = {\n moduleId: string\n key: string\n source: 'app' | 'package'\n importPath: string\n}\n\nfunction scanDashboardWidgetEntries(options: {\n modId: string\n roots: ModuleRoots\n appImportBase: string\n pkgImportBase: string\n}): DashboardWidgetEntry[] {\n const { modId, roots, appImportBase, pkgImportBase } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.dashboardWidgets)\n return files.map(({ relPath, fromApp }) => {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/widgets/dashboard/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n return { moduleId: modId, key, source, importPath }\n })\n}\n\nfunction processPageFiles(options: {\n files: Array<{ relPath: string; fromApp: boolean }>\n type: 'frontend' | 'backend'\n modId: string\n appDir: string\n pkgDir: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): string[] {\n const { files, type, modId, appDir, pkgDir, appImportBase, pkgImportBase, imports, importIdRef } = options\n const prefix = type === 'frontend' ? 'C' : 'B'\n const modPrefix = type === 'frontend' ? 'CM' : 'BM'\n const metaPrefix = type === 'frontend' ? 'M' : 'BM'\n const routes: string[] = []\n\n // Next-style page.tsx files\n for (const { relPath, fromApp } of files.filter(({ relPath: f }) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = relPath.split('/')\n segs.pop()\n const importName = `${prefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `${modPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${sub}`\n const routePath = type === 'frontend'\n ? '/' + (segs.join('/') || '')\n : '/backend/' + (segs.join('/') || modId)\n const metaCandidates = [\n path.join(fromApp ? appDir : pkgDir, ...segs, 'page.meta.ts'),\n path.join(fromApp ? appDir : pkgDir, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `${metaPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...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 const baseProps = `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`\n const extraProps = type === 'backend' ? `, pageContext: (${metaExpr})?.pageContext` : ''\n routes.push(`{ ${baseProps}${extraProps}, Component: ${importName} }`)\n }\n\n // Back-compat direct files (old-style pages like login.tsx instead of login/page.tsx)\n for (const { relPath, fromApp } of files.filter(({ relPath: f }) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const routeSegs = [...segs, name].filter(Boolean)\n const importName = `${prefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const pageModName = `${modPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...segs, name].join('/')}`\n const routePath = type === 'frontend'\n ? '/' + (routeSegs.join('/') || '')\n : '/backend/' + [modId, ...segs, name].filter(Boolean).join('/')\n const metaCandidates = [\n path.join(fromApp ? appDir : pkgDir, ...segs, `${name}.meta.ts`),\n path.join(fromApp ? appDir : pkgDir, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `${metaPrefix}${importIdRef.value++}_${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 : pkgImportBase}/${type}/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = type === 'frontend' ? `(${metaImportName}.metadata as any)` : `${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 const baseProps = `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`\n const extraFe = type === 'frontend' ? `, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled` : `, 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, pageContext: (${metaExpr})?.pageContext`\n routes.push(`{ ${baseProps}${extraFe}, Component: ${importName} }`)\n }\n\n return routes\n}\n\nasync function processApiRoutes(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): Promise<string[]> {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const apiApp = path.join(roots.appBase, 'api')\n const apiPkg = path.join(roots.pkgBase, 'api')\n if (!fs.existsSync(apiApp) && !fs.existsSync(apiPkg)) return []\n\n const apis: string[] = []\n\n // route.ts aggregations\n const routeFiles = scanModuleDir(roots, SCAN_CONFIGS.apiRoutes)\n for (const { relPath, fromApp } of routeFiles) {\n const segs = relPath.split('/')\n segs.pop()\n const reqSegs = [modId, ...segs]\n const importName = `R${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...segs, 'route.ts')\n const apiSegPath = segs.join('/')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/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 (plain .ts, not route.ts, not tests, skip method dirs)\n const plainFiles = scanModuleDir(roots, SCAN_CONFIGS.apiPlainFiles)\n for (const { relPath, fromApp } of plainFiles) {\n const segs = relPath.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${importIdRef.value++}_${toVar(modId)}_${toVar(fullSegs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...fullSegs) + '.ts'\n const plainSegPath = fullSegs.join('/')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/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\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 methodRoots: ModuleRoots = { appBase: methodDir, pkgBase: methodDir }\n const methodConfig = {\n folder: '',\n include: (name: string) => name.endsWith('.ts') && !/\\.(test|spec)\\.ts$/.test(name),\n }\n const apiFiles = scanModuleDir(methodRoots, methodConfig)\n for (const { relPath } of apiFiles) {\n const segs = relPath.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${importIdRef.value++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const fromApp = methodDir === appMethodDir\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/api/${method.toLowerCase()}/${fullSegs.join('/')}`\n const metaName = `RM${importIdRef.value++}_${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 return apis\n}\n\nfunction processSubscribers(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): string[] {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.subscribers)\n const subscribers: string[] = []\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importName = `Subscriber${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/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 return subscribers\n}\n\nasync function processWorkers(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): Promise<string[]> {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.workers)\n const workers: string[] = []\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/workers/${[...segs, name].join('/')}`\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importIdRef.value++}_${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 return workers\n}\n\nfunction processTranslations(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n}): string[] {\n const { roots, modId, appImportBase, pkgImportBase, imports } = options\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 const translations: string[] = []\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 '${pkgImportBase}/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 '${pkgImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n return translations\n}\n\n/**\n * Resolves a convention file and pushes its import + config entry to standalone arrays.\n * Used for files that produce their own generated output (notifications, AI tools, events, analytics, enrichers, etc.).\n *\n * @returns The generated import name, or null if the file was not found.\n */\nfunction processStandaloneConfig(options: {\n roots: ModuleRoots\n imps: ModuleImports\n modId: string\n relativePath: string\n prefix: string\n importIdRef: { value: number }\n standaloneImports: string[]\n standaloneConfigs: string[]\n configExpr: (importName: string, modId: string) => string\n /** Also push the import to the shared imports array (used by modules.generated.ts) */\n sharedImports?: string[]\n}): string | null {\n const { roots, imps, modId, relativePath, prefix, importIdRef, standaloneImports, standaloneConfigs, configExpr, sharedImports } = options\n const resolved = resolveModuleFile(roots, imps, relativePath)\n if (!resolved) return null\n const importName = `${prefix}_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n standaloneImports.push(importStmt)\n if (sharedImports) sharedImports.push(importStmt)\n standaloneConfigs.push(configExpr(importName, modId))\n return importName\n}\n\nfunction resolveConventionFile(\n roots: ModuleRoots,\n imps: ModuleImports,\n relativePath: string,\n prefix: string,\n modId: string,\n importIdRef: { value: number },\n imports: string[],\n importStyle: 'namespace' | 'default' = 'namespace'\n): { importName: string; importPath: string; fromApp: boolean } | null {\n const resolved = resolveModuleFile(roots, imps, relativePath)\n if (!resolved) return null\n const importName = `${prefix}_${toVar(modId)}_${importIdRef.value++}`\n if (importStyle === 'default') {\n imports.push(`import ${importName} from '${resolved.importPath}'`)\n } else {\n imports.push(`import * as ${importName} from '${resolved.importPath}'`)\n }\n return { importName, importPath: resolved.importPath, fromApp: resolved.fromApp }\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 const notificationsOutFile = path.join(outputDir, 'notifications.generated.ts')\n const notificationsChecksumFile = path.join(outputDir, 'notifications.generated.checksum')\n const notificationsClientOutFile = path.join(outputDir, 'notifications.client.generated.ts')\n const notificationsClientChecksumFile = path.join(outputDir, 'notifications.client.generated.checksum')\n const messageTypesOutFile = path.join(outputDir, 'message-types.generated.ts')\n const messageTypesChecksumFile = path.join(outputDir, 'message-types.generated.checksum')\n const messageObjectsOutFile = path.join(outputDir, 'message-objects.generated.ts')\n const messageObjectsChecksumFile = path.join(outputDir, 'message-objects.generated.checksum')\n const messagesClientOutFile = path.join(outputDir, 'messages.client.generated.ts')\n const messagesClientChecksumFile = path.join(outputDir, 'messages.client.generated.checksum')\n const aiToolsOutFile = path.join(outputDir, 'ai-tools.generated.ts')\n const aiToolsChecksumFile = path.join(outputDir, 'ai-tools.generated.checksum')\n const eventsOutFile = path.join(outputDir, 'events.generated.ts')\n const eventsChecksumFile = path.join(outputDir, 'events.generated.checksum')\n const analyticsOutFile = path.join(outputDir, 'analytics.generated.ts')\n const analyticsChecksumFile = path.join(outputDir, 'analytics.generated.checksum')\n const transFieldsOutFile = path.join(outputDir, 'translations-fields.generated.ts')\n const transFieldsChecksumFile = path.join(outputDir, 'translations-fields.generated.checksum')\n const enrichersOutFile = path.join(outputDir, 'enrichers.generated.ts')\n const enrichersChecksumFile = path.join(outputDir, 'enrichers.generated.checksum')\n const inboxActionsOutFile = path.join(outputDir, 'inbox-actions.generated.ts')\n const inboxActionsChecksumFile = path.join(outputDir, 'inbox-actions.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n // Mutable ref so extracted helper functions can increment the shared counter\n const importIdRef = { value: 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 const notificationTypes: string[] = []\n const notificationImports: string[] = []\n const notificationClientTypes: string[] = []\n const notificationClientImports: string[] = []\n const messageTypeEntries: string[] = []\n const messageTypeImports: string[] = []\n const messageObjectTypeEntries: string[] = []\n const messageObjectTypeImports: string[] = []\n const aiToolsConfigs: string[] = []\n const aiToolsImports: string[] = []\n const eventsConfigs: string[] = []\n const eventsImports: string[] = []\n const analyticsConfigs: string[] = []\n const analyticsImports: string[] = []\n const transFieldsConfigs: string[] = []\n const transFieldsImports: string[] = []\n const enricherConfigs: string[] = []\n const enricherImports: string[] = []\n const inboxActionsConfigs: string[] = []\n const inboxActionsImports: string[] = []\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const rawImps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : rawImps.appBase\n const imps: ModuleImports = { appBase: appImportBase, pkgBase: rawImps.pkgBase }\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 eventsImportName: string | null = null\n let analyticsImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n const dashboardWidgets: string[] = []\n const injectionWidgets: string[] = []\n let injectionTableImportName: string | null = null\n let setupImportName: string | null = null\n\n // === Processing order MUST match original import ID sequence ===\n\n // 1. Module metadata: index.ts (overrideable)\n const appIndex = path.join(roots.appBase, 'index.ts')\n const pkgIndex = path.join(roots.pkgBase, 'index.ts')\n const indexTs = fs.existsSync(appIndex) ? appIndex : fs.existsSync(pkgIndex) ? pkgIndex : null\n if (indexTs) {\n infoImportName = `I${importIdRef.value++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\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 // 2. Pages: frontend\n {\n const feApp = path.join(roots.appBase, 'frontend')\n const fePkg = path.join(roots.pkgBase, 'frontend')\n const feFiles = scanModuleDir(roots, SCAN_CONFIGS.frontendPages)\n if (feFiles.length) {\n frontendRoutes.push(...processPageFiles({\n files: feFiles,\n type: 'frontend',\n modId,\n appDir: feApp,\n pkgDir: fePkg,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n }\n }\n\n // 3. Entity extensions: data/extensions.ts\n {\n const ext = resolveConventionFile(roots, imps, 'data/extensions.ts', 'X', modId, importIdRef, imports)\n if (ext) extensionsImportName = ext.importName\n }\n\n // 4. RBAC: acl.ts\n {\n const rootApp = path.join(roots.appBase, 'acl.ts')\n const rootPkg = path.join(roots.pkgBase, 'acl.ts')\n const hasRoot = fs.existsSync(rootApp) || fs.existsSync(rootPkg)\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importIdRef.value++}`\n const useApp = fs.existsSync(rootApp) ? 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 // 5. Custom entities: ce.ts\n {\n const ce = resolveConventionFile(roots, imps, 'ce.ts', 'CE', modId, importIdRef, imports)\n if (ce) customEntitiesImportName = ce.importName\n }\n\n // 6. Search: search.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'search.ts')\n if (resolved) {\n const importName = `SEARCH_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n imports.push(importStmt)\n searchImports.push(importStmt)\n searchImportName = importName\n }\n }\n\n // 7. Notifications: notifications.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'notifications.ts',\n prefix: 'NOTIF',\n standaloneImports: notificationImports,\n standaloneConfigs: notificationTypes,\n configExpr: (n, id) => `{ moduleId: '${id}', types: ((${n}.default ?? ${n}.notificationTypes ?? (${n} as any).types ?? []) as NotificationTypeDefinition[]) }`,\n })\n\n // Notification client renderers: notifications.client.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'notifications.client.ts',\n prefix: 'NOTIF_CLIENT',\n standaloneImports: notificationClientImports,\n standaloneConfigs: notificationClientTypes,\n configExpr: (n, id) => `{ moduleId: '${id}', types: (${n}.default ?? []) }`,\n })\n // Message types: module root message-types.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'message-types.ts')\n if (resolved) {\n const importName = `MSG_TYPES_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n messageTypeImports.push(importStmt)\n messageTypeEntries.push(\n `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageTypes ?? (${importName} as any).types ?? []) as MessageTypeDefinition[]) }`\n )\n }\n }\n\n // Message object types: module root message-objects.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'message-objects.ts')\n if (resolved) {\n const importName = `MSG_OBJECTS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n messageObjectTypeImports.push(importStmt)\n messageObjectTypeEntries.push(\n `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageObjectTypes ?? (${importName} as any).objectTypes ?? (${importName} as any).types ?? []) as MessageObjectTypeDefinition[]) }`\n )\n }\n }\n\n // AI Tools: module root ai-tools.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'notifications.client.ts')\n if (resolved) {\n const importName = `NOTIF_CLIENT_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n notificationClientImports.push(importStmt)\n notificationClientTypes.push(\n `{ moduleId: '${modId}', types: (${importName}.default ?? []) }`\n )\n }\n }\n\n // 8. AI Tools: ai-tools.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'ai-tools.ts',\n prefix: 'AI_TOOLS',\n standaloneImports: aiToolsImports,\n standaloneConfigs: aiToolsConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', tools: (${n}.aiTools ?? ${n}.default ?? []) }`,\n })\n\n // 9. Events: events.ts (also referenced in module declarations)\n eventsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'events.ts',\n prefix: 'EVENTS',\n standaloneImports: eventsImports,\n standaloneConfigs: eventsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', config: (${n}.default ?? ${n}.eventsConfig ?? null) as EventModuleConfigBase | null }`,\n })\n\n // 10. Analytics: analytics.ts (also referenced in module declarations)\n analyticsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'analytics.ts',\n prefix: 'ANALYTICS',\n standaloneImports: analyticsImports,\n standaloneConfigs: analyticsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', config: (${n}.default ?? ${n}.analyticsConfig ?? ${n}.config ?? null) }`,\n })\n\n // 10b. Enrichers: data/enrichers.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'data/enrichers.ts',\n prefix: 'ENRICHERS',\n standaloneImports: enricherImports,\n standaloneConfigs: enricherConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', enrichers: ((${n} as any).enrichers ?? (${n} as any).default ?? []) }`,\n })\n\n // Translatable fields: translations.ts (also referenced in module declarations)\n let transFieldsImportName: string | null = null\n transFieldsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'translations.ts',\n prefix: 'TRANS_FIELDS',\n standaloneImports: transFieldsImports,\n standaloneConfigs: transFieldsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', fields: (${n}.default ?? ${n}.translatableFields ?? {}) as Record<string, string[]> }`,\n })\n\n // Inbox Actions: inbox-actions.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'inbox-actions.ts')\n if (resolved) {\n const importName = `INBOX_ACTIONS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n inboxActionsImports.push(importStmt)\n inboxActionsConfigs.push(\n `{ moduleId: '${modId}', actions: (${importName}.default ?? ${importName}.inboxActions ?? []) }`\n )\n }\n }\n\n // 11. Setup: setup.ts\n {\n const setup = resolveConventionFile(roots, imps, 'setup.ts', 'SETUP', modId, importIdRef, imports)\n if (setup) setupImportName = setup.importName\n }\n\n // 12. Custom fields: data/fields.ts\n {\n const fields = resolveConventionFile(roots, imps, 'data/fields.ts', 'F', modId, importIdRef, imports)\n if (fields) fieldsImportName = fields.importName\n }\n\n // 13. Pages: backend\n {\n const beApp = path.join(roots.appBase, 'backend')\n const bePkg = path.join(roots.pkgBase, 'backend')\n const beFiles = scanModuleDir(roots, SCAN_CONFIGS.backendPages)\n if (beFiles.length) {\n backendRoutes.push(...processPageFiles({\n files: beFiles,\n type: 'backend',\n modId,\n appDir: beApp,\n pkgDir: bePkg,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n }\n }\n\n // 14. API routes\n apis.push(...await processApiRoutes({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 15. CLI\n {\n const cliApp = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\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\n // 16. Translations\n translations.push(...processTranslations({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n }))\n\n // 17. Subscribers\n subscribers.push(...processSubscribers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 18. Workers\n workers.push(...await processWorkers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Build combined customFieldSets expression\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 // 19. Dashboard widgets\n {\n const entries = scanDashboardWidgetEntries({\n modId,\n roots,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n })\n for (const entry of entries) {\n dashboardWidgets.push(\n `{ moduleId: '${entry.moduleId}', key: '${entry.key}', source: '${entry.source}', loader: () => import('${entry.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allDashboardWidgets.get(entry.key)\n if (!existing || (existing.source !== 'app' && entry.source === 'app')) {\n allDashboardWidgets.set(entry.key, {\n moduleId: entry.moduleId,\n source: entry.source,\n importPath: entry.importPath,\n })\n }\n }\n }\n\n // 20. Injection widgets\n {\n const files = scanModuleDir(roots, SCAN_CONFIGS.injectionWidgets)\n const widgetApp = path.join(roots.appBase, 'widgets', 'injection')\n for (const { relPath, fromApp } of files) {\n const segs = relPath.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 // 21. Injection table\n {\n const resolved = resolveModuleFile(roots, imps, 'widgets/injection-table.ts')\n if (resolved) {\n const importName = `InjTable_${toVar(modId)}_${importIdRef.value++}`\n imports.push(`import * as ${importName} from '${resolved.importPath}'`)\n injectionTableImportName = importName\n allInjectionTables.push({ moduleId: modId, importPath: resolved.importPath, importName })\n }\n }\n\n if (searchImportName) {\n searchConfigs.push(`{ moduleId: '${modId}', config: (${searchImportName}.default ?? ${searchImportName}.searchConfig ?? ${searchImportName}.config ?? null) }`)\n }\n\n // Note: events, analytics, enrichers, notifications, AI tools, and translatable fields\n // configs are pushed inside processStandaloneConfig() above \u2014 no separate push needed here.\n\n if (transFieldsImportName) {\n transFieldsConfigs.push(`{ moduleId: '${modId}', fields: (${transFieldsImportName}.default ?? ${transFieldsImportName}.translatableFields ?? {}) as Record<string, string[]> }`)\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 ${setupImportName ? `setup: (${setupImportName}.default ?? ${setupImportName}.setup) || undefined,` : ''}\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 const eventsEntriesLiteral = eventsConfigs.join(',\\n ')\n const eventsImportSection = eventsImports.join('\\n')\n const eventsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { EventModuleConfigBase, EventDefinition } from '@open-mercato/shared/modules/events'\n${eventsImportSection ? `\\n${eventsImportSection}\\n` : '\\n'}type EventConfigEntry = { moduleId: string; config: EventModuleConfigBase | null }\n\nconst entriesRaw: EventConfigEntry[] = [\n${eventsEntriesLiteral ? ` ${eventsEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((e): e is { moduleId: string; config: EventModuleConfigBase } => e.config != null)\n\nexport const eventModuleConfigEntries = entries\nexport const eventModuleConfigs: EventModuleConfigBase[] = entries.map((e) => e.config)\nexport const allEvents: EventDefinition[] = entries.flatMap((e) => e.config.events)\n\n// Runtime registry for validation\nconst allDeclaredEventIds = new Set(allEvents.map((e) => e.id))\nexport function isEventDeclared(eventId: string): boolean {\n return allDeclaredEventIds.has(eventId)\n}\n`\n\n const analyticsEntriesLiteral = analyticsConfigs.join(',\\n ')\n const analyticsImportSection = analyticsImports.join('\\n')\n const analyticsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { AnalyticsModuleConfig } from '@open-mercato/shared/modules/analytics'\n${analyticsImportSection ? `\\n${analyticsImportSection}\\n` : '\\n'}type AnalyticsConfigEntry = { moduleId: string; config: AnalyticsModuleConfig | null }\n\nconst entriesRaw: AnalyticsConfigEntry[] = [\n${analyticsEntriesLiteral ? ` ${analyticsEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((entry): entry is { moduleId: string; config: AnalyticsModuleConfig } => entry.config != null)\n\nexport const analyticsModuleConfigEntries = entries\nexport const analyticsModuleConfigs: AnalyticsModuleConfig[] = entries.map((entry) => entry.config)\n`\n\n const transFieldsEntriesLiteral = transFieldsConfigs.join(',\\n ')\n const transFieldsImportSection = transFieldsImports.join('\\n')\n const transFieldsOutput = `// AUTO-GENERATED by mercato generate registry\nimport { registerTranslatableFields } from '@open-mercato/shared/lib/localization/translatable-fields'\n${transFieldsImportSection ? `\\n${transFieldsImportSection}\\n` : '\\n'}type TransFieldsEntry = { moduleId: string; fields: Record<string, string[]> }\n\nconst entries: TransFieldsEntry[] = [\n${transFieldsEntriesLiteral ? ` ${transFieldsEntriesLiteral}\\n` : ''}]\n\nconst allFields: Record<string, string[]> = {}\nfor (const entry of entries) {\n for (const [key, value] of Object.entries(entry.fields)) {\n allFields[key] = value\n }\n}\n\nexport const translatableFieldEntries = entries\nexport const allTranslatableFields = allFields\nexport const allTranslatableEntityTypes = Object.keys(allFields)\n\n// Auto-register on import (side-effect)\nregisterTranslatableFields(allFields)\n`\n\n const notificationEntriesLiteral = notificationTypes.join(',\\n ')\n const notificationImportSection = notificationImports.join('\\n')\n const notificationsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'\n${notificationImportSection ? `\\n${notificationImportSection}\\n` : '\\n'}type NotificationTypeEntry = { moduleId: string; types: NotificationTypeDefinition[] }\n\nconst entriesRaw: NotificationTypeEntry[] = [\n${notificationEntriesLiteral ? ` ${notificationEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const notificationTypeEntries = entriesRaw\nexport const notificationTypes = allTypes\n\nexport function getNotificationTypes(): NotificationTypeDefinition[] {\n return allTypes\n}\n\nexport function getNotificationType(type: string): NotificationTypeDefinition | undefined {\n return allTypes.find((t) => t.type === type)\n}\n`\n const notificationClientEntriesLiteral = notificationClientTypes.join(',\\n ')\n const notificationClientImportSection = notificationClientImports.join('\\n')\n const notificationsClientOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ComponentType } from 'react'\nimport type { NotificationTypeDefinition, NotificationRendererProps } from '@open-mercato/shared/modules/notifications/types'\n${notificationClientImportSection ? `\\n${notificationClientImportSection}\\n` : '\\n'}type NotificationTypeEntry = { moduleId: string; types: NotificationTypeDefinition[] }\nexport type NotificationRenderers = Record<string, ComponentType<NotificationRendererProps>>\n\nconst entriesRaw: NotificationTypeEntry[] = [\n${notificationClientEntriesLiteral ? ` ${notificationClientEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\nconst renderers: NotificationRenderers = Object.fromEntries(\n allTypes\n .filter((typeDef) => Boolean(typeDef.Renderer))\n .map((typeDef) => [typeDef.type, typeDef.Renderer!]),\n)\n\nexport const notificationClientTypeEntries = entriesRaw\nexport const notificationClientTypes = allTypes\nexport const notificationRenderers = renderers\n\nexport function getNotificationRenderers(): NotificationRenderers {\n return renderers\n}\n`\n\n const messageTypeEntriesLiteral = messageTypeEntries.join(',\\n ')\n const messageTypeImportSection = messageTypeImports.join('\\n')\n const messageTypesOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { MessageTypeDefinition } from '@open-mercato/shared/modules/messages/types'\n${messageTypeImportSection ? `\\n${messageTypeImportSection}\\n` : '\\n'}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }\n\nconst entriesRaw: MessageTypeEntry[] = [\n${messageTypeEntriesLiteral ? ` ${messageTypeEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const messageTypeEntries = entriesRaw\nexport const messageTypes = allTypes\n\nexport function getMessageTypes(): MessageTypeDefinition[] {\n return allTypes\n}\n\nexport function getMessageType(type: string): MessageTypeDefinition | undefined {\n return allTypes.find((entry) => entry.type === type)\n}\n`\n\n const messageObjectEntriesLiteral = messageObjectTypeEntries.join(',\\n ')\n const messageObjectImportSection = messageObjectTypeImports.join('\\n')\n const messageObjectsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { MessageObjectTypeDefinition } from '@open-mercato/shared/modules/messages/types'\n${messageObjectImportSection ? `\\n${messageObjectImportSection}\\n` : '\\n'}type MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }\n\nconst entriesRaw: MessageObjectTypeEntry[] = [\n${messageObjectEntriesLiteral ? ` ${messageObjectEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const messageObjectTypeEntries = entriesRaw\nexport const messageObjectTypes = allTypes\n\nexport function getMessageObjectTypes(): MessageObjectTypeDefinition[] {\n return allTypes\n}\n\nexport function getMessageObjectType(module: string, entityType: string): MessageObjectTypeDefinition | undefined {\n return allTypes.find((entry) => entry.module === module && entry.entityType === entityType)\n}\n`\n const messagesClientOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ComponentType } from 'react'\nimport type {\n MessageTypeDefinition,\n MessageObjectTypeDefinition,\n MessageListItemProps,\n MessageContentProps,\n MessageActionsProps,\n ObjectDetailProps,\n ObjectPreviewProps,\n} from '@open-mercato/shared/modules/messages/types'\nimport { registerMessageObjectTypes } from '@open-mercato/core/modules/messages/lib/message-objects-registry'\nimport { configureMessageUiComponentRegistry } from '@open-mercato/core/modules/messages/components/utils/typeUiRegistry'\n${messageTypeImportSection ? `\\n${messageTypeImportSection}\\n` : '\\n'}${messageObjectImportSection ? `\\n${messageObjectImportSection}\\n` : ''}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }\ntype MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }\n\nexport type MessageListItemRenderers = Record<string, ComponentType<MessageListItemProps>>\nexport type MessageContentRenderers = Record<string, ComponentType<MessageContentProps>>\nexport type MessageActionsRenderers = Record<string, ComponentType<MessageActionsProps>>\nexport type MessageObjectDetailRenderers = Record<string, ComponentType<ObjectDetailProps>>\nexport type MessageObjectPreviewRenderers = Record<string, ComponentType<ObjectPreviewProps>>\n\nexport type MessageUiComponentRegistry = {\n listItemComponents: MessageListItemRenderers\n contentComponents: MessageContentRenderers\n actionsComponents: MessageActionsRenderers\n objectDetailComponents: MessageObjectDetailRenderers\n objectPreviewComponents: MessageObjectPreviewRenderers\n}\n\nconst messageTypeEntriesRaw: MessageTypeEntry[] = [\n${messageTypeEntriesLiteral ? ` ${messageTypeEntriesLiteral}\\n` : ''}]\nconst messageObjectTypeEntriesRaw: MessageObjectTypeEntry[] = [\n${messageObjectEntriesLiteral ? ` ${messageObjectEntriesLiteral}\\n` : ''}]\n\nconst allMessageTypes = messageTypeEntriesRaw.flatMap((entry) => entry.types)\nconst allMessageObjectTypes = messageObjectTypeEntriesRaw.flatMap((entry) => entry.types)\n\nconst listItemComponents: MessageListItemRenderers = Object.fromEntries(\n allMessageTypes\n .filter((typeDef) => Boolean(typeDef.ui?.listItemComponent) && Boolean(typeDef.ListItemComponent))\n .map((typeDef) => [typeDef.ui!.listItemComponent!, typeDef.ListItemComponent!]),\n)\n\nconst contentComponents: MessageContentRenderers = Object.fromEntries(\n allMessageTypes\n .filter((typeDef) => Boolean(typeDef.ui?.contentComponent) && Boolean(typeDef.ContentComponent))\n .map((typeDef) => [typeDef.ui!.contentComponent!, typeDef.ContentComponent!]),\n)\n\nconst actionsComponents: MessageActionsRenderers = Object.fromEntries(\n allMessageTypes\n .filter((typeDef) => Boolean(typeDef.ui?.actionsComponent) && Boolean(typeDef.ActionsComponent))\n .map((typeDef) => [typeDef.ui!.actionsComponent!, typeDef.ActionsComponent!]),\n)\n\nconst objectDetailComponents: MessageObjectDetailRenderers = Object.fromEntries(\n allMessageObjectTypes\n .filter((typeDef) => Boolean(typeDef.DetailComponent))\n .map((typeDef) => [\\`\\${typeDef.module}:\\${typeDef.entityType}\\`, typeDef.DetailComponent!]),\n)\n\nconst objectPreviewComponents: MessageObjectPreviewRenderers = Object.fromEntries(\n allMessageObjectTypes\n .filter((typeDef) => Boolean(typeDef.PreviewComponent))\n .map((typeDef) => [\\`\\${typeDef.module}:\\${typeDef.entityType}\\`, typeDef.PreviewComponent!]),\n)\n\nconst registry: MessageUiComponentRegistry = {\n listItemComponents,\n contentComponents,\n actionsComponents,\n objectDetailComponents,\n objectPreviewComponents,\n}\n\nexport const messageClientTypeEntries = messageTypeEntriesRaw\nexport const messageClientObjectTypeEntries = messageObjectTypeEntriesRaw\nexport const messageUiComponentRegistry = registry\n\nexport function getMessageUiComponentRegistry(): MessageUiComponentRegistry {\n return registry\n}\n\n// Side-effects: register all message object types and configure the UI component registry on import.\nfor (const entry of messageObjectTypeEntriesRaw) {\n registerMessageObjectTypes(entry.types)\n}\nconfigureMessageUiComponentRegistry(registry)\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([\n ...Array.from(trackedRoots),\n ])\n\n writeGeneratedFile({ outFile, checksumFile, content: output, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: widgetsOutFile, checksumFile: widgetsChecksumFile, content: widgetsOutput, structureChecksum, result, quiet })\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 writeGeneratedFile({ outFile: injectionWidgetsOutFile, checksumFile: injectionWidgetsChecksumFile, content: injectionWidgetsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: injectionTablesOutFile, checksumFile: injectionTablesChecksumFile, content: injectionTablesOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: searchOutFile, checksumFile: searchChecksumFile, content: searchOutput, structureChecksum, result, quiet })\n\n // AI Tools generated file\n const aiToolsOutput = `// AUTO-GENERATED by mercato generate registry\n${aiToolsImports.length ? aiToolsImports.join('\\n') + '\\n' : ''}\ntype AiToolConfigEntry = { moduleId: string; tools: unknown[] }\n\nexport const aiToolConfigEntries: AiToolConfigEntry[] = [\n${aiToolsConfigs.length ? ' ' + aiToolsConfigs.join(',\\n ') + '\\n' : ''}].filter(e => Array.isArray(e.tools) && e.tools.length > 0)\n\nexport const allAiTools = aiToolConfigEntries.flatMap(e => e.tools)\n`\n writeGeneratedFile({ outFile: aiToolsOutFile, checksumFile: aiToolsChecksumFile, content: aiToolsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: notificationsOutFile, checksumFile: notificationsChecksumFile, content: notificationsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: notificationsClientOutFile, checksumFile: notificationsClientChecksumFile, content: notificationsClientOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: messageTypesOutFile, checksumFile: messageTypesChecksumFile, content: messageTypesOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: messageObjectsOutFile, checksumFile: messageObjectsChecksumFile, content: messageObjectsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: messagesClientOutFile, checksumFile: messagesClientChecksumFile, content: messagesClientOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: eventsOutFile, checksumFile: eventsChecksumFile, content: eventsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: analyticsOutFile, checksumFile: analyticsChecksumFile, content: analyticsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: transFieldsOutFile, checksumFile: transFieldsChecksumFile, content: transFieldsOutput, structureChecksum, result, quiet })\n\n // Enrichers generated file\n const enricherEntriesLiteral = enricherConfigs.join(',\\n ')\n const enricherImportSection = enricherImports.join('\\n')\n const enrichersOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ResponseEnricher } from '@open-mercato/shared/lib/crud/response-enricher'\n${enricherImportSection ? `\\n${enricherImportSection}\\n` : '\\n'}type EnricherEntry = { moduleId: string; enrichers: ResponseEnricher[] }\n\nexport const enricherEntries: EnricherEntry[] = [\n${enricherEntriesLiteral ? ` ${enricherEntriesLiteral}\\n` : ''}]\n`\n writeGeneratedFile({ outFile: enrichersOutFile, checksumFile: enrichersChecksumFile, content: enrichersOutput, structureChecksum, result, quiet })\n // Inbox Actions generated file\n const inboxActionsEntriesLiteral = inboxActionsConfigs.join(',\\n ')\n const inboxActionsImportSection = inboxActionsImports.join('\\n')\n const inboxActionsOutput = `// AUTO-GENERATED by mercato generate registry \u2014 do not edit\nimport type { InboxActionDefinition } from '@open-mercato/shared/modules/inbox-actions'\n${inboxActionsImportSection ? `\\n${inboxActionsImportSection}\\n` : '\\n'}\ntype InboxActionConfigEntry = { moduleId: string; actions: InboxActionDefinition[] }\n\nconst entriesRaw: InboxActionConfigEntry[] = [\n${inboxActionsEntriesLiteral ? ` ${inboxActionsEntriesLiteral}\\n` : ''}]\n\nconst entries = entriesRaw.filter((e): e is InboxActionConfigEntry => Array.isArray(e.actions) && e.actions.length > 0)\n\nexport const inboxActionConfigEntries = entries\nexport const inboxActions: InboxActionDefinition[] = entries.flatMap((e) => e.actions)\n\nconst actionTypeMap = new Map(inboxActions.map((a) => [a.type, a]))\nexport function getInboxAction(type: string): InboxActionDefinition | undefined {\n return actionTypeMap.get(type)\n}\nexport function getRegisteredActionTypes(): string[] {\n return Array.from(actionTypeMap.keys())\n}\n`\n writeGeneratedFile({ outFile: inboxActionsOutFile, checksumFile: inboxActionsChecksumFile, content: inboxActionsOutput, structureChecksum, result, quiet })\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, dashboard widgets\n * Excludes: frontend routes, backend routes, API handlers, 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 // Mutable ref so extracted helper functions can increment the shared counter\n const importIdRef = { value: 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 rawImps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : rawImps.appBase\n const imps: ModuleImports = { appBase: appImportBase, pkgBase: rawImps.pkgBase }\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 const dashboardWidgets: string[] = []\n let setupImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n\n // Module metadata: index.ts (overrideable)\n const appIndex = path.join(roots.appBase, 'index.ts')\n const pkgIndex = path.join(roots.pkgBase, 'index.ts')\n const indexTs = fs.existsSync(appIndex) ? appIndex : fs.existsSync(pkgIndex) ? pkgIndex : null\n if (indexTs) {\n infoImportName = `I${importIdRef.value++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\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 // Module setup configuration: setup.ts\n {\n const setup = resolveConventionFile(roots, imps, 'setup.ts', 'SETUP', modId, importIdRef, imports)\n if (setup) setupImportName = setup.importName\n }\n\n // Entity extensions: data/extensions.ts\n {\n const ext = resolveConventionFile(roots, imps, 'data/extensions.ts', 'X', modId, importIdRef, imports)\n if (ext) extensionsImportName = ext.importName\n }\n\n // RBAC: acl.ts\n {\n const rootApp = path.join(roots.appBase, 'acl.ts')\n const rootPkg = path.join(roots.pkgBase, 'acl.ts')\n const hasRoot = fs.existsSync(rootApp) || fs.existsSync(rootPkg)\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importIdRef.value++}`\n const useApp = fs.existsSync(rootApp) ? 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: ce.ts\n {\n const ce = resolveConventionFile(roots, imps, 'ce.ts', 'CE', modId, importIdRef, imports)\n if (ce) customEntitiesImportName = ce.importName\n }\n\n // Vector search configuration: vector.ts\n {\n const vec = resolveConventionFile(roots, imps, 'vector.ts', 'VECTOR', modId, importIdRef, imports)\n if (vec) vectorImportName = vec.importName\n }\n\n // Custom fields: data/fields.ts\n {\n const fields = resolveConventionFile(roots, imps, 'data/fields.ts', 'F', modId, importIdRef, imports)\n if (fields) fieldsImportName = fields.importName\n }\n\n // CLI\n {\n const cliApp = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\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\n // Translations\n translations.push(...processTranslations({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n }))\n\n // Subscribers\n subscribers.push(...processSubscribers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Workers\n workers.push(...await processWorkers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Build combined customFieldSets expression\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\n {\n const entries = scanDashboardWidgetEntries({\n modId,\n roots,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n })\n for (const entry of entries) {\n dashboardWidgets.push(\n `{ moduleId: '${entry.moduleId}', key: '${entry.key}', source: '${entry.source}', loader: () => import('${entry.importPath}').then((mod) => mod.default ?? mod) }`\n )\n }\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 ${dashboardWidgets.length ? `dashboardWidgets: [${dashboardWidgets.join(', ')}],` : ''}\n ${vectorImportName ? `vector: (${vectorImportName}.default ?? ${vectorImportName}.vectorConfig ?? ${vectorImportName}.config ?? undefined),` : ''}\n ${setupImportName ? `setup: (${setupImportName}.default ?? ${setupImportName}.setup) || 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, injection 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 writeGeneratedFile({ outFile, checksumFile, content: output, structureChecksum, result, quiet })\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 calculateStructureChecksum,\n toVar,\n moduleHasExport,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n} from '../utils'\nimport {\n scanModuleDir,\n resolveModuleFile,\n SCAN_CONFIGS,\n type ModuleRoots,\n type ModuleImports,\n} from './scanner'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\nexport interface ModuleRegistryOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\ntype DashboardWidgetEntry = {\n moduleId: string\n key: string\n source: 'app' | 'package'\n importPath: string\n}\n\nfunction scanDashboardWidgetEntries(options: {\n modId: string\n roots: ModuleRoots\n appImportBase: string\n pkgImportBase: string\n}): DashboardWidgetEntry[] {\n const { modId, roots, appImportBase, pkgImportBase } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.dashboardWidgets)\n return files.map(({ relPath, fromApp }) => {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/widgets/dashboard/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n return { moduleId: modId, key, source, importPath }\n })\n}\n\nfunction processPageFiles(options: {\n files: Array<{ relPath: string; fromApp: boolean }>\n type: 'frontend' | 'backend'\n modId: string\n appDir: string\n pkgDir: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): string[] {\n const { files, type, modId, appDir, pkgDir, appImportBase, pkgImportBase, imports, importIdRef } = options\n const prefix = type === 'frontend' ? 'C' : 'B'\n const modPrefix = type === 'frontend' ? 'CM' : 'BM'\n const metaPrefix = type === 'frontend' ? 'M' : 'BM'\n const routes: string[] = []\n\n // Next-style page.tsx files\n for (const { relPath, fromApp } of files.filter(({ relPath: f }) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = relPath.split('/')\n segs.pop()\n const importName = `${prefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `${modPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${sub}`\n const routePath = type === 'frontend'\n ? '/' + (segs.join('/') || '')\n : '/backend/' + (segs.join('/') || modId)\n const metaCandidates = [\n path.join(fromApp ? appDir : pkgDir, ...segs, 'page.meta.ts'),\n path.join(fromApp ? appDir : pkgDir, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `${metaPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...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 const baseProps = `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`\n const extraProps = type === 'backend' ? `, pageContext: (${metaExpr})?.pageContext` : ''\n routes.push(`{ ${baseProps}${extraProps}, Component: ${importName} }`)\n }\n\n // Back-compat direct files (old-style pages like login.tsx instead of login/page.tsx)\n for (const { relPath, fromApp } of files.filter(({ relPath: f }) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const routeSegs = [...segs, name].filter(Boolean)\n const importName = `${prefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const pageModName = `${modPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...segs, name].join('/')}`\n const routePath = type === 'frontend'\n ? '/' + (routeSegs.join('/') || '')\n : '/backend/' + [modId, ...segs, name].filter(Boolean).join('/')\n const metaCandidates = [\n path.join(fromApp ? appDir : pkgDir, ...segs, `${name}.meta.ts`),\n path.join(fromApp ? appDir : pkgDir, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `${metaPrefix}${importIdRef.value++}_${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 : pkgImportBase}/${type}/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = type === 'frontend' ? `(${metaImportName}.metadata as any)` : `${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 const baseProps = `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`\n const extraFe = type === 'frontend' ? `, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled` : `, 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, pageContext: (${metaExpr})?.pageContext`\n routes.push(`{ ${baseProps}${extraFe}, Component: ${importName} }`)\n }\n\n return routes\n}\n\nasync function processApiRoutes(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): Promise<string[]> {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const apiApp = path.join(roots.appBase, 'api')\n const apiPkg = path.join(roots.pkgBase, 'api')\n if (!fs.existsSync(apiApp) && !fs.existsSync(apiPkg)) return []\n\n const apis: string[] = []\n\n // route.ts aggregations\n const routeFiles = scanModuleDir(roots, SCAN_CONFIGS.apiRoutes)\n for (const { relPath, fromApp } of routeFiles) {\n const segs = relPath.split('/')\n segs.pop()\n const reqSegs = [modId, ...segs]\n const importName = `R${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...segs, 'route.ts')\n const apiSegPath = segs.join('/')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/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 (plain .ts, not route.ts, not tests, skip method dirs)\n const plainFiles = scanModuleDir(roots, SCAN_CONFIGS.apiPlainFiles)\n for (const { relPath, fromApp } of plainFiles) {\n const segs = relPath.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${importIdRef.value++}_${toVar(modId)}_${toVar(fullSegs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...fullSegs) + '.ts'\n const plainSegPath = fullSegs.join('/')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/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\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 methodRoots: ModuleRoots = { appBase: methodDir, pkgBase: methodDir }\n const methodConfig = {\n folder: '',\n include: (name: string) => name.endsWith('.ts') && !/\\.(test|spec)\\.ts$/.test(name),\n }\n const apiFiles = scanModuleDir(methodRoots, methodConfig)\n for (const { relPath } of apiFiles) {\n const segs = relPath.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${importIdRef.value++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const fromApp = methodDir === appMethodDir\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/api/${method.toLowerCase()}/${fullSegs.join('/')}`\n const metaName = `RM${importIdRef.value++}_${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 return apis\n}\n\nfunction processSubscribers(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): string[] {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.subscribers)\n const subscribers: string[] = []\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importName = `Subscriber${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/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 return subscribers\n}\n\nasync function processWorkers(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): Promise<string[]> {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.workers)\n const workers: string[] = []\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/workers/${[...segs, name].join('/')}`\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importIdRef.value++}_${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 return workers\n}\n\nfunction processTranslations(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n}): string[] {\n const { roots, modId, appImportBase, pkgImportBase, imports } = options\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 const translations: string[] = []\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 '${pkgImportBase}/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 '${pkgImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n return translations\n}\n\n/**\n * Resolves a convention file and pushes its import + config entry to standalone arrays.\n * Used for files that produce their own generated output (notifications, AI tools, events, analytics, enrichers, etc.).\n *\n * @returns The generated import name, or null if the file was not found.\n */\nfunction processStandaloneConfig(options: {\n roots: ModuleRoots\n imps: ModuleImports\n modId: string\n relativePath: string\n prefix: string\n importIdRef: { value: number }\n standaloneImports: string[]\n standaloneConfigs: string[]\n configExpr: (importName: string, modId: string) => string\n /** Also push the import to the shared imports array (used by modules.generated.ts) */\n sharedImports?: string[]\n}): string | null {\n const { roots, imps, modId, relativePath, prefix, importIdRef, standaloneImports, standaloneConfigs, configExpr, sharedImports } = options\n const resolved = resolveModuleFile(roots, imps, relativePath)\n if (!resolved) return null\n const importName = `${prefix}_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n standaloneImports.push(importStmt)\n if (sharedImports) sharedImports.push(importStmt)\n standaloneConfigs.push(configExpr(importName, modId))\n return importName\n}\n\nfunction resolveConventionFile(\n roots: ModuleRoots,\n imps: ModuleImports,\n relativePath: string,\n prefix: string,\n modId: string,\n importIdRef: { value: number },\n imports: string[],\n importStyle: 'namespace' | 'default' = 'namespace'\n): { importName: string; importPath: string; fromApp: boolean } | null {\n const resolved = resolveModuleFile(roots, imps, relativePath)\n if (!resolved) return null\n const importName = `${prefix}_${toVar(modId)}_${importIdRef.value++}`\n if (importStyle === 'default') {\n imports.push(`import ${importName} from '${resolved.importPath}'`)\n } else {\n imports.push(`import * as ${importName} from '${resolved.importPath}'`)\n }\n return { importName, importPath: resolved.importPath, fromApp: resolved.fromApp }\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 const notificationsOutFile = path.join(outputDir, 'notifications.generated.ts')\n const notificationsChecksumFile = path.join(outputDir, 'notifications.generated.checksum')\n const notificationsClientOutFile = path.join(outputDir, 'notifications.client.generated.ts')\n const notificationsClientChecksumFile = path.join(outputDir, 'notifications.client.generated.checksum')\n const messageTypesOutFile = path.join(outputDir, 'message-types.generated.ts')\n const messageTypesChecksumFile = path.join(outputDir, 'message-types.generated.checksum')\n const messageObjectsOutFile = path.join(outputDir, 'message-objects.generated.ts')\n const messageObjectsChecksumFile = path.join(outputDir, 'message-objects.generated.checksum')\n const messagesClientOutFile = path.join(outputDir, 'messages.client.generated.ts')\n const messagesClientChecksumFile = path.join(outputDir, 'messages.client.generated.checksum')\n const aiToolsOutFile = path.join(outputDir, 'ai-tools.generated.ts')\n const aiToolsChecksumFile = path.join(outputDir, 'ai-tools.generated.checksum')\n const eventsOutFile = path.join(outputDir, 'events.generated.ts')\n const eventsChecksumFile = path.join(outputDir, 'events.generated.checksum')\n const analyticsOutFile = path.join(outputDir, 'analytics.generated.ts')\n const analyticsChecksumFile = path.join(outputDir, 'analytics.generated.checksum')\n const transFieldsOutFile = path.join(outputDir, 'translations-fields.generated.ts')\n const transFieldsChecksumFile = path.join(outputDir, 'translations-fields.generated.checksum')\n const enrichersOutFile = path.join(outputDir, 'enrichers.generated.ts')\n const enrichersChecksumFile = path.join(outputDir, 'enrichers.generated.checksum')\n const interceptorsOutFile = path.join(outputDir, 'interceptors.generated.ts')\n const interceptorsChecksumFile = path.join(outputDir, 'interceptors.generated.checksum')\n const componentOverridesOutFile = path.join(outputDir, 'component-overrides.generated.ts')\n const componentOverridesChecksumFile = path.join(outputDir, 'component-overrides.generated.checksum')\n const inboxActionsOutFile = path.join(outputDir, 'inbox-actions.generated.ts')\n const inboxActionsChecksumFile = path.join(outputDir, 'inbox-actions.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n // Mutable ref so extracted helper functions can increment the shared counter\n const importIdRef = { value: 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 const notificationTypes: string[] = []\n const notificationImports: string[] = []\n const notificationClientTypes: string[] = []\n const notificationClientImports: string[] = []\n const messageTypeEntries: string[] = []\n const messageTypeImports: string[] = []\n const messageObjectTypeEntries: string[] = []\n const messageObjectTypeImports: string[] = []\n const aiToolsConfigs: string[] = []\n const aiToolsImports: string[] = []\n const eventsConfigs: string[] = []\n const eventsImports: string[] = []\n const analyticsConfigs: string[] = []\n const analyticsImports: string[] = []\n const transFieldsConfigs: string[] = []\n const transFieldsImports: string[] = []\n const enricherConfigs: string[] = []\n const enricherImports: string[] = []\n const interceptorConfigs: string[] = []\n const interceptorImports: string[] = []\n const componentOverrideConfigs: string[] = []\n const componentOverrideImports: string[] = []\n const inboxActionsConfigs: string[] = []\n const inboxActionsImports: string[] = []\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const rawImps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : rawImps.appBase\n const imps: ModuleImports = { appBase: appImportBase, pkgBase: rawImps.pkgBase }\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 eventsImportName: string | null = null\n let analyticsImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n const dashboardWidgets: string[] = []\n const injectionWidgets: string[] = []\n let injectionTableImportName: string | null = null\n let setupImportName: string | null = null\n\n // === Processing order MUST match original import ID sequence ===\n\n // 1. Module metadata: index.ts (overrideable)\n const appIndex = path.join(roots.appBase, 'index.ts')\n const pkgIndex = path.join(roots.pkgBase, 'index.ts')\n const indexTs = fs.existsSync(appIndex) ? appIndex : fs.existsSync(pkgIndex) ? pkgIndex : null\n if (indexTs) {\n infoImportName = `I${importIdRef.value++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\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 // 2. Pages: frontend\n {\n const feApp = path.join(roots.appBase, 'frontend')\n const fePkg = path.join(roots.pkgBase, 'frontend')\n const feFiles = scanModuleDir(roots, SCAN_CONFIGS.frontendPages)\n if (feFiles.length) {\n frontendRoutes.push(...processPageFiles({\n files: feFiles,\n type: 'frontend',\n modId,\n appDir: feApp,\n pkgDir: fePkg,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n }\n }\n\n // 3. Entity extensions: data/extensions.ts\n {\n const ext = resolveConventionFile(roots, imps, 'data/extensions.ts', 'X', modId, importIdRef, imports)\n if (ext) extensionsImportName = ext.importName\n }\n\n // 4. RBAC: acl.ts\n {\n const rootApp = path.join(roots.appBase, 'acl.ts')\n const rootPkg = path.join(roots.pkgBase, 'acl.ts')\n const hasRoot = fs.existsSync(rootApp) || fs.existsSync(rootPkg)\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importIdRef.value++}`\n const useApp = fs.existsSync(rootApp) ? 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 // 5. Custom entities: ce.ts\n {\n const ce = resolveConventionFile(roots, imps, 'ce.ts', 'CE', modId, importIdRef, imports)\n if (ce) customEntitiesImportName = ce.importName\n }\n\n // 6. Search: search.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'search.ts')\n if (resolved) {\n const importName = `SEARCH_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n imports.push(importStmt)\n searchImports.push(importStmt)\n searchImportName = importName\n }\n }\n\n // 7. Notifications: notifications.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'notifications.ts',\n prefix: 'NOTIF',\n standaloneImports: notificationImports,\n standaloneConfigs: notificationTypes,\n configExpr: (n, id) => `{ moduleId: '${id}', types: ((${n}.default ?? ${n}.notificationTypes ?? (${n} as any).types ?? []) as NotificationTypeDefinition[]) }`,\n })\n\n // Notification client renderers: notifications.client.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'notifications.client.ts',\n prefix: 'NOTIF_CLIENT',\n standaloneImports: notificationClientImports,\n standaloneConfigs: notificationClientTypes,\n configExpr: (n, id) => `{ moduleId: '${id}', types: (${n}.default ?? []) }`,\n })\n // Message types: module root message-types.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'message-types.ts')\n if (resolved) {\n const importName = `MSG_TYPES_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n messageTypeImports.push(importStmt)\n messageTypeEntries.push(\n `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageTypes ?? (${importName} as any).types ?? []) as MessageTypeDefinition[]) }`\n )\n }\n }\n\n // Message object types: module root message-objects.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'message-objects.ts')\n if (resolved) {\n const importName = `MSG_OBJECTS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n messageObjectTypeImports.push(importStmt)\n messageObjectTypeEntries.push(\n `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageObjectTypes ?? (${importName} as any).objectTypes ?? (${importName} as any).types ?? []) as MessageObjectTypeDefinition[]) }`\n )\n }\n }\n\n // AI Tools: module root ai-tools.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'notifications.client.ts')\n if (resolved) {\n const importName = `NOTIF_CLIENT_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n notificationClientImports.push(importStmt)\n notificationClientTypes.push(\n `{ moduleId: '${modId}', types: (${importName}.default ?? []) }`\n )\n }\n }\n\n // 8. AI Tools: ai-tools.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'ai-tools.ts',\n prefix: 'AI_TOOLS',\n standaloneImports: aiToolsImports,\n standaloneConfigs: aiToolsConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', tools: (${n}.aiTools ?? ${n}.default ?? []) }`,\n })\n\n // 9. Events: events.ts (also referenced in module declarations)\n eventsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'events.ts',\n prefix: 'EVENTS',\n standaloneImports: eventsImports,\n standaloneConfigs: eventsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', config: (${n}.default ?? ${n}.eventsConfig ?? null) as EventModuleConfigBase | null }`,\n })\n\n // 10. Analytics: analytics.ts (also referenced in module declarations)\n analyticsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'analytics.ts',\n prefix: 'ANALYTICS',\n standaloneImports: analyticsImports,\n standaloneConfigs: analyticsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', config: (${n}.default ?? ${n}.analyticsConfig ?? ${n}.config ?? null) }`,\n })\n\n // 10b. Enrichers: data/enrichers.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'data/enrichers.ts',\n prefix: 'ENRICHERS',\n standaloneImports: enricherImports,\n standaloneConfigs: enricherConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', enrichers: ((${n} as any).enrichers ?? (${n} as any).default ?? []) }`,\n })\n\n // 10c. API interceptors: api/interceptors.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'api/interceptors.ts',\n prefix: 'INTERCEPTORS',\n standaloneImports: interceptorImports,\n standaloneConfigs: interceptorConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', interceptors: ((${n} as any).interceptors ?? (${n} as any).default ?? []) }`,\n })\n\n // 10d. Component overrides: widgets/components.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'widgets/components.ts',\n prefix: 'COMPONENT_OVERRIDES',\n standaloneImports: componentOverrideImports,\n standaloneConfigs: componentOverrideConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', componentOverrides: ((${n} as any).componentOverrides ?? (${n} as any).default ?? []) }`,\n })\n\n // Translatable fields: translations.ts (also referenced in module declarations)\n let transFieldsImportName: string | null = null\n transFieldsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'translations.ts',\n prefix: 'TRANS_FIELDS',\n standaloneImports: transFieldsImports,\n standaloneConfigs: transFieldsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', fields: (${n}.default ?? ${n}.translatableFields ?? {}) as Record<string, string[]> }`,\n })\n\n // Inbox Actions: inbox-actions.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'inbox-actions.ts')\n if (resolved) {\n const importName = `INBOX_ACTIONS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n inboxActionsImports.push(importStmt)\n inboxActionsConfigs.push(\n `{ moduleId: '${modId}', actions: (${importName}.default ?? ${importName}.inboxActions ?? []) }`\n )\n }\n }\n\n // 11. Setup: setup.ts\n {\n const setup = resolveConventionFile(roots, imps, 'setup.ts', 'SETUP', modId, importIdRef, imports)\n if (setup) setupImportName = setup.importName\n }\n\n // 12. Custom fields: data/fields.ts\n {\n const fields = resolveConventionFile(roots, imps, 'data/fields.ts', 'F', modId, importIdRef, imports)\n if (fields) fieldsImportName = fields.importName\n }\n\n // 13. Pages: backend\n {\n const beApp = path.join(roots.appBase, 'backend')\n const bePkg = path.join(roots.pkgBase, 'backend')\n const beFiles = scanModuleDir(roots, SCAN_CONFIGS.backendPages)\n if (beFiles.length) {\n backendRoutes.push(...processPageFiles({\n files: beFiles,\n type: 'backend',\n modId,\n appDir: beApp,\n pkgDir: bePkg,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n }\n }\n\n // 14. API routes\n apis.push(...await processApiRoutes({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 15. CLI\n {\n const cliApp = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\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\n // 16. Translations\n translations.push(...processTranslations({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n }))\n\n // 17. Subscribers\n subscribers.push(...processSubscribers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 18. Workers\n workers.push(...await processWorkers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Build combined customFieldSets expression\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 // 19. Dashboard widgets\n {\n const entries = scanDashboardWidgetEntries({\n modId,\n roots,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n })\n for (const entry of entries) {\n dashboardWidgets.push(\n `{ moduleId: '${entry.moduleId}', key: '${entry.key}', source: '${entry.source}', loader: () => import('${entry.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allDashboardWidgets.get(entry.key)\n if (!existing || (existing.source !== 'app' && entry.source === 'app')) {\n allDashboardWidgets.set(entry.key, {\n moduleId: entry.moduleId,\n source: entry.source,\n importPath: entry.importPath,\n })\n }\n }\n }\n\n // 20. Injection widgets\n {\n const files = scanModuleDir(roots, SCAN_CONFIGS.injectionWidgets)\n const widgetApp = path.join(roots.appBase, 'widgets', 'injection')\n for (const { relPath, fromApp } of files) {\n const segs = relPath.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 // 21. Injection table\n {\n const resolved = resolveModuleFile(roots, imps, 'widgets/injection-table.ts')\n if (resolved) {\n const importName = `InjTable_${toVar(modId)}_${importIdRef.value++}`\n imports.push(`import * as ${importName} from '${resolved.importPath}'`)\n injectionTableImportName = importName\n allInjectionTables.push({ moduleId: modId, importPath: resolved.importPath, importName })\n }\n }\n\n if (searchImportName) {\n searchConfigs.push(`{ moduleId: '${modId}', config: (${searchImportName}.default ?? ${searchImportName}.searchConfig ?? ${searchImportName}.config ?? null) }`)\n }\n\n // Note: events, analytics, enrichers, notifications, AI tools, and translatable fields\n // configs are pushed inside processStandaloneConfig() above \u2014 no separate push needed here.\n\n if (transFieldsImportName) {\n transFieldsConfigs.push(`{ moduleId: '${modId}', fields: (${transFieldsImportName}.default ?? ${transFieldsImportName}.translatableFields ?? {}) as Record<string, string[]> }`)\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 ${setupImportName ? `setup: (${setupImportName}.default ?? ${setupImportName}.setup) || undefined,` : ''}\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 const eventsEntriesLiteral = eventsConfigs.join(',\\n ')\n const eventsImportSection = eventsImports.join('\\n')\n const eventsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { EventModuleConfigBase, EventDefinition } from '@open-mercato/shared/modules/events'\n${eventsImportSection ? `\\n${eventsImportSection}\\n` : '\\n'}type EventConfigEntry = { moduleId: string; config: EventModuleConfigBase | null }\n\nconst entriesRaw: EventConfigEntry[] = [\n${eventsEntriesLiteral ? ` ${eventsEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((e): e is { moduleId: string; config: EventModuleConfigBase } => e.config != null)\n\nexport const eventModuleConfigEntries = entries\nexport const eventModuleConfigs: EventModuleConfigBase[] = entries.map((e) => e.config)\nexport const allEvents: EventDefinition[] = entries.flatMap((e) => e.config.events)\n\n// Runtime registry for validation\nconst allDeclaredEventIds = new Set(allEvents.map((e) => e.id))\nexport function isEventDeclared(eventId: string): boolean {\n return allDeclaredEventIds.has(eventId)\n}\n`\n\n const analyticsEntriesLiteral = analyticsConfigs.join(',\\n ')\n const analyticsImportSection = analyticsImports.join('\\n')\n const analyticsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { AnalyticsModuleConfig } from '@open-mercato/shared/modules/analytics'\n${analyticsImportSection ? `\\n${analyticsImportSection}\\n` : '\\n'}type AnalyticsConfigEntry = { moduleId: string; config: AnalyticsModuleConfig | null }\n\nconst entriesRaw: AnalyticsConfigEntry[] = [\n${analyticsEntriesLiteral ? ` ${analyticsEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((entry): entry is { moduleId: string; config: AnalyticsModuleConfig } => entry.config != null)\n\nexport const analyticsModuleConfigEntries = entries\nexport const analyticsModuleConfigs: AnalyticsModuleConfig[] = entries.map((entry) => entry.config)\n`\n\n const transFieldsEntriesLiteral = transFieldsConfigs.join(',\\n ')\n const transFieldsImportSection = transFieldsImports.join('\\n')\n const transFieldsOutput = `// AUTO-GENERATED by mercato generate registry\nimport { registerTranslatableFields } from '@open-mercato/shared/lib/localization/translatable-fields'\n${transFieldsImportSection ? `\\n${transFieldsImportSection}\\n` : '\\n'}type TransFieldsEntry = { moduleId: string; fields: Record<string, string[]> }\n\nconst entries: TransFieldsEntry[] = [\n${transFieldsEntriesLiteral ? ` ${transFieldsEntriesLiteral}\\n` : ''}]\n\nconst allFields: Record<string, string[]> = {}\nfor (const entry of entries) {\n for (const [key, value] of Object.entries(entry.fields)) {\n allFields[key] = value\n }\n}\n\nexport const translatableFieldEntries = entries\nexport const allTranslatableFields = allFields\nexport const allTranslatableEntityTypes = Object.keys(allFields)\n\n// Auto-register on import (side-effect)\nregisterTranslatableFields(allFields)\n`\n\n const notificationEntriesLiteral = notificationTypes.join(',\\n ')\n const notificationImportSection = notificationImports.join('\\n')\n const notificationsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'\n${notificationImportSection ? `\\n${notificationImportSection}\\n` : '\\n'}type NotificationTypeEntry = { moduleId: string; types: NotificationTypeDefinition[] }\n\nconst entriesRaw: NotificationTypeEntry[] = [\n${notificationEntriesLiteral ? ` ${notificationEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const notificationTypeEntries = entriesRaw\nexport const notificationTypes = allTypes\n\nexport function getNotificationTypes(): NotificationTypeDefinition[] {\n return allTypes\n}\n\nexport function getNotificationType(type: string): NotificationTypeDefinition | undefined {\n return allTypes.find((t) => t.type === type)\n}\n`\n const notificationClientEntriesLiteral = notificationClientTypes.join(',\\n ')\n const notificationClientImportSection = notificationClientImports.join('\\n')\n const notificationsClientOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ComponentType } from 'react'\nimport type { NotificationTypeDefinition, NotificationRendererProps } from '@open-mercato/shared/modules/notifications/types'\n${notificationClientImportSection ? `\\n${notificationClientImportSection}\\n` : '\\n'}type NotificationTypeEntry = { moduleId: string; types: NotificationTypeDefinition[] }\nexport type NotificationRenderers = Record<string, ComponentType<NotificationRendererProps>>\n\nconst entriesRaw: NotificationTypeEntry[] = [\n${notificationClientEntriesLiteral ? ` ${notificationClientEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\nconst renderers: NotificationRenderers = Object.fromEntries(\n allTypes\n .filter((typeDef) => Boolean(typeDef.Renderer))\n .map((typeDef) => [typeDef.type, typeDef.Renderer!]),\n)\n\nexport const notificationClientTypeEntries = entriesRaw\nexport const notificationClientTypes = allTypes\nexport const notificationRenderers = renderers\n\nexport function getNotificationRenderers(): NotificationRenderers {\n return renderers\n}\n`\n\n const messageTypeEntriesLiteral = messageTypeEntries.join(',\\n ')\n const messageTypeImportSection = messageTypeImports.join('\\n')\n const messageTypesOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { MessageTypeDefinition } from '@open-mercato/shared/modules/messages/types'\n${messageTypeImportSection ? `\\n${messageTypeImportSection}\\n` : '\\n'}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }\n\nconst entriesRaw: MessageTypeEntry[] = [\n${messageTypeEntriesLiteral ? ` ${messageTypeEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const messageTypeEntries = entriesRaw\nexport const messageTypes = allTypes\n\nexport function getMessageTypes(): MessageTypeDefinition[] {\n return allTypes\n}\n\nexport function getMessageType(type: string): MessageTypeDefinition | undefined {\n return allTypes.find((entry) => entry.type === type)\n}\n`\n\n const messageObjectEntriesLiteral = messageObjectTypeEntries.join(',\\n ')\n const messageObjectImportSection = messageObjectTypeImports.join('\\n')\n const messageObjectsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { MessageObjectTypeDefinition } from '@open-mercato/shared/modules/messages/types'\n${messageObjectImportSection ? `\\n${messageObjectImportSection}\\n` : '\\n'}type MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }\n\nconst entriesRaw: MessageObjectTypeEntry[] = [\n${messageObjectEntriesLiteral ? ` ${messageObjectEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const messageObjectTypeEntries = entriesRaw\nexport const messageObjectTypes = allTypes\n\nexport function getMessageObjectTypes(): MessageObjectTypeDefinition[] {\n return allTypes\n}\n\nexport function getMessageObjectType(module: string, entityType: string): MessageObjectTypeDefinition | undefined {\n return allTypes.find((entry) => entry.module === module && entry.entityType === entityType)\n}\n`\n const messagesClientOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ComponentType } from 'react'\nimport type {\n MessageTypeDefinition,\n MessageObjectTypeDefinition,\n MessageListItemProps,\n MessageContentProps,\n MessageActionsProps,\n ObjectDetailProps,\n ObjectPreviewProps,\n} from '@open-mercato/shared/modules/messages/types'\nimport { registerMessageObjectTypes } from '@open-mercato/core/modules/messages/lib/message-objects-registry'\nimport { configureMessageUiComponentRegistry } from '@open-mercato/core/modules/messages/components/utils/typeUiRegistry'\n${messageTypeImportSection ? `\\n${messageTypeImportSection}\\n` : '\\n'}${messageObjectImportSection ? `\\n${messageObjectImportSection}\\n` : ''}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }\ntype MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }\n\nexport type MessageListItemRenderers = Record<string, ComponentType<MessageListItemProps>>\nexport type MessageContentRenderers = Record<string, ComponentType<MessageContentProps>>\nexport type MessageActionsRenderers = Record<string, ComponentType<MessageActionsProps>>\nexport type MessageObjectDetailRenderers = Record<string, ComponentType<ObjectDetailProps>>\nexport type MessageObjectPreviewRenderers = Record<string, ComponentType<ObjectPreviewProps>>\n\nexport type MessageUiComponentRegistry = {\n listItemComponents: MessageListItemRenderers\n contentComponents: MessageContentRenderers\n actionsComponents: MessageActionsRenderers\n objectDetailComponents: MessageObjectDetailRenderers\n objectPreviewComponents: MessageObjectPreviewRenderers\n}\n\nconst messageTypeEntriesRaw: MessageTypeEntry[] = [\n${messageTypeEntriesLiteral ? ` ${messageTypeEntriesLiteral}\\n` : ''}]\nconst messageObjectTypeEntriesRaw: MessageObjectTypeEntry[] = [\n${messageObjectEntriesLiteral ? ` ${messageObjectEntriesLiteral}\\n` : ''}]\n\nconst allMessageTypes = messageTypeEntriesRaw.flatMap((entry) => entry.types)\nconst allMessageObjectTypes = messageObjectTypeEntriesRaw.flatMap((entry) => entry.types)\n\nconst listItemComponents: MessageListItemRenderers = Object.fromEntries(\n allMessageTypes\n .filter((typeDef) => Boolean(typeDef.ui?.listItemComponent) && Boolean(typeDef.ListItemComponent))\n .map((typeDef) => [typeDef.ui!.listItemComponent!, typeDef.ListItemComponent!]),\n)\n\nconst contentComponents: MessageContentRenderers = Object.fromEntries(\n allMessageTypes\n .filter((typeDef) => Boolean(typeDef.ui?.contentComponent) && Boolean(typeDef.ContentComponent))\n .map((typeDef) => [typeDef.ui!.contentComponent!, typeDef.ContentComponent!]),\n)\n\nconst actionsComponents: MessageActionsRenderers = Object.fromEntries(\n allMessageTypes\n .filter((typeDef) => Boolean(typeDef.ui?.actionsComponent) && Boolean(typeDef.ActionsComponent))\n .map((typeDef) => [typeDef.ui!.actionsComponent!, typeDef.ActionsComponent!]),\n)\n\nconst objectDetailComponents: MessageObjectDetailRenderers = Object.fromEntries(\n allMessageObjectTypes\n .filter((typeDef) => Boolean(typeDef.DetailComponent))\n .map((typeDef) => [\\`\\${typeDef.module}:\\${typeDef.entityType}\\`, typeDef.DetailComponent!]),\n)\n\nconst objectPreviewComponents: MessageObjectPreviewRenderers = Object.fromEntries(\n allMessageObjectTypes\n .filter((typeDef) => Boolean(typeDef.PreviewComponent))\n .map((typeDef) => [\\`\\${typeDef.module}:\\${typeDef.entityType}\\`, typeDef.PreviewComponent!]),\n)\n\nconst registry: MessageUiComponentRegistry = {\n listItemComponents,\n contentComponents,\n actionsComponents,\n objectDetailComponents,\n objectPreviewComponents,\n}\n\nexport const messageClientTypeEntries = messageTypeEntriesRaw\nexport const messageClientObjectTypeEntries = messageObjectTypeEntriesRaw\nexport const messageUiComponentRegistry = registry\n\nexport function getMessageUiComponentRegistry(): MessageUiComponentRegistry {\n return registry\n}\n\n// Side-effects: register all message object types and configure the UI component registry on import.\nfor (const entry of messageObjectTypeEntriesRaw) {\n registerMessageObjectTypes(entry.types)\n}\nconfigureMessageUiComponentRegistry(registry)\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([\n ...Array.from(trackedRoots),\n ])\n\n writeGeneratedFile({ outFile, checksumFile, content: output, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: widgetsOutFile, checksumFile: widgetsChecksumFile, content: widgetsOutput, structureChecksum, result, quiet })\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 writeGeneratedFile({ outFile: injectionWidgetsOutFile, checksumFile: injectionWidgetsChecksumFile, content: injectionWidgetsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: injectionTablesOutFile, checksumFile: injectionTablesChecksumFile, content: injectionTablesOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: searchOutFile, checksumFile: searchChecksumFile, content: searchOutput, structureChecksum, result, quiet })\n\n // AI Tools generated file\n const aiToolsOutput = `// AUTO-GENERATED by mercato generate registry\n${aiToolsImports.length ? aiToolsImports.join('\\n') + '\\n' : ''}\ntype AiToolConfigEntry = { moduleId: string; tools: unknown[] }\n\nexport const aiToolConfigEntries: AiToolConfigEntry[] = [\n${aiToolsConfigs.length ? ' ' + aiToolsConfigs.join(',\\n ') + '\\n' : ''}].filter(e => Array.isArray(e.tools) && e.tools.length > 0)\n\nexport const allAiTools = aiToolConfigEntries.flatMap(e => e.tools)\n`\n writeGeneratedFile({ outFile: aiToolsOutFile, checksumFile: aiToolsChecksumFile, content: aiToolsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: notificationsOutFile, checksumFile: notificationsChecksumFile, content: notificationsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: notificationsClientOutFile, checksumFile: notificationsClientChecksumFile, content: notificationsClientOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: messageTypesOutFile, checksumFile: messageTypesChecksumFile, content: messageTypesOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: messageObjectsOutFile, checksumFile: messageObjectsChecksumFile, content: messageObjectsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: messagesClientOutFile, checksumFile: messagesClientChecksumFile, content: messagesClientOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: eventsOutFile, checksumFile: eventsChecksumFile, content: eventsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: analyticsOutFile, checksumFile: analyticsChecksumFile, content: analyticsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: transFieldsOutFile, checksumFile: transFieldsChecksumFile, content: transFieldsOutput, structureChecksum, result, quiet })\n\n // Enrichers generated file\n const enricherEntriesLiteral = enricherConfigs.join(',\\n ')\n const enricherImportSection = enricherImports.join('\\n')\n const enrichersOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ResponseEnricher } from '@open-mercato/shared/lib/crud/response-enricher'\n${enricherImportSection ? `\\n${enricherImportSection}\\n` : '\\n'}type EnricherEntry = { moduleId: string; enrichers: ResponseEnricher[] }\n\nexport const enricherEntries: EnricherEntry[] = [\n${enricherEntriesLiteral ? ` ${enricherEntriesLiteral}\\n` : ''}]\n`\n writeGeneratedFile({ outFile: enrichersOutFile, checksumFile: enrichersChecksumFile, content: enrichersOutput, structureChecksum, result, quiet })\n // Inbox Actions generated file\n const inboxActionsEntriesLiteral = inboxActionsConfigs.join(',\\n ')\n const inboxActionsImportSection = inboxActionsImports.join('\\n')\n const inboxActionsOutput = `// AUTO-GENERATED by mercato generate registry \u2014 do not edit\nimport type { InboxActionDefinition } from '@open-mercato/shared/modules/inbox-actions'\n${inboxActionsImportSection ? `\\n${inboxActionsImportSection}\\n` : '\\n'}\ntype InboxActionConfigEntry = { moduleId: string; actions: InboxActionDefinition[] }\n\nconst entriesRaw: InboxActionConfigEntry[] = [\n${inboxActionsEntriesLiteral ? ` ${inboxActionsEntriesLiteral}\\n` : ''}]\n\nconst entries = entriesRaw.filter((e): e is InboxActionConfigEntry => Array.isArray(e.actions) && e.actions.length > 0)\n\nexport const inboxActionConfigEntries = entries\nexport const inboxActions: InboxActionDefinition[] = entries.flatMap((e) => e.actions)\n\nconst actionTypeMap = new Map(inboxActions.map((a) => [a.type, a]))\nexport function getInboxAction(type: string): InboxActionDefinition | undefined {\n return actionTypeMap.get(type)\n}\nexport function getRegisteredActionTypes(): string[] {\n return Array.from(actionTypeMap.keys())\n}\n`\n writeGeneratedFile({ outFile: inboxActionsOutFile, checksumFile: inboxActionsChecksumFile, content: inboxActionsOutput, structureChecksum, result, quiet })\n\n const interceptorEntriesLiteral = interceptorConfigs.join(',\\n ')\n const interceptorImportSection = interceptorImports.join('\\n')\n const interceptorsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ApiInterceptor } from '@open-mercato/shared/lib/crud/api-interceptor'\n${interceptorImportSection ? `\\n${interceptorImportSection}\\n` : '\\n'}type InterceptorEntry = { moduleId: string; interceptors: ApiInterceptor[] }\n\nexport const interceptorEntries: InterceptorEntry[] = [\n${interceptorEntriesLiteral ? ` ${interceptorEntriesLiteral}\\n` : ''}]\n`\n writeGeneratedFile({ outFile: interceptorsOutFile, checksumFile: interceptorsChecksumFile, content: interceptorsOutput, structureChecksum, result, quiet })\n\n const componentOverrideEntriesLiteral = componentOverrideConfigs.join(',\\n ')\n const componentOverrideImportSection = componentOverrideImports.join('\\n')\n const componentOverridesOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ComponentOverride } from '@open-mercato/shared/modules/widgets/component-registry'\n${componentOverrideImportSection ? `\\n${componentOverrideImportSection}\\n` : '\\n'}type ComponentOverrideEntry = { moduleId: string; componentOverrides: ComponentOverride[] }\n\nexport const componentOverrideEntries: ComponentOverrideEntry[] = [\n${componentOverrideEntriesLiteral ? ` ${componentOverrideEntriesLiteral}\\n` : ''}]\n`\n writeGeneratedFile({\n outFile: componentOverridesOutFile,\n checksumFile: componentOverridesChecksumFile,\n content: componentOverridesOutput,\n structureChecksum,\n result,\n quiet,\n })\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, dashboard widgets\n * Excludes: frontend routes, backend routes, API handlers, 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 // Mutable ref so extracted helper functions can increment the shared counter\n const importIdRef = { value: 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 rawImps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : rawImps.appBase\n const imps: ModuleImports = { appBase: appImportBase, pkgBase: rawImps.pkgBase }\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 const dashboardWidgets: string[] = []\n let setupImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n\n // Module metadata: index.ts (overrideable)\n const appIndex = path.join(roots.appBase, 'index.ts')\n const pkgIndex = path.join(roots.pkgBase, 'index.ts')\n const indexTs = fs.existsSync(appIndex) ? appIndex : fs.existsSync(pkgIndex) ? pkgIndex : null\n if (indexTs) {\n infoImportName = `I${importIdRef.value++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\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 // Module setup configuration: setup.ts\n {\n const setup = resolveConventionFile(roots, imps, 'setup.ts', 'SETUP', modId, importIdRef, imports)\n if (setup) setupImportName = setup.importName\n }\n\n // Entity extensions: data/extensions.ts\n {\n const ext = resolveConventionFile(roots, imps, 'data/extensions.ts', 'X', modId, importIdRef, imports)\n if (ext) extensionsImportName = ext.importName\n }\n\n // RBAC: acl.ts\n {\n const rootApp = path.join(roots.appBase, 'acl.ts')\n const rootPkg = path.join(roots.pkgBase, 'acl.ts')\n const hasRoot = fs.existsSync(rootApp) || fs.existsSync(rootPkg)\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importIdRef.value++}`\n const useApp = fs.existsSync(rootApp) ? 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: ce.ts\n {\n const ce = resolveConventionFile(roots, imps, 'ce.ts', 'CE', modId, importIdRef, imports)\n if (ce) customEntitiesImportName = ce.importName\n }\n\n // Vector search configuration: vector.ts\n {\n const vec = resolveConventionFile(roots, imps, 'vector.ts', 'VECTOR', modId, importIdRef, imports)\n if (vec) vectorImportName = vec.importName\n }\n\n // Custom fields: data/fields.ts\n {\n const fields = resolveConventionFile(roots, imps, 'data/fields.ts', 'F', modId, importIdRef, imports)\n if (fields) fieldsImportName = fields.importName\n }\n\n // CLI\n {\n const cliApp = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\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\n // Translations\n translations.push(...processTranslations({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n }))\n\n // Subscribers\n subscribers.push(...processSubscribers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Workers\n workers.push(...await processWorkers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Build combined customFieldSets expression\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\n {\n const entries = scanDashboardWidgetEntries({\n modId,\n roots,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n })\n for (const entry of entries) {\n dashboardWidgets.push(\n `{ moduleId: '${entry.moduleId}', key: '${entry.key}', source: '${entry.source}', loader: () => import('${entry.importPath}').then((mod) => mod.default ?? mod) }`\n )\n }\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 ${dashboardWidgets.length ? `dashboardWidgets: [${dashboardWidgets.join(', ')}],` : ''}\n ${vectorImportName ? `vector: (${vectorImportName}.default ?? ${vectorImportName}.vectorConfig ?? ${vectorImportName}.config ?? undefined),` : ''}\n ${setupImportName ? `setup: (${setupImportName}.default ?? ${setupImportName}.setup) || 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, injection 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 writeGeneratedFile({ outFile, checksumFile, content: output, structureChecksum, result, quiet })\n\n return result\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["entry"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/cli",
3
- "version": "0.4.6-develop-ce2a0728a5",
3
+ "version": "0.4.6-develop-77fa3b7ed8",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -58,7 +58,7 @@
58
58
  "@mikro-orm/core": "^6.6.2",
59
59
  "@mikro-orm/migrations": "^6.6.2",
60
60
  "@mikro-orm/postgresql": "^6.6.2",
61
- "@open-mercato/shared": "0.4.6-develop-ce2a0728a5",
61
+ "@open-mercato/shared": "0.4.6-develop-77fa3b7ed8",
62
62
  "pg": "8.16.3",
63
63
  "testcontainers": "^11.12.0",
64
64
  "typescript": "^5.9.3"
@@ -407,6 +407,10 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
407
407
  const transFieldsChecksumFile = path.join(outputDir, 'translations-fields.generated.checksum')
408
408
  const enrichersOutFile = path.join(outputDir, 'enrichers.generated.ts')
409
409
  const enrichersChecksumFile = path.join(outputDir, 'enrichers.generated.checksum')
410
+ const interceptorsOutFile = path.join(outputDir, 'interceptors.generated.ts')
411
+ const interceptorsChecksumFile = path.join(outputDir, 'interceptors.generated.checksum')
412
+ const componentOverridesOutFile = path.join(outputDir, 'component-overrides.generated.ts')
413
+ const componentOverridesChecksumFile = path.join(outputDir, 'component-overrides.generated.checksum')
410
414
  const inboxActionsOutFile = path.join(outputDir, 'inbox-actions.generated.ts')
411
415
  const inboxActionsChecksumFile = path.join(outputDir, 'inbox-actions.generated.checksum')
412
416
 
@@ -440,6 +444,10 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
440
444
  const transFieldsImports: string[] = []
441
445
  const enricherConfigs: string[] = []
442
446
  const enricherImports: string[] = []
447
+ const interceptorConfigs: string[] = []
448
+ const interceptorImports: string[] = []
449
+ const componentOverrideConfigs: string[] = []
450
+ const componentOverrideImports: string[] = []
443
451
  const inboxActionsConfigs: string[] = []
444
452
  const inboxActionsImports: string[] = []
445
453
 
@@ -652,6 +660,26 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
652
660
  configExpr: (n, id) => `{ moduleId: '${id}', enrichers: ((${n} as any).enrichers ?? (${n} as any).default ?? []) }`,
653
661
  })
654
662
 
663
+ // 10c. API interceptors: api/interceptors.ts
664
+ processStandaloneConfig({
665
+ roots, imps, modId, importIdRef,
666
+ relativePath: 'api/interceptors.ts',
667
+ prefix: 'INTERCEPTORS',
668
+ standaloneImports: interceptorImports,
669
+ standaloneConfigs: interceptorConfigs,
670
+ configExpr: (n, id) => `{ moduleId: '${id}', interceptors: ((${n} as any).interceptors ?? (${n} as any).default ?? []) }`,
671
+ })
672
+
673
+ // 10d. Component overrides: widgets/components.ts
674
+ processStandaloneConfig({
675
+ roots, imps, modId, importIdRef,
676
+ relativePath: 'widgets/components.ts',
677
+ prefix: 'COMPONENT_OVERRIDES',
678
+ standaloneImports: componentOverrideImports,
679
+ standaloneConfigs: componentOverrideConfigs,
680
+ configExpr: (n, id) => `{ moduleId: '${id}', componentOverrides: ((${n} as any).componentOverrides ?? (${n} as any).default ?? []) }`,
681
+ })
682
+
655
683
  // Translatable fields: translations.ts (also referenced in module declarations)
656
684
  let transFieldsImportName: string | null = null
657
685
  transFieldsImportName = processStandaloneConfig({
@@ -1255,6 +1283,35 @@ export function getRegisteredActionTypes(): string[] {
1255
1283
  `
1256
1284
  writeGeneratedFile({ outFile: inboxActionsOutFile, checksumFile: inboxActionsChecksumFile, content: inboxActionsOutput, structureChecksum, result, quiet })
1257
1285
 
1286
+ const interceptorEntriesLiteral = interceptorConfigs.join(',\n ')
1287
+ const interceptorImportSection = interceptorImports.join('\n')
1288
+ const interceptorsOutput = `// AUTO-GENERATED by mercato generate registry
1289
+ import type { ApiInterceptor } from '@open-mercato/shared/lib/crud/api-interceptor'
1290
+ ${interceptorImportSection ? `\n${interceptorImportSection}\n` : '\n'}type InterceptorEntry = { moduleId: string; interceptors: ApiInterceptor[] }
1291
+
1292
+ export const interceptorEntries: InterceptorEntry[] = [
1293
+ ${interceptorEntriesLiteral ? ` ${interceptorEntriesLiteral}\n` : ''}]
1294
+ `
1295
+ writeGeneratedFile({ outFile: interceptorsOutFile, checksumFile: interceptorsChecksumFile, content: interceptorsOutput, structureChecksum, result, quiet })
1296
+
1297
+ const componentOverrideEntriesLiteral = componentOverrideConfigs.join(',\n ')
1298
+ const componentOverrideImportSection = componentOverrideImports.join('\n')
1299
+ const componentOverridesOutput = `// AUTO-GENERATED by mercato generate registry
1300
+ import type { ComponentOverride } from '@open-mercato/shared/modules/widgets/component-registry'
1301
+ ${componentOverrideImportSection ? `\n${componentOverrideImportSection}\n` : '\n'}type ComponentOverrideEntry = { moduleId: string; componentOverrides: ComponentOverride[] }
1302
+
1303
+ export const componentOverrideEntries: ComponentOverrideEntry[] = [
1304
+ ${componentOverrideEntriesLiteral ? ` ${componentOverrideEntriesLiteral}\n` : ''}]
1305
+ `
1306
+ writeGeneratedFile({
1307
+ outFile: componentOverridesOutFile,
1308
+ checksumFile: componentOverridesChecksumFile,
1309
+ content: componentOverridesOutput,
1310
+ structureChecksum,
1311
+ result,
1312
+ quiet,
1313
+ })
1314
+
1258
1315
  return result
1259
1316
  }
1260
1317