@open-mercato/cli 0.4.6-develop-02aac88968 → 0.4.6-develop-832c3006bf

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.
@@ -279,6 +279,8 @@ async function generateModuleRegistry(options) {
279
279
  const notificationsChecksumFile = path.join(outputDir, "notifications.generated.checksum");
280
280
  const notificationsClientOutFile = path.join(outputDir, "notifications.client.generated.ts");
281
281
  const notificationsClientChecksumFile = path.join(outputDir, "notifications.client.generated.checksum");
282
+ const notificationHandlersOutFile = path.join(outputDir, "notification-handlers.generated.ts");
283
+ const notificationHandlersChecksumFile = path.join(outputDir, "notification-handlers.generated.checksum");
282
284
  const messageTypesOutFile = path.join(outputDir, "message-types.generated.ts");
283
285
  const messageTypesChecksumFile = path.join(outputDir, "message-types.generated.checksum");
284
286
  const messageObjectsOutFile = path.join(outputDir, "message-objects.generated.ts");
@@ -320,6 +322,8 @@ async function generateModuleRegistry(options) {
320
322
  const notificationImports = [];
321
323
  const notificationClientTypes = [];
322
324
  const notificationClientImports = [];
325
+ const notificationHandlerEntries = [];
326
+ const notificationHandlerImports = [];
323
327
  const messageTypeEntries = [];
324
328
  const messageTypeImports = [];
325
329
  const messageObjectTypeEntries = [];
@@ -457,6 +461,17 @@ async function generateModuleRegistry(options) {
457
461
  standaloneConfigs: notificationClientTypes,
458
462
  configExpr: (n, id) => `{ moduleId: '${id}', types: (${n}.default ?? []) }`
459
463
  });
464
+ processStandaloneConfig({
465
+ roots,
466
+ imps,
467
+ modId,
468
+ importIdRef,
469
+ relativePath: "notifications.handlers.ts",
470
+ prefix: "NOTIF_HANDLERS",
471
+ standaloneImports: notificationHandlerImports,
472
+ standaloneConfigs: notificationHandlerEntries,
473
+ configExpr: (n, id) => `{ moduleId: '${id}', handlers: ((${n}.default ?? ${n}.notificationHandlers ?? []) as NotificationHandler[]) }`
474
+ });
460
475
  {
461
476
  const resolved = resolveModuleFile(roots, imps, "message-types.ts");
462
477
  if (resolved) {
@@ -910,6 +925,18 @@ export const notificationRenderers = renderers
910
925
  export function getNotificationRenderers(): NotificationRenderers {
911
926
  return renderers
912
927
  }
928
+ `;
929
+ const notificationHandlersEntriesLiteral = notificationHandlerEntries.join(",\n ");
930
+ const notificationHandlersImportSection = notificationHandlerImports.join("\n");
931
+ const notificationHandlersOutput = `// AUTO-GENERATED by mercato generate registry
932
+ import type { NotificationHandler } from '@open-mercato/shared/modules/notifications/handler'
933
+ ${notificationHandlersImportSection ? `
934
+ ${notificationHandlersImportSection}
935
+ ` : "\n"}type NotificationHandlerEntry = { moduleId: string; handlers: NotificationHandler[] }
936
+
937
+ export const notificationHandlerEntries: NotificationHandlerEntry[] = [
938
+ ${notificationHandlersEntriesLiteral ? ` ${notificationHandlersEntriesLiteral}
939
+ ` : ""}]
913
940
  `;
914
941
  const messageTypeEntriesLiteral = messageTypeEntries.join(",\n ");
915
942
  const messageTypeImportSection = messageTypeImports.join("\n");
@@ -1121,6 +1148,7 @@ export const allAiTools = aiToolConfigEntries.flatMap(e => e.tools)
1121
1148
  writeGeneratedFile({ outFile: aiToolsOutFile, checksumFile: aiToolsChecksumFile, content: aiToolsOutput, structureChecksum, result, quiet });
1122
1149
  writeGeneratedFile({ outFile: notificationsOutFile, checksumFile: notificationsChecksumFile, content: notificationsOutput, structureChecksum, result, quiet });
1123
1150
  writeGeneratedFile({ outFile: notificationsClientOutFile, checksumFile: notificationsClientChecksumFile, content: notificationsClientOutput, structureChecksum, result, quiet });
1151
+ writeGeneratedFile({ outFile: notificationHandlersOutFile, checksumFile: notificationHandlersChecksumFile, content: notificationHandlersOutput, structureChecksum, result, quiet });
1124
1152
  writeGeneratedFile({ outFile: messageTypesOutFile, checksumFile: messageTypesChecksumFile, content: messageTypesOutput, structureChecksum, result, quiet });
1125
1153
  writeGeneratedFile({ outFile: messageObjectsOutFile, checksumFile: messageObjectsChecksumFile, content: messageObjectsOutput, structureChecksum, result, quiet });
1126
1154
  writeGeneratedFile({ outFile: messagesClientOutFile, checksumFile: messagesClientChecksumFile, content: messagesClientOutput, structureChecksum, result, quiet });
@@ -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, sync: ((${metaName}.metadata) as any)?.sync, priority: ((${metaName}.metadata) as any)?.priority, 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 const guardsOutFile = path.join(outputDir, 'guards.generated.ts')\n const guardsChecksumFile = path.join(outputDir, 'guards.generated.checksum')\n const commandInterceptorsOutFile = path.join(outputDir, 'command-interceptors.generated.ts')\n const commandInterceptorsChecksumFile = path.join(outputDir, 'command-interceptors.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 const guardConfigs: string[] = []\n const guardImports: string[] = []\n const commandInterceptorConfigs: string[] = []\n const commandInterceptorImports: 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 // 10e. Mutation guards: data/guards.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'data/guards.ts',\n prefix: 'GUARDS',\n standaloneImports: guardImports,\n standaloneConfigs: guardConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', guards: ((${n} as any).guards ?? (${n} as any).default ?? []) }`,\n })\n\n // 10f. Command interceptors: commands/interceptors.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'commands/interceptors.ts',\n prefix: 'CMD_INTERCEPTORS',\n standaloneImports: commandInterceptorImports,\n standaloneConfigs: commandInterceptorConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', interceptors: ((${n} as any).interceptors ?? (${n} as any).default ?? []) }`,\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 const guardEntriesLiteral = guardConfigs.join(',\\n ')\n const guardImportSection = guardImports.join('\\n')\n const guardsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { MutationGuard } from '@open-mercato/shared/lib/crud/mutation-guard-registry'\n${guardImportSection ? `\\n${guardImportSection}\\n` : '\\n'}type GuardEntry = { moduleId: string; guards: MutationGuard[] }\n\nexport const guardEntries: GuardEntry[] = [\n${guardEntriesLiteral ? ` ${guardEntriesLiteral}\\n` : ''}]\n`\n writeGeneratedFile({ outFile: guardsOutFile, checksumFile: guardsChecksumFile, content: guardsOutput, structureChecksum, result, quiet })\n\n const commandInterceptorEntriesLiteral = commandInterceptorConfigs.join(',\\n ')\n const commandInterceptorImportSection = commandInterceptorImports.join('\\n')\n const commandInterceptorsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { CommandInterceptor } from '@open-mercato/shared/lib/commands/command-interceptor'\n${commandInterceptorImportSection ? `\\n${commandInterceptorImportSection}\\n` : '\\n'}type CommandInterceptorEntry = { moduleId: string; interceptors: CommandInterceptor[] }\n\nexport const commandInterceptorEntries: CommandInterceptorEntry[] = [\n${commandInterceptorEntriesLiteral ? ` ${commandInterceptorEntriesLiteral}\\n` : ''}]\n`\n writeGeneratedFile({ outFile: commandInterceptorsOutFile, checksumFile: commandInterceptorsChecksumFile, content: commandInterceptorsOutput, 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, sync: ((${metaName}.metadata) as any)?.sync, priority: ((${metaName}.metadata) as any)?.priority, 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 notificationHandlersOutFile = path.join(outputDir, 'notification-handlers.generated.ts')\n const notificationHandlersChecksumFile = path.join(outputDir, 'notification-handlers.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 const guardsOutFile = path.join(outputDir, 'guards.generated.ts')\n const guardsChecksumFile = path.join(outputDir, 'guards.generated.checksum')\n const commandInterceptorsOutFile = path.join(outputDir, 'command-interceptors.generated.ts')\n const commandInterceptorsChecksumFile = path.join(outputDir, 'command-interceptors.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 notificationHandlerEntries: string[] = []\n const notificationHandlerImports: 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 const guardConfigs: string[] = []\n const guardImports: string[] = []\n const commandInterceptorConfigs: string[] = []\n const commandInterceptorImports: 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\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'notifications.handlers.ts',\n prefix: 'NOTIF_HANDLERS',\n standaloneImports: notificationHandlerImports,\n standaloneConfigs: notificationHandlerEntries,\n configExpr: (n, id) => `{ moduleId: '${id}', handlers: ((${n}.default ?? ${n}.notificationHandlers ?? []) as NotificationHandler[]) }`,\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 // 10e. Mutation guards: data/guards.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'data/guards.ts',\n prefix: 'GUARDS',\n standaloneImports: guardImports,\n standaloneConfigs: guardConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', guards: ((${n} as any).guards ?? (${n} as any).default ?? []) }`,\n })\n\n // 10f. Command interceptors: commands/interceptors.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'commands/interceptors.ts',\n prefix: 'CMD_INTERCEPTORS',\n standaloneImports: commandInterceptorImports,\n standaloneConfigs: commandInterceptorConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', interceptors: ((${n} as any).interceptors ?? (${n} as any).default ?? []) }`,\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 notificationHandlersEntriesLiteral = notificationHandlerEntries.join(',\\n ')\n const notificationHandlersImportSection = notificationHandlerImports.join('\\n')\n const notificationHandlersOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { NotificationHandler } from '@open-mercato/shared/modules/notifications/handler'\n${notificationHandlersImportSection ? `\\n${notificationHandlersImportSection}\\n` : '\\n'}type NotificationHandlerEntry = { moduleId: string; handlers: NotificationHandler[] }\n\nexport const notificationHandlerEntries: NotificationHandlerEntry[] = [\n${notificationHandlersEntriesLiteral ? ` ${notificationHandlersEntriesLiteral}\\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: notificationHandlersOutFile, checksumFile: notificationHandlersChecksumFile, content: notificationHandlersOutput, 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 const guardEntriesLiteral = guardConfigs.join(',\\n ')\n const guardImportSection = guardImports.join('\\n')\n const guardsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { MutationGuard } from '@open-mercato/shared/lib/crud/mutation-guard-registry'\n${guardImportSection ? `\\n${guardImportSection}\\n` : '\\n'}type GuardEntry = { moduleId: string; guards: MutationGuard[] }\n\nexport const guardEntries: GuardEntry[] = [\n${guardEntriesLiteral ? ` ${guardEntriesLiteral}\\n` : ''}]\n`\n writeGeneratedFile({ outFile: guardsOutFile, checksumFile: guardsChecksumFile, content: guardsOutput, structureChecksum, result, quiet })\n\n const commandInterceptorEntriesLiteral = commandInterceptorConfigs.join(',\\n ')\n const commandInterceptorImportSection = commandInterceptorImports.join('\\n')\n const commandInterceptorsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { CommandInterceptor } from '@open-mercato/shared/lib/commands/command-interceptor'\n${commandInterceptorImportSection ? `\\n${commandInterceptorImportSection}\\n` : '\\n'}type CommandInterceptorEntry = { moduleId: string; interceptors: CommandInterceptor[] }\n\nexport const commandInterceptorEntries: CommandInterceptorEntry[] = [\n${commandInterceptorEntriesLiteral ? ` ${commandInterceptorEntriesLiteral}\\n` : ''}]\n`\n writeGeneratedFile({ outFile: commandInterceptorsOutFile, checksumFile: commandInterceptorsChecksumFile, content: commandInterceptorsOutput, 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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",
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-02aac88968",
3
+ "version": "0.4.6-develop-832c3006bf",
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-02aac88968",
61
+ "@open-mercato/shared": "0.4.6-develop-832c3006bf",
62
62
  "pg": "8.16.3",
63
63
  "testcontainers": "^11.12.0",
64
64
  "typescript": "^5.9.3"
@@ -391,6 +391,8 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
391
391
  const notificationsChecksumFile = path.join(outputDir, 'notifications.generated.checksum')
392
392
  const notificationsClientOutFile = path.join(outputDir, 'notifications.client.generated.ts')
393
393
  const notificationsClientChecksumFile = path.join(outputDir, 'notifications.client.generated.checksum')
394
+ const notificationHandlersOutFile = path.join(outputDir, 'notification-handlers.generated.ts')
395
+ const notificationHandlersChecksumFile = path.join(outputDir, 'notification-handlers.generated.checksum')
394
396
  const messageTypesOutFile = path.join(outputDir, 'message-types.generated.ts')
395
397
  const messageTypesChecksumFile = path.join(outputDir, 'message-types.generated.checksum')
396
398
  const messageObjectsOutFile = path.join(outputDir, 'message-objects.generated.ts')
@@ -434,6 +436,8 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
434
436
  const notificationImports: string[] = []
435
437
  const notificationClientTypes: string[] = []
436
438
  const notificationClientImports: string[] = []
439
+ const notificationHandlerEntries: string[] = []
440
+ const notificationHandlerImports: string[] = []
437
441
  const messageTypeEntries: string[] = []
438
442
  const messageTypeImports: string[] = []
439
443
  const messageObjectTypeEntries: string[] = []
@@ -587,6 +591,15 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
587
591
  standaloneConfigs: notificationClientTypes,
588
592
  configExpr: (n, id) => `{ moduleId: '${id}', types: (${n}.default ?? []) }`,
589
593
  })
