@open-mercato/cli 0.4.5-develop-5191db4ef3 → 0.4.5-develop-033a719bf2

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.
@@ -268,6 +268,12 @@ async function generateModuleRegistry(options) {
268
268
  const notificationsChecksumFile = path.join(outputDir, "notifications.generated.checksum");
269
269
  const notificationsClientOutFile = path.join(outputDir, "notifications.client.generated.ts");
270
270
  const notificationsClientChecksumFile = path.join(outputDir, "notifications.client.generated.checksum");
271
+ const messageTypesOutFile = path.join(outputDir, "message-types.generated.ts");
272
+ const messageTypesChecksumFile = path.join(outputDir, "message-types.generated.checksum");
273
+ const messageObjectsOutFile = path.join(outputDir, "message-objects.generated.ts");
274
+ const messageObjectsChecksumFile = path.join(outputDir, "message-objects.generated.checksum");
275
+ const messagesClientOutFile = path.join(outputDir, "messages.client.generated.ts");
276
+ const messagesClientChecksumFile = path.join(outputDir, "messages.client.generated.checksum");
271
277
  const aiToolsOutFile = path.join(outputDir, "ai-tools.generated.ts");
272
278
  const aiToolsChecksumFile = path.join(outputDir, "ai-tools.generated.checksum");
273
279
  const eventsOutFile = path.join(outputDir, "events.generated.ts");
@@ -291,6 +297,10 @@ async function generateModuleRegistry(options) {
291
297
  const notificationImports = [];
292
298
  const notificationClientTypes = [];
293
299
  const notificationClientImports = [];
300
+ const messageTypeEntries = [];
301
+ const messageTypeImports = [];
302
+ const messageObjectTypeEntries = [];
303
+ const messageObjectTypeImports = [];
294
304
  const aiToolsConfigs = [];
295
305
  const aiToolsImports = [];
296
306
  const eventsConfigs = [];
@@ -401,6 +411,28 @@ async function generateModuleRegistry(options) {
401
411
  );
402
412
  }
403
413
  }
