@open-mercato/cli 0.4.5-develop-610fbb24ec → 0.4.5-develop-811deeb983

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.
@@ -189,7 +189,7 @@ async function dbMigrate(resolver, options = {}) {
189
189
  clientUrl: getClientUrl(),
190
190
  loggerFactory: () => createMinimalLogger(),
191
191
  dynamicImportProvider,
192
- entities: entities.length ? entities : [],
192
+ entities: [],
193
193
  discovery: { warnWhenNoEntities: false },
194
194
  migrations: {
195
195
  path: migrationsPath,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/db/commands.ts"],
4
- "sourcesContent": ["import path from 'node:path'\nimport fs from 'node:fs'\nimport { pathToFileURL } from 'node:url'\nimport { MikroORM, type Logger } from '@mikro-orm/core'\nimport { Migrator } from '@mikro-orm/migrations'\nimport { PostgreSqlDriver } from '@mikro-orm/postgresql'\nimport { getSslConfig } from '@open-mercato/shared/lib/db/ssl'\nimport type { PackageResolver, ModuleEntry } from '../resolver'\n\nconst QUIET_MODE = process.env.OM_CLI_QUIET === '1' || process.env.MERCATO_QUIET === '1'\nconst PROGRESS_EMOJI = ''\n\nfunction formatResult(modId: string, message: string, emoji = '\u2022') {\n return `${emoji} ${modId}: ${message}`\n}\n\nfunction createProgressRenderer(total: number) {\n const width = 20\n const normalizedTotal = total > 0 ? total : 1\n return (current: number) => {\n const clamped = Math.min(Math.max(current, 0), normalizedTotal)\n const filled = Math.round((clamped / normalizedTotal) * width)\n const bar = `${'='.repeat(filled)}${'.'.repeat(Math.max(width - filled, 0))}`\n return `[${bar}] ${clamped}/${normalizedTotal}`\n }\n}\n\nfunction createMinimalLogger(): Logger {\n return {\n log: () => {},\n error: (_namespace, message) => console.error(message),\n warn: (_namespace, message) => {\n if (!QUIET_MODE) console.warn(message)\n },\n logQuery: () => {},\n setDebugMode: () => {},\n isEnabled: () => false,\n }\n}\n\nfunction getClientUrl(): string {\n const url = process.env.DATABASE_URL\n if (!url) throw new Error('DATABASE_URL is not set')\n return url\n}\n\nfunction sortModules(mods: ModuleEntry[]): ModuleEntry[] {\n // Sort modules alphabetically since they are now isomorphic\n return mods.slice().sort((a, b) => a.id.localeCompare(b.id))\n}\n\n/**\n * Custom dynamic import provider for MikroORM that properly handles Windows paths.\n * MikroORM's built-in handling has a bug where it converts file:// URLs back to\n * Windows paths when the extension isn't in require.extensions (which is always\n * true for .ts files in ESM mode).\n */\nasync function dynamicImportProvider(id: string): Promise<any> {\n // On Windows, convert absolute paths to file:// URLs\n // Check if it's a Windows absolute path (e.g., C:\\... or D:\\...)\n if (process.platform === 'win32' && /^[a-zA-Z]:[\\\\/]/.test(id)) {\n id = pathToFileURL(id).href\n }\n return import(id)\n}\n\n/**\n * Sanitizes a module ID for use in SQL identifiers (table names).\n * Replaces non-alphanumeric characters with underscores to prevent SQL injection.\n * @public Exported for testing\n */\nexport function sanitizeModuleId(modId: string): string {\n return modId.replace(/[^a-z0-9_]/gi, '_')\n}\n\n/**\n * Validates that a table name is safe for use in SQL queries.\n * @throws Error if the table name contains invalid characters.\n * @public Exported for testing\n */\nexport function validateTableName(tableName: string): void {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(tableName)) {\n throw new Error(`Invalid table name: ${tableName}. Table names must start with a letter or underscore and contain only alphanumeric characters and underscores.`)\n }\n}\n\nasync function loadModuleEntities(entry: ModuleEntry, resolver: PackageResolver): Promise<any[]> {\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n const isAppModule = entry.from === '@app'\n const bases = [\n path.join(roots.appBase, 'data'),\n path.join(roots.pkgBase, 'data'),\n path.join(roots.appBase, 'db'),\n path.join(roots.pkgBase, 'db'),\n ]\n const candidates = ['entities.ts', 'schema.ts']\n\n for (const base of bases) {\n for (const f of candidates) {\n const p = path.join(base, f)\n if (fs.existsSync(p)) {\n const sub = path.basename(base)\n const fromApp = base.startsWith(roots.appBase)\n // For @app modules, use file:// URL since @/ alias doesn't work in Node.js runtime\n const importPath = (isAppModule && fromApp)\n ? pathToFileURL(p.replace(/\\.ts$/, '.js')).href\n : `${fromApp ? imps.appBase : imps.pkgBase}/${sub}/${f.replace(/\\.ts$/, '')}`\n try {\n const mod = await import(importPath)\n const entities = Object.values(mod).filter((v) => typeof v === 'function')\n if (entities.length) return entities as any[]\n } catch (err) {\n // For @app modules with TypeScript files, they can't be directly imported\n // Skip and let MikroORM handle entities through discovery\n if (isAppModule) continue\n throw err\n }\n }\n }\n }\n return []\n}\n\nfunction getMigrationsPath(entry: ModuleEntry, resolver: PackageResolver): string {\n const roots = resolver.getModulePaths(entry)\n\n if (entry.from === '@app') {\n // @app modules: use src/ (user's TypeScript source)\n // Normalize to forward slashes for ESM compatibility on Windows\n return path.join(roots.appBase, 'migrations').replace(/\\\\/g, '/')\n }\n\n // Package modules: in standalone mode, use dist/ (compiled JS) since Node.js\n // can't run TypeScript from node_modules. In monorepo, use src/ (TypeScript).\n if (!resolver.isMonorepo()) {\n // Replace src/modules with dist/modules for standalone apps\n // Use regex to handle both forward and backslashes\n const distPath = roots.pkgBase.replace(/[/\\\\]src[/\\\\]modules[/\\\\]/, '/dist/modules/')\n return path.join(distPath, 'migrations').replace(/\\\\/g, '/')\n }\n\n // Normalize to forward slashes for ESM compatibility on Windows\n return path.join(roots.pkgBase, 'migrations').replace(/\\\\/g, '/')\n}\n\nexport interface DbOptions {\n quiet?: boolean\n}\n\nexport interface GreenfieldOptions extends DbOptions {\n yes: boolean\n}\n\nexport async function dbGenerate(resolver: PackageResolver, options: DbOptions = {}): Promise<void> {\n const modules = resolver.loadEnabledModules()\n const ordered = sortModules(modules)\n const results: string[] = []\n\n for (const entry of ordered) {\n const modId = entry.id\n const sanitizedModId = sanitizeModuleId(modId)\n const entities = await loadModuleEntities(entry, resolver)\n if (!entities.length) continue\n\n const migrationsPath = getMigrationsPath(entry, resolver)\n fs.mkdirSync(migrationsPath, { recursive: true })\n\n const tableName = `mikro_orm_migrations_${sanitizedModId}`\n validateTableName(tableName)\n\n const sslConfig = getSslConfig()\n const orm = await MikroORM.init<PostgreSqlDriver>({\n driver: PostgreSqlDriver,\n clientUrl: getClientUrl(),\n loggerFactory: () => createMinimalLogger(),\n dynamicImportProvider,\n entities,\n migrations: {\n path: migrationsPath,\n glob: '!(*.d).{ts,js}',\n tableName,\n dropTables: false,\n },\n schemaGenerator: {\n disableForeignKeys: true,\n },\n pool: {\n min: 1,\n max: 3,\n idleTimeoutMillis: 30000,\n acquireTimeoutMillis: 60000,\n destroyTimeoutMillis: 30000,\n },\n driverOptions: sslConfig ? {\n connection: {\n ssl: sslConfig,\n },\n } : undefined,\n })\n\n const migrator = orm.getMigrator() as Migrator\n const diff = await migrator.createMigration()\n if (diff && diff.fileName) {\n try {\n const orig = diff.fileName\n const base = path.basename(orig)\n const dir = path.dirname(orig)\n const ext = path.extname(base)\n const stem = base.replace(ext, '')\n const suffix = `_${modId}`\n const newBase = stem.endsWith(suffix) ? base : `${stem}${suffix}${ext}`\n const newPath = path.join(dir, newBase)\n let content = fs.readFileSync(orig, 'utf8')\n // Rename class to ensure uniqueness as well\n content = content.replace(\n /export class (Migration\\d+)/,\n `export class $1_${modId.replace(/[^a-zA-Z0-9]/g, '_')}`\n )\n fs.writeFileSync(newPath, content, 'utf8')\n if (newPath !== orig) fs.unlinkSync(orig)\n results.push(formatResult(modId, `generated ${newBase}`, ''))\n } catch {\n results.push(formatResult(modId, `generated ${path.basename(diff.fileName)} (rename failed)`, ''))\n }\n } else {\n results.push(formatResult(modId, 'no changes', ''))\n }\n\n await orm.close(true)\n }\n\n console.log(results.join('\\n'))\n}\n\nexport async function dbMigrate(resolver: PackageResolver, options: DbOptions = {}): Promise<void> {\n const modules = resolver.loadEnabledModules()\n const ordered = sortModules(modules)\n const results: string[] = []\n\n for (const entry of ordered) {\n const modId = entry.id\n const sanitizedModId = sanitizeModuleId(modId)\n const entities = await loadModuleEntities(entry, resolver)\n\n const migrationsPath = getMigrationsPath(entry, resolver)\n\n // Skip if no entities AND no migrations directory exists\n // (allows @app modules to run migrations even if entities can't be dynamically imported)\n if (!entities.length && !fs.existsSync(migrationsPath)) continue\n fs.mkdirSync(migrationsPath, { recursive: true })\n\n const tableName = `mikro_orm_migrations_${sanitizedModId}`\n validateTableName(tableName)\n\n // For @app modules, entities may be empty since TypeScript files can't be imported at runtime\n // Use discovery.warnWhenNoEntities: false to allow running migrations without entities\n const sslConfig = getSslConfig()\n const orm = await MikroORM.init<PostgreSqlDriver>({\n driver: PostgreSqlDriver,\n clientUrl: getClientUrl(),\n loggerFactory: () => createMinimalLogger(),\n dynamicImportProvider,\n entities: entities.length ? entities : [],\n discovery: { warnWhenNoEntities: false },\n migrations: {\n path: migrationsPath,\n glob: '!(*.d).{ts,js}',\n tableName,\n dropTables: false,\n },\n schemaGenerator: {\n disableForeignKeys: true,\n },\n pool: {\n min: 1,\n max: 3,\n idleTimeoutMillis: 30000,\n acquireTimeoutMillis: 60000,\n destroyTimeoutMillis: 30000,\n },\n driverOptions: sslConfig ? {\n connection: {\n ssl: sslConfig,\n },\n } : undefined,\n })\n\n const migrator = orm.getMigrator() as Migrator\n const pending = await migrator.getPendingMigrations()\n if (!pending.length) {\n results.push(formatResult(modId, 'no pending migrations', ''))\n } else {\n const renderProgress = createProgressRenderer(pending.length)\n let applied = 0\n if (!QUIET_MODE) {\n process.stdout.write(` ${PROGRESS_EMOJI} ${modId}: ${renderProgress(applied)}`)\n }\n for (const migration of pending) {\n const migrationName =\n typeof migration === 'string'\n ? migration\n : (migration as any).name ?? (migration as any).fileName\n await migrator.up(migrationName ? { migrations: [migrationName] } : undefined)\n applied += 1\n if (!QUIET_MODE) {\n process.stdout.write(`\\r ${PROGRESS_EMOJI} ${modId}: ${renderProgress(applied)}`)\n }\n }\n if (!QUIET_MODE) process.stdout.write('\\n')\n results.push(\n formatResult(modId, `${pending.length} migration${pending.length === 1 ? '' : 's'} applied`, '')\n )\n }\n\n await orm.close(true)\n }\n\n console.log(results.join('\\n'))\n}\n\nexport async function dbGreenfield(resolver: PackageResolver, options: GreenfieldOptions): Promise<void> {\n if (!options.yes) {\n console.error('This command will DELETE all data. Use --yes to confirm.')\n process.exit(1)\n }\n\n console.log('Cleaning up migrations and snapshots for greenfield setup...')\n\n const modules = resolver.loadEnabledModules()\n const ordered = sortModules(modules)\n const results: string[] = []\n const outputDir = resolver.getOutputDir()\n\n for (const entry of ordered) {\n const modId = entry.id\n const migrationsPath = getMigrationsPath(entry, resolver)\n\n if (fs.existsSync(migrationsPath)) {\n // Remove all migration files\n const migrationFiles = fs\n .readdirSync(migrationsPath)\n .filter((file) => file.endsWith('.ts') && file.startsWith('Migration'))\n\n for (const file of migrationFiles) {\n fs.unlinkSync(path.join(migrationsPath, file))\n }\n\n // Remove snapshot files\n const snapshotFiles = fs\n .readdirSync(migrationsPath)\n .filter((file) => file.endsWith('.json') && file.includes('snapshot'))\n\n for (const file of snapshotFiles) {\n fs.unlinkSync(path.join(migrationsPath, file))\n }\n\n if (migrationFiles.length > 0 || snapshotFiles.length > 0) {\n results.push(\n formatResult(modId, `cleaned ${migrationFiles.length} migrations, ${snapshotFiles.length} snapshots`, '')\n )\n } else {\n results.push(formatResult(modId, 'already clean', ''))\n }\n } else {\n results.push(formatResult(modId, 'no migrations directory', ''))\n }\n\n // Clean up checksum files using glob pattern\n if (fs.existsSync(outputDir)) {\n const files = fs.readdirSync(outputDir)\n const checksumFiles = files.filter((file) => file.endsWith('.checksum'))\n\n for (const file of checksumFiles) {\n fs.unlinkSync(path.join(outputDir, file))\n }\n\n if (checksumFiles.length > 0) {\n results.push(formatResult(modId, `cleaned ${checksumFiles.length} checksum files`, ''))\n }\n }\n }\n\n console.log(results.join('\\n'))\n\n // Drop per-module MikroORM migration tables to ensure clean slate\n console.log('Dropping per-module migration tables...')\n try {\n const { Client } = await import('pg')\n const client = new Client({ connectionString: getClientUrl(), ssl: getSslConfig() })\n await client.connect()\n try {\n await client.query('BEGIN')\n for (const entry of ordered) {\n const modId = entry.id\n const sanitizedModId = sanitizeModuleId(modId)\n const tableName = `mikro_orm_migrations_${sanitizedModId}`\n validateTableName(tableName)\n await client.query(`DROP TABLE IF EXISTS \"${tableName}\"`)\n console.log(` ${modId}: dropped table ${tableName}`)\n }\n await client.query('COMMIT')\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n } finally {\n try {\n await client.end()\n } catch {}\n }\n } catch (e) {\n console.error('Failed to drop migration tables:', (e as any)?.message || e)\n throw e\n }\n\n // Drop all existing user tables to ensure fresh CREATE-only migrations\n console.log('Dropping ALL public tables for true greenfield...')\n try {\n const { Client } = await import('pg')\n const client = new Client({ connectionString: getClientUrl(), ssl: getSslConfig() })\n await client.connect()\n try {\n const res = await client.query(`SELECT tablename FROM pg_tables WHERE schemaname = 'public'`)\n const tables: string[] = (res.rows || []).map((r: any) => String(r.tablename))\n if (tables.length) {\n await client.query('BEGIN')\n try {\n await client.query(\"SET session_replication_role = 'replica'\")\n for (const t of tables) {\n await client.query(`DROP TABLE IF EXISTS \"${t}\" CASCADE`)\n }\n await client.query(\"SET session_replication_role = 'origin'\")\n await client.query('COMMIT')\n console.log(` Dropped ${tables.length} tables.`)\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n }\n } else {\n console.log(' No tables found to drop.')\n }\n } finally {\n try {\n await client.end()\n } catch {}\n }\n } catch (e) {\n console.error('Failed to drop public tables:', (e as any)?.message || e)\n throw e\n }\n\n // Generate fresh migrations for all modules\n console.log('Generating fresh migrations for all modules...')\n await dbGenerate(resolver)\n\n // Apply migrations\n console.log('Applying migrations...')\n await dbMigrate(resolver)\n\n console.log('Greenfield reset complete! Fresh migrations generated and applied.')\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import path from 'node:path'\nimport fs from 'node:fs'\nimport { pathToFileURL } from 'node:url'\nimport { MikroORM, type Logger } from '@mikro-orm/core'\nimport { Migrator } from '@mikro-orm/migrations'\nimport { PostgreSqlDriver } from '@mikro-orm/postgresql'\nimport { getSslConfig } from '@open-mercato/shared/lib/db/ssl'\nimport type { PackageResolver, ModuleEntry } from '../resolver'\n\nconst QUIET_MODE = process.env.OM_CLI_QUIET === '1' || process.env.MERCATO_QUIET === '1'\nconst PROGRESS_EMOJI = ''\n\nfunction formatResult(modId: string, message: string, emoji = '\u2022') {\n return `${emoji} ${modId}: ${message}`\n}\n\nfunction createProgressRenderer(total: number) {\n const width = 20\n const normalizedTotal = total > 0 ? total : 1\n return (current: number) => {\n const clamped = Math.min(Math.max(current, 0), normalizedTotal)\n const filled = Math.round((clamped / normalizedTotal) * width)\n const bar = `${'='.repeat(filled)}${'.'.repeat(Math.max(width - filled, 0))}`\n return `[${bar}] ${clamped}/${normalizedTotal}`\n }\n}\n\nfunction createMinimalLogger(): Logger {\n return {\n log: () => {},\n error: (_namespace, message) => console.error(message),\n warn: (_namespace, message) => {\n if (!QUIET_MODE) console.warn(message)\n },\n logQuery: () => {},\n setDebugMode: () => {},\n isEnabled: () => false,\n }\n}\n\nfunction getClientUrl(): string {\n const url = process.env.DATABASE_URL\n if (!url) throw new Error('DATABASE_URL is not set')\n return url\n}\n\nfunction sortModules(mods: ModuleEntry[]): ModuleEntry[] {\n // Sort modules alphabetically since they are now isomorphic\n return mods.slice().sort((a, b) => a.id.localeCompare(b.id))\n}\n\n/**\n * Custom dynamic import provider for MikroORM that properly handles Windows paths.\n * MikroORM's built-in handling has a bug where it converts file:// URLs back to\n * Windows paths when the extension isn't in require.extensions (which is always\n * true for .ts files in ESM mode).\n */\nasync function dynamicImportProvider(id: string): Promise<any> {\n // On Windows, convert absolute paths to file:// URLs\n // Check if it's a Windows absolute path (e.g., C:\\... or D:\\...)\n if (process.platform === 'win32' && /^[a-zA-Z]:[\\\\/]/.test(id)) {\n id = pathToFileURL(id).href\n }\n return import(id)\n}\n\n/**\n * Sanitizes a module ID for use in SQL identifiers (table names).\n * Replaces non-alphanumeric characters with underscores to prevent SQL injection.\n * @public Exported for testing\n */\nexport function sanitizeModuleId(modId: string): string {\n return modId.replace(/[^a-z0-9_]/gi, '_')\n}\n\n/**\n * Validates that a table name is safe for use in SQL queries.\n * @throws Error if the table name contains invalid characters.\n * @public Exported for testing\n */\nexport function validateTableName(tableName: string): void {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(tableName)) {\n throw new Error(`Invalid table name: ${tableName}. Table names must start with a letter or underscore and contain only alphanumeric characters and underscores.`)\n }\n}\n\nasync function loadModuleEntities(entry: ModuleEntry, resolver: PackageResolver): Promise<any[]> {\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n const isAppModule = entry.from === '@app'\n const bases = [\n path.join(roots.appBase, 'data'),\n path.join(roots.pkgBase, 'data'),\n path.join(roots.appBase, 'db'),\n path.join(roots.pkgBase, 'db'),\n ]\n const candidates = ['entities.ts', 'schema.ts']\n\n for (const base of bases) {\n for (const f of candidates) {\n const p = path.join(base, f)\n if (fs.existsSync(p)) {\n const sub = path.basename(base)\n const fromApp = base.startsWith(roots.appBase)\n // For @app modules, use file:// URL since @/ alias doesn't work in Node.js runtime\n const importPath = (isAppModule && fromApp)\n ? pathToFileURL(p.replace(/\\.ts$/, '.js')).href\n : `${fromApp ? imps.appBase : imps.pkgBase}/${sub}/${f.replace(/\\.ts$/, '')}`\n try {\n const mod = await import(importPath)\n const entities = Object.values(mod).filter((v) => typeof v === 'function')\n if (entities.length) return entities as any[]\n } catch (err) {\n // For @app modules with TypeScript files, they can't be directly imported\n // Skip and let MikroORM handle entities through discovery\n if (isAppModule) continue\n throw err\n }\n }\n }\n }\n return []\n}\n\nfunction getMigrationsPath(entry: ModuleEntry, resolver: PackageResolver): string {\n const roots = resolver.getModulePaths(entry)\n\n if (entry.from === '@app') {\n // @app modules: use src/ (user's TypeScript source)\n // Normalize to forward slashes for ESM compatibility on Windows\n return path.join(roots.appBase, 'migrations').replace(/\\\\/g, '/')\n }\n\n // Package modules: in standalone mode, use dist/ (compiled JS) since Node.js\n // can't run TypeScript from node_modules. In monorepo, use src/ (TypeScript).\n if (!resolver.isMonorepo()) {\n // Replace src/modules with dist/modules for standalone apps\n // Use regex to handle both forward and backslashes\n const distPath = roots.pkgBase.replace(/[/\\\\]src[/\\\\]modules[/\\\\]/, '/dist/modules/')\n return path.join(distPath, 'migrations').replace(/\\\\/g, '/')\n }\n\n // Normalize to forward slashes for ESM compatibility on Windows\n return path.join(roots.pkgBase, 'migrations').replace(/\\\\/g, '/')\n}\n\nexport interface DbOptions {\n quiet?: boolean\n}\n\nexport interface GreenfieldOptions extends DbOptions {\n yes: boolean\n}\n\nexport async function dbGenerate(resolver: PackageResolver, options: DbOptions = {}): Promise<void> {\n const modules = resolver.loadEnabledModules()\n const ordered = sortModules(modules)\n const results: string[] = []\n\n for (const entry of ordered) {\n const modId = entry.id\n const sanitizedModId = sanitizeModuleId(modId)\n const entities = await loadModuleEntities(entry, resolver)\n if (!entities.length) continue\n\n const migrationsPath = getMigrationsPath(entry, resolver)\n fs.mkdirSync(migrationsPath, { recursive: true })\n\n const tableName = `mikro_orm_migrations_${sanitizedModId}`\n validateTableName(tableName)\n\n const sslConfig = getSslConfig()\n const orm = await MikroORM.init<PostgreSqlDriver>({\n driver: PostgreSqlDriver,\n clientUrl: getClientUrl(),\n loggerFactory: () => createMinimalLogger(),\n dynamicImportProvider,\n entities,\n migrations: {\n path: migrationsPath,\n glob: '!(*.d).{ts,js}',\n tableName,\n dropTables: false,\n },\n schemaGenerator: {\n disableForeignKeys: true,\n },\n pool: {\n min: 1,\n max: 3,\n idleTimeoutMillis: 30000,\n acquireTimeoutMillis: 60000,\n destroyTimeoutMillis: 30000,\n },\n driverOptions: sslConfig ? {\n connection: {\n ssl: sslConfig,\n },\n } : undefined,\n })\n\n const migrator = orm.getMigrator() as Migrator\n const diff = await migrator.createMigration()\n if (diff && diff.fileName) {\n try {\n const orig = diff.fileName\n const base = path.basename(orig)\n const dir = path.dirname(orig)\n const ext = path.extname(base)\n const stem = base.replace(ext, '')\n const suffix = `_${modId}`\n const newBase = stem.endsWith(suffix) ? base : `${stem}${suffix}${ext}`\n const newPath = path.join(dir, newBase)\n let content = fs.readFileSync(orig, 'utf8')\n // Rename class to ensure uniqueness as well\n content = content.replace(\n /export class (Migration\\d+)/,\n `export class $1_${modId.replace(/[^a-zA-Z0-9]/g, '_')}`\n )\n fs.writeFileSync(newPath, content, 'utf8')\n if (newPath !== orig) fs.unlinkSync(orig)\n results.push(formatResult(modId, `generated ${newBase}`, ''))\n } catch {\n results.push(formatResult(modId, `generated ${path.basename(diff.fileName)} (rename failed)`, ''))\n }\n } else {\n results.push(formatResult(modId, 'no changes', ''))\n }\n\n await orm.close(true)\n }\n\n console.log(results.join('\\n'))\n}\n\nexport async function dbMigrate(resolver: PackageResolver, options: DbOptions = {}): Promise<void> {\n const modules = resolver.loadEnabledModules()\n const ordered = sortModules(modules)\n const results: string[] = []\n\n for (const entry of ordered) {\n const modId = entry.id\n const sanitizedModId = sanitizeModuleId(modId)\n const entities = await loadModuleEntities(entry, resolver)\n\n const migrationsPath = getMigrationsPath(entry, resolver)\n\n // Skip if no entities AND no migrations directory exists\n // (allows @app modules to run migrations even if entities can't be dynamically imported)\n if (!entities.length && !fs.existsSync(migrationsPath)) continue\n fs.mkdirSync(migrationsPath, { recursive: true })\n\n const tableName = `mikro_orm_migrations_${sanitizedModId}`\n validateTableName(tableName)\n\n // dbMigrate only runs existing migration files \u2014 entities are intentionally\n // omitted so MikroORM does not compare them against the snapshot and\n // auto-generate a phantom diff migration (that would duplicate tables\n // already created by committed migrations).\n const sslConfig = getSslConfig()\n const orm = await MikroORM.init<PostgreSqlDriver>({\n driver: PostgreSqlDriver,\n clientUrl: getClientUrl(),\n loggerFactory: () => createMinimalLogger(),\n dynamicImportProvider,\n entities: [],\n discovery: { warnWhenNoEntities: false },\n migrations: {\n path: migrationsPath,\n glob: '!(*.d).{ts,js}',\n tableName,\n dropTables: false,\n },\n schemaGenerator: {\n disableForeignKeys: true,\n },\n pool: {\n min: 1,\n max: 3,\n idleTimeoutMillis: 30000,\n acquireTimeoutMillis: 60000,\n destroyTimeoutMillis: 30000,\n },\n driverOptions: sslConfig ? {\n connection: {\n ssl: sslConfig,\n },\n } : undefined,\n })\n\n const migrator = orm.getMigrator() as Migrator\n const pending = await migrator.getPendingMigrations()\n if (!pending.length) {\n results.push(formatResult(modId, 'no pending migrations', ''))\n } else {\n const renderProgress = createProgressRenderer(pending.length)\n let applied = 0\n if (!QUIET_MODE) {\n process.stdout.write(` ${PROGRESS_EMOJI} ${modId}: ${renderProgress(applied)}`)\n }\n for (const migration of pending) {\n const migrationName =\n typeof migration === 'string'\n ? migration\n : (migration as any).name ?? (migration as any).fileName\n await migrator.up(migrationName ? { migrations: [migrationName] } : undefined)\n applied += 1\n if (!QUIET_MODE) {\n process.stdout.write(`\\r ${PROGRESS_EMOJI} ${modId}: ${renderProgress(applied)}`)\n }\n }\n if (!QUIET_MODE) process.stdout.write('\\n')\n results.push(\n formatResult(modId, `${pending.length} migration${pending.length === 1 ? '' : 's'} applied`, '')\n )\n }\n\n await orm.close(true)\n }\n\n console.log(results.join('\\n'))\n}\n\nexport async function dbGreenfield(resolver: PackageResolver, options: GreenfieldOptions): Promise<void> {\n if (!options.yes) {\n console.error('This command will DELETE all data. Use --yes to confirm.')\n process.exit(1)\n }\n\n console.log('Cleaning up migrations and snapshots for greenfield setup...')\n\n const modules = resolver.loadEnabledModules()\n const ordered = sortModules(modules)\n const results: string[] = []\n const outputDir = resolver.getOutputDir()\n\n for (const entry of ordered) {\n const modId = entry.id\n const migrationsPath = getMigrationsPath(entry, resolver)\n\n if (fs.existsSync(migrationsPath)) {\n // Remove all migration files\n const migrationFiles = fs\n .readdirSync(migrationsPath)\n .filter((file) => file.endsWith('.ts') && file.startsWith('Migration'))\n\n for (const file of migrationFiles) {\n fs.unlinkSync(path.join(migrationsPath, file))\n }\n\n // Remove snapshot files\n const snapshotFiles = fs\n .readdirSync(migrationsPath)\n .filter((file) => file.endsWith('.json') && file.includes('snapshot'))\n\n for (const file of snapshotFiles) {\n fs.unlinkSync(path.join(migrationsPath, file))\n }\n\n if (migrationFiles.length > 0 || snapshotFiles.length > 0) {\n results.push(\n formatResult(modId, `cleaned ${migrationFiles.length} migrations, ${snapshotFiles.length} snapshots`, '')\n )\n } else {\n results.push(formatResult(modId, 'already clean', ''))\n }\n } else {\n results.push(formatResult(modId, 'no migrations directory', ''))\n }\n\n // Clean up checksum files using glob pattern\n if (fs.existsSync(outputDir)) {\n const files = fs.readdirSync(outputDir)\n const checksumFiles = files.filter((file) => file.endsWith('.checksum'))\n\n for (const file of checksumFiles) {\n fs.unlinkSync(path.join(outputDir, file))\n }\n\n if (checksumFiles.length > 0) {\n results.push(formatResult(modId, `cleaned ${checksumFiles.length} checksum files`, ''))\n }\n }\n }\n\n console.log(results.join('\\n'))\n\n // Drop per-module MikroORM migration tables to ensure clean slate\n console.log('Dropping per-module migration tables...')\n try {\n const { Client } = await import('pg')\n const client = new Client({ connectionString: getClientUrl(), ssl: getSslConfig() })\n await client.connect()\n try {\n await client.query('BEGIN')\n for (const entry of ordered) {\n const modId = entry.id\n const sanitizedModId = sanitizeModuleId(modId)\n const tableName = `mikro_orm_migrations_${sanitizedModId}`\n validateTableName(tableName)\n await client.query(`DROP TABLE IF EXISTS \"${tableName}\"`)\n console.log(` ${modId}: dropped table ${tableName}`)\n }\n await client.query('COMMIT')\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n } finally {\n try {\n await client.end()\n } catch {}\n }\n } catch (e) {\n console.error('Failed to drop migration tables:', (e as any)?.message || e)\n throw e\n }\n\n // Drop all existing user tables to ensure fresh CREATE-only migrations\n console.log('Dropping ALL public tables for true greenfield...')\n try {\n const { Client } = await import('pg')\n const client = new Client({ connectionString: getClientUrl(), ssl: getSslConfig() })\n await client.connect()\n try {\n const res = await client.query(`SELECT tablename FROM pg_tables WHERE schemaname = 'public'`)\n const tables: string[] = (res.rows || []).map((r: any) => String(r.tablename))\n if (tables.length) {\n await client.query('BEGIN')\n try {\n await client.query(\"SET session_replication_role = 'replica'\")\n for (const t of tables) {\n await client.query(`DROP TABLE IF EXISTS \"${t}\" CASCADE`)\n }\n await client.query(\"SET session_replication_role = 'origin'\")\n await client.query('COMMIT')\n console.log(` Dropped ${tables.length} tables.`)\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n }\n } else {\n console.log(' No tables found to drop.')\n }\n } finally {\n try {\n await client.end()\n } catch {}\n }\n } catch (e) {\n console.error('Failed to drop public tables:', (e as any)?.message || e)\n throw e\n }\n\n // Generate fresh migrations for all modules\n console.log('Generating fresh migrations for all modules...')\n await dbGenerate(resolver)\n\n // Apply migrations\n console.log('Applying migrations...')\n await dbMigrate(resolver)\n\n console.log('Greenfield reset complete! Fresh migrations generated and applied.')\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -897,6 +897,8 @@ import type {
897
897
  ObjectDetailProps,
898
898
  ObjectPreviewProps,
899
899
  } from '@open-mercato/shared/modules/messages/types'
900
+ import { registerMessageObjectTypes } from '@open-mercato/core/modules/messages/lib/message-objects-registry'
901
+ import { configureMessageUiComponentRegistry } from '@open-mercato/core/modules/messages/components/utils/typeUiRegistry'
900
902
  ${messageTypeImportSection ? `
901
903
  ${messageTypeImportSection}
902
904
  ` : "\n"}${messageObjectImportSection ? `
@@ -973,6 +975,12 @@ export const messageUiComponentRegistry = registry
973
975
  export function getMessageUiComponentRegistry(): MessageUiComponentRegistry {
974
976
  return registry
975
977
  }
978
+
979
+ // Side-effects: register all message object types and configure the UI component registry on import.
980
+ for (const entry of messageObjectTypeEntriesRaw) {
981
+ registerMessageObjectTypes(entry.types)
982
+ }
983
+ configureMessageUiComponentRegistry(registry)
976
984
  `;
977
985
  {
978
986
  const enabledIds = new Set(enabled.map((e) => e.id));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/generators/module-registry.ts"],
4
- "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageResolver } from '../resolver'\nimport {\n calculateStructureChecksum,\n toVar,\n moduleHasExport,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n} from '../utils'\nimport {\n scanModuleDir,\n resolveModuleFile,\n SCAN_CONFIGS,\n type ModuleRoots,\n type ModuleImports,\n} from './scanner'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\nexport interface ModuleRegistryOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\ntype DashboardWidgetEntry = {\n moduleId: string\n key: string\n source: 'app' | 'package'\n importPath: string\n}\n\nfunction scanDashboardWidgetEntries(options: {\n modId: string\n roots: ModuleRoots\n appImportBase: string\n pkgImportBase: string\n}): DashboardWidgetEntry[] {\n const { modId, roots, appImportBase, pkgImportBase } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.dashboardWidgets)\n return files.map(({ relPath, fromApp }) => {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/widgets/dashboard/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n return { moduleId: modId, key, source, importPath }\n })\n}\n\nfunction processPageFiles(options: {\n files: Array<{ relPath: string; fromApp: boolean }>\n type: 'frontend' | 'backend'\n modId: string\n appDir: string\n pkgDir: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): string[] {\n const { files, type, modId, appDir, pkgDir, appImportBase, pkgImportBase, imports, importIdRef } = options\n const prefix = type === 'frontend' ? 'C' : 'B'\n const modPrefix = type === 'frontend' ? 'CM' : 'BM'\n const metaPrefix = type === 'frontend' ? 'M' : 'BM'\n const routes: string[] = []\n\n // Next-style page.tsx files\n for (const { relPath, fromApp } of files.filter(({ relPath: f }) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = relPath.split('/')\n segs.pop()\n const importName = `${prefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `${modPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${sub}`\n const routePath = type === 'frontend'\n ? '/' + (segs.join('/') || '')\n : '/backend/' + (segs.join('/') || modId)\n const metaCandidates = [\n path.join(fromApp ? appDir : pkgDir, ...segs, 'page.meta.ts'),\n path.join(fromApp ? appDir : pkgDir, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `${metaPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...segs, path.basename(metaPath).replace(/\\.ts$/, '')].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n const baseProps = `pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb`\n const extraProps = type === 'backend' ? `, pageContext: (${metaExpr})?.pageContext` : ''\n routes.push(`{ ${baseProps}${extraProps}, Component: ${importName} }`)\n }\n\n // Back-compat direct files (old-style pages like login.tsx instead of login/page.tsx)\n for (const { relPath, fromApp } of files.filter(({ relPath: f }) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const routeSegs = [...segs, name].filter(Boolean)\n const importName = `${prefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const pageModName = `${modPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...segs, name].join('/')}`\n const routePath = type === 'frontend'\n ? '/' + (routeSegs.join('/') || '')\n : '/backend/' + [modId, ...segs, name].filter(Boolean).join('/')\n const metaCandidates = [\n path.join(fromApp ? appDir : pkgDir, ...segs, `${name}.meta.ts`),\n path.join(fromApp ? appDir : pkgDir, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `${metaPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const metaBase = path.basename(metaPath)\n const metaImportSub = metaBase === 'meta.ts' ? 'meta' : name + '.meta'\n const metaImportPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = type === 'frontend' ? `(${metaImportName}.metadata as any)` : `${metaImportName}.metadata`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n const baseProps = `pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey`\n const extraFe = type === 'frontend' ? `, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled` : `, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, pageContext: (${metaExpr})?.pageContext`\n routes.push(`{ ${baseProps}${extraFe}, Component: ${importName} }`)\n }\n\n return routes\n}\n\nasync function processApiRoutes(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): Promise<string[]> {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const apiApp = path.join(roots.appBase, 'api')\n const apiPkg = path.join(roots.pkgBase, 'api')\n if (!fs.existsSync(apiApp) && !fs.existsSync(apiPkg)) return []\n\n const apis: string[] = []\n\n // route.ts aggregations\n const routeFiles = scanModuleDir(roots, SCAN_CONFIGS.apiRoutes)\n for (const { relPath, fromApp } of routeFiles) {\n const segs = relPath.split('/')\n segs.pop()\n const reqSegs = [modId, ...segs]\n const importName = `R${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...segs, 'route.ts')\n const apiSegPath = segs.join('/')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/api${apiSegPath ? `/${apiSegPath}` : ''}/route`\n const routePath = '/' + reqSegs.filter(Boolean).join('/')\n const sourceFile = fromApp ? appFile : path.join(apiPkg, ...segs, 'route.ts')\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n\n // Single files (plain .ts, not route.ts, not tests, skip method dirs)\n const plainFiles = scanModuleDir(roots, SCAN_CONFIGS.apiPlainFiles)\n for (const { relPath, fromApp } of plainFiles) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `R${importIdRef.value++}_${toVar(modId)}_${toVar(fullSegs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...fullSegs) + '.ts'\n const plainSegPath = fullSegs.join('/')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/api${plainSegPath ? `/${plainSegPath}` : ''}`\n const pkgFile = path.join(apiPkg, ...fullSegs) + '.ts'\n const sourceFile = fromApp ? appFile : pkgFile\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n\n // Legacy per-method\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']\n for (const method of methods) {\n const coreMethodDir = path.join(apiPkg, method.toLowerCase())\n const appMethodDir = path.join(apiApp, method.toLowerCase())\n const methodDir = fs.existsSync(appMethodDir) ? appMethodDir : coreMethodDir\n if (!fs.existsSync(methodDir)) continue\n const methodRoots: ModuleRoots = { appBase: methodDir, pkgBase: methodDir }\n const methodConfig = {\n folder: '',\n include: (name: string) => name.endsWith('.ts') && !/\\.(test|spec)\\.ts$/.test(name),\n }\n const apiFiles = scanModuleDir(methodRoots, methodConfig)\n for (const { relPath } of apiFiles) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `H${importIdRef.value++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const fromApp = methodDir === appMethodDir\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/api/${method.toLowerCase()}/${fullSegs.join('/')}`\n const metaName = `RM${importIdRef.value++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const sourceFile = path.join(methodDir, ...segs, file)\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${metaName}.openApi` : ''\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n apis.push(`{ method: '${method}', path: '${routePath}', handler: ${importName}, metadata: ${metaName}.metadata${docsPart} }`)\n }\n }\n\n return apis\n}\n\nfunction processSubscribers(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): string[] {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.subscribers)\n const subscribers: string[] = []\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importName = `Subscriber${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/subscribers/${[...segs, name].join('/')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const sid = [modId, ...segs, name].filter(Boolean).join(':')\n subscribers.push(\n `{ id: (((${metaName}.metadata) as any)?.id || '${sid}'), event: ((${metaName}.metadata) as any)?.event, persistent: ((${metaName}.metadata) as any)?.persistent, handler: ${importName} }`\n )\n }\n return subscribers\n}\n\nasync function processWorkers(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): Promise<string[]> {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.workers)\n const workers: string[] = []\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/workers/${[...segs, name].join('/')}`\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const wid = [modId, 'workers', ...segs, name].filter(Boolean).join(':')\n workers.push(\n `{ id: (${metaName}.metadata as { id?: string })?.id || '${wid}', queue: (${metaName}.metadata as { queue: string }).queue, concurrency: (${metaName}.metadata as { concurrency?: number })?.concurrency ?? 1, handler: ${importName} as (job: unknown, ctx: unknown) => Promise<void> }`\n )\n }\n return workers\n}\n\nfunction processTranslations(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n}): string[] {\n const { roots, modId, appImportBase, pkgImportBase, imports } = options\n const i18nApp = path.join(roots.appBase, 'i18n')\n const i18nCore = path.join(roots.pkgBase, 'i18n')\n const locales = new Set<string>()\n if (fs.existsSync(i18nCore))\n for (const e of fs.readdirSync(i18nCore, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n if (fs.existsSync(i18nApp))\n for (const e of fs.readdirSync(i18nApp, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n const translations: string[] = []\n for (const locale of locales) {\n const coreHas = fs.existsSync(path.join(i18nCore, `${locale}.json`))\n const appHas = fs.existsSync(path.join(i18nApp, `${locale}.json`))\n if (coreHas && appHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${cName} from '${pkgImportBase}/i18n/${locale}.json'`)\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(\n `'${locale}': { ...( ${cName} as unknown as Record<string,string> ), ...( ${aName} as unknown as Record<string,string> ) }`\n )\n } else if (appHas) {\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${aName} as unknown as Record<string,string>`)\n } else if (coreHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n imports.push(`import ${cName} from '${pkgImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n return translations\n}\n\n/**\n * Resolves a convention file and pushes its import + config entry to standalone arrays.\n * Used for files that produce their own generated output (notifications, AI tools, events, analytics, enrichers, etc.).\n *\n * @returns The generated import name, or null if the file was not found.\n */\nfunction processStandaloneConfig(options: {\n roots: ModuleRoots\n imps: ModuleImports\n modId: string\n relativePath: string\n prefix: string\n importIdRef: { value: number }\n standaloneImports: string[]\n standaloneConfigs: string[]\n configExpr: (importName: string, modId: string) => string\n /** Also push the import to the shared imports array (used by modules.generated.ts) */\n sharedImports?: string[]\n}): string | null {\n const { roots, imps, modId, relativePath, prefix, importIdRef, standaloneImports, standaloneConfigs, configExpr, sharedImports } = options\n const resolved = resolveModuleFile(roots, imps, relativePath)\n if (!resolved) return null\n const importName = `${prefix}_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n standaloneImports.push(importStmt)\n if (sharedImports) sharedImports.push(importStmt)\n standaloneConfigs.push(configExpr(importName, modId))\n return importName\n}\n\nfunction resolveConventionFile(\n roots: ModuleRoots,\n imps: ModuleImports,\n relativePath: string,\n prefix: string,\n modId: string,\n importIdRef: { value: number },\n imports: string[],\n importStyle: 'namespace' | 'default' = 'namespace'\n): { importName: string; importPath: string; fromApp: boolean } | null {\n const resolved = resolveModuleFile(roots, imps, relativePath)\n if (!resolved) return null\n const importName = `${prefix}_${toVar(modId)}_${importIdRef.value++}`\n if (importStyle === 'default') {\n imports.push(`import ${importName} from '${resolved.importPath}'`)\n } else {\n imports.push(`import * as ${importName} from '${resolved.importPath}'`)\n }\n return { importName, importPath: resolved.importPath, fromApp: resolved.fromApp }\n}\n\nexport async function generateModuleRegistry(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.generated.checksum')\n const widgetsOutFile = path.join(outputDir, 'dashboard-widgets.generated.ts')\n const widgetsChecksumFile = path.join(outputDir, 'dashboard-widgets.generated.checksum')\n const injectionWidgetsOutFile = path.join(outputDir, 'injection-widgets.generated.ts')\n const injectionWidgetsChecksumFile = path.join(outputDir, 'injection-widgets.generated.checksum')\n const injectionTablesOutFile = path.join(outputDir, 'injection-tables.generated.ts')\n const injectionTablesChecksumFile = path.join(outputDir, 'injection-tables.generated.checksum')\n const searchOutFile = path.join(outputDir, 'search.generated.ts')\n const searchChecksumFile = path.join(outputDir, 'search.generated.checksum')\n const notificationsOutFile = path.join(outputDir, 'notifications.generated.ts')\n const notificationsChecksumFile = path.join(outputDir, 'notifications.generated.checksum')\n const notificationsClientOutFile = path.join(outputDir, 'notifications.client.generated.ts')\n const notificationsClientChecksumFile = path.join(outputDir, 'notifications.client.generated.checksum')\n const messageTypesOutFile = path.join(outputDir, 'message-types.generated.ts')\n const messageTypesChecksumFile = path.join(outputDir, 'message-types.generated.checksum')\n const messageObjectsOutFile = path.join(outputDir, 'message-objects.generated.ts')\n const messageObjectsChecksumFile = path.join(outputDir, 'message-objects.generated.checksum')\n const messagesClientOutFile = path.join(outputDir, 'messages.client.generated.ts')\n const messagesClientChecksumFile = path.join(outputDir, 'messages.client.generated.checksum')\n const aiToolsOutFile = path.join(outputDir, 'ai-tools.generated.ts')\n const aiToolsChecksumFile = path.join(outputDir, 'ai-tools.generated.checksum')\n const eventsOutFile = path.join(outputDir, 'events.generated.ts')\n const eventsChecksumFile = path.join(outputDir, 'events.generated.checksum')\n const analyticsOutFile = path.join(outputDir, 'analytics.generated.ts')\n const analyticsChecksumFile = path.join(outputDir, 'analytics.generated.checksum')\n const transFieldsOutFile = path.join(outputDir, 'translations-fields.generated.ts')\n const transFieldsChecksumFile = path.join(outputDir, 'translations-fields.generated.checksum')\n const enrichersOutFile = path.join(outputDir, 'enrichers.generated.ts')\n const enrichersChecksumFile = path.join(outputDir, 'enrichers.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n // Mutable ref so extracted helper functions can increment the shared counter\n const importIdRef = { value: 0 }\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n const allDashboardWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionTables: Array<{ moduleId: string; importPath: string; importName: string }> = []\n const searchConfigs: string[] = []\n const searchImports: string[] = []\n const notificationTypes: string[] = []\n const notificationImports: string[] = []\n const notificationClientTypes: string[] = []\n const notificationClientImports: string[] = []\n const messageTypeEntries: string[] = []\n const messageTypeImports: string[] = []\n const messageObjectTypeEntries: string[] = []\n const messageObjectTypeImports: string[] = []\n const aiToolsConfigs: string[] = []\n const aiToolsImports: string[] = []\n const eventsConfigs: string[] = []\n const eventsImports: string[] = []\n const analyticsConfigs: string[] = []\n const analyticsImports: string[] = []\n const transFieldsConfigs: string[] = []\n const transFieldsImports: string[] = []\n const enricherConfigs: string[] = []\n const enricherImports: string[] = []\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const rawImps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : rawImps.appBase\n const imps: ModuleImports = { appBase: appImportBase, pkgBase: rawImps.pkgBase }\n\n const frontendRoutes: string[] = []\n const backendRoutes: string[] = []\n const apis: string[] = []\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let searchImportName: string | null = null\n let eventsImportName: string | null = null\n let analyticsImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n const dashboardWidgets: string[] = []\n const injectionWidgets: string[] = []\n let injectionTableImportName: string | null = null\n let setupImportName: string | null = null\n\n // === Processing order MUST match original import ID sequence ===\n\n // 1. Module metadata: index.ts (overrideable)\n const appIndex = path.join(roots.appBase, 'index.ts')\n const pkgIndex = path.join(roots.pkgBase, 'index.ts')\n const indexTs = fs.existsSync(appIndex) ? appIndex : fs.existsSync(pkgIndex) ? pkgIndex : null\n if (indexTs) {\n infoImportName = `I${importIdRef.value++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // 2. Pages: frontend\n {\n const feApp = path.join(roots.appBase, 'frontend')\n const fePkg = path.join(roots.pkgBase, 'frontend')\n const feFiles = scanModuleDir(roots, SCAN_CONFIGS.frontendPages)\n if (feFiles.length) {\n frontendRoutes.push(...processPageFiles({\n files: feFiles,\n type: 'frontend',\n modId,\n appDir: feApp,\n pkgDir: fePkg,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n }\n }\n\n // 3. Entity extensions: data/extensions.ts\n {\n const ext = resolveConventionFile(roots, imps, 'data/extensions.ts', 'X', modId, importIdRef, imports)\n if (ext) extensionsImportName = ext.importName\n }\n\n // 4. RBAC: acl.ts\n {\n const rootApp = path.join(roots.appBase, 'acl.ts')\n const rootPkg = path.join(roots.pkgBase, 'acl.ts')\n const hasRoot = fs.existsSync(rootApp) || fs.existsSync(rootPkg)\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importIdRef.value++}`\n const useApp = fs.existsSync(rootApp) ? rootApp : rootPkg\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // 5. Custom entities: ce.ts\n {\n const ce = resolveConventionFile(roots, imps, 'ce.ts', 'CE', modId, importIdRef, imports)\n if (ce) customEntitiesImportName = ce.importName\n }\n\n // 6. Search: search.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'search.ts')\n if (resolved) {\n const importName = `SEARCH_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n imports.push(importStmt)\n searchImports.push(importStmt)\n searchImportName = importName\n }\n }\n\n // 7. Notifications: notifications.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'notifications.ts',\n prefix: 'NOTIF',\n standaloneImports: notificationImports,\n standaloneConfigs: notificationTypes,\n configExpr: (n, id) => `{ moduleId: '${id}', types: ((${n}.default ?? ${n}.notificationTypes ?? (${n} as any).types ?? []) as NotificationTypeDefinition[]) }`,\n })\n\n // Notification client renderers: notifications.client.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'notifications.client.ts',\n prefix: 'NOTIF_CLIENT',\n standaloneImports: notificationClientImports,\n standaloneConfigs: notificationClientTypes,\n configExpr: (n, id) => `{ moduleId: '${id}', types: (${n}.default ?? []) }`,\n })\n // Message types: module root message-types.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'message-types.ts')\n if (resolved) {\n const importName = `MSG_TYPES_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n messageTypeImports.push(importStmt)\n messageTypeEntries.push(\n `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageTypes ?? (${importName} as any).types ?? []) as MessageTypeDefinition[]) }`\n )\n }\n }\n\n // Message object types: module root message-objects.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'message-objects.ts')\n if (resolved) {\n const importName = `MSG_OBJECTS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n messageObjectTypeImports.push(importStmt)\n messageObjectTypeEntries.push(\n `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageObjectTypes ?? (${importName} as any).objectTypes ?? (${importName} as any).types ?? []) as MessageObjectTypeDefinition[]) }`\n )\n }\n }\n\n // AI Tools: module root ai-tools.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'notifications.client.ts')\n if (resolved) {\n const importName = `NOTIF_CLIENT_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n notificationClientImports.push(importStmt)\n notificationClientTypes.push(\n `{ moduleId: '${modId}', types: (${importName}.default ?? []) }`\n )\n }\n }\n\n // 8. AI Tools: ai-tools.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'ai-tools.ts',\n prefix: 'AI_TOOLS',\n standaloneImports: aiToolsImports,\n standaloneConfigs: aiToolsConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', tools: (${n}.aiTools ?? ${n}.default ?? []) }`,\n })\n\n // 9. Events: events.ts (also referenced in module declarations)\n eventsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'events.ts',\n prefix: 'EVENTS',\n standaloneImports: eventsImports,\n standaloneConfigs: eventsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', config: (${n}.default ?? ${n}.eventsConfig ?? null) as EventModuleConfigBase | null }`,\n })\n\n // 10. Analytics: analytics.ts (also referenced in module declarations)\n analyticsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'analytics.ts',\n prefix: 'ANALYTICS',\n standaloneImports: analyticsImports,\n standaloneConfigs: analyticsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', config: (${n}.default ?? ${n}.analyticsConfig ?? ${n}.config ?? null) }`,\n })\n\n // 10b. Enrichers: data/enrichers.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'data/enrichers.ts',\n prefix: 'ENRICHERS',\n standaloneImports: enricherImports,\n standaloneConfigs: enricherConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', enrichers: ((${n} as any).enrichers ?? (${n} as any).default ?? []) }`,\n })\n\n // Translatable fields: translations.ts (also referenced in module declarations)\n let transFieldsImportName: string | null = null\n transFieldsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'translations.ts',\n prefix: 'TRANS_FIELDS',\n standaloneImports: transFieldsImports,\n standaloneConfigs: transFieldsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', fields: (${n}.default ?? ${n}.translatableFields ?? {}) as Record<string, string[]> }`,\n })\n\n // 11. Setup: setup.ts\n {\n const setup = resolveConventionFile(roots, imps, 'setup.ts', 'SETUP', modId, importIdRef, imports)\n if (setup) setupImportName = setup.importName\n }\n\n // 12. Custom fields: data/fields.ts\n {\n const fields = resolveConventionFile(roots, imps, 'data/fields.ts', 'F', modId, importIdRef, imports)\n if (fields) fieldsImportName = fields.importName\n }\n\n // 13. Pages: backend\n {\n const beApp = path.join(roots.appBase, 'backend')\n const bePkg = path.join(roots.pkgBase, 'backend')\n const beFiles = scanModuleDir(roots, SCAN_CONFIGS.backendPages)\n if (beFiles.length) {\n backendRoutes.push(...processPageFiles({\n files: beFiles,\n type: 'backend',\n modId,\n appDir: beApp,\n pkgDir: bePkg,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n }\n }\n\n // 14. API routes\n apis.push(...await processApiRoutes({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 15. CLI\n {\n const cliApp = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n }\n\n // 16. Translations\n translations.push(...processTranslations({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n }))\n\n // 17. Subscribers\n subscribers.push(...processSubscribers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 18. Workers\n workers.push(...await processWorkers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Build combined customFieldSets expression\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n // 19. Dashboard widgets\n {\n const entries = scanDashboardWidgetEntries({\n modId,\n roots,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n })\n for (const entry of entries) {\n dashboardWidgets.push(\n `{ moduleId: '${entry.moduleId}', key: '${entry.key}', source: '${entry.source}', loader: () => import('${entry.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allDashboardWidgets.get(entry.key)\n if (!existing || (existing.source !== 'app' && entry.source === 'app')) {\n allDashboardWidgets.set(entry.key, {\n moduleId: entry.moduleId,\n source: entry.source,\n importPath: entry.importPath,\n })\n }\n }\n }\n\n // 20. Injection widgets\n {\n const files = scanModuleDir(roots, SCAN_CONFIGS.injectionWidgets)\n const widgetApp = path.join(roots.appBase, 'widgets', 'injection')\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/injection/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n injectionWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allInjectionWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allInjectionWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n\n // 21. Injection table\n {\n const resolved = resolveModuleFile(roots, imps, 'widgets/injection-table.ts')\n if (resolved) {\n const importName = `InjTable_${toVar(modId)}_${importIdRef.value++}`\n imports.push(`import * as ${importName} from '${resolved.importPath}'`)\n injectionTableImportName = importName\n allInjectionTables.push({ moduleId: modId, importPath: resolved.importPath, importName })\n }\n }\n\n if (searchImportName) {\n searchConfigs.push(`{ moduleId: '${modId}', config: (${searchImportName}.default ?? ${searchImportName}.searchConfig ?? ${searchImportName}.config ?? null) }`)\n }\n\n // Note: events, analytics, enrichers, notifications, AI tools, and translatable fields\n // configs are pushed inside processStandaloneConfig() above \u2014 no separate push needed here.\n\n if (transFieldsImportName) {\n transFieldsConfigs.push(`{ moduleId: '${modId}', fields: (${transFieldsImportName}.default ?? ${transFieldsImportName}.translatableFields ?? {}) as Record<string, string[]> }`)\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${frontendRoutes.length ? `frontendRoutes: [${frontendRoutes.join(', ')}],` : ''}\n ${backendRoutes.length ? `backendRoutes: [${backendRoutes.join(', ')}],` : ''}\n ${apis.length ? `apis: [${apis.join(', ')}],` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as import('@open-mercato/shared/modules/entities').EntityExtension[]) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${dashboardWidgets.length ? `dashboardWidgets: [${dashboardWidgets.join(', ')}],` : ''}\n ${setupImportName ? `setup: (${setupImportName}.default ?? ${setupImportName}.setup) || undefined,` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n const widgetEntriesList = Array.from(allDashboardWidgets.entries()).sort(([a], [b]) => a.localeCompare(b))\n const widgetDecls = widgetEntriesList.map(\n ([key, data]) =>\n ` { moduleId: '${data.moduleId}', key: '${key}', source: '${data.source}', loader: () => import('${data.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const widgetsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleDashboardWidgetEntry } from '@open-mercato/shared/modules/registry'\n\nexport const dashboardWidgetEntries: ModuleDashboardWidgetEntry[] = [\n${widgetDecls.join(',\\n')}\n]\n`\n const searchEntriesLiteral = searchConfigs.join(',\\n ')\n const searchImportSection = searchImports.join('\\n')\n const searchOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { SearchModuleConfig } from '@open-mercato/shared/modules/search'\n${searchImportSection ? `\\n${searchImportSection}\\n` : '\\n'}type SearchConfigEntry = { moduleId: string; config: SearchModuleConfig | null }\n\nconst entriesRaw: SearchConfigEntry[] = [\n${searchEntriesLiteral ? ` ${searchEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((entry): entry is { moduleId: string; config: SearchModuleConfig } => entry.config != null)\n\nexport const searchModuleConfigEntries = entries\nexport const searchModuleConfigs: SearchModuleConfig[] = entries.map((entry) => entry.config)\n`\n const eventsEntriesLiteral = eventsConfigs.join(',\\n ')\n const eventsImportSection = eventsImports.join('\\n')\n const eventsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { EventModuleConfigBase, EventDefinition } from '@open-mercato/shared/modules/events'\n${eventsImportSection ? `\\n${eventsImportSection}\\n` : '\\n'}type EventConfigEntry = { moduleId: string; config: EventModuleConfigBase | null }\n\nconst entriesRaw: EventConfigEntry[] = [\n${eventsEntriesLiteral ? ` ${eventsEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((e): e is { moduleId: string; config: EventModuleConfigBase } => e.config != null)\n\nexport const eventModuleConfigEntries = entries\nexport const eventModuleConfigs: EventModuleConfigBase[] = entries.map((e) => e.config)\nexport const allEvents: EventDefinition[] = entries.flatMap((e) => e.config.events)\n\n// Runtime registry for validation\nconst allDeclaredEventIds = new Set(allEvents.map((e) => e.id))\nexport function isEventDeclared(eventId: string): boolean {\n return allDeclaredEventIds.has(eventId)\n}\n`\n\n const analyticsEntriesLiteral = analyticsConfigs.join(',\\n ')\n const analyticsImportSection = analyticsImports.join('\\n')\n const analyticsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { AnalyticsModuleConfig } from '@open-mercato/shared/modules/analytics'\n${analyticsImportSection ? `\\n${analyticsImportSection}\\n` : '\\n'}type AnalyticsConfigEntry = { moduleId: string; config: AnalyticsModuleConfig | null }\n\nconst entriesRaw: AnalyticsConfigEntry[] = [\n${analyticsEntriesLiteral ? ` ${analyticsEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((entry): entry is { moduleId: string; config: AnalyticsModuleConfig } => entry.config != null)\n\nexport const analyticsModuleConfigEntries = entries\nexport const analyticsModuleConfigs: AnalyticsModuleConfig[] = entries.map((entry) => entry.config)\n`\n\n const transFieldsEntriesLiteral = transFieldsConfigs.join(',\\n ')\n const transFieldsImportSection = transFieldsImports.join('\\n')\n const transFieldsOutput = `// AUTO-GENERATED by mercato generate registry\nimport { registerTranslatableFields } from '@open-mercato/shared/lib/localization/translatable-fields'\n${transFieldsImportSection ? `\\n${transFieldsImportSection}\\n` : '\\n'}type TransFieldsEntry = { moduleId: string; fields: Record<string, string[]> }\n\nconst entries: TransFieldsEntry[] = [\n${transFieldsEntriesLiteral ? ` ${transFieldsEntriesLiteral}\\n` : ''}]\n\nconst allFields: Record<string, string[]> = {}\nfor (const entry of entries) {\n for (const [key, value] of Object.entries(entry.fields)) {\n allFields[key] = value\n }\n}\n\nexport const translatableFieldEntries = entries\nexport const allTranslatableFields = allFields\nexport const allTranslatableEntityTypes = Object.keys(allFields)\n\n// Auto-register on import (side-effect)\nregisterTranslatableFields(allFields)\n`\n\n const notificationEntriesLiteral = notificationTypes.join(',\\n ')\n const notificationImportSection = notificationImports.join('\\n')\n const notificationsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'\n${notificationImportSection ? `\\n${notificationImportSection}\\n` : '\\n'}type NotificationTypeEntry = { moduleId: string; types: NotificationTypeDefinition[] }\n\nconst entriesRaw: NotificationTypeEntry[] = [\n${notificationEntriesLiteral ? ` ${notificationEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const notificationTypeEntries = entriesRaw\nexport const notificationTypes = allTypes\n\nexport function getNotificationTypes(): NotificationTypeDefinition[] {\n return allTypes\n}\n\nexport function getNotificationType(type: string): NotificationTypeDefinition | undefined {\n return allTypes.find((t) => t.type === type)\n}\n`\n const notificationClientEntriesLiteral = notificationClientTypes.join(',\\n ')\n const notificationClientImportSection = notificationClientImports.join('\\n')\n const notificationsClientOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ComponentType } from 'react'\nimport type { NotificationTypeDefinition, NotificationRendererProps } from '@open-mercato/shared/modules/notifications/types'\n${notificationClientImportSection ? `\\n${notificationClientImportSection}\\n` : '\\n'}type NotificationTypeEntry = { moduleId: string; types: NotificationTypeDefinition[] }\nexport type NotificationRenderers = Record<string, ComponentType<NotificationRendererProps>>\n\nconst entriesRaw: NotificationTypeEntry[] = [\n${notificationClientEntriesLiteral ? ` ${notificationClientEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\nconst renderers: NotificationRenderers = Object.fromEntries(\n allTypes\n .filter((typeDef) => Boolean(typeDef.Renderer))\n .map((typeDef) => [typeDef.type, typeDef.Renderer!]),\n)\n\nexport const notificationClientTypeEntries = entriesRaw\nexport const notificationClientTypes = allTypes\nexport const notificationRenderers = renderers\n\nexport function getNotificationRenderers(): NotificationRenderers {\n return renderers\n}\n`\n\n const messageTypeEntriesLiteral = messageTypeEntries.join(',\\n ')\n const messageTypeImportSection = messageTypeImports.join('\\n')\n const messageTypesOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { MessageTypeDefinition } from '@open-mercato/shared/modules/messages/types'\n${messageTypeImportSection ? `\\n${messageTypeImportSection}\\n` : '\\n'}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }\n\nconst entriesRaw: MessageTypeEntry[] = [\n${messageTypeEntriesLiteral ? ` ${messageTypeEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const messageTypeEntries = entriesRaw\nexport const messageTypes = allTypes\n\nexport function getMessageTypes(): MessageTypeDefinition[] {\n return allTypes\n}\n\nexport function getMessageType(type: string): MessageTypeDefinition | undefined {\n return allTypes.find((entry) => entry.type === type)\n}\n`\n\n const messageObjectEntriesLiteral = messageObjectTypeEntries.join(',\\n ')\n const messageObjectImportSection = messageObjectTypeImports.join('\\n')\n const messageObjectsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { MessageObjectTypeDefinition } from '@open-mercato/shared/modules/messages/types'\n${messageObjectImportSection ? `\\n${messageObjectImportSection}\\n` : '\\n'}type MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }\n\nconst entriesRaw: MessageObjectTypeEntry[] = [\n${messageObjectEntriesLiteral ? ` ${messageObjectEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const messageObjectTypeEntries = entriesRaw\nexport const messageObjectTypes = allTypes\n\nexport function getMessageObjectTypes(): MessageObjectTypeDefinition[] {\n return allTypes\n}\n\nexport function getMessageObjectType(module: string, entityType: string): MessageObjectTypeDefinition | undefined {\n return allTypes.find((entry) => entry.module === module && entry.entityType === entityType)\n}\n`\n const messagesClientOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ComponentType } from 'react'\nimport type {\n MessageTypeDefinition,\n MessageObjectTypeDefinition,\n MessageListItemProps,\n MessageContentProps,\n MessageActionsProps,\n ObjectDetailProps,\n ObjectPreviewProps,\n} from '@open-mercato/shared/modules/messages/types'\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\n // Enrichers generated file\n const enricherEntriesLiteral = enricherConfigs.join(',\\n ')\n const enricherImportSection = enricherImports.join('\\n')\n const enrichersOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ResponseEnricher } from '@open-mercato/shared/lib/crud/response-enricher'\n${enricherImportSection ? `\\n${enricherImportSection}\\n` : '\\n'}type EnricherEntry = { moduleId: string; enrichers: ResponseEnricher[] }\n\nexport const enricherEntries: EnricherEntry[] = [\n${enricherEntriesLiteral ? ` ${enricherEntriesLiteral}\\n` : ''}]\n`\n writeGeneratedFile({ outFile: enrichersOutFile, checksumFile: enrichersChecksumFile, content: enrichersOutput, structureChecksum, result, quiet })\n\n return result\n}\n\n/**\n * Generate a CLI-specific module registry that excludes Next.js dependent code.\n * This produces modules.cli.generated.ts which can be loaded without Next.js runtime.\n *\n * Includes: module metadata, CLI commands, translations, subscribers, workers, entity extensions,\n * features/ACL, custom entities, vector config, custom fields, dashboard widgets\n * Excludes: frontend routes, backend routes, API handlers, injection widgets\n */\nexport async function generateModuleRegistryCli(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.cli.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.cli.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n // Mutable ref so extracted helper functions can increment the shared counter\n const importIdRef = { value: 0 }\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const rawImps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : rawImps.appBase\n const imps: ModuleImports = { appBase: appImportBase, pkgBase: rawImps.pkgBase }\n\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let vectorImportName: string | null = null\n const dashboardWidgets: string[] = []\n let setupImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n\n // Module metadata: index.ts (overrideable)\n const appIndex = path.join(roots.appBase, 'index.ts')\n const pkgIndex = path.join(roots.pkgBase, 'index.ts')\n const indexTs = fs.existsSync(appIndex) ? appIndex : fs.existsSync(pkgIndex) ? pkgIndex : null\n if (indexTs) {\n infoImportName = `I${importIdRef.value++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // Module setup configuration: setup.ts\n {\n const setup = resolveConventionFile(roots, imps, 'setup.ts', 'SETUP', modId, importIdRef, imports)\n if (setup) setupImportName = setup.importName\n }\n\n // Entity extensions: data/extensions.ts\n {\n const ext = resolveConventionFile(roots, imps, 'data/extensions.ts', 'X', modId, importIdRef, imports)\n if (ext) extensionsImportName = ext.importName\n }\n\n // RBAC: acl.ts\n {\n const rootApp = path.join(roots.appBase, 'acl.ts')\n const rootPkg = path.join(roots.pkgBase, 'acl.ts')\n const hasRoot = fs.existsSync(rootApp) || fs.existsSync(rootPkg)\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importIdRef.value++}`\n const useApp = fs.existsSync(rootApp) ? rootApp : rootPkg\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities: ce.ts\n {\n const ce = resolveConventionFile(roots, imps, 'ce.ts', 'CE', modId, importIdRef, imports)\n if (ce) customEntitiesImportName = ce.importName\n }\n\n // Vector search configuration: vector.ts\n {\n const vec = resolveConventionFile(roots, imps, 'vector.ts', 'VECTOR', modId, importIdRef, imports)\n if (vec) vectorImportName = vec.importName\n }\n\n // Custom fields: data/fields.ts\n {\n const fields = resolveConventionFile(roots, imps, 'data/fields.ts', 'F', modId, importIdRef, imports)\n if (fields) fieldsImportName = fields.importName\n }\n\n // CLI\n {\n const cliApp = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n }\n\n // Translations\n translations.push(...processTranslations({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n }))\n\n // Subscribers\n subscribers.push(...processSubscribers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Workers\n workers.push(...await processWorkers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Build combined customFieldSets expression\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n // Dashboard widgets\n {\n const entries = scanDashboardWidgetEntries({\n modId,\n roots,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n })\n for (const entry of entries) {\n dashboardWidgets.push(\n `{ moduleId: '${entry.moduleId}', key: '${entry.key}', source: '${entry.source}', loader: () => import('${entry.importPath}').then((mod) => mod.default ?? mod) }`\n )\n }\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as any) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${dashboardWidgets.length ? `dashboardWidgets: [${dashboardWidgets.join(', ')}],` : ''}\n ${vectorImportName ? `vector: (${vectorImportName}.default ?? ${vectorImportName}.vectorConfig ?? ${vectorImportName}.config ?? undefined),` : ''}\n ${setupImportName ? `setup: (${setupImportName}.default ?? ${setupImportName}.setup) || undefined,` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry (CLI version)\n// This file excludes Next.js dependent code (routes, APIs, injection widgets)\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n\n // Validate module dependencies declared via ModuleInfo.requires\n {\n const enabledIds = new Set(enabled.map((e) => e.id))\n const problems: string[] = []\n for (const [modId, reqs] of requiresByModule.entries()) {\n const missing = reqs.filter((r) => !enabledIds.has(r))\n if (missing.length) {\n problems.push(`- Module \"${modId}\" requires: ${missing.join(', ')}`)\n }\n }\n if (problems.length) {\n console.error('\\nModule dependency check failed:')\n for (const p of problems) console.error(p)\n console.error('\\nFix: Enable required module(s) in src/modules.ts. Example:')\n console.error(\n ' export const enabledModules = [ { id: \\'' +\n Array.from(new Set(requiresByModule.values()).values()).join(\"' }, { id: '\") +\n \"' } ]\"\n )\n process.exit(1)\n }\n }\n\n const structureChecksum = calculateStructureChecksum(Array.from(trackedRoots))\n writeGeneratedFile({ outFile, checksumFile, content: output, structureChecksum, result, quiet })\n\n return result\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageResolver } from '../resolver'\nimport {\n calculateStructureChecksum,\n toVar,\n moduleHasExport,\n type GeneratorResult,\n createGeneratorResult,\n writeGeneratedFile,\n} from '../utils'\nimport {\n scanModuleDir,\n resolveModuleFile,\n SCAN_CONFIGS,\n type ModuleRoots,\n type ModuleImports,\n} from './scanner'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\nexport interface ModuleRegistryOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\ntype DashboardWidgetEntry = {\n moduleId: string\n key: string\n source: 'app' | 'package'\n importPath: string\n}\n\nfunction scanDashboardWidgetEntries(options: {\n modId: string\n roots: ModuleRoots\n appImportBase: string\n pkgImportBase: string\n}): DashboardWidgetEntry[] {\n const { modId, roots, appImportBase, pkgImportBase } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.dashboardWidgets)\n return files.map(({ relPath, fromApp }) => {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/widgets/dashboard/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n return { moduleId: modId, key, source, importPath }\n })\n}\n\nfunction processPageFiles(options: {\n files: Array<{ relPath: string; fromApp: boolean }>\n type: 'frontend' | 'backend'\n modId: string\n appDir: string\n pkgDir: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): string[] {\n const { files, type, modId, appDir, pkgDir, appImportBase, pkgImportBase, imports, importIdRef } = options\n const prefix = type === 'frontend' ? 'C' : 'B'\n const modPrefix = type === 'frontend' ? 'CM' : 'BM'\n const metaPrefix = type === 'frontend' ? 'M' : 'BM'\n const routes: string[] = []\n\n // Next-style page.tsx files\n for (const { relPath, fromApp } of files.filter(({ relPath: f }) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = relPath.split('/')\n segs.pop()\n const importName = `${prefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `${modPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${sub}`\n const routePath = type === 'frontend'\n ? '/' + (segs.join('/') || '')\n : '/backend/' + (segs.join('/') || modId)\n const metaCandidates = [\n path.join(fromApp ? appDir : pkgDir, ...segs, 'page.meta.ts'),\n path.join(fromApp ? appDir : pkgDir, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `${metaPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...segs, path.basename(metaPath).replace(/\\.ts$/, '')].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n const baseProps = `pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb`\n const extraProps = type === 'backend' ? `, pageContext: (${metaExpr})?.pageContext` : ''\n routes.push(`{ ${baseProps}${extraProps}, Component: ${importName} }`)\n }\n\n // Back-compat direct files (old-style pages like login.tsx instead of login/page.tsx)\n for (const { relPath, fromApp } of files.filter(({ relPath: f }) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const routeSegs = [...segs, name].filter(Boolean)\n const importName = `${prefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const pageModName = `${modPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...segs, name].join('/')}`\n const routePath = type === 'frontend'\n ? '/' + (routeSegs.join('/') || '')\n : '/backend/' + [modId, ...segs, name].filter(Boolean).join('/')\n const metaCandidates = [\n path.join(fromApp ? appDir : pkgDir, ...segs, `${name}.meta.ts`),\n path.join(fromApp ? appDir : pkgDir, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `${metaPrefix}${importIdRef.value++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const metaBase = path.basename(metaPath)\n const metaImportSub = metaBase === 'meta.ts' ? 'meta' : name + '.meta'\n const metaImportPath = `${fromApp ? appImportBase : pkgImportBase}/${type}/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = type === 'frontend' ? `(${metaImportName}.metadata as any)` : `${metaImportName}.metadata`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n const baseProps = `pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey`\n const extraFe = type === 'frontend' ? `, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled` : `, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, pageContext: (${metaExpr})?.pageContext`\n routes.push(`{ ${baseProps}${extraFe}, Component: ${importName} }`)\n }\n\n return routes\n}\n\nasync function processApiRoutes(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): Promise<string[]> {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const apiApp = path.join(roots.appBase, 'api')\n const apiPkg = path.join(roots.pkgBase, 'api')\n if (!fs.existsSync(apiApp) && !fs.existsSync(apiPkg)) return []\n\n const apis: string[] = []\n\n // route.ts aggregations\n const routeFiles = scanModuleDir(roots, SCAN_CONFIGS.apiRoutes)\n for (const { relPath, fromApp } of routeFiles) {\n const segs = relPath.split('/')\n segs.pop()\n const reqSegs = [modId, ...segs]\n const importName = `R${importIdRef.value++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...segs, 'route.ts')\n const apiSegPath = segs.join('/')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/api${apiSegPath ? `/${apiSegPath}` : ''}/route`\n const routePath = '/' + reqSegs.filter(Boolean).join('/')\n const sourceFile = fromApp ? appFile : path.join(apiPkg, ...segs, 'route.ts')\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n\n // Single files (plain .ts, not route.ts, not tests, skip method dirs)\n const plainFiles = scanModuleDir(roots, SCAN_CONFIGS.apiPlainFiles)\n for (const { relPath, fromApp } of plainFiles) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `R${importIdRef.value++}_${toVar(modId)}_${toVar(fullSegs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...fullSegs) + '.ts'\n const plainSegPath = fullSegs.join('/')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/api${plainSegPath ? `/${plainSegPath}` : ''}`\n const pkgFile = path.join(apiPkg, ...fullSegs) + '.ts'\n const sourceFile = fromApp ? appFile : pkgFile\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n\n // Legacy per-method\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']\n for (const method of methods) {\n const coreMethodDir = path.join(apiPkg, method.toLowerCase())\n const appMethodDir = path.join(apiApp, method.toLowerCase())\n const methodDir = fs.existsSync(appMethodDir) ? appMethodDir : coreMethodDir\n if (!fs.existsSync(methodDir)) continue\n const methodRoots: ModuleRoots = { appBase: methodDir, pkgBase: methodDir }\n const methodConfig = {\n folder: '',\n include: (name: string) => name.endsWith('.ts') && !/\\.(test|spec)\\.ts$/.test(name),\n }\n const apiFiles = scanModuleDir(methodRoots, methodConfig)\n for (const { relPath } of apiFiles) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `H${importIdRef.value++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const fromApp = methodDir === appMethodDir\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/api/${method.toLowerCase()}/${fullSegs.join('/')}`\n const metaName = `RM${importIdRef.value++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const sourceFile = path.join(methodDir, ...segs, file)\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${metaName}.openApi` : ''\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n apis.push(`{ method: '${method}', path: '${routePath}', handler: ${importName}, metadata: ${metaName}.metadata${docsPart} }`)\n }\n }\n\n return apis\n}\n\nfunction processSubscribers(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): string[] {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.subscribers)\n const subscribers: string[] = []\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importName = `Subscriber${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/subscribers/${[...segs, name].join('/')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const sid = [modId, ...segs, name].filter(Boolean).join(':')\n subscribers.push(\n `{ id: (((${metaName}.metadata) as any)?.id || '${sid}'), event: ((${metaName}.metadata) as any)?.event, persistent: ((${metaName}.metadata) as any)?.persistent, handler: ${importName} }`\n )\n }\n return subscribers\n}\n\nasync function processWorkers(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n importIdRef: { value: number }\n}): Promise<string[]> {\n const { roots, modId, appImportBase, pkgImportBase, imports, importIdRef } = options\n const files = scanModuleDir(roots, SCAN_CONFIGS.workers)\n const workers: string[] = []\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importPath = `${fromApp ? appImportBase : pkgImportBase}/workers/${[...segs, name].join('/')}`\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importIdRef.value++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const wid = [modId, 'workers', ...segs, name].filter(Boolean).join(':')\n workers.push(\n `{ id: (${metaName}.metadata as { id?: string })?.id || '${wid}', queue: (${metaName}.metadata as { queue: string }).queue, concurrency: (${metaName}.metadata as { concurrency?: number })?.concurrency ?? 1, handler: ${importName} as (job: unknown, ctx: unknown) => Promise<void> }`\n )\n }\n return workers\n}\n\nfunction processTranslations(options: {\n roots: ModuleRoots\n modId: string\n appImportBase: string\n pkgImportBase: string\n imports: string[]\n}): string[] {\n const { roots, modId, appImportBase, pkgImportBase, imports } = options\n const i18nApp = path.join(roots.appBase, 'i18n')\n const i18nCore = path.join(roots.pkgBase, 'i18n')\n const locales = new Set<string>()\n if (fs.existsSync(i18nCore))\n for (const e of fs.readdirSync(i18nCore, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n if (fs.existsSync(i18nApp))\n for (const e of fs.readdirSync(i18nApp, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n const translations: string[] = []\n for (const locale of locales) {\n const coreHas = fs.existsSync(path.join(i18nCore, `${locale}.json`))\n const appHas = fs.existsSync(path.join(i18nApp, `${locale}.json`))\n if (coreHas && appHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${cName} from '${pkgImportBase}/i18n/${locale}.json'`)\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(\n `'${locale}': { ...( ${cName} as unknown as Record<string,string> ), ...( ${aName} as unknown as Record<string,string> ) }`\n )\n } else if (appHas) {\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${aName} as unknown as Record<string,string>`)\n } else if (coreHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n imports.push(`import ${cName} from '${pkgImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n return translations\n}\n\n/**\n * Resolves a convention file and pushes its import + config entry to standalone arrays.\n * Used for files that produce their own generated output (notifications, AI tools, events, analytics, enrichers, etc.).\n *\n * @returns The generated import name, or null if the file was not found.\n */\nfunction processStandaloneConfig(options: {\n roots: ModuleRoots\n imps: ModuleImports\n modId: string\n relativePath: string\n prefix: string\n importIdRef: { value: number }\n standaloneImports: string[]\n standaloneConfigs: string[]\n configExpr: (importName: string, modId: string) => string\n /** Also push the import to the shared imports array (used by modules.generated.ts) */\n sharedImports?: string[]\n}): string | null {\n const { roots, imps, modId, relativePath, prefix, importIdRef, standaloneImports, standaloneConfigs, configExpr, sharedImports } = options\n const resolved = resolveModuleFile(roots, imps, relativePath)\n if (!resolved) return null\n const importName = `${prefix}_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n standaloneImports.push(importStmt)\n if (sharedImports) sharedImports.push(importStmt)\n standaloneConfigs.push(configExpr(importName, modId))\n return importName\n}\n\nfunction resolveConventionFile(\n roots: ModuleRoots,\n imps: ModuleImports,\n relativePath: string,\n prefix: string,\n modId: string,\n importIdRef: { value: number },\n imports: string[],\n importStyle: 'namespace' | 'default' = 'namespace'\n): { importName: string; importPath: string; fromApp: boolean } | null {\n const resolved = resolveModuleFile(roots, imps, relativePath)\n if (!resolved) return null\n const importName = `${prefix}_${toVar(modId)}_${importIdRef.value++}`\n if (importStyle === 'default') {\n imports.push(`import ${importName} from '${resolved.importPath}'`)\n } else {\n imports.push(`import * as ${importName} from '${resolved.importPath}'`)\n }\n return { importName, importPath: resolved.importPath, fromApp: resolved.fromApp }\n}\n\nexport async function generateModuleRegistry(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.generated.checksum')\n const widgetsOutFile = path.join(outputDir, 'dashboard-widgets.generated.ts')\n const widgetsChecksumFile = path.join(outputDir, 'dashboard-widgets.generated.checksum')\n const injectionWidgetsOutFile = path.join(outputDir, 'injection-widgets.generated.ts')\n const injectionWidgetsChecksumFile = path.join(outputDir, 'injection-widgets.generated.checksum')\n const injectionTablesOutFile = path.join(outputDir, 'injection-tables.generated.ts')\n const injectionTablesChecksumFile = path.join(outputDir, 'injection-tables.generated.checksum')\n const searchOutFile = path.join(outputDir, 'search.generated.ts')\n const searchChecksumFile = path.join(outputDir, 'search.generated.checksum')\n const notificationsOutFile = path.join(outputDir, 'notifications.generated.ts')\n const notificationsChecksumFile = path.join(outputDir, 'notifications.generated.checksum')\n const notificationsClientOutFile = path.join(outputDir, 'notifications.client.generated.ts')\n const notificationsClientChecksumFile = path.join(outputDir, 'notifications.client.generated.checksum')\n const messageTypesOutFile = path.join(outputDir, 'message-types.generated.ts')\n const messageTypesChecksumFile = path.join(outputDir, 'message-types.generated.checksum')\n const messageObjectsOutFile = path.join(outputDir, 'message-objects.generated.ts')\n const messageObjectsChecksumFile = path.join(outputDir, 'message-objects.generated.checksum')\n const messagesClientOutFile = path.join(outputDir, 'messages.client.generated.ts')\n const messagesClientChecksumFile = path.join(outputDir, 'messages.client.generated.checksum')\n const aiToolsOutFile = path.join(outputDir, 'ai-tools.generated.ts')\n const aiToolsChecksumFile = path.join(outputDir, 'ai-tools.generated.checksum')\n const eventsOutFile = path.join(outputDir, 'events.generated.ts')\n const eventsChecksumFile = path.join(outputDir, 'events.generated.checksum')\n const analyticsOutFile = path.join(outputDir, 'analytics.generated.ts')\n const analyticsChecksumFile = path.join(outputDir, 'analytics.generated.checksum')\n const transFieldsOutFile = path.join(outputDir, 'translations-fields.generated.ts')\n const transFieldsChecksumFile = path.join(outputDir, 'translations-fields.generated.checksum')\n const enrichersOutFile = path.join(outputDir, 'enrichers.generated.ts')\n const enrichersChecksumFile = path.join(outputDir, 'enrichers.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n // Mutable ref so extracted helper functions can increment the shared counter\n const importIdRef = { value: 0 }\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n const allDashboardWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionTables: Array<{ moduleId: string; importPath: string; importName: string }> = []\n const searchConfigs: string[] = []\n const searchImports: string[] = []\n const notificationTypes: string[] = []\n const notificationImports: string[] = []\n const notificationClientTypes: string[] = []\n const notificationClientImports: string[] = []\n const messageTypeEntries: string[] = []\n const messageTypeImports: string[] = []\n const messageObjectTypeEntries: string[] = []\n const messageObjectTypeImports: string[] = []\n const aiToolsConfigs: string[] = []\n const aiToolsImports: string[] = []\n const eventsConfigs: string[] = []\n const eventsImports: string[] = []\n const analyticsConfigs: string[] = []\n const analyticsImports: string[] = []\n const transFieldsConfigs: string[] = []\n const transFieldsImports: string[] = []\n const enricherConfigs: string[] = []\n const enricherImports: string[] = []\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const rawImps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : rawImps.appBase\n const imps: ModuleImports = { appBase: appImportBase, pkgBase: rawImps.pkgBase }\n\n const frontendRoutes: string[] = []\n const backendRoutes: string[] = []\n const apis: string[] = []\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let searchImportName: string | null = null\n let eventsImportName: string | null = null\n let analyticsImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n const dashboardWidgets: string[] = []\n const injectionWidgets: string[] = []\n let injectionTableImportName: string | null = null\n let setupImportName: string | null = null\n\n // === Processing order MUST match original import ID sequence ===\n\n // 1. Module metadata: index.ts (overrideable)\n const appIndex = path.join(roots.appBase, 'index.ts')\n const pkgIndex = path.join(roots.pkgBase, 'index.ts')\n const indexTs = fs.existsSync(appIndex) ? appIndex : fs.existsSync(pkgIndex) ? pkgIndex : null\n if (indexTs) {\n infoImportName = `I${importIdRef.value++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // 2. Pages: frontend\n {\n const feApp = path.join(roots.appBase, 'frontend')\n const fePkg = path.join(roots.pkgBase, 'frontend')\n const feFiles = scanModuleDir(roots, SCAN_CONFIGS.frontendPages)\n if (feFiles.length) {\n frontendRoutes.push(...processPageFiles({\n files: feFiles,\n type: 'frontend',\n modId,\n appDir: feApp,\n pkgDir: fePkg,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n }\n }\n\n // 3. Entity extensions: data/extensions.ts\n {\n const ext = resolveConventionFile(roots, imps, 'data/extensions.ts', 'X', modId, importIdRef, imports)\n if (ext) extensionsImportName = ext.importName\n }\n\n // 4. RBAC: acl.ts\n {\n const rootApp = path.join(roots.appBase, 'acl.ts')\n const rootPkg = path.join(roots.pkgBase, 'acl.ts')\n const hasRoot = fs.existsSync(rootApp) || fs.existsSync(rootPkg)\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importIdRef.value++}`\n const useApp = fs.existsSync(rootApp) ? rootApp : rootPkg\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // 5. Custom entities: ce.ts\n {\n const ce = resolveConventionFile(roots, imps, 'ce.ts', 'CE', modId, importIdRef, imports)\n if (ce) customEntitiesImportName = ce.importName\n }\n\n // 6. Search: search.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'search.ts')\n if (resolved) {\n const importName = `SEARCH_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n imports.push(importStmt)\n searchImports.push(importStmt)\n searchImportName = importName\n }\n }\n\n // 7. Notifications: notifications.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'notifications.ts',\n prefix: 'NOTIF',\n standaloneImports: notificationImports,\n standaloneConfigs: notificationTypes,\n configExpr: (n, id) => `{ moduleId: '${id}', types: ((${n}.default ?? ${n}.notificationTypes ?? (${n} as any).types ?? []) as NotificationTypeDefinition[]) }`,\n })\n\n // Notification client renderers: notifications.client.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'notifications.client.ts',\n prefix: 'NOTIF_CLIENT',\n standaloneImports: notificationClientImports,\n standaloneConfigs: notificationClientTypes,\n configExpr: (n, id) => `{ moduleId: '${id}', types: (${n}.default ?? []) }`,\n })\n // Message types: module root message-types.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'message-types.ts')\n if (resolved) {\n const importName = `MSG_TYPES_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n messageTypeImports.push(importStmt)\n messageTypeEntries.push(\n `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageTypes ?? (${importName} as any).types ?? []) as MessageTypeDefinition[]) }`\n )\n }\n }\n\n // Message object types: module root message-objects.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'message-objects.ts')\n if (resolved) {\n const importName = `MSG_OBJECTS_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n messageObjectTypeImports.push(importStmt)\n messageObjectTypeEntries.push(\n `{ moduleId: '${modId}', types: ((${importName}.default ?? (${importName} as any).messageObjectTypes ?? (${importName} as any).objectTypes ?? (${importName} as any).types ?? []) as MessageObjectTypeDefinition[]) }`\n )\n }\n }\n\n // AI Tools: module root ai-tools.ts\n {\n const resolved = resolveModuleFile(roots, imps, 'notifications.client.ts')\n if (resolved) {\n const importName = `NOTIF_CLIENT_${toVar(modId)}_${importIdRef.value++}`\n const importStmt = `import * as ${importName} from '${resolved.importPath}'`\n notificationClientImports.push(importStmt)\n notificationClientTypes.push(\n `{ moduleId: '${modId}', types: (${importName}.default ?? []) }`\n )\n }\n }\n\n // 8. AI Tools: ai-tools.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'ai-tools.ts',\n prefix: 'AI_TOOLS',\n standaloneImports: aiToolsImports,\n standaloneConfigs: aiToolsConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', tools: (${n}.aiTools ?? ${n}.default ?? []) }`,\n })\n\n // 9. Events: events.ts (also referenced in module declarations)\n eventsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'events.ts',\n prefix: 'EVENTS',\n standaloneImports: eventsImports,\n standaloneConfigs: eventsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', config: (${n}.default ?? ${n}.eventsConfig ?? null) as EventModuleConfigBase | null }`,\n })\n\n // 10. Analytics: analytics.ts (also referenced in module declarations)\n analyticsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'analytics.ts',\n prefix: 'ANALYTICS',\n standaloneImports: analyticsImports,\n standaloneConfigs: analyticsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', config: (${n}.default ?? ${n}.analyticsConfig ?? ${n}.config ?? null) }`,\n })\n\n // 10b. Enrichers: data/enrichers.ts\n processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'data/enrichers.ts',\n prefix: 'ENRICHERS',\n standaloneImports: enricherImports,\n standaloneConfigs: enricherConfigs,\n configExpr: (n, id) => `{ moduleId: '${id}', enrichers: ((${n} as any).enrichers ?? (${n} as any).default ?? []) }`,\n })\n\n // Translatable fields: translations.ts (also referenced in module declarations)\n let transFieldsImportName: string | null = null\n transFieldsImportName = processStandaloneConfig({\n roots, imps, modId, importIdRef,\n relativePath: 'translations.ts',\n prefix: 'TRANS_FIELDS',\n standaloneImports: transFieldsImports,\n standaloneConfigs: transFieldsConfigs,\n sharedImports: imports,\n configExpr: (n, id) => `{ moduleId: '${id}', fields: (${n}.default ?? ${n}.translatableFields ?? {}) as Record<string, string[]> }`,\n })\n\n // 11. Setup: setup.ts\n {\n const setup = resolveConventionFile(roots, imps, 'setup.ts', 'SETUP', modId, importIdRef, imports)\n if (setup) setupImportName = setup.importName\n }\n\n // 12. Custom fields: data/fields.ts\n {\n const fields = resolveConventionFile(roots, imps, 'data/fields.ts', 'F', modId, importIdRef, imports)\n if (fields) fieldsImportName = fields.importName\n }\n\n // 13. Pages: backend\n {\n const beApp = path.join(roots.appBase, 'backend')\n const bePkg = path.join(roots.pkgBase, 'backend')\n const beFiles = scanModuleDir(roots, SCAN_CONFIGS.backendPages)\n if (beFiles.length) {\n backendRoutes.push(...processPageFiles({\n files: beFiles,\n type: 'backend',\n modId,\n appDir: beApp,\n pkgDir: bePkg,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n }\n }\n\n // 14. API routes\n apis.push(...await processApiRoutes({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 15. CLI\n {\n const cliApp = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n }\n\n // 16. Translations\n translations.push(...processTranslations({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n }))\n\n // 17. Subscribers\n subscribers.push(...processSubscribers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // 18. Workers\n workers.push(...await processWorkers({\n roots,\n modId,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n imports,\n importIdRef,\n }))\n\n // Build combined customFieldSets expression\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n // 19. Dashboard widgets\n {\n const entries = scanDashboardWidgetEntries({\n modId,\n roots,\n appImportBase,\n pkgImportBase: imps.pkgBase,\n })\n for (const entry of entries) {\n dashboardWidgets.push(\n `{ moduleId: '${entry.moduleId}', key: '${entry.key}', source: '${entry.source}', loader: () => import('${entry.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allDashboardWidgets.get(entry.key)\n if (!existing || (existing.source !== 'app' && entry.source === 'app')) {\n allDashboardWidgets.set(entry.key, {\n moduleId: entry.moduleId,\n source: entry.source,\n importPath: entry.importPath,\n })\n }\n }\n }\n\n // 20. Injection widgets\n {\n const files = scanModuleDir(roots, SCAN_CONFIGS.injectionWidgets)\n const widgetApp = path.join(roots.appBase, 'widgets', 'injection')\n for (const { relPath, fromApp } of files) {\n const segs = relPath.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/injection/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n injectionWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allInjectionWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allInjectionWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n\n // 21. Injection table\n {\n const resolved = resolveModuleFile(roots, imps, 'widgets/injection-table.ts')\n if (resolved) {\n const importName = `InjTable_${toVar(modId)}_${importIdRef.value++}`\n imports.push(`import * as ${importName} from '${resolved.importPath}'`)\n injectionTableImportName = importName\n allInjectionTables.push({ moduleId: modId, importPath: resolved.importPath, importName })\n }\n }\n\n if (searchImportName) {\n searchConfigs.push(`{ moduleId: '${modId}', config: (${searchImportName}.default ?? ${searchImportName}.searchConfig ?? ${searchImportName}.config ?? null) }`)\n }\n\n // Note: events, analytics, enrichers, notifications, AI tools, and translatable fields\n // configs are pushed inside processStandaloneConfig() above \u2014 no separate push needed here.\n\n if (transFieldsImportName) {\n transFieldsConfigs.push(`{ moduleId: '${modId}', fields: (${transFieldsImportName}.default ?? ${transFieldsImportName}.translatableFields ?? {}) as Record<string, string[]> }`)\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${frontendRoutes.length ? `frontendRoutes: [${frontendRoutes.join(', ')}],` : ''}\n ${backendRoutes.length ? `backendRoutes: [${backendRoutes.join(', ')}],` : ''}\n ${apis.length ? `apis: [${apis.join(', ')}],` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as import('@open-mercato/shared/modules/entities').EntityExtension[]) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${dashboardWidgets.length ? `dashboardWidgets: [${dashboardWidgets.join(', ')}],` : ''}\n ${setupImportName ? `setup: (${setupImportName}.default ?? ${setupImportName}.setup) || undefined,` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n const widgetEntriesList = Array.from(allDashboardWidgets.entries()).sort(([a], [b]) => a.localeCompare(b))\n const widgetDecls = widgetEntriesList.map(\n ([key, data]) =>\n ` { moduleId: '${data.moduleId}', key: '${key}', source: '${data.source}', loader: () => import('${data.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const widgetsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleDashboardWidgetEntry } from '@open-mercato/shared/modules/registry'\n\nexport const dashboardWidgetEntries: ModuleDashboardWidgetEntry[] = [\n${widgetDecls.join(',\\n')}\n]\n`\n const searchEntriesLiteral = searchConfigs.join(',\\n ')\n const searchImportSection = searchImports.join('\\n')\n const searchOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { SearchModuleConfig } from '@open-mercato/shared/modules/search'\n${searchImportSection ? `\\n${searchImportSection}\\n` : '\\n'}type SearchConfigEntry = { moduleId: string; config: SearchModuleConfig | null }\n\nconst entriesRaw: SearchConfigEntry[] = [\n${searchEntriesLiteral ? ` ${searchEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((entry): entry is { moduleId: string; config: SearchModuleConfig } => entry.config != null)\n\nexport const searchModuleConfigEntries = entries\nexport const searchModuleConfigs: SearchModuleConfig[] = entries.map((entry) => entry.config)\n`\n const eventsEntriesLiteral = eventsConfigs.join(',\\n ')\n const eventsImportSection = eventsImports.join('\\n')\n const eventsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { EventModuleConfigBase, EventDefinition } from '@open-mercato/shared/modules/events'\n${eventsImportSection ? `\\n${eventsImportSection}\\n` : '\\n'}type EventConfigEntry = { moduleId: string; config: EventModuleConfigBase | null }\n\nconst entriesRaw: EventConfigEntry[] = [\n${eventsEntriesLiteral ? ` ${eventsEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((e): e is { moduleId: string; config: EventModuleConfigBase } => e.config != null)\n\nexport const eventModuleConfigEntries = entries\nexport const eventModuleConfigs: EventModuleConfigBase[] = entries.map((e) => e.config)\nexport const allEvents: EventDefinition[] = entries.flatMap((e) => e.config.events)\n\n// Runtime registry for validation\nconst allDeclaredEventIds = new Set(allEvents.map((e) => e.id))\nexport function isEventDeclared(eventId: string): boolean {\n return allDeclaredEventIds.has(eventId)\n}\n`\n\n const analyticsEntriesLiteral = analyticsConfigs.join(',\\n ')\n const analyticsImportSection = analyticsImports.join('\\n')\n const analyticsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { AnalyticsModuleConfig } from '@open-mercato/shared/modules/analytics'\n${analyticsImportSection ? `\\n${analyticsImportSection}\\n` : '\\n'}type AnalyticsConfigEntry = { moduleId: string; config: AnalyticsModuleConfig | null }\n\nconst entriesRaw: AnalyticsConfigEntry[] = [\n${analyticsEntriesLiteral ? ` ${analyticsEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((entry): entry is { moduleId: string; config: AnalyticsModuleConfig } => entry.config != null)\n\nexport const analyticsModuleConfigEntries = entries\nexport const analyticsModuleConfigs: AnalyticsModuleConfig[] = entries.map((entry) => entry.config)\n`\n\n const transFieldsEntriesLiteral = transFieldsConfigs.join(',\\n ')\n const transFieldsImportSection = transFieldsImports.join('\\n')\n const transFieldsOutput = `// AUTO-GENERATED by mercato generate registry\nimport { registerTranslatableFields } from '@open-mercato/shared/lib/localization/translatable-fields'\n${transFieldsImportSection ? `\\n${transFieldsImportSection}\\n` : '\\n'}type TransFieldsEntry = { moduleId: string; fields: Record<string, string[]> }\n\nconst entries: TransFieldsEntry[] = [\n${transFieldsEntriesLiteral ? ` ${transFieldsEntriesLiteral}\\n` : ''}]\n\nconst allFields: Record<string, string[]> = {}\nfor (const entry of entries) {\n for (const [key, value] of Object.entries(entry.fields)) {\n allFields[key] = value\n }\n}\n\nexport const translatableFieldEntries = entries\nexport const allTranslatableFields = allFields\nexport const allTranslatableEntityTypes = Object.keys(allFields)\n\n// Auto-register on import (side-effect)\nregisterTranslatableFields(allFields)\n`\n\n const notificationEntriesLiteral = notificationTypes.join(',\\n ')\n const notificationImportSection = notificationImports.join('\\n')\n const notificationsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'\n${notificationImportSection ? `\\n${notificationImportSection}\\n` : '\\n'}type NotificationTypeEntry = { moduleId: string; types: NotificationTypeDefinition[] }\n\nconst entriesRaw: NotificationTypeEntry[] = [\n${notificationEntriesLiteral ? ` ${notificationEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const notificationTypeEntries = entriesRaw\nexport const notificationTypes = allTypes\n\nexport function getNotificationTypes(): NotificationTypeDefinition[] {\n return allTypes\n}\n\nexport function getNotificationType(type: string): NotificationTypeDefinition | undefined {\n return allTypes.find((t) => t.type === type)\n}\n`\n const notificationClientEntriesLiteral = notificationClientTypes.join(',\\n ')\n const notificationClientImportSection = notificationClientImports.join('\\n')\n const notificationsClientOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ComponentType } from 'react'\nimport type { NotificationTypeDefinition, NotificationRendererProps } from '@open-mercato/shared/modules/notifications/types'\n${notificationClientImportSection ? `\\n${notificationClientImportSection}\\n` : '\\n'}type NotificationTypeEntry = { moduleId: string; types: NotificationTypeDefinition[] }\nexport type NotificationRenderers = Record<string, ComponentType<NotificationRendererProps>>\n\nconst entriesRaw: NotificationTypeEntry[] = [\n${notificationClientEntriesLiteral ? ` ${notificationClientEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\nconst renderers: NotificationRenderers = Object.fromEntries(\n allTypes\n .filter((typeDef) => Boolean(typeDef.Renderer))\n .map((typeDef) => [typeDef.type, typeDef.Renderer!]),\n)\n\nexport const notificationClientTypeEntries = entriesRaw\nexport const notificationClientTypes = allTypes\nexport const notificationRenderers = renderers\n\nexport function getNotificationRenderers(): NotificationRenderers {\n return renderers\n}\n`\n\n const messageTypeEntriesLiteral = messageTypeEntries.join(',\\n ')\n const messageTypeImportSection = messageTypeImports.join('\\n')\n const messageTypesOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { MessageTypeDefinition } from '@open-mercato/shared/modules/messages/types'\n${messageTypeImportSection ? `\\n${messageTypeImportSection}\\n` : '\\n'}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }\n\nconst entriesRaw: MessageTypeEntry[] = [\n${messageTypeEntriesLiteral ? ` ${messageTypeEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const messageTypeEntries = entriesRaw\nexport const messageTypes = allTypes\n\nexport function getMessageTypes(): MessageTypeDefinition[] {\n return allTypes\n}\n\nexport function getMessageType(type: string): MessageTypeDefinition | undefined {\n return allTypes.find((entry) => entry.type === type)\n}\n`\n\n const messageObjectEntriesLiteral = messageObjectTypeEntries.join(',\\n ')\n const messageObjectImportSection = messageObjectTypeImports.join('\\n')\n const messageObjectsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { MessageObjectTypeDefinition } from '@open-mercato/shared/modules/messages/types'\n${messageObjectImportSection ? `\\n${messageObjectImportSection}\\n` : '\\n'}type MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }\n\nconst entriesRaw: MessageObjectTypeEntry[] = [\n${messageObjectEntriesLiteral ? ` ${messageObjectEntriesLiteral}\\n` : ''}]\n\nconst allTypes = entriesRaw.flatMap((entry) => entry.types)\n\nexport const messageObjectTypeEntries = entriesRaw\nexport const messageObjectTypes = allTypes\n\nexport function getMessageObjectTypes(): MessageObjectTypeDefinition[] {\n return allTypes\n}\n\nexport function getMessageObjectType(module: string, entityType: string): MessageObjectTypeDefinition | undefined {\n return allTypes.find((entry) => entry.module === module && entry.entityType === entityType)\n}\n`\n const messagesClientOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ComponentType } from 'react'\nimport type {\n MessageTypeDefinition,\n MessageObjectTypeDefinition,\n MessageListItemProps,\n MessageContentProps,\n MessageActionsProps,\n ObjectDetailProps,\n ObjectPreviewProps,\n} from '@open-mercato/shared/modules/messages/types'\nimport { registerMessageObjectTypes } from '@open-mercato/core/modules/messages/lib/message-objects-registry'\nimport { configureMessageUiComponentRegistry } from '@open-mercato/core/modules/messages/components/utils/typeUiRegistry'\n${messageTypeImportSection ? `\\n${messageTypeImportSection}\\n` : '\\n'}${messageObjectImportSection ? `\\n${messageObjectImportSection}\\n` : ''}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }\ntype MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }\n\nexport type MessageListItemRenderers = Record<string, ComponentType<MessageListItemProps>>\nexport type MessageContentRenderers = Record<string, ComponentType<MessageContentProps>>\nexport type MessageActionsRenderers = Record<string, ComponentType<MessageActionsProps>>\nexport type MessageObjectDetailRenderers = Record<string, ComponentType<ObjectDetailProps>>\nexport type MessageObjectPreviewRenderers = Record<string, ComponentType<ObjectPreviewProps>>\n\nexport type MessageUiComponentRegistry = {\n listItemComponents: MessageListItemRenderers\n contentComponents: MessageContentRenderers\n actionsComponents: MessageActionsRenderers\n objectDetailComponents: MessageObjectDetailRenderers\n objectPreviewComponents: MessageObjectPreviewRenderers\n}\n\nconst messageTypeEntriesRaw: MessageTypeEntry[] = [\n${messageTypeEntriesLiteral ? ` ${messageTypeEntriesLiteral}\\n` : ''}]\nconst messageObjectTypeEntriesRaw: MessageObjectTypeEntry[] = [\n${messageObjectEntriesLiteral ? ` ${messageObjectEntriesLiteral}\\n` : ''}]\n\nconst allMessageTypes = messageTypeEntriesRaw.flatMap((entry) => entry.types)\nconst allMessageObjectTypes = messageObjectTypeEntriesRaw.flatMap((entry) => entry.types)\n\nconst listItemComponents: MessageListItemRenderers = Object.fromEntries(\n allMessageTypes\n .filter((typeDef) => Boolean(typeDef.ui?.listItemComponent) && Boolean(typeDef.ListItemComponent))\n .map((typeDef) => [typeDef.ui!.listItemComponent!, typeDef.ListItemComponent!]),\n)\n\nconst contentComponents: MessageContentRenderers = Object.fromEntries(\n allMessageTypes\n .filter((typeDef) => Boolean(typeDef.ui?.contentComponent) && Boolean(typeDef.ContentComponent))\n .map((typeDef) => [typeDef.ui!.contentComponent!, typeDef.ContentComponent!]),\n)\n\nconst actionsComponents: MessageActionsRenderers = Object.fromEntries(\n allMessageTypes\n .filter((typeDef) => Boolean(typeDef.ui?.actionsComponent) && Boolean(typeDef.ActionsComponent))\n .map((typeDef) => [typeDef.ui!.actionsComponent!, typeDef.ActionsComponent!]),\n)\n\nconst objectDetailComponents: MessageObjectDetailRenderers = Object.fromEntries(\n allMessageObjectTypes\n .filter((typeDef) => Boolean(typeDef.DetailComponent))\n .map((typeDef) => [\\`\\${typeDef.module}:\\${typeDef.entityType}\\`, typeDef.DetailComponent!]),\n)\n\nconst objectPreviewComponents: MessageObjectPreviewRenderers = Object.fromEntries(\n allMessageObjectTypes\n .filter((typeDef) => Boolean(typeDef.PreviewComponent))\n .map((typeDef) => [\\`\\${typeDef.module}:\\${typeDef.entityType}\\`, typeDef.PreviewComponent!]),\n)\n\nconst registry: MessageUiComponentRegistry = {\n listItemComponents,\n contentComponents,\n actionsComponents,\n objectDetailComponents,\n objectPreviewComponents,\n}\n\nexport const messageClientTypeEntries = messageTypeEntriesRaw\nexport const messageClientObjectTypeEntries = messageObjectTypeEntriesRaw\nexport const messageUiComponentRegistry = registry\n\nexport function getMessageUiComponentRegistry(): MessageUiComponentRegistry {\n return registry\n}\n\n// Side-effects: register all message object types and configure the UI component registry on import.\nfor (const entry of messageObjectTypeEntriesRaw) {\n registerMessageObjectTypes(entry.types)\n}\nconfigureMessageUiComponentRegistry(registry)\n`\n\n // Validate module dependencies declared via ModuleInfo.requires\n {\n const enabledIds = new Set(enabled.map((e) => e.id))\n const problems: string[] = []\n for (const [modId, reqs] of requiresByModule.entries()) {\n const missing = reqs.filter((r) => !enabledIds.has(r))\n if (missing.length) {\n problems.push(`- Module \"${modId}\" requires: ${missing.join(', ')}`)\n }\n }\n if (problems.length) {\n console.error('\\nModule dependency check failed:')\n for (const p of problems) console.error(p)\n console.error('\\nFix: Enable required module(s) in src/modules.ts. Example:')\n console.error(\n ' export const enabledModules = [ { id: \\'' +\n Array.from(new Set(requiresByModule.values()).values()).join(\"' }, { id: '\") +\n \"' } ]\"\n )\n process.exit(1)\n }\n }\n\n const structureChecksum = calculateStructureChecksum([\n ...Array.from(trackedRoots),\n ])\n\n writeGeneratedFile({ outFile, checksumFile, content: output, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: widgetsOutFile, checksumFile: widgetsChecksumFile, content: widgetsOutput, structureChecksum, result, quiet })\n\n const injectionWidgetEntriesList = Array.from(allInjectionWidgets.entries()).sort(([a], [b]) => a.localeCompare(b))\n const injectionWidgetDecls = injectionWidgetEntriesList.map(\n ([key, data]) =>\n ` { moduleId: '${data.moduleId}', key: '${key}', source: '${data.source}', loader: () => import('${data.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const injectionWidgetsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleInjectionWidgetEntry } from '@open-mercato/shared/modules/registry'\n\nexport const injectionWidgetEntries: ModuleInjectionWidgetEntry[] = [\n${injectionWidgetDecls.join(',\\n')}\n]\n`\n const injectionTableImports = allInjectionTables.map(\n (entry) => `import * as ${entry.importName} from '${entry.importPath}'`\n )\n const injectionTableDecls = allInjectionTables.map(\n (entry) =>\n ` { moduleId: '${entry.moduleId}', table: ((${entry.importName}.default ?? ${entry.importName}.injectionTable) as any) || {} }`\n )\n const injectionTablesOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleInjectionTable } from '@open-mercato/shared/modules/widgets/injection'\n${injectionTableImports.join('\\n')}\n\nexport const injectionTables: Array<{ moduleId: string; table: ModuleInjectionTable }> = [\n${injectionTableDecls.join(',\\n')}\n]\n`\n writeGeneratedFile({ outFile: injectionWidgetsOutFile, checksumFile: injectionWidgetsChecksumFile, content: injectionWidgetsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: injectionTablesOutFile, checksumFile: injectionTablesChecksumFile, content: injectionTablesOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: searchOutFile, checksumFile: searchChecksumFile, content: searchOutput, structureChecksum, result, quiet })\n\n // AI Tools generated file\n const aiToolsOutput = `// AUTO-GENERATED by mercato generate registry\n${aiToolsImports.length ? aiToolsImports.join('\\n') + '\\n' : ''}\ntype AiToolConfigEntry = { moduleId: string; tools: unknown[] }\n\nexport const aiToolConfigEntries: AiToolConfigEntry[] = [\n${aiToolsConfigs.length ? ' ' + aiToolsConfigs.join(',\\n ') + '\\n' : ''}].filter(e => Array.isArray(e.tools) && e.tools.length > 0)\n\nexport const allAiTools = aiToolConfigEntries.flatMap(e => e.tools)\n`\n writeGeneratedFile({ outFile: aiToolsOutFile, checksumFile: aiToolsChecksumFile, content: aiToolsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: notificationsOutFile, checksumFile: notificationsChecksumFile, content: notificationsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: notificationsClientOutFile, checksumFile: notificationsClientChecksumFile, content: notificationsClientOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: messageTypesOutFile, checksumFile: messageTypesChecksumFile, content: messageTypesOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: messageObjectsOutFile, checksumFile: messageObjectsChecksumFile, content: messageObjectsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: messagesClientOutFile, checksumFile: messagesClientChecksumFile, content: messagesClientOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: eventsOutFile, checksumFile: eventsChecksumFile, content: eventsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: analyticsOutFile, checksumFile: analyticsChecksumFile, content: analyticsOutput, structureChecksum, result, quiet })\n writeGeneratedFile({ outFile: transFieldsOutFile, checksumFile: transFieldsChecksumFile, content: transFieldsOutput, structureChecksum, result, quiet })\n\n // Enrichers generated file\n const enricherEntriesLiteral = enricherConfigs.join(',\\n ')\n const enricherImportSection = enricherImports.join('\\n')\n const enrichersOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ResponseEnricher } from '@open-mercato/shared/lib/crud/response-enricher'\n${enricherImportSection ? `\\n${enricherImportSection}\\n` : '\\n'}type EnricherEntry = { moduleId: string; enrichers: ResponseEnricher[] }\n\nexport const enricherEntries: EnricherEntry[] = [\n${enricherEntriesLiteral ? ` ${enricherEntriesLiteral}\\n` : ''}]\n`\n writeGeneratedFile({ outFile: enrichersOutFile, checksumFile: enrichersChecksumFile, content: enrichersOutput, structureChecksum, result, quiet })\n\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-610fbb24ec",
3
+ "version": "0.4.5-develop-811deeb983",
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-610fbb24ec",
61
+ "@open-mercato/shared": "0.4.5-develop-811deeb983",
62
62
  "pg": "8.16.3",
63
63
  "testcontainers": "^11.12.0",
64
64
  "typescript": "^5.9.3"
@@ -253,15 +253,17 @@ export async function dbMigrate(resolver: PackageResolver, options: DbOptions =
253
253
  const tableName = `mikro_orm_migrations_${sanitizedModId}`
254
254
  validateTableName(tableName)
255
255
 
256
- // For @app modules, entities may be empty since TypeScript files can't be imported at runtime
257
- // Use discovery.warnWhenNoEntities: false to allow running migrations without entities
256
+ // dbMigrate only runs existing migration files entities are intentionally
257
+ // omitted so MikroORM does not compare them against the snapshot and
258
+ // auto-generate a phantom diff migration (that would duplicate tables
259
+ // already created by committed migrations).
258
260
  const sslConfig = getSslConfig()
259
261
  const orm = await MikroORM.init<PostgreSqlDriver>({
260
262
  driver: PostgreSqlDriver,
261
263
  clientUrl: getClientUrl(),
262
264
  loggerFactory: () => createMinimalLogger(),
263
265
  dynamicImportProvider,
264
- entities: entities.length ? entities : [],
266
+ entities: [],
265
267
  discovery: { warnWhenNoEntities: false },
266
268
  migrations: {
267
269
  path: migrationsPath,
@@ -1040,6 +1040,8 @@ import type {
1040
1040
  ObjectDetailProps,
1041
1041
  ObjectPreviewProps,
1042
1042
  } from '@open-mercato/shared/modules/messages/types'
1043
+ import { registerMessageObjectTypes } from '@open-mercato/core/modules/messages/lib/message-objects-registry'
1044
+ import { configureMessageUiComponentRegistry } from '@open-mercato/core/modules/messages/components/utils/typeUiRegistry'
1043
1045
  ${messageTypeImportSection ? `\n${messageTypeImportSection}\n` : '\n'}${messageObjectImportSection ? `\n${messageObjectImportSection}\n` : ''}type MessageTypeEntry = { moduleId: string; types: MessageTypeDefinition[] }
1044
1046
  type MessageObjectTypeEntry = { moduleId: string; types: MessageObjectTypeDefinition[] }
1045
1047
 
@@ -1110,6 +1112,12 @@ export const messageUiComponentRegistry = registry
1110
1112
  export function getMessageUiComponentRegistry(): MessageUiComponentRegistry {
1111
1113
  return registry
1112
1114
  }
1115
+
1116
+ // Side-effects: register all message object types and configure the UI component registry on import.
1117
+ for (const entry of messageObjectTypeEntriesRaw) {
1118
+ registerMessageObjectTypes(entry.types)
1119
+ }
1120
+ configureMessageUiComponentRegistry(registry)
1113
1121
  `
1114
1122
 
1115
1123
  // Validate module dependencies declared via ModuleInfo.requires