594
+
595
+ processStandaloneConfig({
596
+ roots, imps, modId, importIdRef,
597
+ relativePath: 'notifications.handlers.ts',
598
+ prefix: 'NOTIF_HANDLERS',
599
+ standaloneImports: notificationHandlerImports,
600
+ standaloneConfigs: notificationHandlerEntries,
601
+ configExpr: (n, id) => `{ moduleId: '${id}', handlers: ((${n}.default ?? ${n}.notificationHandlers ?? []) as NotificationHandler[]) }`,
602
+ })
590
603
  // Message types: module root message-types.ts
591
604
  {
592
605
  const resolved = resolveModuleFile(roots, imps, 'message-types.ts')
@@ -1055,6 +1068,16 @@ export const notificationRenderers = renderers
1055
1068
  export function getNotificationRenderers(): NotificationRenderers {
1056
1069
  return renderers
1057
1070
  }
1071
+ `
1072
+
1073
+ const notificationHandlersEntriesLiteral = notificationHandlerEntries.join(',\n ')
1074
+ const notificationHandlersImportSection = notificationHandlerImports.join('\n')
1075
+ const notificationHandlersOutput = `// AUTO-GENERATED by mercato generate registry
1076
+ import type { NotificationHandler } from '@open-mercato/shared/modules/notifications/handler'
1077
+ ${notificationHandlersImportSection ? `\n${notificationHandlersImportSection}\n` : '\n'}type NotificationHandlerEntry = { moduleId: string; handlers: NotificationHandler[] }
1078
+
1079
+ export const notificationHandlerEntries: NotificationHandlerEntry[] = [
1080
+ ${notificationHandlersEntriesLiteral ? ` ${notificationHandlersEntriesLiteral}\n` : ''}]
1058
1081
  `
1059
1082
 
1060
1083
  const messageTypeEntriesLiteral = messageTypeEntries.join(',\n ')
@@ -1267,6 +1290,7 @@ export const allAiTools = aiToolConfigEntries.flatMap(e => e.tools)
1267
1290
  writeGeneratedFile({ outFile: aiToolsOutFile, checksumFile: aiToolsChecksumFile, content: aiToolsOutput, structureChecksum, result, quiet })
1268
1291
  writeGeneratedFile({ outFile: notificationsOutFile, checksumFile: notificationsChecksumFile, content: notificationsOutput, structureChecksum, result, quiet })
1269
1292
  writeGeneratedFile({ outFile: notificationsClientOutFile, checksumFile: notificationsClientChecksumFile, content: notificationsClientOutput, structureChecksum, result, quiet })
1293
+ writeGeneratedFile({ outFile: notificationHandlersOutFile, checksumFile: notificationHandlersChecksumFile, content: notificationHandlersOutput, structureChecksum, result, quiet })
1270
1294
  writeGeneratedFile({ outFile: messageTypesOutFile, checksumFile: messageTypesChecksumFile, content: messageTypesOutput, structureChecksum, result, quiet })
1271
1295
  writeGeneratedFile({ outFile: messageObjectsOutFile, checksumFile: messageObjectsChecksumFile, content: messageObjectsOutput, structureChecksum, result, quiet })
1272
1296
  writeGeneratedFile({ outFile: messagesClientOutFile, checksumFile: messagesClientChecksumFile, content: messagesClientOutput, structureChecksum, result, quiet })