414
+ {
415
+ const resolved = resolveModuleFile(roots, imps, "message-types.ts");
416
+ if (resolved) {
417
+ const importName = `MSG_TYPES_${toVar(modId)}_${importIdRef.value++}`;
418
+ const importStmt = `import * as ${importName} from '${resolved.importPath}'`;
419
+ messageTypeImports.push(importStmt);
420
+ messageTypeEntries.push(
421
+ `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageTypes ?? (${importName} as any).types ?? []) as MessageTypeDefinition[]) }`
422
+ );
423
+ }
424
+ }
425
+ {
426
+ const resolved = resolveModuleFile(roots, imps, "message-objects.ts");
427
+ if (resolved) {
428
+ const importName = `MSG_OBJECTS_${toVar(modId)}_${importIdRef.value++}`;
429
+ const importStmt = `import * as ${importName} from '${resolved.importPath}'`;
430
+ messageObjectTypeImports.push(importStmt);
431
+ messageObjectTypeEntries.push(
432
+ `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageObjectTypes ?? (${importName} as any).objectTypes ?? (${importName} as any).types ?? []) as MessageObjectTypeDefinition[]) }`
433
+ );
434
+ }
435
+ }
404
436
  {
405
437
  const resolved = resolveModuleFile(roots, imps, "notifications.client.ts");
406
438
  if (resolved) {
@@ -766,6 +798,144 @@ export const notificationRenderers = renderers
766
798
  export function getNotificationRenderers(): NotificationRenderers {
767
799
  return renderers
768
800
  }
801
+ `;
802
+ const messageTypeEntriesLiteral = messageTypeEntries.join(",\n ");
803
+ const messageTypeImportSection = messageTypeImports.join("\n");
804
+ const messageTypesOutput = `// AUTO-GENERATED by mercato generate registry
805
+ import type { MessageTypeDefinition } from '@open-mercato/shared/modules/messages/types'
806
+ ${messageTypeImportSection ? `
807
+ ${messageTypeImportSection}
808
+ ` : "\n"}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }
809
+
810
+ const entriesRaw: MessageTypeEntry[] = [
811
+ ${messageTypeEntriesLiteral ? ` ${messageTypeEntriesLiteral}
812
+ ` : ""}]
813
+
814
+ const allTypes = entriesRaw.flatMap((entry) => entry.types)
815
+
816
+ export const messageTypeEntries = entriesRaw
817
+ export const messageTypes = allTypes
818
+
819
+ export function getMessageTypes(): MessageTypeDefinition[] {
820
+ return allTypes
821
+ }
822
+
823
+ export function getMessageType(type: string): MessageTypeDefinition | undefined {
824
+ return allTypes.find((entry) => entry.type === type)
825
+ }
826
+ `;
827
+ const messageObjectEntriesLiteral = messageObjectTypeEntries.join(",\n ");
828
+ const messageObjectImportSection = messageObjectTypeImports.join("\n");
829
+ const messageObjectsOutput = `// AUTO-GENERATED by mercato generate registry
830
+ import type { MessageObjectTypeDefinition } from '@open-mercato/shared/modules/messages/types'
831
+ ${messageObjectImportSection ? `
832
+ ${messageObjectImportSection}
833
+ ` : "\n"}type MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }
834
+
835
+ const entriesRaw: MessageObjectTypeEntry[] = [
836
+ ${messageObjectEntriesLiteral ? ` ${messageObjectEntriesLiteral}
837
+ ` : ""}]
838
+
839
+ const allTypes = entriesRaw.flatMap((entry) => entry.types)
840
+
841
+ export const messageObjectTypeEntries = entriesRaw
842
+ export const messageObjectTypes = allTypes
843
+
844
+ export function getMessageObjectTypes(): MessageObjectTypeDefinition[] {
845
+ return allTypes
846
+ }
847
+
848
+ export function getMessageObjectType(module: string, entityType: string): MessageObjectTypeDefinition | undefined {
849
+ return allTypes.find((entry) => entry.module === module && entry.entityType === entityType)
850
+ }
851
+ `;
852
+ const messagesClientOutput = `// AUTO-GENERATED by mercato generate registry
853
+ import type { ComponentType } from 'react'
854
+ import type {
855
+ MessageTypeDefinition,
856
+ MessageObjectTypeDefinition,
857
+ MessageListItemProps,
858
+ MessageContentProps,
859
+ MessageActionsProps,
860
+ ObjectDetailProps,
861
+ ObjectPreviewProps,
862
+ } from '@open-mercato/shared/modules/messages/types'
863
+ ${messageTypeImportSection ? `
864
+ ${messageTypeImportSection}
865
+ ` : "\n"}${messageObjectImportSection ? `
866
+ ${messageObjectImportSection}
867
+ ` : ""}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }
868
+ type MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }
869
+
870
+ export type MessageListItemRenderers = Record<string, ComponentType<MessageListItemProps>>
871
+ export type MessageContentRenderers = Record<string, ComponentType<MessageContentProps>>
872
+ export type MessageActionsRenderers = Record<string, ComponentType<MessageActionsProps>>
873
+ export type MessageObjectDetailRenderers = Record<string, ComponentType<ObjectDetailProps>>
874
+ export type MessageObjectPreviewRenderers = Record<string, ComponentType<ObjectPreviewProps>>
875
+
876
+ export type MessageUiComponentRegistry = {
877
+ listItemComponents: MessageListItemRenderers
878
+ contentComponents: MessageContentRenderers
879
+ actionsComponents: MessageActionsRenderers
880
+ objectDetailComponents: MessageObjectDetailRenderers
881
+ objectPreviewComponents: MessageObjectPreviewRenderers
882
+ }
883
+
884
+ const messageTypeEntriesRaw: MessageTypeEntry[] = [
885
+ ${messageTypeEntriesLiteral ? ` ${messageTypeEntriesLiteral}
886
+ ` : ""}]
887
+ const messageObjectTypeEntriesRaw: MessageObjectTypeEntry[] = [
888
+ ${messageObjectEntriesLiteral ? ` ${messageObjectEntriesLiteral}
889
+ ` : ""}]
890
+
891
+ const allMessageTypes = messageTypeEntriesRaw.flatMap((entry) => entry.types)
892
+ const allMessageObjectTypes = messageObjectTypeEntriesRaw.flatMap((entry) => entry.types)
893
+
894
+ const listItemComponents: MessageListItemRenderers = Object.fromEntries(
895
+ allMessageTypes
896
+ .filter((typeDef) => Boolean(typeDef.ui?.listItemComponent) && Boolean(typeDef.ListItemComponent))
897
+ .map((typeDef) => [typeDef.ui!.listItemComponent!, typeDef.ListItemComponent!]),
898
+ )
899
+
900
+ const contentComponents: MessageContentRenderers = Object.fromEntries(
901
+ allMessageTypes
902
+ .filter((typeDef) => Boolean(typeDef.ui?.contentComponent) && Boolean(typeDef.ContentComponent))
903
+ .map((typeDef) => [typeDef.ui!.contentComponent!, typeDef.ContentComponent!]),
904
+ )
905
+
906
+ const actionsComponents: MessageActionsRenderers = Object.fromEntries(
907
+ allMessageTypes
908
+ .filter((typeDef) => Boolean(typeDef.ui?.actionsComponent) && Boolean(typeDef.ActionsComponent))
909
+ .map((typeDef) => [typeDef.ui!.actionsComponent!, typeDef.ActionsComponent!]),
910
+ )
911
+
912
+ const objectDetailComponents: MessageObjectDetailRenderers = Object.fromEntries(
913
+ allMessageObjectTypes
914
+ .filter((typeDef) => Boolean(typeDef.DetailComponent))
915
+ .map((typeDef) => [\`\${typeDef.module}:\${typeDef.entityType}\`, typeDef.DetailComponent!]),
916
+ )
917
+
918
+ const objectPreviewComponents: MessageObjectPreviewRenderers = Object.fromEntries(
919
+ allMessageObjectTypes
920
+ .filter((typeDef) => Boolean(typeDef.PreviewComponent))
921
+ .map((typeDef) => [\`\${typeDef.module}:\${typeDef.entityType}\`, typeDef.PreviewComponent!]),
922
+ )
923
+
924
+ const registry: MessageUiComponentRegistry = {
925
+ listItemComponents,
926
+ contentComponents,
927
+ actionsComponents,
928
+ objectDetailComponents,
929
+ objectPreviewComponents,
930
+ }
931
+
932
+ export const messageClientTypeEntries = messageTypeEntriesRaw
933
+ export const messageClientObjectTypeEntries = messageObjectTypeEntriesRaw
934
+ export const messageUiComponentRegistry = registry
935
+
936
+ export function getMessageUiComponentRegistry(): MessageUiComponentRegistry {
937
+ return registry
938
+ }
769
939
  `;
770
940
  {
771
941
  const enabledIds = new Set(enabled.map((e) => e.id));
@@ -831,6 +1001,9 @@ export const allAiTools = aiToolConfigEntries.flatMap(e => e.tools)
831
1001
  writeGeneratedFile({ outFile: aiToolsOutFile, checksumFile: aiToolsChecksumFile, content: aiToolsOutput, structureChecksum, result, quiet });
832
1002
  writeGeneratedFile({ outFile: notificationsOutFile, checksumFile: notificationsChecksumFile, content: notificationsOutput, structureChecksum, result, quiet });
833
1003
  writeGeneratedFile({ outFile: notificationsClientOutFile, checksumFile: notificationsClientChecksumFile, content: notificationsClientOutput, structureChecksum, result, quiet });
1004
+ writeGeneratedFile({ outFile: messageTypesOutFile, checksumFile: messageTypesChecksumFile, content: messageTypesOutput, structureChecksum, result, quiet });
1005
+ writeGeneratedFile({ outFile: messageObjectsOutFile, checksumFile: messageObjectsChecksumFile, content: messageObjectsOutput, structureChecksum, result, quiet });
1006
+ writeGeneratedFile({ outFile: messagesClientOutFile, checksumFile: messagesClientChecksumFile, content: messagesClientOutput, structureChecksum, result, quiet });
834
1007
  writeGeneratedFile({ outFile: eventsOutFile, checksumFile: eventsChecksumFile, content: eventsOutput, structureChecksum, result, quiet });
835
1008
  writeGeneratedFile({ outFile: analyticsOutFile, checksumFile: analyticsChecksumFile, content: analyticsOutput, structureChecksum, result, quiet });
836
1009
  writeGeneratedFile({ outFile: transFieldsOutFile, checksumFile: transFieldsChecksumFile, content: transFieldsOutput, 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, 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\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 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\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 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\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 {\n const resolved = resolveModuleFile(roots, imps, 'notifications.ts')\n if (resolved) {\n const importName = `NOTIF_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n notificationImports.push(importStmt)\n notificationTypes.push(\n `{ moduleId: '${modId}', types: (${importName}.default ?? ${importName}.notificationTypes ?? []) }`\n )\n }\n }\n\n // Notification client renderers: module root notifications.client.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 {\n const resolved = resolveModuleFile(roots, imps, 'ai-tools.ts')\n if (resolved) {\n const importName = `AI_TOOLS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n aiToolsImports.push(importStmt)\n aiToolsConfigs.push(\n `{ moduleId: '${modId}', tools: (${importName}.aiTools ?? ${importName}.default ?? []) }`\n )\n }\n }\n\n // 9. Events: events.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'events.ts')\n if (resolved) {\n const importName = `EVENTS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n imports.push(importStmt)\n eventsImports.push(importStmt)\n eventsImportName = importName\n }\n }\n\n // 10. Analytics: analytics.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'analytics.ts')\n if (resolved) {\n const importName = `ANALYTICS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n imports.push(importStmt)\n analyticsImports.push(importStmt)\n analyticsImportName = importName\n }\n }\n\n // Translatable fields: module root translations.ts\n let transFieldsImportName: string | null = null\n {\n const resolved = resolveModuleFile(roots, imps, 'translations.ts')\n if (resolved) {\n const importName = `TRANS_FIELDS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n imports.push(importStmt)\n transFieldsImports.push(importStmt)\n transFieldsImportName = importName\n }\n }\n\n // 11. Setup: setup.ts\n {\n const setup = resolveConventionFile(roots, imps, 'setup.ts', 'SETUP', modId, importIdRef, imports)\n if (setup) setupImportName = setup.importName\n }\n\n // 12. Custom fields: data/fields.ts\n {\n const fields = resolveConventionFile(roots, imps, 'data/fields.ts', 'F', modId, importIdRef, imports)\n if (fields) fieldsImportName = fields.importName\n }\n\n // 13. Pages: backend\n {\n const beApp = path.join(roots.appBase, 'backend')\n const bePkg = path.join(roots.pkgBase, 'backend')\n const beFiles = scanModuleDir(roots, SCAN_CONFIGS.backendPages)\n if (beFiles.length) {\n backendRoutes.push(...processPageFiles({\n files: beFiles,\n type: 'backend',\n modId,\n appDir: beApp,\n pkgDir: bePkg,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n }\n }\n\n // 14. API routes\n apis.push(...await processApiRoutes({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 15. CLI\n {\n const cliApp = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n }\n\n // 16. Translations\n translations.push(...processTranslations({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n }))\n\n // 17. Subscribers\n subscribers.push(...processSubscribers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 18. Workers\n workers.push(...await processWorkers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Build combined customFieldSets expression\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n // 19. Dashboard widgets\n {\n const entries = scanDashboardWidgetEntries({\n modId,\n roots,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n })\n for (const entry of entries) {\n dashboardWidgets.push(\n `{ moduleId: '${entry.moduleId}', key: '${entry.key}', source: '${entry.source}', loader: () => import('${entry.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allDashboardWidgets.get(entry.key)\n if (!existing || (existing.source !== 'app' && entry.source === 'app')) {\n allDashboardWidgets.set(entry.key, {\n moduleId: entry.moduleId,\n source: entry.source,\n importPath: entry.importPath,\n })\n }\n }\n }\n\n // 20. Injection widgets\n {\n const files = scanModuleDir(roots, SCAN_CONFIGS.injectionWidgets)\n const widgetApp = path.join(roots.appBase, 'widgets', 'injection')\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/injection/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n injectionWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allInjectionWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allInjectionWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n\n // 21. Injection table\n {\n const resolved = resolveModuleFile(roots, imps, 'widgets/injection-table.ts')\n if (resolved) {\n const importName = `InjTable_${toVar(modId)}_${importIdRef.value++}`\n imports.push(`import * as ${importName} from '${resolved.importPath}'`)\n injectionTableImportName = importName\n allInjectionTables.push({ moduleId: modId, importPath: resolved.importPath, importName })\n }\n }\n\n if (searchImportName) {\n searchConfigs.push(`{ moduleId: '${modId}', config: (${searchImportName}.default ?? ${searchImportName}.searchConfig ?? ${searchImportName}.config ?? null) }`)\n }\n\n if (eventsImportName) {\n eventsConfigs.push(`{ moduleId: '${modId}', config: (${eventsImportName}.default ?? ${eventsImportName}.eventsConfig ?? null) as EventModuleConfigBase | null }`)\n }\n\n if (analyticsImportName) {\n analyticsConfigs.push(`{ moduleId: '${modId}', config: (${analyticsImportName}.default ?? ${analyticsImportName}.analyticsConfig ?? ${analyticsImportName}.config ?? null) }`)\n }\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 // 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: 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 return result\n}\n\n/**\n * Generate a CLI-specific module registry that excludes Next.js dependent code.\n * This produces modules.cli.generated.ts which can be loaded without Next.js runtime.\n *\n * Includes: module metadata, CLI commands, translations, subscribers, workers, entity extensions,\n * features/ACL, custom entities, vector config, custom fields, dashboard widgets\n * Excludes: frontend routes, backend routes, API handlers, injection widgets\n */\nexport async function generateModuleRegistryCli(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.cli.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.cli.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n // Mutable ref so extracted helper functions can increment the shared counter\n const importIdRef = { value: 0 }\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const rawImps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : rawImps.appBase\n const imps: ModuleImports = { appBase: appImportBase, pkgBase: rawImps.pkgBase }\n\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let vectorImportName: string | null = null\n const dashboardWidgets: string[] = []\n let setupImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n\n // Module metadata: index.ts (overrideable)\n const appIndex = path.join(roots.appBase, 'index.ts')\n const pkgIndex = path.join(roots.pkgBase, 'index.ts')\n const indexTs = fs.existsSync(appIndex) ? appIndex : fs.existsSync(pkgIndex) ? pkgIndex : null\n if (indexTs) {\n infoImportName = `I${importIdRef.value++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // Module setup configuration: setup.ts\n {\n const setup = resolveConventionFile(roots, imps, 'setup.ts', 'SETUP', modId, importIdRef, imports)\n if (setup) setupImportName = setup.importName\n }\n\n // Entity extensions: data/extensions.ts\n {\n const ext = resolveConventionFile(roots, imps, 'data/extensions.ts', 'X', modId, importIdRef, imports)\n if (ext) extensionsImportName = ext.importName\n }\n\n // RBAC: acl.ts\n {\n const rootApp = path.join(roots.appBase, 'acl.ts')\n const rootPkg = path.join(roots.pkgBase, 'acl.ts')\n const hasRoot = fs.existsSync(rootApp) || fs.existsSync(rootPkg)\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importIdRef.value++}`\n const useApp = fs.existsSync(rootApp) ? rootApp : rootPkg\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities: ce.ts\n {\n const ce = resolveConventionFile(roots, imps, 'ce.ts', 'CE', modId, importIdRef, imports)\n if (ce) customEntitiesImportName = ce.importName\n }\n\n // Vector search configuration: vector.ts\n {\n const vec = resolveConventionFile(roots, imps, 'vector.ts', 'VECTOR', modId, importIdRef, imports)\n if (vec) vectorImportName = vec.importName\n }\n\n // Custom fields: data/fields.ts\n {\n const fields = resolveConventionFile(roots, imps, 'data/fields.ts', 'F', modId, importIdRef, imports)\n if (fields) fieldsImportName = fields.importName\n }\n\n // CLI\n {\n const cliApp = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n }\n\n // Translations\n translations.push(...processTranslations({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n }))\n\n // Subscribers\n subscribers.push(...processSubscribers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Workers\n workers.push(...await processWorkers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Build combined customFieldSets expression\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n // Dashboard widgets\n {\n const entries = scanDashboardWidgetEntries({\n modId,\n roots,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n })\n for (const entry of entries) {\n dashboardWidgets.push(\n `{ moduleId: '${entry.moduleId}', key: '${entry.key}', source: '${entry.source}', loader: () => import('${entry.importPath}').then((mod) => mod.default ?? mod) }`\n )\n }\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as any) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${dashboardWidgets.length ? `dashboardWidgets: [${dashboardWidgets.join(', ')}],` : ''}\n ${vectorImportName ? `vector: (${vectorImportName}.default ?? ${vectorImportName}.vectorConfig ?? ${vectorImportName}.config ?? undefined),` : ''}\n ${setupImportName ? `setup: (${setupImportName}.default ?? ${setupImportName}.setup) || undefined,` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry (CLI version)\n// This file excludes Next.js dependent code (routes, APIs, injection widgets)\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n\n // Validate module dependencies declared via ModuleInfo.requires\n {\n const enabledIds = new Set(enabled.map((e) => e.id))\n const problems: string[] = []\n for (const [modId, reqs] of requiresByModule.entries()) {\n const missing = reqs.filter((r) => !enabledIds.has(r))\n if (missing.length) {\n problems.push(`- Module \"${modId}\" requires: ${missing.join(', ')}`)\n }\n }\n if (problems.length) {\n console.error('\\nModule dependency check failed:')\n for (const p of problems) console.error(p)\n console.error('\\nFix: Enable required module(s) in src/modules.ts. Example:')\n console.error(\n ' export const enabledModules = [ { id: \\'' +\n Array.from(new Set(requiresByModule.values()).values()).join(\"' }, { id: '\") +\n \"' } ]\"\n )\n process.exit(1)\n }\n }\n\n const structureChecksum = calculateStructureChecksum(Array.from(trackedRoots))\n writeGeneratedFile({ outFile, checksumFile, content: output, structureChecksum, result, quiet })\n\n return result\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageResolver } from '../resolver'\nimport {\n calculateStructureChecksum,\n toVar,\n moduleHasExport,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n} from '../utils'\nimport {\n scanModuleDir,\n resolveModuleFile,\n SCAN_CONFIGS,\n type ModuleRoots,\n type ModuleImports,\n} from './scanner'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\nexport interface ModuleRegistryOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\ntype DashboardWidgetEntry = {\n moduleId: string\n key: string\n source: 'app' | 'package'\n importPath: string\n}\n\nfunction scanDashboardWidgetEntries(options: {\n modId: string\n roots: ModuleRoots\n appImportBase: string\n pkgImportBase: string\n}): DashboardWidgetEntry[] {\n const { modId, roots, appImportBase, pkgImportBase } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.dashboardWidgets)\n return files.map(({ relPath, fromApp }) => {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/widgets/dashboard/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n return { moduleId: modId, key, source, importPath }\n })\n}\n\nfunction processPageFiles(options: {\n files: Array<{ relPath: string; fromApp: boolean }>\n type: 'frontend' | 'backend'\n modId: string\n appDir: string\n pkgDir: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): string[] {\n const { files, type, modId, appDir, pkgDir, appImportBase, pkgImportBase, imports, importIdRef } = options\n const prefix = type === 'frontend' ? 'C' : 'B'\n const modPrefix = type === 'frontend' ? 'CM' : 'BM'\n const metaPrefix = type === 'frontend' ? 'M' : 'BM'\n const routes: string[] = []\n\n // Next-style page.tsx files\n for (const { relPath, fromApp } of files.filter(({ relPath: f }) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = relPath.split('/')\n segs.pop()\n const importName = `${prefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `${modPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${sub}`\n const routePath = type === 'frontend'\n ? '/' + (segs.join('/') || '')\n : '/backend/' + (segs.join('/') || modId)\n const metaCandidates = [\n path.join(fromApp ? appDir : pkgDir, ...segs, 'page.meta.ts'),\n path.join(fromApp ? appDir : pkgDir, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `${metaPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...segs, path.basename(metaPath).replace(/\\.ts$/, '')].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n const baseProps = `pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb`\n const extraProps = type === 'backend' ? `, pageContext: (${metaExpr})?.pageContext` : ''\n routes.push(`{ ${baseProps}${extraProps}, Component: ${importName} }`)\n }\n\n // Back-compat direct files (old-style pages like login.tsx instead of login/page.tsx)\n for (const { relPath, fromApp } of files.filter(({ relPath: f }) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const routeSegs = [...segs, name].filter(Boolean)\n const importName = `${prefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const pageModName = `${modPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...segs, name].join('/')}`\n const routePath = type === 'frontend'\n ? '/' + (routeSegs.join('/') || '')\n : '/backend/' + [modId, ...segs, name].filter(Boolean).join('/')\n const metaCandidates = [\n path.join(fromApp ? appDir : pkgDir, ...segs, `${name}.meta.ts`),\n path.join(fromApp ? appDir : pkgDir, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `${metaPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const metaBase = path.basename(metaPath)\n const metaImportSub = metaBase === 'meta.ts' ? 'meta' : name + '.meta'\n const metaImportPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = type === 'frontend' ? `(${metaImportName}.metadata as any)` : `${metaImportName}.metadata`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n const baseProps = `pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey`\n const extraFe = type === 'frontend' ? `, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled` : `, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, pageContext: (${metaExpr})?.pageContext`\n routes.push(`{ ${baseProps}${extraFe}, Component: ${importName} }`)\n }\n\n return routes\n}\n\nasync function processApiRoutes(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): Promise<string[]> {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const apiApp = path.join(roots.appBase, 'api')\n const apiPkg = path.join(roots.pkgBase, 'api')\n if (!fs.existsSync(apiApp) && !fs.existsSync(apiPkg)) return []\n\n const apis: string[] = []\n\n // route.ts aggregations\n const routeFiles = scanModuleDir(roots, SCAN_CONFIGS.apiRoutes)\n for (const { relPath, fromApp } of routeFiles) {\n const segs = relPath.split('/')\n segs.pop()\n const reqSegs = [modId, ...segs]\n const importName = `R${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...segs, 'route.ts')\n const apiSegPath = segs.join('/')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/api${apiSegPath ? `/${apiSegPath}` : ''}/route`\n const routePath = '/' + reqSegs.filter(Boolean).join('/')\n const sourceFile = fromApp ? appFile : path.join(apiPkg, ...segs, 'route.ts')\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n\n // Single files (plain .ts, not route.ts, not tests, skip method dirs)\n const plainFiles = scanModuleDir(roots, SCAN_CONFIGS.apiPlainFiles)\n for (const { relPath, fromApp } of plainFiles) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `R${importIdRef.value++}_${toVar(modId)}_${toVar(fullSegs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...fullSegs) + '.ts'\n const plainSegPath = fullSegs.join('/')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/api${plainSegPath ? `/${plainSegPath}` : ''}`\n const pkgFile = path.join(apiPkg, ...fullSegs) + '.ts'\n const sourceFile = fromApp ? appFile : pkgFile\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n\n // Legacy per-method\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']\n for (const method of methods) {\n const coreMethodDir = path.join(apiPkg, method.toLowerCase())\n const appMethodDir = path.join(apiApp, method.toLowerCase())\n const methodDir = fs.existsSync(appMethodDir) ? appMethodDir : coreMethodDir\n if (!fs.existsSync(methodDir)) continue\n const methodRoots: ModuleRoots = { appBase: methodDir, pkgBase: methodDir }\n const methodConfig = {\n folder: '',\n include: (name: string) => name.endsWith('.ts') && !/\\.(test|spec)\\.ts$/.test(name),\n }\n const apiFiles = scanModuleDir(methodRoots, methodConfig)\n for (const { relPath } of apiFiles) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `H${importIdRef.value++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const fromApp = methodDir === appMethodDir\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/api/${method.toLowerCase()}/${fullSegs.join('/')}`\n const metaName = `RM${importIdRef.value++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const sourceFile = path.join(methodDir, ...segs, file)\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${metaName}.openApi` : ''\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n apis.push(`{ method: '${method}', path: '${routePath}', handler: ${importName}, metadata: ${metaName}.metadata${docsPart} }`)\n }\n }\n\n return apis\n}\n\nfunction processSubscribers(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): string[] {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.subscribers)\n const subscribers: string[] = []\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importName = `Subscriber${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/subscribers/${[...segs, name].join('/')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const sid = [modId, ...segs, name].filter(Boolean).join(':')\n subscribers.push(\n `{ id: (((${metaName}.metadata) as any)?.id || '${sid}'), event: ((${metaName}.metadata) as any)?.event, persistent: ((${metaName}.metadata) as any)?.persistent, handler: ${importName} }`\n )\n }\n return subscribers\n}\n\nasync function processWorkers(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): Promise<string[]> {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.workers)\n const workers: string[] = []\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/workers/${[...segs, name].join('/')}`\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const wid = [modId, 'workers', ...segs, name].filter(Boolean).join(':')\n workers.push(\n `{ id: (${metaName}.metadata as { id?: string })?.id || '${wid}', queue: (${metaName}.metadata as { queue: string }).queue, concurrency: (${metaName}.metadata as { concurrency?: number })?.concurrency ?? 1, handler: ${importName} as (job: unknown, ctx: unknown) => Promise<void> }`\n )\n }\n return workers\n}\n\nfunction processTranslations(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n}): string[] {\n const { roots, modId, appImportBase, pkgImportBase, imports } = options\n const i18nApp = path.join(roots.appBase, 'i18n')\n const i18nCore = path.join(roots.pkgBase, 'i18n')\n const locales = new Set<string>()\n if (fs.existsSync(i18nCore))\n for (const e of fs.readdirSync(i18nCore, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n if (fs.existsSync(i18nApp))\n for (const e of fs.readdirSync(i18nApp, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n const translations: string[] = []\n for (const locale of locales) {\n const coreHas = fs.existsSync(path.join(i18nCore, `${locale}.json`))\n const appHas = fs.existsSync(path.join(i18nApp, `${locale}.json`))\n if (coreHas && appHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${cName} from '${pkgImportBase}/i18n/${locale}.json'`)\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(\n `'${locale}': { ...( ${cName} as unknown as Record<string,string> ), ...( ${aName} as unknown as Record<string,string> ) }`\n )\n } else if (appHas) {\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${aName} as unknown as Record<string,string>`)\n } else if (coreHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n imports.push(`import ${cName} from '${pkgImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n return translations\n}\n\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\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\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 {\n const resolved = resolveModuleFile(roots, imps, 'notifications.ts')\n if (resolved) {\n const importName = `NOTIF_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n notificationImports.push(importStmt)\n notificationTypes.push(\n `{ moduleId: '${modId}', types: (${importName}.default ?? ${importName}.notificationTypes ?? []) }`\n )\n }\n }\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 {\n const resolved = resolveModuleFile(roots, imps, 'ai-tools.ts')\n if (resolved) {\n const importName = `AI_TOOLS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n aiToolsImports.push(importStmt)\n aiToolsConfigs.push(\n `{ moduleId: '${modId}', tools: (${importName}.aiTools ?? ${importName}.default ?? []) }`\n )\n }\n }\n\n // 9. Events: events.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'events.ts')\n if (resolved) {\n const importName = `EVENTS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n imports.push(importStmt)\n eventsImports.push(importStmt)\n eventsImportName = importName\n }\n }\n\n // 10. Analytics: analytics.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'analytics.ts')\n if (resolved) {\n const importName = `ANALYTICS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n imports.push(importStmt)\n analyticsImports.push(importStmt)\n analyticsImportName = importName\n }\n }\n\n // Translatable fields: module root translations.ts\n let transFieldsImportName: string | null = null\n {\n const resolved = resolveModuleFile(roots, imps, 'translations.ts')\n if (resolved) {\n const importName = `TRANS_FIELDS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n imports.push(importStmt)\n transFieldsImports.push(importStmt)\n transFieldsImportName = importName\n }\n }\n\n // 11. Setup: setup.ts\n {\n const setup = resolveConventionFile(roots, imps, 'setup.ts', 'SETUP', modId, importIdRef, imports)\n if (setup) setupImportName = setup.importName\n }\n\n // 12. Custom fields: data/fields.ts\n {\n const fields = resolveConventionFile(roots, imps, 'data/fields.ts', 'F', modId, importIdRef, imports)\n if (fields) fieldsImportName = fields.importName\n }\n\n // 13. Pages: backend\n {\n const beApp = path.join(roots.appBase, 'backend')\n const bePkg = path.join(roots.pkgBase, 'backend')\n const beFiles = scanModuleDir(roots, SCAN_CONFIGS.backendPages)\n if (beFiles.length) {\n backendRoutes.push(...processPageFiles({\n files: beFiles,\n type: 'backend',\n modId,\n appDir: beApp,\n pkgDir: bePkg,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n }\n }\n\n // 14. API routes\n apis.push(...await processApiRoutes({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 15. CLI\n {\n const cliApp = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n }\n\n // 16. Translations\n translations.push(...processTranslations({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n }))\n\n // 17. Subscribers\n subscribers.push(...processSubscribers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 18. Workers\n workers.push(...await processWorkers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Build combined customFieldSets expression\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n // 19. Dashboard widgets\n {\n const entries = scanDashboardWidgetEntries({\n modId,\n roots,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n })\n for (const entry of entries) {\n dashboardWidgets.push(\n `{ moduleId: '${entry.moduleId}', key: '${entry.key}', source: '${entry.source}', loader: () => import('${entry.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allDashboardWidgets.get(entry.key)\n if (!existing || (existing.source !== 'app' && entry.source === 'app')) {\n allDashboardWidgets.set(entry.key, {\n moduleId: entry.moduleId,\n source: entry.source,\n importPath: entry.importPath,\n })\n }\n }\n }\n\n // 20. Injection widgets\n {\n const files = scanModuleDir(roots, SCAN_CONFIGS.injectionWidgets)\n const widgetApp = path.join(roots.appBase, 'widgets', 'injection')\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/injection/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n injectionWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allInjectionWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allInjectionWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n\n // 21. Injection table\n {\n const resolved = resolveModuleFile(roots, imps, 'widgets/injection-table.ts')\n if (resolved) {\n const importName = `InjTable_${toVar(modId)}_${importIdRef.value++}`\n imports.push(`import * as ${importName} from '${resolved.importPath}'`)\n injectionTableImportName = importName\n allInjectionTables.push({ moduleId: modId, importPath: resolved.importPath, importName })\n }\n }\n\n if (searchImportName) {\n searchConfigs.push(`{ moduleId: '${modId}', config: (${searchImportName}.default ?? ${searchImportName}.searchConfig ?? ${searchImportName}.config ?? null) }`)\n }\n\n if (eventsImportName) {\n eventsConfigs.push(`{ moduleId: '${modId}', config: (${eventsImportName}.default ?? ${eventsImportName}.eventsConfig ?? null) as EventModuleConfigBase | null }`)\n }\n\n if (analyticsImportName) {\n analyticsConfigs.push(`{ moduleId: '${modId}', config: (${analyticsImportName}.default ?? ${analyticsImportName}.analyticsConfig ?? ${analyticsImportName}.config ?? null) }`)\n }\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'\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\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 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.5-develop-5191db4ef3",
3
+ "version": "0.4.5-develop-033a719bf2",
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.5-develop-5191db4ef3",
61
+ "@open-mercato/shared": "0.4.5-develop-033a719bf2",
62
62
  "pg": "8.16.3",
63
63
  "testcontainers": "^11.12.0",
64
64
  "typescript": "^5.9.3"
@@ -361,6 +361,12 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
361
361
  const notificationsChecksumFile = path.join(outputDir, 'notifications.generated.checksum')
362
362
  const notificationsClientOutFile = path.join(outputDir, 'notifications.client.generated.ts')
363
363
  const notificationsClientChecksumFile = path.join(outputDir, 'notifications.client.generated.checksum')
364
+ const messageTypesOutFile = path.join(outputDir, 'message-types.generated.ts')
365
+ const messageTypesChecksumFile = path.join(outputDir, 'message-types.generated.checksum')
366
+ const messageObjectsOutFile = path.join(outputDir, 'message-objects.generated.ts')
367
+ const messageObjectsChecksumFile = path.join(outputDir, 'message-objects.generated.checksum')
368
+ const messagesClientOutFile = path.join(outputDir, 'messages.client.generated.ts')
369
+ const messagesClientChecksumFile = path.join(outputDir, 'messages.client.generated.checksum')
364
370
  const aiToolsOutFile = path.join(outputDir, 'ai-tools.generated.ts')
365
371
  const aiToolsChecksumFile = path.join(outputDir, 'ai-tools.generated.checksum')
366
372
  const eventsOutFile = path.join(outputDir, 'events.generated.ts')
@@ -386,6 +392,10 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
386
392
  const notificationImports: string[] = []
387
393
  const notificationClientTypes: string[] = []
388
394
  const notificationClientImports: string[] = []
395
+ const messageTypeEntries: string[] = []
396
+ const messageTypeImports: string[] = []
397
+ const messageObjectTypeEntries: string[] = []
398
+ const messageObjectTypeImports: string[] = []
389
399
  const aiToolsConfigs: string[] = []
390
400
  const aiToolsImports: string[] = []
391
401
  const eventsConfigs: string[] = []
@@ -517,7 +527,33 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
517
527
  }
518
528
  }
519
529
 
520
- // Notification client renderers: module root notifications.client.ts
530
+ // Message types: module root message-types.ts
531
+ {
532
+ const resolved = resolveModuleFile(roots, imps, 'message-types.ts')
533
+ if (resolved) {
534
+ const importName = `MSG_TYPES_${toVar(modId)}_${importIdRef.value++}`
535
+ const importStmt = `import * as ${importName} from '${resolved.importPath}'`
536
+ messageTypeImports.push(importStmt)
537
+ messageTypeEntries.push(
538
+ `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageTypes ?? (${importName} as any).types ?? []) as MessageTypeDefinition[]) }`
539
+ )
540
+ }
541
+ }
542
+
543
+ // Message object types: module root message-objects.ts
544
+ {
545
+ const resolved = resolveModuleFile(roots, imps, 'message-objects.ts')
546
+ if (resolved) {
547
+ const importName = `MSG_OBJECTS_${toVar(modId)}_${importIdRef.value++}`
548
+ const importStmt = `import * as ${importName} from '${resolved.importPath}'`
549
+ messageObjectTypeImports.push(importStmt)
550
+ messageObjectTypeEntries.push(
551
+ `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageObjectTypes ?? (${importName} as any).objectTypes ?? (${importName} as any).types ?? []) as MessageObjectTypeDefinition[]) }`
552
+ )
553
+ }
554
+ }
555
+
556
+ // AI Tools: module root ai-tools.ts
521
557
  {
522
558
  const resolved = resolveModuleFile(roots, imps, 'notifications.client.ts')
523
559
  if (resolved) {
@@ -907,6 +943,134 @@ export const notificationRenderers = renderers
907
943
  export function getNotificationRenderers(): NotificationRenderers {
908
944
  return renderers
909
945
  }
946
+ `
947
+
948
+ const messageTypeEntriesLiteral = messageTypeEntries.join(',\n ')
949
+ const messageTypeImportSection = messageTypeImports.join('\n')
950
+ const messageTypesOutput = `// AUTO-GENERATED by mercato generate registry
951
+ import type { MessageTypeDefinition } from '@open-mercato/shared/modules/messages/types'
952
+ ${messageTypeImportSection ? `\n${messageTypeImportSection}\n` : '\n'}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }
953
+
954
+ const entriesRaw: MessageTypeEntry[] = [
955
+ ${messageTypeEntriesLiteral ? ` ${messageTypeEntriesLiteral}\n` : ''}]
956
+
957
+ const allTypes = entriesRaw.flatMap((entry) => entry.types)
958
+
959
+ export const messageTypeEntries = entriesRaw
960
+ export const messageTypes = allTypes
961
+
962
+ export function getMessageTypes(): MessageTypeDefinition[] {
963
+ return allTypes
964
+ }
965
+
966
+ export function getMessageType(type: string): MessageTypeDefinition | undefined {
967
+ return allTypes.find((entry) => entry.type === type)
968
+ }
969
+ `
970
+
971
+ const messageObjectEntriesLiteral = messageObjectTypeEntries.join(',\n ')
972
+ const messageObjectImportSection = messageObjectTypeImports.join('\n')
973
+ const messageObjectsOutput = `// AUTO-GENERATED by mercato generate registry
974
+ import type { MessageObjectTypeDefinition } from '@open-mercato/shared/modules/messages/types'
975
+ ${messageObjectImportSection ? `\n${messageObjectImportSection}\n` : '\n'}type MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }
976
+
977
+ const entriesRaw: MessageObjectTypeEntry[] = [
978
+ ${messageObjectEntriesLiteral ? ` ${messageObjectEntriesLiteral}\n` : ''}]
979
+
980
+ const allTypes = entriesRaw.flatMap((entry) => entry.types)
981
+
982
+ export const messageObjectTypeEntries = entriesRaw
983
+ export const messageObjectTypes = allTypes
984
+
985
+ export function getMessageObjectTypes(): MessageObjectTypeDefinition[] {
986
+ return allTypes
987
+ }
988
+
989
+ export function getMessageObjectType(module: string, entityType: string): MessageObjectTypeDefinition | undefined {
990
+ return allTypes.find((entry) => entry.module === module && entry.entityType === entityType)
991
+ }
992
+ `
993
+ const messagesClientOutput = `// AUTO-GENERATED by mercato generate registry
994
+ import type { ComponentType } from 'react'
995
+ import type {
996
+ MessageTypeDefinition,
997
+ MessageObjectTypeDefinition,
998
+ MessageListItemProps,
999
+ MessageContentProps,
1000
+ MessageActionsProps,
1001
+ ObjectDetailProps,
1002
+ ObjectPreviewProps,
1003
+ } from '@open-mercato/shared/modules/messages/types'
1004
+ ${messageTypeImportSection ? `\n${messageTypeImportSection}\n` : '\n'}${messageObjectImportSection ? `\n${messageObjectImportSection}\n` : ''}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }
1005
+ type MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }
1006
+
1007
+ export type MessageListItemRenderers = Record<string, ComponentType<MessageListItemProps>>
1008
+ export type MessageContentRenderers = Record<string, ComponentType<MessageContentProps>>
1009
+ export type MessageActionsRenderers = Record<string, ComponentType<MessageActionsProps>>
1010
+ export type MessageObjectDetailRenderers = Record<string, ComponentType<ObjectDetailProps>>
1011
+ export type MessageObjectPreviewRenderers = Record<string, ComponentType<ObjectPreviewProps>>
1012
+
1013
+ export type MessageUiComponentRegistry = {
1014
+ listItemComponents: MessageListItemRenderers
1015
+ contentComponents: MessageContentRenderers
1016
+ actionsComponents: MessageActionsRenderers
1017
+ objectDetailComponents: MessageObjectDetailRenderers
1018
+ objectPreviewComponents: MessageObjectPreviewRenderers
1019
+ }
1020
+
1021
+ const messageTypeEntriesRaw: MessageTypeEntry[] = [
1022
+ ${messageTypeEntriesLiteral ? ` ${messageTypeEntriesLiteral}\n` : ''}]
1023
+ const messageObjectTypeEntriesRaw: MessageObjectTypeEntry[] = [
1024
+ ${messageObjectEntriesLiteral ? ` ${messageObjectEntriesLiteral}\n` : ''}]
1025
+
1026
+ const allMessageTypes = messageTypeEntriesRaw.flatMap((entry) => entry.types)
1027
+ const allMessageObjectTypes = messageObjectTypeEntriesRaw.flatMap((entry) => entry.types)
1028
+
1029
+ const listItemComponents: MessageListItemRenderers = Object.fromEntries(
1030
+ allMessageTypes
1031
+ .filter((typeDef) => Boolean(typeDef.ui?.listItemComponent) && Boolean(typeDef.ListItemComponent))
1032
+ .map((typeDef) => [typeDef.ui!.listItemComponent!, typeDef.ListItemComponent!]),
1033
+ )
1034
+
1035
+ const contentComponents: MessageContentRenderers = Object.fromEntries(
1036
+ allMessageTypes
1037
+ .filter((typeDef) => Boolean(typeDef.ui?.contentComponent) && Boolean(typeDef.ContentComponent))
1038
+ .map((typeDef) => [typeDef.ui!.contentComponent!, typeDef.ContentComponent!]),
1039
+ )
1040
+
1041
+ const actionsComponents: MessageActionsRenderers = Object.fromEntries(
1042
+ allMessageTypes
1043
+ .filter((typeDef) => Boolean(typeDef.ui?.actionsComponent) && Boolean(typeDef.ActionsComponent))
1044
+ .map((typeDef) => [typeDef.ui!.actionsComponent!, typeDef.ActionsComponent!]),
1045
+ )
1046
+
1047
+ const objectDetailComponents: MessageObjectDetailRenderers = Object.fromEntries(
1048
+ allMessageObjectTypes
1049
+ .filter((typeDef) => Boolean(typeDef.DetailComponent))
1050
+ .map((typeDef) => [\`\${typeDef.module}:\${typeDef.entityType}\`, typeDef.DetailComponent!]),
1051
+ )
1052
+
1053
+ const objectPreviewComponents: MessageObjectPreviewRenderers = Object.fromEntries(
1054
+ allMessageObjectTypes
1055
+ .filter((typeDef) => Boolean(typeDef.PreviewComponent))
1056
+ .map((typeDef) => [\`\${typeDef.module}:\${typeDef.entityType}\`, typeDef.PreviewComponent!]),
1057
+ )
1058
+
1059
+ const registry: MessageUiComponentRegistry = {
1060
+ listItemComponents,
1061
+ contentComponents,
1062
+ actionsComponents,
1063
+ objectDetailComponents,
1064
+ objectPreviewComponents,
1065
+ }
1066
+
1067
+ export const messageClientTypeEntries = messageTypeEntriesRaw
1068
+ export const messageClientObjectTypeEntries = messageObjectTypeEntriesRaw
1069
+ export const messageUiComponentRegistry = registry
1070
+
1071
+ export function getMessageUiComponentRegistry(): MessageUiComponentRegistry {
1072
+ return registry
1073
+ }
910
1074
  `
911
1075
 
912
1076
  // Validate module dependencies declared via ModuleInfo.requires
@@ -983,10 +1147,12 @@ export const allAiTools = aiToolConfigEntries.flatMap(e => e.tools)
983
1147
  writeGeneratedFile({ outFile: aiToolsOutFile, checksumFile: aiToolsChecksumFile, content: aiToolsOutput, structureChecksum, result, quiet })
984
1148
  writeGeneratedFile({ outFile: notificationsOutFile, checksumFile: notificationsChecksumFile, content: notificationsOutput, structureChecksum, result, quiet })
985
1149
  writeGeneratedFile({ outFile: notificationsClientOutFile, checksumFile: notificationsClientChecksumFile, content: notificationsClientOutput, structureChecksum, result, quiet })
1150
+ writeGeneratedFile({ outFile: messageTypesOutFile, checksumFile: messageTypesChecksumFile, content: messageTypesOutput, structureChecksum, result, quiet })
1151
+ writeGeneratedFile({ outFile: messageObjectsOutFile, checksumFile: messageObjectsChecksumFile, content: messageObjectsOutput, structureChecksum, result, quiet })
1152
+ writeGeneratedFile({ outFile: messagesClientOutFile, checksumFile: messagesClientChecksumFile, content: messagesClientOutput, structureChecksum, result, quiet })
986
1153
  writeGeneratedFile({ outFile: eventsOutFile, checksumFile: eventsChecksumFile, content: eventsOutput, structureChecksum, result, quiet })
987
1154
  writeGeneratedFile({ outFile: analyticsOutFile, checksumFile: analyticsChecksumFile, content: analyticsOutput, structureChecksum, result, quiet })
988
1155
  writeGeneratedFile({ outFile: transFieldsOutFile, checksumFile: transFieldsChecksumFile, content: transFieldsOutput, structureChecksum, result, quiet })
989
-
990
1156
  return result
991
1157
  }
992
1158