@open-mercato/cli 0.4.2-canary-ecaf80188b → 0.4.2-canary-f80d1bfa83
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.
- package/dist/lib/generators/entity-ids.js +3 -2
- package/dist/lib/generators/entity-ids.js.map +2 -2
- package/dist/lib/generators/module-di.js +6 -4
- package/dist/lib/generators/module-di.js.map +2 -2
- package/dist/lib/generators/module-registry.js +28 -20
- package/dist/lib/generators/module-registry.js.map +2 -2
- package/package.json +2 -2
- package/src/lib/generators/entity-ids.ts +4 -2
- package/src/lib/generators/module-di.ts +7 -4
- package/src/lib/generators/module-registry.ts +32 -24
|
@@ -131,7 +131,7 @@ async function generateEntityIds(options) {
|
|
|
131
131
|
const appDb = path.join(roots.appBase, "db");
|
|
132
132
|
const pkgDb = path.join(roots.pkgBase, "db");
|
|
133
133
|
const bases = [appData, pkgData, appDb, pkgDb];
|
|
134
|
-
const candidates = ["entities.override.ts", "entities.ts", "schema.ts"];
|
|
134
|
+
const candidates = ["entities.override.ts", "entities.override.js", "entities.ts", "entities.js", "schema.ts", "schema.js"];
|
|
135
135
|
let importPath = null;
|
|
136
136
|
let filePath = null;
|
|
137
137
|
for (const base of bases) {
|
|
@@ -140,7 +140,8 @@ async function generateEntityIds(options) {
|
|
|
140
140
|
if (fs.existsSync(p)) {
|
|
141
141
|
const fromApp = base.startsWith(roots.appBase);
|
|
142
142
|
const sub = path.basename(base);
|
|
143
|
-
|
|
143
|
+
const fileBaseName = f.replace(/\.(ts|js)$/, "");
|
|
144
|
+
importPath = `${fromApp ? imps.appBase : imps.pkgBase}/${sub}/${fileBaseName}`;
|
|
144
145
|
filePath = p;
|
|
145
146
|
break;
|
|
146
147
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/generators/entity-ids.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport ts from 'typescript'\nimport type { PackageResolver, ModuleEntry } from '../resolver'\nimport {\n calculateChecksum,\n readChecksumRecord,\n writeChecksumRecord,\n ensureDir,\n toVar,\n toSnake,\n rimrafDir,\n logGenerationResult,\n type GeneratorResult,\n createGeneratorResult,\n} from '../utils'\n\ntype GroupKey = '@app' | '@open-mercato/core' | string\ntype EntityFieldMap = Record<string, string[]>\n\nexport interface EntityIdsOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\n/**\n * Extract exported class names from a TypeScript source file without dynamic import.\n * This is used for @app modules since Node.js can't import TypeScript files directly.\n */\nfunction parseExportedClassNamesFromFile(filePath: string): string[] {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n const classNames: string[] = []\n\n sf.forEachChild((node) => {\n // Check for exported class declarations\n if (ts.isClassDeclaration(node) && node.name) {\n const hasExport = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n if (hasExport) {\n classNames.push(node.name.text)\n }\n }\n })\n\n return classNames\n}\n\nfunction parseEntityFieldsFromFile(filePath: string, exportedClassNames: string[]): EntityFieldMap {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n\n const exported = new Set(exportedClassNames)\n const result: EntityFieldMap = {}\n\n function getDecoratorArgNameLiteral(dec: ts.Decorator | undefined): string | undefined {\n if (!dec) return undefined\n const expr = dec.expression\n if (!ts.isCallExpression(expr)) return undefined\n if (!expr.arguments.length) return undefined\n const first = expr.arguments[0]\n if (!ts.isObjectLiteralExpression(first)) return undefined\n for (const prop of first.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === 'name') {\n if (ts.isStringLiteral(prop.initializer)) return prop.initializer.text\n }\n }\n return undefined\n }\n\n function normalizeDbName(propertyName: string, _decoratorName?: string, nameOverride?: string): string {\n if (nameOverride) return nameOverride\n return toSnake(propertyName)\n }\n\n sf.forEachChild((node) => {\n if (!ts.isClassDeclaration(node) || !node.name) return\n const clsName = node.name.text\n if (!exported.has(clsName)) return\n const entityKey = toSnake(clsName)\n const fields: string[] = []\n\n for (const member of node.members) {\n if (!ts.isPropertyDeclaration(member) || !member.name) continue\n const name = ts.isIdentifier(member.name)\n ? member.name.text\n : ts.isStringLiteral(member.name)\n ? member.name.text\n : undefined\n if (!name) continue\n if (member.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword)) continue\n const decorators = ts.canHaveDecorators(member)\n ? ts.getDecorators(member) ?? []\n : []\n let dbName: string | undefined\n if (decorators && decorators.length) {\n for (const d of decorators) {\n const nameOverride = getDecoratorArgNameLiteral(d)\n dbName = normalizeDbName(name, undefined, nameOverride)\n if (dbName) break\n }\n }\n if (!dbName) dbName = normalizeDbName(name)\n fields.push(dbName)\n }\n result[entityKey] = Array.from(new Set(fields))\n })\n\n return result\n}\n\nfunction writePerEntityFieldFiles(outRoot: string, fieldsByEntity: EntityFieldMap): void {\n fs.mkdirSync(outRoot, { recursive: true })\n rimrafDir(outRoot)\n fs.mkdirSync(outRoot, { recursive: true })\n for (const [entity, fields] of Object.entries(fieldsByEntity)) {\n const entDir = path.join(outRoot, entity)\n fs.mkdirSync(entDir, { recursive: true })\n const idx = fields.map((f) => `export const ${toVar(f)} = '${f}'`).join('\\n') + '\\n'\n fs.writeFileSync(path.join(entDir, 'index.ts'), idx)\n }\n}\n\nfunction writeEntityFieldsRegistry(generatedRoot: string, fieldsByEntity: EntityFieldMap): void {\n const entities = Object.keys(fieldsByEntity).sort()\n\n // Always write the file, even if empty, to prevent TypeScript import errors\n const imports = entities.length > 0\n ? entities.map((e) => `import * as ${toVar(e)} from './entities/${e}/index'`).join('\\n')\n : ''\n const registryEntries = entities.length > 0\n ? entities.map((e) => ` ${toVar(e)}`).join(',\\n')\n : ''\n\n const src = `// AUTO-GENERATED by mercato generate entity-ids\n// Static registry for entity fields - eliminates dynamic imports for Turbopack compatibility\n${imports}\n\nexport const entityFieldsRegistry: Record<string, Record<string, string>> = {\n${registryEntries}\n}\n\nexport function getEntityFields(slug: string): Record<string, string> | undefined {\n return entityFieldsRegistry[slug]\n}\n`\n const outPath = path.join(generatedRoot, 'entity-fields-registry.ts')\n ensureDir(outPath)\n fs.writeFileSync(outPath, src)\n}\n\nexport async function generateEntityIds(options: EntityIdsOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'entities.ids.generated.ts')\n const checksumFile = path.join(outputDir, 'entities.ids.generated.checksum')\n\n const entries = resolver.loadEnabledModules()\n\n const consolidated: Record<string, Record<string, string>> = {}\n const grouped: Record<GroupKey, Record<string, Record<string, string>>> = {}\n const modulesDict: Record<string, string> = {}\n const groupedModulesDict: Record<GroupKey, Record<string, string>> = {}\n\n const fieldsByGroup: Record<GroupKey, Record<string, EntityFieldMap>> = {}\n\n for (const entry of entries) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n const group: GroupKey = (entry.from as GroupKey) || '@open-mercato/core'\n\n // Locate entities definition file (prefer app override)\n const appData = path.join(roots.appBase, 'data')\n const pkgData = path.join(roots.pkgBase, 'data')\n const appDb = path.join(roots.appBase, 'db')\n const pkgDb = path.join(roots.pkgBase, 'db')\n const bases = [appData, pkgData, appDb, pkgDb]\n const candidates = ['entities.override.ts', 'entities.ts', 'schema.ts']\n let importPath: string | null = null\n let filePath: string | null = null\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 fromApp = base.startsWith(roots.appBase)\n const sub = path.basename(base) // 'data' | 'db'\n importPath = `${fromApp ? imps.appBase : imps.pkgBase}/${sub}/${f.replace(/\\.ts$/, '')}`\n filePath = p\n break\n }\n }\n if (importPath) break\n }\n\n // No entities file found -> still register module id\n if (!importPath) {\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n continue\n }\n\n // Get exported class names - either via dynamic import or TypeScript parsing\n let exportNames: string[]\n const isAppModule = entry.from === '@app'\n\n if (isAppModule && filePath) {\n // For @app modules, parse TypeScript source directly\n // since Node.js can't import TypeScript files (path alias @/ doesn't resolve at runtime)\n exportNames = parseExportedClassNamesFromFile(filePath)\n } else {\n // For package modules, use dynamic import\n let mod: Record<string, unknown>\n try {\n mod = await import(importPath)\n } catch (err) {\n // Module import failed, record error and skip\n const errorMessage = err instanceof Error ? err.message : String(err)\n result.errors.push(`Failed to import ${importPath}: ${errorMessage}`)\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n continue\n }\n exportNames = Object.keys(mod).filter((k) => typeof mod[k] === 'function')\n }\n\n const entityNames = exportNames\n .map((k) => toSnake(k))\n .filter((k, idx, arr) => arr.indexOf(k) === idx)\n\n // Build dictionaries\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n\n consolidated[modId] = consolidated[modId] || {}\n grouped[group] = grouped[group] || {}\n grouped[group][modId] = grouped[group][modId] || {}\n\n for (const en of entityNames) {\n consolidated[modId][en] = `${modId}:${en}`\n grouped[group][modId][en] = `${modId}:${en}`\n }\n\n if (filePath) {\n // exportNames already contains only class/function names from either source\n const entityFieldMap = parseEntityFieldsFromFile(filePath, exportNames)\n fieldsByGroup[group] = fieldsByGroup[group] || {}\n fieldsByGroup[group][modId] = entityFieldMap\n }\n }\n\n // Write consolidated output\n const consolidatedSrc = `// AUTO-GENERATED by mercato generate entity-ids\nexport const M = ${JSON.stringify(modulesDict, null, 2)} as const\nexport const E = ${JSON.stringify(consolidated, null, 2)} as const\nexport type KnownModuleId = keyof typeof M\nexport type KnownEntities = typeof E\n`\n\n // Check if content has changed\n const newChecksum = calculateChecksum(consolidatedSrc)\n let shouldWrite = true\n\n const existingRecord = readChecksumRecord(checksumFile)\n if (existingRecord && existingRecord.content === newChecksum) {\n shouldWrite = false\n }\n\n if (shouldWrite) {\n ensureDir(outFile)\n fs.writeFileSync(outFile, consolidatedSrc)\n writeChecksumRecord(checksumFile, { content: newChecksum, structure: '' })\n result.filesWritten.push(outFile)\n if (!quiet) {\n logGenerationResult(path.relative(process.cwd(), outFile), true)\n }\n } else {\n result.filesUnchanged.push(outFile)\n }\n\n // Write per-group outputs\n const groups = Object.keys(grouped) as GroupKey[]\n for (const g of groups) {\n const pkgOutputDir = resolver.getPackageOutputDir(g)\n // Skip @app group since it writes to the same location as the consolidated output\n if (g === '@app' && pkgOutputDir === outputDir) {\n continue\n }\n const out = path.join(pkgOutputDir, 'entities.ids.generated.ts')\n\n const src = `// AUTO-GENERATED by mercato generate entity-ids\nexport const M = ${JSON.stringify(groupedModulesDict[g] || {}, null, 2)} as const\nexport const E = ${JSON.stringify(grouped[g] || {}, null, 2)} as const\nexport type KnownModuleId = keyof typeof M\nexport type KnownEntities = typeof E\n`\n ensureDir(out)\n fs.writeFileSync(out, src)\n result.filesWritten.push(out)\n\n const fieldsRoot = path.join(pkgOutputDir, 'entities')\n const fieldsByModule = fieldsByGroup[g] || {}\n const combined: EntityFieldMap = {}\n for (const mId of Object.keys(fieldsByModule)) {\n const mMap = fieldsByModule[mId]\n for (const [entity, fields] of Object.entries(mMap)) {\n combined[entity] = Array.from(new Set([...(combined[entity] || []), ...fields]))\n }\n }\n writePerEntityFieldFiles(fieldsRoot, combined)\n\n // Generate static entity fields registry for Turbopack compatibility\n writeEntityFieldsRegistry(pkgOutputDir, combined)\n }\n\n // Write combined entity fields to root generated/ folder\n const combinedAll: EntityFieldMap = {}\n for (const groupFields of Object.values(fieldsByGroup)) {\n for (const mMap of Object.values(groupFields)) {\n for (const [entity, fields] of Object.entries(mMap)) {\n combinedAll[entity] = Array.from(new Set([...(combinedAll[entity] || []), ...fields]))\n }\n }\n }\n writePerEntityFieldFiles(path.join(outputDir, 'entities'), combinedAll)\n writeEntityFieldsRegistry(outputDir, combinedAll)\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 ts from 'typescript'\nimport type { PackageResolver, ModuleEntry } from '../resolver'\nimport {\n calculateChecksum,\n readChecksumRecord,\n writeChecksumRecord,\n ensureDir,\n toVar,\n toSnake,\n rimrafDir,\n logGenerationResult,\n type GeneratorResult,\n createGeneratorResult,\n} from '../utils'\n\ntype GroupKey = '@app' | '@open-mercato/core' | string\ntype EntityFieldMap = Record<string, string[]>\n\nexport interface EntityIdsOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\n/**\n * Extract exported class names from a TypeScript source file without dynamic import.\n * This is used for @app modules since Node.js can't import TypeScript files directly.\n */\nfunction parseExportedClassNamesFromFile(filePath: string): string[] {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n const classNames: string[] = []\n\n sf.forEachChild((node) => {\n // Check for exported class declarations\n if (ts.isClassDeclaration(node) && node.name) {\n const hasExport = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n if (hasExport) {\n classNames.push(node.name.text)\n }\n }\n })\n\n return classNames\n}\n\nfunction parseEntityFieldsFromFile(filePath: string, exportedClassNames: string[]): EntityFieldMap {\n const src = fs.readFileSync(filePath, 'utf8')\n const sf = ts.createSourceFile(filePath, src, ts.ScriptTarget.ES2020, true, ts.ScriptKind.TS)\n\n const exported = new Set(exportedClassNames)\n const result: EntityFieldMap = {}\n\n function getDecoratorArgNameLiteral(dec: ts.Decorator | undefined): string | undefined {\n if (!dec) return undefined\n const expr = dec.expression\n if (!ts.isCallExpression(expr)) return undefined\n if (!expr.arguments.length) return undefined\n const first = expr.arguments[0]\n if (!ts.isObjectLiteralExpression(first)) return undefined\n for (const prop of first.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === 'name') {\n if (ts.isStringLiteral(prop.initializer)) return prop.initializer.text\n }\n }\n return undefined\n }\n\n function normalizeDbName(propertyName: string, _decoratorName?: string, nameOverride?: string): string {\n if (nameOverride) return nameOverride\n return toSnake(propertyName)\n }\n\n sf.forEachChild((node) => {\n if (!ts.isClassDeclaration(node) || !node.name) return\n const clsName = node.name.text\n if (!exported.has(clsName)) return\n const entityKey = toSnake(clsName)\n const fields: string[] = []\n\n for (const member of node.members) {\n if (!ts.isPropertyDeclaration(member) || !member.name) continue\n const name = ts.isIdentifier(member.name)\n ? member.name.text\n : ts.isStringLiteral(member.name)\n ? member.name.text\n : undefined\n if (!name) continue\n if (member.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword)) continue\n const decorators = ts.canHaveDecorators(member)\n ? ts.getDecorators(member) ?? []\n : []\n let dbName: string | undefined\n if (decorators && decorators.length) {\n for (const d of decorators) {\n const nameOverride = getDecoratorArgNameLiteral(d)\n dbName = normalizeDbName(name, undefined, nameOverride)\n if (dbName) break\n }\n }\n if (!dbName) dbName = normalizeDbName(name)\n fields.push(dbName)\n }\n result[entityKey] = Array.from(new Set(fields))\n })\n\n return result\n}\n\nfunction writePerEntityFieldFiles(outRoot: string, fieldsByEntity: EntityFieldMap): void {\n fs.mkdirSync(outRoot, { recursive: true })\n rimrafDir(outRoot)\n fs.mkdirSync(outRoot, { recursive: true })\n for (const [entity, fields] of Object.entries(fieldsByEntity)) {\n const entDir = path.join(outRoot, entity)\n fs.mkdirSync(entDir, { recursive: true })\n const idx = fields.map((f) => `export const ${toVar(f)} = '${f}'`).join('\\n') + '\\n'\n fs.writeFileSync(path.join(entDir, 'index.ts'), idx)\n }\n}\n\nfunction writeEntityFieldsRegistry(generatedRoot: string, fieldsByEntity: EntityFieldMap): void {\n const entities = Object.keys(fieldsByEntity).sort()\n\n // Always write the file, even if empty, to prevent TypeScript import errors\n const imports = entities.length > 0\n ? entities.map((e) => `import * as ${toVar(e)} from './entities/${e}/index'`).join('\\n')\n : ''\n const registryEntries = entities.length > 0\n ? entities.map((e) => ` ${toVar(e)}`).join(',\\n')\n : ''\n\n const src = `// AUTO-GENERATED by mercato generate entity-ids\n// Static registry for entity fields - eliminates dynamic imports for Turbopack compatibility\n${imports}\n\nexport const entityFieldsRegistry: Record<string, Record<string, string>> = {\n${registryEntries}\n}\n\nexport function getEntityFields(slug: string): Record<string, string> | undefined {\n return entityFieldsRegistry[slug]\n}\n`\n const outPath = path.join(generatedRoot, 'entity-fields-registry.ts')\n ensureDir(outPath)\n fs.writeFileSync(outPath, src)\n}\n\nexport async function generateEntityIds(options: EntityIdsOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'entities.ids.generated.ts')\n const checksumFile = path.join(outputDir, 'entities.ids.generated.checksum')\n\n const entries = resolver.loadEnabledModules()\n\n const consolidated: Record<string, Record<string, string>> = {}\n const grouped: Record<GroupKey, Record<string, Record<string, string>>> = {}\n const modulesDict: Record<string, string> = {}\n const groupedModulesDict: Record<GroupKey, Record<string, string>> = {}\n\n const fieldsByGroup: Record<GroupKey, Record<string, EntityFieldMap>> = {}\n\n for (const entry of entries) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n const group: GroupKey = (entry.from as GroupKey) || '@open-mercato/core'\n\n // Locate entities definition file (prefer app override)\n const appData = path.join(roots.appBase, 'data')\n const pkgData = path.join(roots.pkgBase, 'data')\n const appDb = path.join(roots.appBase, 'db')\n const pkgDb = path.join(roots.pkgBase, 'db')\n const bases = [appData, pkgData, appDb, pkgDb]\n // Check both .ts (src/monorepo) and .js (dist/production) extensions\n const candidates = ['entities.override.ts', 'entities.override.js', 'entities.ts', 'entities.js', 'schema.ts', 'schema.js']\n let importPath: string | null = null\n let filePath: string | null = null\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 fromApp = base.startsWith(roots.appBase)\n const sub = path.basename(base) // 'data' | 'db'\n const fileBaseName = f.replace(/\\.(ts|js)$/, '')\n importPath = `${fromApp ? imps.appBase : imps.pkgBase}/${sub}/${fileBaseName}`\n filePath = p\n break\n }\n }\n if (importPath) break\n }\n\n // No entities file found -> still register module id\n if (!importPath) {\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n continue\n }\n\n // Get exported class names - either via dynamic import or TypeScript parsing\n let exportNames: string[]\n const isAppModule = entry.from === '@app'\n\n if (isAppModule && filePath) {\n // For @app modules, parse TypeScript source directly\n // since Node.js can't import TypeScript files (path alias @/ doesn't resolve at runtime)\n exportNames = parseExportedClassNamesFromFile(filePath)\n } else {\n // For package modules, use dynamic import\n let mod: Record<string, unknown>\n try {\n mod = await import(importPath)\n } catch (err) {\n // Module import failed, record error and skip\n const errorMessage = err instanceof Error ? err.message : String(err)\n result.errors.push(`Failed to import ${importPath}: ${errorMessage}`)\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n continue\n }\n exportNames = Object.keys(mod).filter((k) => typeof mod[k] === 'function')\n }\n\n const entityNames = exportNames\n .map((k) => toSnake(k))\n .filter((k, idx, arr) => arr.indexOf(k) === idx)\n\n // Build dictionaries\n modulesDict[modId] = modId\n groupedModulesDict[group] = groupedModulesDict[group] || {}\n groupedModulesDict[group][modId] = modId\n\n consolidated[modId] = consolidated[modId] || {}\n grouped[group] = grouped[group] || {}\n grouped[group][modId] = grouped[group][modId] || {}\n\n for (const en of entityNames) {\n consolidated[modId][en] = `${modId}:${en}`\n grouped[group][modId][en] = `${modId}:${en}`\n }\n\n if (filePath) {\n // exportNames already contains only class/function names from either source\n const entityFieldMap = parseEntityFieldsFromFile(filePath, exportNames)\n fieldsByGroup[group] = fieldsByGroup[group] || {}\n fieldsByGroup[group][modId] = entityFieldMap\n }\n }\n\n // Write consolidated output\n const consolidatedSrc = `// AUTO-GENERATED by mercato generate entity-ids\nexport const M = ${JSON.stringify(modulesDict, null, 2)} as const\nexport const E = ${JSON.stringify(consolidated, null, 2)} as const\nexport type KnownModuleId = keyof typeof M\nexport type KnownEntities = typeof E\n`\n\n // Check if content has changed\n const newChecksum = calculateChecksum(consolidatedSrc)\n let shouldWrite = true\n\n const existingRecord = readChecksumRecord(checksumFile)\n if (existingRecord && existingRecord.content === newChecksum) {\n shouldWrite = false\n }\n\n if (shouldWrite) {\n ensureDir(outFile)\n fs.writeFileSync(outFile, consolidatedSrc)\n writeChecksumRecord(checksumFile, { content: newChecksum, structure: '' })\n result.filesWritten.push(outFile)\n if (!quiet) {\n logGenerationResult(path.relative(process.cwd(), outFile), true)\n }\n } else {\n result.filesUnchanged.push(outFile)\n }\n\n // Write per-group outputs\n const groups = Object.keys(grouped) as GroupKey[]\n for (const g of groups) {\n const pkgOutputDir = resolver.getPackageOutputDir(g)\n // Skip @app group since it writes to the same location as the consolidated output\n if (g === '@app' && pkgOutputDir === outputDir) {\n continue\n }\n const out = path.join(pkgOutputDir, 'entities.ids.generated.ts')\n\n const src = `// AUTO-GENERATED by mercato generate entity-ids\nexport const M = ${JSON.stringify(groupedModulesDict[g] || {}, null, 2)} as const\nexport const E = ${JSON.stringify(grouped[g] || {}, null, 2)} as const\nexport type KnownModuleId = keyof typeof M\nexport type KnownEntities = typeof E\n`\n ensureDir(out)\n fs.writeFileSync(out, src)\n result.filesWritten.push(out)\n\n const fieldsRoot = path.join(pkgOutputDir, 'entities')\n const fieldsByModule = fieldsByGroup[g] || {}\n const combined: EntityFieldMap = {}\n for (const mId of Object.keys(fieldsByModule)) {\n const mMap = fieldsByModule[mId]\n for (const [entity, fields] of Object.entries(mMap)) {\n combined[entity] = Array.from(new Set([...(combined[entity] || []), ...fields]))\n }\n }\n writePerEntityFieldFiles(fieldsRoot, combined)\n\n // Generate static entity fields registry for Turbopack compatibility\n writeEntityFieldsRegistry(pkgOutputDir, combined)\n }\n\n // Write combined entity fields to root generated/ folder\n const combinedAll: EntityFieldMap = {}\n for (const groupFields of Object.values(fieldsByGroup)) {\n for (const mMap of Object.values(groupFields)) {\n for (const [entity, fields] of Object.entries(mMap)) {\n combinedAll[entity] = Array.from(new Set([...(combinedAll[entity] || []), ...fields]))\n }\n }\n }\n writePerEntityFieldFiles(path.join(outputDir, 'entities'), combinedAll)\n writeEntityFieldsRegistry(outputDir, combinedAll)\n\n return result\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AAEf;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAcP,SAAS,gCAAgC,UAA4B;AACnE,QAAM,MAAM,GAAG,aAAa,UAAU,MAAM;AAC5C,QAAM,KAAK,GAAG,iBAAiB,UAAU,KAAK,GAAG,aAAa,QAAQ,MAAM,GAAG,WAAW,EAAE;AAC5F,QAAM,aAAuB,CAAC;AAE9B,KAAG,aAAa,CAAC,SAAS;AAExB,QAAI,GAAG,mBAAmB,IAAI,KAAK,KAAK,MAAM;AAC5C,YAAM,YAAY,KAAK,WAAW;AAAA,QAChC,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW;AAAA,MAClC;AACA,UAAI,WAAW;AACb,mBAAW,KAAK,KAAK,KAAK,IAAI;AAAA,MAChC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,0BAA0B,UAAkB,oBAA8C;AACjG,QAAM,MAAM,GAAG,aAAa,UAAU,MAAM;AAC5C,QAAM,KAAK,GAAG,iBAAiB,UAAU,KAAK,GAAG,aAAa,QAAQ,MAAM,GAAG,WAAW,EAAE;AAE5F,QAAM,WAAW,IAAI,IAAI,kBAAkB;AAC3C,QAAM,SAAyB,CAAC;AAEhC,WAAS,2BAA2B,KAAmD;AACrF,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,OAAO,IAAI;AACjB,QAAI,CAAC,GAAG,iBAAiB,IAAI,EAAG,QAAO;AACvC,QAAI,CAAC,KAAK,UAAU,OAAQ,QAAO;AACnC,UAAM,QAAQ,KAAK,UAAU,CAAC;AAC9B,QAAI,CAAC,GAAG,0BAA0B,KAAK,EAAG,QAAO;AACjD,eAAW,QAAQ,MAAM,YAAY;AACnC,UAAI,GAAG,qBAAqB,IAAI,KAAK,GAAG,aAAa,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,QAAQ;AAC5F,YAAI,GAAG,gBAAgB,KAAK,WAAW,EAAG,QAAO,KAAK,YAAY;AAAA,MACpE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB,cAAsB,gBAAyB,cAA+B;AACrG,QAAI,aAAc,QAAO;AACzB,WAAO,QAAQ,YAAY;AAAA,EAC7B;AAEA,KAAG,aAAa,CAAC,SAAS;AACxB,QAAI,CAAC,GAAG,mBAAmB,IAAI,KAAK,CAAC,KAAK,KAAM;AAChD,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,SAAS,IAAI,OAAO,EAAG;AAC5B,UAAM,YAAY,QAAQ,OAAO;AACjC,UAAM,SAAmB,CAAC;AAE1B,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI,CAAC,GAAG,sBAAsB,MAAM,KAAK,CAAC,OAAO,KAAM;AACvD,YAAM,OAAO,GAAG,aAAa,OAAO,IAAI,IACpC,OAAO,KAAK,OACZ,GAAG,gBAAgB,OAAO,IAAI,IAC5B,OAAO,KAAK,OACZ;AACN,UAAI,CAAC,KAAM;AACX,UAAI,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,aAAa,EAAG;AAC3E,YAAM,aAAa,GAAG,kBAAkB,MAAM,IAC1C,GAAG,cAAc,MAAM,KAAK,CAAC,IAC7B,CAAC;AACL,UAAI;AACJ,UAAI,cAAc,WAAW,QAAQ;AACnC,mBAAW,KAAK,YAAY;AAC1B,gBAAM,eAAe,2BAA2B,CAAC;AACjD,mBAAS,gBAAgB,MAAM,QAAW,YAAY;AACtD,cAAI,OAAQ;AAAA,QACd;AAAA,MACF;AACA,UAAI,CAAC,OAAQ,UAAS,gBAAgB,IAAI;AAC1C,aAAO,KAAK,MAAM;AAAA,IACpB;AACA,WAAO,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AAAA,EAChD,CAAC;AAED,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAiB,gBAAsC;AACvF,KAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACzC,YAAU,OAAO;AACjB,KAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACzC,aAAW,CAAC,QAAQ,MAAM,KAAK,OAAO,QAAQ,cAAc,GAAG;AAC7D,UAAM,SAAS,KAAK,KAAK,SAAS,MAAM;AACxC,OAAG,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACxC,UAAM,MAAM,OAAO,IAAI,CAAC,MAAM,gBAAgB,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,IAAI,IAAI;AAChF,OAAG,cAAc,KAAK,KAAK,QAAQ,UAAU,GAAG,GAAG;AAAA,EACrD;AACF;AAEA,SAAS,0BAA0B,eAAuB,gBAAsC;AAC9F,QAAM,WAAW,OAAO,KAAK,cAAc,EAAE,KAAK;AAGlD,QAAM,UAAU,SAAS,SAAS,IAC9B,SAAS,IAAI,CAAC,MAAM,eAAe,MAAM,CAAC,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,IAAI,IACrF;AACJ,QAAM,kBAAkB,SAAS,SAAS,IACtC,SAAS,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,KAAK,IAC/C;AAEJ,QAAM,MAAM;AAAA;AAAA,EAEZ,OAAO;AAAA;AAAA;AAAA,EAGP,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOf,QAAM,UAAU,KAAK,KAAK,eAAe,2BAA2B;AACpE,YAAU,OAAO;AACjB,KAAG,cAAc,SAAS,GAAG;AAC/B;AAEA,eAAsB,kBAAkB,SAAqD;AAC3F,QAAM,EAAE,UAAU,QAAQ,MAAM,IAAI;AACpC,QAAM,SAAS,sBAAsB;AAErC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,UAAU,KAAK,KAAK,WAAW,2BAA2B;AAChE,QAAM,eAAe,KAAK,KAAK,WAAW,iCAAiC;AAE3E,QAAM,UAAU,SAAS,mBAAmB;AAE5C,QAAM,eAAuD,CAAC;AAC9D,QAAM,UAAoE,CAAC;AAC3E,QAAM,cAAsC,CAAC;AAC7C,QAAM,qBAA+D,CAAC;AAEtE,QAAM,gBAAkE,CAAC;AAEzE,aAAW,SAAS,SAAS;AAC3B,UAAM,QAAQ,MAAM;AACpB,UAAM,QAAQ,SAAS,eAAe,KAAK;AAC3C,UAAM,OAAO,SAAS,oBAAoB,KAAK;AAC/C,UAAM,QAAmB,MAAM,QAAqB;AAGpD,UAAM,UAAU,KAAK,KAAK,MAAM,SAAS,MAAM;AAC/C,UAAM,UAAU,KAAK,KAAK,MAAM,SAAS,MAAM;AAC/C,UAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,IAAI;AAC3C,UAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,IAAI;AAC3C,UAAM,QAAQ,CAAC,SAAS,SAAS,OAAO,KAAK;AAE7C,UAAM,aAAa,CAAC,wBAAwB,wBAAwB,eAAe,eAAe,aAAa,WAAW;AAC1H,QAAI,aAA4B;AAChC,QAAI,WAA0B;AAE9B,eAAW,QAAQ,OAAO;AACxB,iBAAW,KAAK,YAAY;AAC1B,cAAM,IAAI,KAAK,KAAK,MAAM,CAAC;AAC3B,YAAI,GAAG,WAAW,CAAC,GAAG;AACpB,gBAAM,UAAU,KAAK,WAAW,MAAM,OAAO;AAC7C,gBAAM,MAAM,KAAK,SAAS,IAAI;AAC9B,gBAAM,eAAe,EAAE,QAAQ,cAAc,EAAE;AAC/C,uBAAa,GAAG,UAAU,KAAK,UAAU,KAAK,OAAO,IAAI,GAAG,IAAI,YAAY;AAC5E,qBAAW;AACX;AAAA,QACF;AAAA,MACF;AACA,UAAI,WAAY;AAAA,IAClB;AAGA,QAAI,CAAC,YAAY;AACf,kBAAY,KAAK,IAAI;AACrB,yBAAmB,KAAK,IAAI,mBAAmB,KAAK,KAAK,CAAC;AAC1D,yBAAmB,KAAK,EAAE,KAAK,IAAI;AACnC;AAAA,IACF;AAGA,QAAI;AACJ,UAAM,cAAc,MAAM,SAAS;AAEnC,QAAI,eAAe,UAAU;AAG3B,oBAAc,gCAAgC,QAAQ;AAAA,IACxD,OAAO;AAEL,UAAI;AACJ,UAAI;AACF,cAAM,MAAM,OAAO;AAAA,MACrB,SAAS,KAAK;AAEZ,cAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACpE,eAAO,OAAO,KAAK,oBAAoB,UAAU,KAAK,YAAY,EAAE;AACpE,oBAAY,KAAK,IAAI;AACrB,2BAAmB,KAAK,IAAI,mBAAmB,KAAK,KAAK,CAAC;AAC1D,2BAAmB,KAAK,EAAE,KAAK,IAAI;AACnC;AAAA,MACF;AACA,oBAAc,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,UAAU;AAAA,IAC3E;AAEA,UAAM,cAAc,YACjB,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,EACrB,OAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG;AAGjD,gBAAY,KAAK,IAAI;AACrB,uBAAmB,KAAK,IAAI,mBAAmB,KAAK,KAAK,CAAC;AAC1D,uBAAmB,KAAK,EAAE,KAAK,IAAI;AAEnC,iBAAa,KAAK,IAAI,aAAa,KAAK,KAAK,CAAC;AAC9C,YAAQ,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AACpC,YAAQ,KAAK,EAAE,KAAK,IAAI,QAAQ,KAAK,EAAE,KAAK,KAAK,CAAC;AAElD,eAAW,MAAM,aAAa;AAC5B,mBAAa,KAAK,EAAE,EAAE,IAAI,GAAG,KAAK,IAAI,EAAE;AACxC,cAAQ,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,GAAG,KAAK,IAAI,EAAE;AAAA,IAC5C;AAEA,QAAI,UAAU;AAEZ,YAAM,iBAAiB,0BAA0B,UAAU,WAAW;AACtE,oBAAc,KAAK,IAAI,cAAc,KAAK,KAAK,CAAC;AAChD,oBAAc,KAAK,EAAE,KAAK,IAAI;AAAA,IAChC;AAAA,EACF;AAGA,QAAM,kBAAkB;AAAA,mBACP,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAAA,mBACpC,KAAK,UAAU,cAAc,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAMtD,QAAM,cAAc,kBAAkB,eAAe;AACrD,MAAI,cAAc;AAElB,QAAM,iBAAiB,mBAAmB,YAAY;AACtD,MAAI,kBAAkB,eAAe,YAAY,aAAa;AAC5D,kBAAc;AAAA,EAChB;AAEA,MAAI,aAAa;AACf,cAAU,OAAO;AACjB,OAAG,cAAc,SAAS,eAAe;AACzC,wBAAoB,cAAc,EAAE,SAAS,aAAa,WAAW,GAAG,CAAC;AACzE,WAAO,aAAa,KAAK,OAAO;AAChC,QAAI,CAAC,OAAO;AACV,0BAAoB,KAAK,SAAS,QAAQ,IAAI,GAAG,OAAO,GAAG,IAAI;AAAA,IACjE;AAAA,EACF,OAAO;AACL,WAAO,eAAe,KAAK,OAAO;AAAA,EACpC;AAGA,QAAM,SAAS,OAAO,KAAK,OAAO;AAClC,aAAW,KAAK,QAAQ;AACtB,UAAM,eAAe,SAAS,oBAAoB,CAAC;AAEnD,QAAI,MAAM,UAAU,iBAAiB,WAAW;AAC9C;AAAA,IACF;AACA,UAAM,MAAM,KAAK,KAAK,cAAc,2BAA2B;AAE/D,UAAM,MAAM;AAAA,mBACG,KAAK,UAAU,mBAAmB,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,mBACpD,KAAK,UAAU,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAIxD,cAAU,GAAG;AACb,OAAG,cAAc,KAAK,GAAG;AACzB,WAAO,aAAa,KAAK,GAAG;AAE5B,UAAM,aAAa,KAAK,KAAK,cAAc,UAAU;AACrD,UAAM,iBAAiB,cAAc,CAAC,KAAK,CAAC;AAC5C,UAAM,WAA2B,CAAC;AAClC,eAAW,OAAO,OAAO,KAAK,cAAc,GAAG;AAC7C,YAAM,OAAO,eAAe,GAAG;AAC/B,iBAAW,CAAC,QAAQ,MAAM,KAAK,OAAO,QAAQ,IAAI,GAAG;AACnD,iBAAS,MAAM,IAAI,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAI,SAAS,MAAM,KAAK,CAAC,GAAI,GAAG,MAAM,CAAC,CAAC;AAAA,MACjF;AAAA,IACF;AACA,6BAAyB,YAAY,QAAQ;AAG7C,8BAA0B,cAAc,QAAQ;AAAA,EAClD;AAGA,QAAM,cAA8B,CAAC;AACrC,aAAW,eAAe,OAAO,OAAO,aAAa,GAAG;AACtD,eAAW,QAAQ,OAAO,OAAO,WAAW,GAAG;AAC7C,iBAAW,CAAC,QAAQ,MAAM,KAAK,OAAO,QAAQ,IAAI,GAAG;AACnD,oBAAY,MAAM,IAAI,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAI,YAAY,MAAM,KAAK,CAAC,GAAI,GAAG,MAAM,CAAC,CAAC;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AACA,2BAAyB,KAAK,KAAK,WAAW,UAAU,GAAG,WAAW;AACtE,4BAA0B,WAAW,WAAW;AAEhD,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -23,10 +23,12 @@ async function generateModuleDi(options) {
|
|
|
23
23
|
const modId = entry.id;
|
|
24
24
|
const roots = resolver.getModulePaths(entry);
|
|
25
25
|
const imp = resolver.getModuleImportBase(entry);
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
const
|
|
26
|
+
const appDiTs = path.join(roots.appBase, "di.ts");
|
|
27
|
+
const appDiJs = path.join(roots.appBase, "di.js");
|
|
28
|
+
const pkgDiTs = path.join(roots.pkgBase, "di.ts");
|
|
29
|
+
const pkgDiJs = path.join(roots.pkgBase, "di.js");
|
|
30
|
+
const useApp = fs.existsSync(appDiTs) || fs.existsSync(appDiJs);
|
|
31
|
+
const usePkg = fs.existsSync(pkgDiTs) || fs.existsSync(pkgDiJs);
|
|
30
32
|
const importName = `D_${toVar(modId)}_${i++}`;
|
|
31
33
|
if (useApp) {
|
|
32
34
|
const isAppModule = entry.from === "@app";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/generators/module-di.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageResolver } from '../resolver'\nimport {\n calculateChecksum,\n readChecksumRecord,\n writeChecksumRecord,\n ensureDir,\n toVar,\n logGenerationResult,\n type GeneratorResult,\n createGeneratorResult,\n} from '../utils'\n\nexport interface ModuleDiOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleDi(options: ModuleDiOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'di.generated.ts')\n const checksumFile = path.join(outputDir, 'di.generated.checksum')\n\n const mods = resolver.loadEnabledModules()\n const imports: string[] = []\n const registrars: string[] = []\n let i = 0\n\n for (const entry of mods) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imp = resolver.getModuleImportBase(entry)\n const
|
|
5
|
-
"mappings": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAOP,eAAsB,iBAAiB,SAAoD;AACzF,QAAM,EAAE,UAAU,QAAQ,MAAM,IAAI;AACpC,QAAM,SAAS,sBAAsB;AAErC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,UAAU,KAAK,KAAK,WAAW,iBAAiB;AACtD,QAAM,eAAe,KAAK,KAAK,WAAW,uBAAuB;AAEjE,QAAM,OAAO,SAAS,mBAAmB;AACzC,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAuB,CAAC;AAC9B,MAAI,IAAI;AAER,aAAW,SAAS,MAAM;AACxB,UAAM,QAAQ,MAAM;AACpB,UAAM,QAAQ,SAAS,eAAe,KAAK;AAC3C,UAAM,MAAM,SAAS,oBAAoB,KAAK;
|
|
4
|
+
"sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageResolver } from '../resolver'\nimport {\n calculateChecksum,\n readChecksumRecord,\n writeChecksumRecord,\n ensureDir,\n toVar,\n logGenerationResult,\n type GeneratorResult,\n createGeneratorResult,\n} from '../utils'\n\nexport interface ModuleDiOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleDi(options: ModuleDiOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'di.generated.ts')\n const checksumFile = path.join(outputDir, 'di.generated.checksum')\n\n const mods = resolver.loadEnabledModules()\n const imports: string[] = []\n const registrars: string[] = []\n let i = 0\n\n for (const entry of mods) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imp = resolver.getModuleImportBase(entry)\n // Check both .ts (src/monorepo) and .js (dist/production) extensions\n const appDiTs = path.join(roots.appBase, 'di.ts')\n const appDiJs = path.join(roots.appBase, 'di.js')\n const pkgDiTs = path.join(roots.pkgBase, 'di.ts')\n const pkgDiJs = path.join(roots.pkgBase, 'di.js')\n const useApp = fs.existsSync(appDiTs) || fs.existsSync(appDiJs)\n const usePkg = fs.existsSync(pkgDiTs) || fs.existsSync(pkgDiJs)\n const importName = `D_${toVar(modId)}_${i++}`\n\n if (useApp) {\n // For @app modules, use relative path to work in both Next.js and Node.js CLI context\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const isAppModule = entry.from === '@app'\n const importPath = isAppModule ? `../../src/modules/${modId}/di` : `${imp.appBase}/di`\n imports.push(`import * as ${importName} from '${importPath}'`)\n registrars.push(`${importName}.register`)\n } else if (usePkg) {\n imports.push(`import * as ${importName} from '${imp.pkgBase}/di'`)\n registrars.push(`${importName}.register`)\n }\n }\n\n const output = `// AUTO-GENERATED by mercato generate di\n${imports.join('\\n')}\n\nconst diRegistrars = [\n ${registrars.join(',\\n ')}\n].filter(Boolean) as (((c: any) => void)|undefined)[]\n\nexport { diRegistrars }\nexport default diRegistrars\n`\n\n // Check if content has changed\n const newChecksum = calculateChecksum(output)\n let shouldWrite = true\n\n const existingRecord = readChecksumRecord(checksumFile)\n if (existingRecord && existingRecord.content === newChecksum) {\n shouldWrite = false\n }\n\n if (shouldWrite) {\n ensureDir(outFile)\n fs.writeFileSync(outFile, output)\n writeChecksumRecord(checksumFile, { content: newChecksum, structure: '' })\n result.filesWritten.push(outFile)\n if (!quiet) {\n logGenerationResult(path.relative(process.cwd(), outFile), true)\n }\n } else {\n result.filesUnchanged.push(outFile)\n }\n\n return result\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAOP,eAAsB,iBAAiB,SAAoD;AACzF,QAAM,EAAE,UAAU,QAAQ,MAAM,IAAI;AACpC,QAAM,SAAS,sBAAsB;AAErC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,UAAU,KAAK,KAAK,WAAW,iBAAiB;AACtD,QAAM,eAAe,KAAK,KAAK,WAAW,uBAAuB;AAEjE,QAAM,OAAO,SAAS,mBAAmB;AACzC,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAuB,CAAC;AAC9B,MAAI,IAAI;AAER,aAAW,SAAS,MAAM;AACxB,UAAM,QAAQ,MAAM;AACpB,UAAM,QAAQ,SAAS,eAAe,KAAK;AAC3C,UAAM,MAAM,SAAS,oBAAoB,KAAK;AAE9C,UAAM,UAAU,KAAK,KAAK,MAAM,SAAS,OAAO;AAChD,UAAM,UAAU,KAAK,KAAK,MAAM,SAAS,OAAO;AAChD,UAAM,UAAU,KAAK,KAAK,MAAM,SAAS,OAAO;AAChD,UAAM,UAAU,KAAK,KAAK,MAAM,SAAS,OAAO;AAChD,UAAM,SAAS,GAAG,WAAW,OAAO,KAAK,GAAG,WAAW,OAAO;AAC9D,UAAM,SAAS,GAAG,WAAW,OAAO,KAAK,GAAG,WAAW,OAAO;AAC9D,UAAM,aAAa,KAAK,MAAM,KAAK,CAAC,IAAI,GAAG;AAE3C,QAAI,QAAQ;AAGV,YAAM,cAAc,MAAM,SAAS;AACnC,YAAM,aAAa,cAAc,qBAAqB,KAAK,QAAQ,GAAG,IAAI,OAAO;AACjF,cAAQ,KAAK,eAAe,UAAU,UAAU,UAAU,GAAG;AAC7D,iBAAW,KAAK,GAAG,UAAU,WAAW;AAAA,IAC1C,WAAW,QAAQ;AACjB,cAAQ,KAAK,eAAe,UAAU,UAAU,IAAI,OAAO,MAAM;AACjE,iBAAW,KAAK,GAAG,UAAU,WAAW;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,SAAS;AAAA,EACf,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAGhB,WAAW,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ1B,QAAM,cAAc,kBAAkB,MAAM;AAC5C,MAAI,cAAc;AAElB,QAAM,iBAAiB,mBAAmB,YAAY;AACtD,MAAI,kBAAkB,eAAe,YAAY,aAAa;AAC5D,kBAAc;AAAA,EAChB;AAEA,MAAI,aAAa;AACf,cAAU,OAAO;AACjB,OAAG,cAAc,SAAS,MAAM;AAChC,wBAAoB,cAAc,EAAE,SAAS,aAAa,WAAW,GAAG,CAAC;AACzE,WAAO,aAAa,KAAK,OAAO;AAChC,QAAI,CAAC,OAAO;AACV,0BAAoB,KAAK,SAAS,QAAQ,IAAI,GAAG,OAAO,GAAG,IAAI;AAAA,IACjE;AAAA,EACF,OAAO;AACL,WAAO,eAAe,KAAK,OAAO;AAAA,EACpC;AAEA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -478,8 +478,9 @@ async function generateModuleRegistry(options) {
|
|
|
478
478
|
if (e.isDirectory()) {
|
|
479
479
|
if (e.name === "__tests__" || e.name === "__mocks__") continue;
|
|
480
480
|
walk(path.join(dir, e.name), [...rel, e.name]);
|
|
481
|
-
} else if (e.isFile() && e.name.endsWith(".ts")) {
|
|
482
|
-
if (/\.(test|spec)\.ts$/.test(e.name)) continue;
|
|
481
|
+
} else if (e.isFile() && (e.name.endsWith(".ts") || e.name.endsWith(".js"))) {
|
|
482
|
+
if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue;
|
|
483
|
+
if (e.name.endsWith(".d.ts")) continue;
|
|
483
484
|
found.push([...rel, e.name].join("/"));
|
|
484
485
|
}
|
|
485
486
|
}
|
|
@@ -490,11 +491,12 @@ async function generateModuleRegistry(options) {
|
|
|
490
491
|
for (const rel of files) {
|
|
491
492
|
const segs = rel.split("/");
|
|
492
493
|
const file = segs.pop();
|
|
493
|
-
const name = file.replace(/\.ts$/, "");
|
|
494
|
+
const name = file.replace(/\.(ts|js)$/, "");
|
|
494
495
|
const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
|
|
495
496
|
const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
|
|
496
|
-
const
|
|
497
|
-
const
|
|
497
|
+
const appFileTs = path.join(subApp, ...segs, `${name}.ts`);
|
|
498
|
+
const appFileJs = path.join(subApp, ...segs, `${name}.js`);
|
|
499
|
+
const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs);
|
|
498
500
|
const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join("/")}`;
|
|
499
501
|
imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`);
|
|
500
502
|
const sid = [modId, ...segs, name].filter(Boolean).join(":");
|
|
@@ -513,8 +515,9 @@ async function generateModuleRegistry(options) {
|
|
|
513
515
|
if (e.isDirectory()) {
|
|
514
516
|
if (e.name === "__tests__" || e.name === "__mocks__") continue;
|
|
515
517
|
walk(path.join(dir, e.name), [...rel, e.name]);
|
|
516
|
-
} else if (e.isFile() && e.name.endsWith(".ts")) {
|
|
517
|
-
if (/\.(test|spec)\.ts$/.test(e.name)) continue;
|
|
518
|
+
} else if (e.isFile() && (e.name.endsWith(".ts") || e.name.endsWith(".js"))) {
|
|
519
|
+
if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue;
|
|
520
|
+
if (e.name.endsWith(".d.ts")) continue;
|
|
518
521
|
found.push([...rel, e.name].join("/"));
|
|
519
522
|
}
|
|
520
523
|
}
|
|
@@ -525,9 +528,10 @@ async function generateModuleRegistry(options) {
|
|
|
525
528
|
for (const rel of files) {
|
|
526
529
|
const segs = rel.split("/");
|
|
527
530
|
const file = segs.pop();
|
|
528
|
-
const name = file.replace(/\.ts$/, "");
|
|
529
|
-
const
|
|
530
|
-
const
|
|
531
|
+
const name = file.replace(/\.(ts|js)$/, "");
|
|
532
|
+
const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`);
|
|
533
|
+
const appFileJs = path.join(wrkApp, ...segs, `${name}.js`);
|
|
534
|
+
const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs);
|
|
531
535
|
const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join("/")}`;
|
|
532
536
|
if (!await moduleHasExport(importPath, "metadata")) continue;
|
|
533
537
|
const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
|
|
@@ -952,8 +956,9 @@ async function generateModuleRegistryCli(options) {
|
|
|
952
956
|
if (e.isDirectory()) {
|
|
953
957
|
if (e.name === "__tests__" || e.name === "__mocks__") continue;
|
|
954
958
|
walk(path.join(dir, e.name), [...rel, e.name]);
|
|
955
|
-
} else if (e.isFile() && e.name.endsWith(".ts")) {
|
|
956
|
-
if (/\.(test|spec)\.ts$/.test(e.name)) continue;
|
|
959
|
+
} else if (e.isFile() && (e.name.endsWith(".ts") || e.name.endsWith(".js"))) {
|
|
960
|
+
if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue;
|
|
961
|
+
if (e.name.endsWith(".d.ts")) continue;
|
|
957
962
|
found.push([...rel, e.name].join("/"));
|
|
958
963
|
}
|
|
959
964
|
}
|
|
@@ -964,11 +969,12 @@ async function generateModuleRegistryCli(options) {
|
|
|
964
969
|
for (const rel of files) {
|
|
965
970
|
const segs = rel.split("/");
|
|
966
971
|
const file = segs.pop();
|
|
967
|
-
const name = file.replace(/\.ts$/, "");
|
|
972
|
+
const name = file.replace(/\.(ts|js)$/, "");
|
|
968
973
|
const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
|
|
969
974
|
const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
|
|
970
|
-
const
|
|
971
|
-
const
|
|
975
|
+
const appFileTs = path.join(subApp, ...segs, `${name}.ts`);
|
|
976
|
+
const appFileJs = path.join(subApp, ...segs, `${name}.js`);
|
|
977
|
+
const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs);
|
|
972
978
|
const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join("/")}`;
|
|
973
979
|
imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`);
|
|
974
980
|
const sid = [modId, ...segs, name].filter(Boolean).join(":");
|
|
@@ -987,8 +993,9 @@ async function generateModuleRegistryCli(options) {
|
|
|
987
993
|
if (e.isDirectory()) {
|
|
988
994
|
if (e.name === "__tests__" || e.name === "__mocks__") continue;
|
|
989
995
|
walk(path.join(dir, e.name), [...rel, e.name]);
|
|
990
|
-
} else if (e.isFile() && e.name.endsWith(".ts")) {
|
|
991
|
-
if (/\.(test|spec)\.ts$/.test(e.name)) continue;
|
|
996
|
+
} else if (e.isFile() && (e.name.endsWith(".ts") || e.name.endsWith(".js"))) {
|
|
997
|
+
if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue;
|
|
998
|
+
if (e.name.endsWith(".d.ts")) continue;
|
|
992
999
|
found.push([...rel, e.name].join("/"));
|
|
993
1000
|
}
|
|
994
1001
|
}
|
|
@@ -999,9 +1006,10 @@ async function generateModuleRegistryCli(options) {
|
|
|
999
1006
|
for (const rel of files) {
|
|
1000
1007
|
const segs = rel.split("/");
|
|
1001
1008
|
const file = segs.pop();
|
|
1002
|
-
const name = file.replace(/\.ts$/, "");
|
|
1003
|
-
const
|
|
1004
|
-
const
|
|
1009
|
+
const name = file.replace(/\.(ts|js)$/, "");
|
|
1010
|
+
const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`);
|
|
1011
|
+
const appFileJs = path.join(wrkApp, ...segs, `${name}.js`);
|
|
1012
|
+
const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs);
|
|
1005
1013
|
const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join("/")}`;
|
|
1006
1014
|
if (!await moduleHasExport(importPath, "metadata")) continue;
|
|
1007
1015
|
const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join("_") || "index")}`;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/generators/module-registry.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageResolver } from '../resolver'\nimport {\n calculateChecksum,\n calculateStructureChecksum,\n readChecksumRecord,\n writeChecksumRecord,\n toVar,\n moduleHasExport,\n logGenerationResult,\n type GeneratorResult,\n createGeneratorResult,\n} from '../utils'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\n/**\n * Find a module file, checking for both .ts (src) and .js (dist) extensions.\n * Supports both simple names (e.g., 'cli') and nested paths (e.g., 'data/extensions').\n * Returns the path if found, null otherwise.\n */\nfunction findModuleFile(basePath: string, ...segments: string[]): string | null {\n const name = segments.pop()!\n const dir = segments.length ? path.join(basePath, ...segments) : basePath\n const tsPath = path.join(dir, `${name}.ts`)\n if (fs.existsSync(tsPath)) return tsPath\n const jsPath = path.join(dir, `${name}.js`)\n if (fs.existsSync(jsPath)) return jsPath\n return null\n}\n\nexport interface ModuleRegistryOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleRegistry(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.generated.checksum')\n const widgetsOutFile = path.join(outputDir, 'dashboard-widgets.generated.ts')\n const widgetsChecksumFile = path.join(outputDir, 'dashboard-widgets.generated.checksum')\n const injectionWidgetsOutFile = path.join(outputDir, 'injection-widgets.generated.ts')\n const injectionWidgetsChecksumFile = path.join(outputDir, 'injection-widgets.generated.checksum')\n const injectionTablesOutFile = path.join(outputDir, 'injection-tables.generated.ts')\n const injectionTablesChecksumFile = path.join(outputDir, 'injection-tables.generated.checksum')\n const searchOutFile = path.join(outputDir, 'search.generated.ts')\n const searchChecksumFile = path.join(outputDir, 'search.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n let importId = 0\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n const allDashboardWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionTables: Array<{ moduleId: string; importPath: string; importName: string }> = []\n const searchConfigs: string[] = []\n const searchImports: string[] = []\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n // For @app modules, use relative paths since @/ alias doesn't work in Node.js runtime\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : imps.appBase\n\n const frontendRoutes: string[] = []\n const backendRoutes: string[] = []\n const apis: string[] = []\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let searchImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n const dashboardWidgets: string[] = []\n const injectionWidgets: string[] = []\n let injectionTableImportName: string | null = null\n\n // Module metadata: index.ts (overrideable)\n const appIndex = findModuleFile(roots.appBase, 'index')\n const pkgIndex = findModuleFile(roots.pkgBase, 'index')\n const indexTs = appIndex ?? pkgIndex\n if (indexTs) {\n infoImportName = `I${importId++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n // Try to eagerly read ModuleInfo.requires for dependency validation\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // Pages: frontend\n const feApp = path.join(roots.appBase, 'frontend')\n const fePkg = path.join(roots.pkgBase, 'frontend')\n if (fs.existsSync(feApp) || fs.existsSync(fePkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.tsx')) found.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(fePkg)) walk(fePkg)\n if (fs.existsSync(feApp)) walk(feApp)\n let files = Array.from(new Set(found))\n // Ensure static routes win over dynamic ones (e.g., 'create' before '[id]')\n const isDynamic = (p: string) => /\\/(\\[|\\[\\[\\.\\.\\.)/.test(p) || /^\\[/.test(p)\n files.sort((a, b) => {\n const ad = isDynamic(a) ? 1 : 0\n const bd = isDynamic(b) ? 1 : 0\n if (ad !== bd) return ad - bd // static first\n // Longer, more specific paths later to not shadow peers\n return a.localeCompare(b)\n })\n // Next-style page.tsx\n for (const rel of files.filter((f) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = rel.split('/')\n segs.pop()\n const importName = `C${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `CM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(feApp, ...segs, 'page.tsx')\n const fromApp = fs.existsSync(appFile)\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${sub}`\n const routePath = '/' + (segs.join('/') || '')\n const metaCandidates = [\n path.join(fromApp ? feApp : fePkg, ...segs, 'page.meta.ts'),\n path.join(fromApp ? feApp : fePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `M${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, path.basename(metaPath).replace(/\\.ts$/, '')].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n frontendRoutes.push(\n `{ pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n // Back-compat direct files\n for (const rel of files.filter((f) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const routeSegs = [...segs, name].filter(Boolean)\n const importName = `C${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const pageModName = `CM${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const appFile = path.join(feApp, ...segs, `${name}.tsx`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, name].join('/')}`\n const routePath = '/' + (routeSegs.join('/') || '')\n const metaCandidates = [\n path.join(fromApp ? feApp : fePkg, ...segs, name + '.meta.ts'),\n path.join(fromApp ? feApp : fePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `M${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const metaBase = path.basename(metaPath)\n const metaImportSub = metaBase === 'meta.ts' ? 'meta' : name + '.meta'\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n frontendRoutes.push(\n `{ pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, Component: ${importName} }`\n )\n }\n }\n\n // Entity extensions: src/modules/<module>/data/extensions.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'extensions')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'extensions')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `X_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`\n imports.push(`import * as ${importName} from '${importPath}'`)\n extensionsImportName = importName\n }\n }\n\n // RBAC feature declarations: module root acl.ts\n {\n const rootApp = findModuleFile(roots.appBase, 'acl')\n const rootPkg = findModuleFile(roots.pkgBase, 'acl')\n const hasRoot = rootApp || rootPkg\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importId++}`\n const useApp = rootApp ?? rootPkg!\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities declarations: module root ce.ts\n {\n const appFile = findModuleFile(roots.appBase, 'ce')\n const pkgFile = findModuleFile(roots.pkgBase, 'ce')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `CE_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`\n imports.push(`import * as ${importName} from '${importPath}'`)\n customEntitiesImportName = importName\n }\n }\n\n // Search module configuration: module root search.ts\n {\n const appFile = findModuleFile(roots.appBase, 'search')\n const pkgFile = findModuleFile(roots.pkgBase, 'search')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `SEARCH_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/search` : `${imps.pkgBase}/search`\n const importStmt = `import * as ${importName} from '${importPath}'`\n imports.push(importStmt)\n searchImports.push(importStmt)\n searchImportName = importName\n }\n }\n\n // Custom field declarations: src/modules/<module>/data/fields.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'fields')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'fields')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `F_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`\n imports.push(`import * as ${importName} from '${importPath}'`)\n fieldsImportName = importName\n }\n }\n\n // Pages: backend\n const beApp = path.join(roots.appBase, 'backend')\n const bePkg = path.join(roots.pkgBase, 'backend')\n if (fs.existsSync(beApp) || fs.existsSync(bePkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.tsx')) found.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(bePkg)) walk(bePkg)\n if (fs.existsSync(beApp)) walk(beApp)\n let files = Array.from(new Set(found))\n const isDynamic = (p: string) => /\\/(\\[|\\[\\[\\.\\.\\.)/.test(p) || /^\\[/.test(p)\n files.sort((a, b) => {\n const ad = isDynamic(a) ? 1 : 0\n const bd = isDynamic(b) ? 1 : 0\n if (ad !== bd) return ad - bd\n return a.localeCompare(b)\n })\n // Next-style\n for (const rel of files.filter((f) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = rel.split('/')\n segs.pop()\n const importName = `B${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `BM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(beApp, ...segs, 'page.tsx')\n const fromApp = fs.existsSync(appFile)\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${sub}`\n const basePath = segs.join('/') || modId\n const routePath = '/backend/' + basePath\n const metaCandidates = [\n path.join(fromApp ? beApp : bePkg, ...segs, 'page.meta.ts'),\n path.join(fromApp ? beApp : bePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `BM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, path.basename(metaPath).replace(/\\.ts$/, '')].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n backendRoutes.push(\n `{ pattern: '${routePath}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n // Direct files\n for (const rel of files.filter((f) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const importName = `B${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const pageModName = `BM${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFile = path.join(beApp, ...segs, `${name}.tsx`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, name].join('/')}`\n const routePath = '/backend/' + [modId, ...segs, name].filter(Boolean).join('/')\n const metaCandidates = [\n path.join(fromApp ? beApp : bePkg, ...segs, name + '.meta.ts'),\n path.join(fromApp ? beApp : bePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `BM${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaBase = path.basename(metaPath)\n const metaImportSub = metaBase === 'meta.ts' ? 'meta' : name + '.meta'\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `${metaImportName}.metadata`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n backendRoutes.push(\n `{ pattern: '${routePath}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n }\n\n // APIs\n const apiApp = path.join(roots.appBase, 'api')\n const apiPkg = path.join(roots.pkgBase, 'api')\n if (fs.existsSync(apiApp) || fs.existsSync(apiPkg)) {\n // route.ts aggregations\n const routeFiles: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name === 'route.ts') routeFiles.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(apiPkg)) walk(apiPkg)\n if (fs.existsSync(apiApp)) walk(apiApp)\n const routeList = Array.from(new Set(routeFiles))\n const isDynamicRoute = (p: string) => p.split('/').some((seg) => /\\[|\\[\\[\\.\\.\\./.test(seg))\n routeList.sort((a, b) => {\n const ad = isDynamicRoute(a) ? 1 : 0\n const bd = isDynamicRoute(b) ? 1 : 0\n if (ad !== bd) return ad - bd\n return a.localeCompare(b)\n })\n for (const rel of routeList) {\n const segs = rel.split('/')\n segs.pop()\n const reqSegs = [modId, ...segs]\n const importName = `R${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...segs, 'route.ts')\n const fromApp = fs.existsSync(appFile)\n const apiSegPath = segs.join('/')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${apiSegPath ? `/${apiSegPath}` : ''}/route`\n const routePath = '/' + reqSegs.filter(Boolean).join('/')\n const sourceFile = fromApp ? appFile : path.join(apiPkg, ...segs, 'route.ts')\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n\n // Single files\n const plainFiles: string[] = []\n const methodNames = new Set(['get', 'post', 'put', 'patch', 'delete'])\n const walkPlain = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (methodNames.has(e.name.toLowerCase())) continue\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walkPlain(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts') && e.name !== 'route.ts') {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n plainFiles.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(apiPkg)) walkPlain(apiPkg)\n if (fs.existsSync(apiApp)) walkPlain(apiApp)\n const plainList = Array.from(new Set(plainFiles))\n for (const rel of plainList) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `R${importId++}_${toVar(modId)}_${toVar(fullSegs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...fullSegs) + '.ts'\n const fromApp = fs.existsSync(appFile)\n const plainSegPath = fullSegs.join('/')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${plainSegPath ? `/${plainSegPath}` : ''}`\n const pkgFile = path.join(apiPkg, ...fullSegs) + '.ts'\n const sourceFile = fromApp ? appFile : pkgFile\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n // Legacy per-method\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']\n for (const method of methods) {\n const coreMethodDir = path.join(apiPkg, method.toLowerCase())\n const appMethodDir = path.join(apiApp, method.toLowerCase())\n const methodDir = fs.existsSync(appMethodDir) ? appMethodDir : coreMethodDir\n if (!fs.existsSync(methodDir)) continue\n const apiFiles: string[] = []\n const walk2 = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk2(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n apiFiles.push([...rel, e.name].join('/'))\n }\n }\n }\n walk2(methodDir)\n const methodList = Array.from(new Set(apiFiles))\n for (const rel of methodList) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `H${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const fromApp = methodDir === appMethodDir\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api/${method.toLowerCase()}/${fullSegs.join('/')}`\n const metaName = `RM${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const sourceFile = path.join(methodDir, ...segs, file)\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${metaName}.openApi` : ''\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n apis.push(`{ method: '${method}', path: '${routePath}', handler: ${importName}, metadata: ${metaName}.metadata${docsPart} }`)\n }\n }\n }\n\n // CLI\n const cliApp = findModuleFile(roots.appBase, 'cli')\n const cliPkg = findModuleFile(roots.pkgBase, 'cli')\n const cliPath = cliApp ?? cliPkg\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n\n // Translations: merge core + app with app overriding\n const i18nApp = path.join(roots.appBase, 'i18n')\n const i18nCore = path.join(roots.pkgBase, 'i18n')\n const locales = new Set<string>()\n if (fs.existsSync(i18nCore))\n for (const e of fs.readdirSync(i18nCore, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n if (fs.existsSync(i18nApp))\n for (const e of fs.readdirSync(i18nApp, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n for (const locale of locales) {\n const coreHas = fs.existsSync(path.join(i18nCore, `${locale}.json`))\n const appHas = fs.existsSync(path.join(i18nApp, `${locale}.json`))\n if (coreHas && appHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(\n `'${locale}': { ...( ${cName} as unknown as Record<string,string> ), ...( ${aName} as unknown as Record<string,string> ) }`\n )\n } else if (appHas) {\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${aName} as unknown as Record<string,string>`)\n } else if (coreHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n\n // Subscribers: src/modules/<module>/subscribers/*.ts\n const subApp = path.join(roots.appBase, 'subscribers')\n const subPkg = path.join(roots.pkgBase, 'subscribers')\n if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(subPkg)) walk(subPkg)\n if (fs.existsSync(subApp)) walk(subApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFile = path.join(subApp, ...segs, `${name}.ts`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const sid = [modId, ...segs, name].filter(Boolean).join(':')\n subscribers.push(\n `{ id: (((${metaName}.metadata) as any)?.id || '${sid}'), event: ((${metaName}.metadata) as any)?.event, persistent: ((${metaName}.metadata) as any)?.persistent, handler: ${importName} }`\n )\n }\n }\n\n // Workers: src/modules/<module>/workers/*.ts\n // Only includes files that export `metadata` with a `queue` property\n {\n const wrkApp = path.join(roots.appBase, 'workers')\n const wrkPkg = path.join(roots.pkgBase, 'workers')\n if (fs.existsSync(wrkApp) || fs.existsSync(wrkPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(wrkPkg)) walk(wrkPkg)\n if (fs.existsSync(wrkApp)) walk(wrkApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const appFile = path.join(wrkApp, ...segs, `${name}.ts`)\n const fromApp = fs.existsSync(appFile)\n // Use package import path for checking exports (file path fails due to relative imports)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`\n // Only include files that export metadata with a queue property\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const wid = [modId, 'workers', ...segs, name].filter(Boolean).join(':')\n workers.push(\n `{ id: (${metaName}.metadata as { id?: string })?.id || '${wid}', queue: (${metaName}.metadata as { queue: string }).queue, concurrency: (${metaName}.metadata as { concurrency?: number })?.concurrency ?? 1, handler: ${importName} as (job: unknown, ctx: unknown) => Promise<void> }`\n )\n }\n }\n }\n\n // Build combined customFieldSets expression from data/fields.ts and ce.ts (entities[].fields)\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n // Dashboard widgets: src/modules/<module>/widgets/dashboard/**/widget.ts(x)\n {\n const widgetApp = path.join(roots.appBase, 'widgets', 'dashboard')\n const widgetPkg = path.join(roots.pkgBase, 'widgets', 'dashboard')\n if (fs.existsSync(widgetApp) || fs.existsSync(widgetPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && /^widget\\.(t|j)sx?$/.test(e.name)) {\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(widgetPkg)) walk(widgetPkg)\n if (fs.existsSync(widgetApp)) walk(widgetApp)\n const files = Array.from(new Set(found)).sort()\n for (const rel of files) {\n const appFile = path.join(widgetApp, ...rel.split('/'))\n const fromApp = fs.existsSync(appFile)\n const segs = rel.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/dashboard/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n dashboardWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allDashboardWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allDashboardWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n }\n\n // Injection widgets: src/modules/<module>/widgets/injection/**/widget.ts(x)\n {\n const widgetApp = path.join(roots.appBase, 'widgets', 'injection')\n const widgetPkg = path.join(roots.pkgBase, 'widgets', 'injection')\n if (fs.existsSync(widgetApp) || fs.existsSync(widgetPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && /^widget\\.(t|j)sx?$/.test(e.name)) {\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(widgetPkg)) walk(widgetPkg)\n if (fs.existsSync(widgetApp)) walk(widgetApp)\n const files = Array.from(new Set(found)).sort()\n for (const rel of files) {\n const appFile = path.join(widgetApp, ...rel.split('/'))\n const fromApp = fs.existsSync(appFile)\n const segs = rel.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/injection/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n injectionWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allInjectionWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allInjectionWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n }\n\n // Injection table: src/modules/<module>/widgets/injection-table.ts\n {\n const appFile = path.join(roots.appBase, 'widgets', 'injection-table.ts')\n const pkgFile = path.join(roots.pkgBase, 'widgets', 'injection-table.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(pkgFile)\n if (hasApp || hasPkg) {\n const importName = `InjTable_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/widgets/injection-table` : `${imps.pkgBase}/widgets/injection-table`\n imports.push(`import * as ${importName} from '${importPath}'`)\n injectionTableImportName = importName\n allInjectionTables.push({ moduleId: modId, importPath, importName })\n }\n }\n\n if (searchImportName) {\n searchConfigs.push(`{ moduleId: '${modId}', config: (${searchImportName}.default ?? ${searchImportName}.searchConfig ?? ${searchImportName}.config ?? null) }`)\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${frontendRoutes.length ? `frontendRoutes: [${frontendRoutes.join(', ')}],` : ''}\n ${backendRoutes.length ? `backendRoutes: [${backendRoutes.join(', ')}],` : ''}\n ${apis.length ? `apis: [${apis.join(', ')}],` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as import('@open-mercato/shared/modules/entities').EntityExtension[]) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${dashboardWidgets.length ? `dashboardWidgets: [${dashboardWidgets.join(', ')}],` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n const widgetEntriesList = Array.from(allDashboardWidgets.entries()).sort(([a], [b]) => a.localeCompare(b))\n const widgetDecls = widgetEntriesList.map(\n ([key, data]) =>\n ` { moduleId: '${data.moduleId}', key: '${key}', source: '${data.source}', loader: () => import('${data.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const widgetsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleDashboardWidgetEntry } from '@open-mercato/shared/modules/registry'\n\nexport const dashboardWidgetEntries: ModuleDashboardWidgetEntry[] = [\n${widgetDecls.join(',\\n')}\n]\n`\n const searchEntriesLiteral = searchConfigs.join(',\\n ')\n const searchImportSection = searchImports.join('\\n')\n const searchOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { SearchModuleConfig } from '@open-mercato/shared/modules/search'\n${searchImportSection ? `\\n${searchImportSection}\\n` : '\\n'}type SearchConfigEntry = { moduleId: string; config: SearchModuleConfig | null }\n\nconst entriesRaw: SearchConfigEntry[] = [\n${searchEntriesLiteral ? ` ${searchEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((entry): entry is { moduleId: string; config: SearchModuleConfig } => entry.config != null)\n\nexport const searchModuleConfigEntries = entries\nexport const searchModuleConfigs: SearchModuleConfig[] = entries.map((entry) => entry.config)\n`\n\n // Validate module dependencies declared via ModuleInfo.requires\n {\n const enabledIds = new Set(enabled.map((e) => e.id))\n const problems: string[] = []\n for (const [modId, reqs] of requiresByModule.entries()) {\n const missing = reqs.filter((r) => !enabledIds.has(r))\n if (missing.length) {\n problems.push(`- Module \"${modId}\" requires: ${missing.join(', ')}`)\n }\n }\n if (problems.length) {\n console.error('\\nModule dependency check failed:')\n for (const p of problems) console.error(p)\n console.error('\\nFix: Enable required module(s) in src/modules.ts. Example:')\n console.error(\n ' export const enabledModules = [ { id: \\'' +\n Array.from(new Set(requiresByModule.values()).values()).join(\"' }, { id: '\") +\n \"' } ]\"\n )\n process.exit(1)\n }\n }\n\n const structureChecksum = calculateStructureChecksum(Array.from(trackedRoots))\n\n const modulesChecksum = { content: calculateChecksum(output), structure: structureChecksum }\n const existingModulesChecksum = readChecksumRecord(checksumFile)\n const shouldWriteModules =\n !existingModulesChecksum ||\n existingModulesChecksum.content !== modulesChecksum.content ||\n existingModulesChecksum.structure !== modulesChecksum.structure\n if (shouldWriteModules) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true })\n fs.writeFileSync(outFile, output)\n writeChecksumRecord(checksumFile, modulesChecksum)\n result.filesWritten.push(outFile)\n } else {\n result.filesUnchanged.push(outFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), outFile), shouldWriteModules)\n\n const widgetsChecksum = { content: calculateChecksum(widgetsOutput), structure: structureChecksum }\n const existingWidgetsChecksum = readChecksumRecord(widgetsChecksumFile)\n const shouldWriteWidgets =\n !existingWidgetsChecksum ||\n existingWidgetsChecksum.content !== widgetsChecksum.content ||\n existingWidgetsChecksum.structure !== widgetsChecksum.structure\n if (shouldWriteWidgets) {\n fs.writeFileSync(widgetsOutFile, widgetsOutput)\n writeChecksumRecord(widgetsChecksumFile, widgetsChecksum)\n result.filesWritten.push(widgetsOutFile)\n } else {\n result.filesUnchanged.push(widgetsOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), widgetsOutFile), shouldWriteWidgets)\n\n const injectionWidgetEntriesList = Array.from(allInjectionWidgets.entries()).sort(([a], [b]) => a.localeCompare(b))\n const injectionWidgetDecls = injectionWidgetEntriesList.map(\n ([key, data]) =>\n ` { moduleId: '${data.moduleId}', key: '${key}', source: '${data.source}', loader: () => import('${data.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const injectionWidgetsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleInjectionWidgetEntry } from '@open-mercato/shared/modules/registry'\n\nexport const injectionWidgetEntries: ModuleInjectionWidgetEntry[] = [\n${injectionWidgetDecls.join(',\\n')}\n]\n`\n const injectionTableImports = allInjectionTables.map(\n (entry) => `import * as ${entry.importName} from '${entry.importPath}'`\n )\n const injectionTableDecls = allInjectionTables.map(\n (entry) =>\n ` { moduleId: '${entry.moduleId}', table: ((${entry.importName}.default ?? ${entry.importName}.injectionTable) as any) || {} }`\n )\n const injectionTablesOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleInjectionTable } from '@open-mercato/shared/modules/widgets/injection'\n${injectionTableImports.join('\\n')}\n\nexport const injectionTables: Array<{ moduleId: string; table: ModuleInjectionTable }> = [\n${injectionTableDecls.join(',\\n')}\n]\n`\n const injectionWidgetsChecksum = { content: calculateChecksum(injectionWidgetsOutput), structure: structureChecksum }\n const existingInjectionWidgetsChecksum = readChecksumRecord(injectionWidgetsChecksumFile)\n const shouldWriteInjectionWidgets =\n !existingInjectionWidgetsChecksum ||\n existingInjectionWidgetsChecksum.content !== injectionWidgetsChecksum.content ||\n existingInjectionWidgetsChecksum.structure !== injectionWidgetsChecksum.structure\n if (shouldWriteInjectionWidgets) {\n fs.writeFileSync(injectionWidgetsOutFile, injectionWidgetsOutput)\n writeChecksumRecord(injectionWidgetsChecksumFile, injectionWidgetsChecksum)\n result.filesWritten.push(injectionWidgetsOutFile)\n } else {\n result.filesUnchanged.push(injectionWidgetsOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), injectionWidgetsOutFile), shouldWriteInjectionWidgets)\n\n const injectionTablesChecksum = { content: calculateChecksum(injectionTablesOutput), structure: structureChecksum }\n const existingInjectionTablesChecksum = readChecksumRecord(injectionTablesChecksumFile)\n const shouldWriteInjectionTables =\n !existingInjectionTablesChecksum ||\n existingInjectionTablesChecksum.content !== injectionTablesChecksum.content ||\n existingInjectionTablesChecksum.structure !== injectionTablesChecksum.structure\n if (shouldWriteInjectionTables) {\n fs.writeFileSync(injectionTablesOutFile, injectionTablesOutput)\n writeChecksumRecord(injectionTablesChecksumFile, injectionTablesChecksum)\n result.filesWritten.push(injectionTablesOutFile)\n } else {\n result.filesUnchanged.push(injectionTablesOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), injectionTablesOutFile), shouldWriteInjectionTables)\n\n const searchChecksum = { content: calculateChecksum(searchOutput), structure: structureChecksum }\n const existingSearchChecksum = readChecksumRecord(searchChecksumFile)\n const shouldWriteSearch =\n !existingSearchChecksum ||\n existingSearchChecksum.content !== searchChecksum.content ||\n existingSearchChecksum.structure !== searchChecksum.structure\n if (shouldWriteSearch) {\n fs.writeFileSync(searchOutFile, searchOutput)\n writeChecksumRecord(searchChecksumFile, searchChecksum)\n result.filesWritten.push(searchOutFile)\n } else {\n result.filesUnchanged.push(searchOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), searchOutFile), shouldWriteSearch)\n\n return result\n}\n\n/**\n * Generate a CLI-specific module registry that excludes Next.js dependent code.\n * This produces modules.cli.generated.ts which can be loaded without Next.js runtime.\n *\n * Includes: module metadata, CLI commands, translations, subscribers, workers, entity extensions,\n * features/ACL, custom entities, vector config, custom fields\n * Excludes: frontend routes, backend routes, API handlers, dashboard/injection widgets\n */\nexport async function generateModuleRegistryCli(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.cli.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.cli.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n let importId = 0\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n // For @app modules, use relative paths since @/ alias doesn't work in Node.js runtime\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : imps.appBase\n\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let vectorImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n\n // Module metadata: index.ts (overrideable)\n const appIndex = findModuleFile(roots.appBase, 'index')\n const pkgIndex = findModuleFile(roots.pkgBase, 'index')\n const indexTs = appIndex ?? pkgIndex\n if (indexTs) {\n infoImportName = `I${importId++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n // Try to eagerly read ModuleInfo.requires for dependency validation\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // Entity extensions: src/modules/<module>/data/extensions.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'extensions')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'extensions')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `X_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`\n imports.push(`import * as ${importName} from '${importPath}'`)\n extensionsImportName = importName\n }\n }\n\n // RBAC feature declarations: module root acl.ts\n {\n const rootApp = findModuleFile(roots.appBase, 'acl')\n const rootPkg = findModuleFile(roots.pkgBase, 'acl')\n const hasRoot = rootApp || rootPkg\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importId++}`\n const useApp = rootApp ?? rootPkg!\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities declarations: module root ce.ts\n {\n const appFile = findModuleFile(roots.appBase, 'ce')\n const pkgFile = findModuleFile(roots.pkgBase, 'ce')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `CE_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`\n imports.push(`import * as ${importName} from '${importPath}'`)\n customEntitiesImportName = importName\n }\n }\n\n // Vector search configuration: module root vector.ts\n {\n const appFile = findModuleFile(roots.appBase, 'vector')\n const pkgFile = findModuleFile(roots.pkgBase, 'vector')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `VECTOR_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/vector` : `${imps.pkgBase}/vector`\n imports.push(`import * as ${importName} from '${importPath}'`)\n vectorImportName = importName\n }\n }\n\n // Custom field declarations: src/modules/<module>/data/fields.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'fields')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'fields')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `F_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`\n imports.push(`import * as ${importName} from '${importPath}'`)\n fieldsImportName = importName\n }\n }\n\n // CLI\n const cliApp = findModuleFile(roots.appBase, 'cli')\n const cliPkg = findModuleFile(roots.pkgBase, 'cli')\n const cliPath = cliApp ?? cliPkg\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n\n // Translations: merge core + app with app overriding\n const i18nApp = path.join(roots.appBase, 'i18n')\n const i18nCore = path.join(roots.pkgBase, 'i18n')\n const locales = new Set<string>()\n if (fs.existsSync(i18nCore))\n for (const e of fs.readdirSync(i18nCore, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n if (fs.existsSync(i18nApp))\n for (const e of fs.readdirSync(i18nApp, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n for (const locale of locales) {\n const coreHas = fs.existsSync(path.join(i18nCore, `${locale}.json`))\n const appHas = fs.existsSync(path.join(i18nApp, `${locale}.json`))\n if (coreHas && appHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(\n `'${locale}': { ...( ${cName} as unknown as Record<string,string> ), ...( ${aName} as unknown as Record<string,string> ) }`\n )\n } else if (appHas) {\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${aName} as unknown as Record<string,string>`)\n } else if (coreHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n\n // Subscribers: src/modules/<module>/subscribers/*.ts\n const subApp = path.join(roots.appBase, 'subscribers')\n const subPkg = path.join(roots.pkgBase, 'subscribers')\n if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(subPkg)) walk(subPkg)\n if (fs.existsSync(subApp)) walk(subApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFile = path.join(subApp, ...segs, `${name}.ts`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const sid = [modId, ...segs, name].filter(Boolean).join(':')\n subscribers.push(\n `{ id: (((${metaName}.metadata) as any)?.id || '${sid}'), event: ((${metaName}.metadata) as any)?.event, persistent: ((${metaName}.metadata) as any)?.persistent, handler: ${importName} }`\n )\n }\n }\n\n // Workers: src/modules/<module>/workers/*.ts\n // Only includes files that export `metadata` with a `queue` property\n {\n const wrkApp = path.join(roots.appBase, 'workers')\n const wrkPkg = path.join(roots.pkgBase, 'workers')\n if (fs.existsSync(wrkApp) || fs.existsSync(wrkPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(wrkPkg)) walk(wrkPkg)\n if (fs.existsSync(wrkApp)) walk(wrkApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.ts$/, '')\n const appFile = path.join(wrkApp, ...segs, `${name}.ts`)\n const fromApp = fs.existsSync(appFile)\n // Use package import path for checking exports (file path fails due to relative imports)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`\n // Only include files that export metadata with a queue property\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const wid = [modId, 'workers', ...segs, name].filter(Boolean).join(':')\n workers.push(\n `{ id: (${metaName}.metadata as { id?: string })?.id || '${wid}', queue: (${metaName}.metadata as { queue: string }).queue, concurrency: (${metaName}.metadata as { concurrency?: number })?.concurrency ?? 1, handler: ${importName} as (job: unknown, ctx: unknown) => Promise<void> }`\n )\n }\n }\n }\n\n // Build combined customFieldSets expression from data/fields.ts and ce.ts (entities[].fields)\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as any) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${vectorImportName ? `vector: (${vectorImportName}.default ?? ${vectorImportName}.vectorConfig ?? ${vectorImportName}.config ?? undefined),` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry (CLI version)\n// This file excludes Next.js dependent code (routes, APIs, widgets)\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n\n // Validate module dependencies declared via ModuleInfo.requires\n {\n const enabledIds = new Set(enabled.map((e) => e.id))\n const problems: string[] = []\n for (const [modId, reqs] of requiresByModule.entries()) {\n const missing = reqs.filter((r) => !enabledIds.has(r))\n if (missing.length) {\n problems.push(`- Module \"${modId}\" requires: ${missing.join(', ')}`)\n }\n }\n if (problems.length) {\n console.error('\\nModule dependency check failed:')\n for (const p of problems) console.error(p)\n console.error('\\nFix: Enable required module(s) in src/modules.ts. Example:')\n console.error(\n ' export const enabledModules = [ { id: \\'' +\n Array.from(new Set(requiresByModule.values()).values()).join(\"' }, { id: '\") +\n \"' } ]\"\n )\n process.exit(1)\n }\n }\n\n const structureChecksum = calculateStructureChecksum(Array.from(trackedRoots))\n\n const checksum = { content: calculateChecksum(output), structure: structureChecksum }\n const existingChecksum = readChecksumRecord(checksumFile)\n const shouldWrite =\n !existingChecksum ||\n existingChecksum.content !== checksum.content ||\n existingChecksum.structure !== checksum.structure\n if (shouldWrite) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true })\n fs.writeFileSync(outFile, output)\n writeChecksumRecord(checksumFile, checksum)\n result.filesWritten.push(outFile)\n } else {\n result.filesUnchanged.push(outFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), outFile), shouldWrite)\n\n return result\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageResolver } from '../resolver'\nimport {\n calculateChecksum,\n calculateStructureChecksum,\n readChecksumRecord,\n writeChecksumRecord,\n toVar,\n moduleHasExport,\n logGenerationResult,\n type GeneratorResult,\n createGeneratorResult,\n} from '../utils'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\n/**\n * Find a module file, checking for both .ts (src) and .js (dist) extensions.\n * Supports both simple names (e.g., 'cli') and nested paths (e.g., 'data/extensions').\n * Returns the path if found, null otherwise.\n */\nfunction findModuleFile(basePath: string, ...segments: string[]): string | null {\n const name = segments.pop()!\n const dir = segments.length ? path.join(basePath, ...segments) : basePath\n const tsPath = path.join(dir, `${name}.ts`)\n if (fs.existsSync(tsPath)) return tsPath\n const jsPath = path.join(dir, `${name}.js`)\n if (fs.existsSync(jsPath)) return jsPath\n return null\n}\n\nexport interface ModuleRegistryOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\nexport async function generateModuleRegistry(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.generated.checksum')\n const widgetsOutFile = path.join(outputDir, 'dashboard-widgets.generated.ts')\n const widgetsChecksumFile = path.join(outputDir, 'dashboard-widgets.generated.checksum')\n const injectionWidgetsOutFile = path.join(outputDir, 'injection-widgets.generated.ts')\n const injectionWidgetsChecksumFile = path.join(outputDir, 'injection-widgets.generated.checksum')\n const injectionTablesOutFile = path.join(outputDir, 'injection-tables.generated.ts')\n const injectionTablesChecksumFile = path.join(outputDir, 'injection-tables.generated.checksum')\n const searchOutFile = path.join(outputDir, 'search.generated.ts')\n const searchChecksumFile = path.join(outputDir, 'search.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n let importId = 0\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n const allDashboardWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionWidgets = new Map<string, { moduleId: string; source: 'app' | 'package'; importPath: string }>()\n const allInjectionTables: Array<{ moduleId: string; importPath: string; importName: string }> = []\n const searchConfigs: string[] = []\n const searchImports: string[] = []\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n // For @app modules, use relative paths since @/ alias doesn't work in Node.js runtime\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : imps.appBase\n\n const frontendRoutes: string[] = []\n const backendRoutes: string[] = []\n const apis: string[] = []\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let searchImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n const dashboardWidgets: string[] = []\n const injectionWidgets: string[] = []\n let injectionTableImportName: string | null = null\n\n // Module metadata: index.ts (overrideable)\n const appIndex = findModuleFile(roots.appBase, 'index')\n const pkgIndex = findModuleFile(roots.pkgBase, 'index')\n const indexTs = appIndex ?? pkgIndex\n if (indexTs) {\n infoImportName = `I${importId++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n // Try to eagerly read ModuleInfo.requires for dependency validation\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // Pages: frontend\n const feApp = path.join(roots.appBase, 'frontend')\n const fePkg = path.join(roots.pkgBase, 'frontend')\n if (fs.existsSync(feApp) || fs.existsSync(fePkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.tsx')) found.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(fePkg)) walk(fePkg)\n if (fs.existsSync(feApp)) walk(feApp)\n let files = Array.from(new Set(found))\n // Ensure static routes win over dynamic ones (e.g., 'create' before '[id]')\n const isDynamic = (p: string) => /\\/(\\[|\\[\\[\\.\\.\\.)/.test(p) || /^\\[/.test(p)\n files.sort((a, b) => {\n const ad = isDynamic(a) ? 1 : 0\n const bd = isDynamic(b) ? 1 : 0\n if (ad !== bd) return ad - bd // static first\n // Longer, more specific paths later to not shadow peers\n return a.localeCompare(b)\n })\n // Next-style page.tsx\n for (const rel of files.filter((f) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = rel.split('/')\n segs.pop()\n const importName = `C${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `CM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(feApp, ...segs, 'page.tsx')\n const fromApp = fs.existsSync(appFile)\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${sub}`\n const routePath = '/' + (segs.join('/') || '')\n const metaCandidates = [\n path.join(fromApp ? feApp : fePkg, ...segs, 'page.meta.ts'),\n path.join(fromApp ? feApp : fePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `M${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, path.basename(metaPath).replace(/\\.ts$/, '')].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n frontendRoutes.push(\n `{ pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n // Back-compat direct files\n for (const rel of files.filter((f) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const routeSegs = [...segs, name].filter(Boolean)\n const importName = `C${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const pageModName = `CM${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const appFile = path.join(feApp, ...segs, `${name}.tsx`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, name].join('/')}`\n const routePath = '/' + (routeSegs.join('/') || '')\n const metaCandidates = [\n path.join(fromApp ? feApp : fePkg, ...segs, name + '.meta.ts'),\n path.join(fromApp ? feApp : fePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `M${importId++}_${toVar(modId)}_${toVar(routeSegs.join('_') || 'index')}`\n const metaBase = path.basename(metaPath)\n const metaImportSub = metaBase === 'meta.ts' ? 'meta' : name + '.meta'\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/frontend/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n frontendRoutes.push(\n `{ pattern: '${routePath || '/'}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, Component: ${importName} }`\n )\n }\n }\n\n // Entity extensions: src/modules/<module>/data/extensions.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'extensions')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'extensions')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `X_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`\n imports.push(`import * as ${importName} from '${importPath}'`)\n extensionsImportName = importName\n }\n }\n\n // RBAC feature declarations: module root acl.ts\n {\n const rootApp = findModuleFile(roots.appBase, 'acl')\n const rootPkg = findModuleFile(roots.pkgBase, 'acl')\n const hasRoot = rootApp || rootPkg\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importId++}`\n const useApp = rootApp ?? rootPkg!\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities declarations: module root ce.ts\n {\n const appFile = findModuleFile(roots.appBase, 'ce')\n const pkgFile = findModuleFile(roots.pkgBase, 'ce')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `CE_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`\n imports.push(`import * as ${importName} from '${importPath}'`)\n customEntitiesImportName = importName\n }\n }\n\n // Search module configuration: module root search.ts\n {\n const appFile = findModuleFile(roots.appBase, 'search')\n const pkgFile = findModuleFile(roots.pkgBase, 'search')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `SEARCH_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/search` : `${imps.pkgBase}/search`\n const importStmt = `import * as ${importName} from '${importPath}'`\n imports.push(importStmt)\n searchImports.push(importStmt)\n searchImportName = importName\n }\n }\n\n // Custom field declarations: src/modules/<module>/data/fields.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'fields')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'fields')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `F_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`\n imports.push(`import * as ${importName} from '${importPath}'`)\n fieldsImportName = importName\n }\n }\n\n // Pages: backend\n const beApp = path.join(roots.appBase, 'backend')\n const bePkg = path.join(roots.pkgBase, 'backend')\n if (fs.existsSync(beApp) || fs.existsSync(bePkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.tsx')) found.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(bePkg)) walk(bePkg)\n if (fs.existsSync(beApp)) walk(beApp)\n let files = Array.from(new Set(found))\n const isDynamic = (p: string) => /\\/(\\[|\\[\\[\\.\\.\\.)/.test(p) || /^\\[/.test(p)\n files.sort((a, b) => {\n const ad = isDynamic(a) ? 1 : 0\n const bd = isDynamic(b) ? 1 : 0\n if (ad !== bd) return ad - bd\n return a.localeCompare(b)\n })\n // Next-style\n for (const rel of files.filter((f) => f.endsWith('/page.tsx') || f === 'page.tsx')) {\n const segs = rel.split('/')\n segs.pop()\n const importName = `B${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const pageModName = `BM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(beApp, ...segs, 'page.tsx')\n const fromApp = fs.existsSync(appFile)\n const sub = segs.length ? `${segs.join('/')}/page` : 'page'\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${sub}`\n const basePath = segs.join('/') || modId\n const routePath = '/backend/' + basePath\n const metaCandidates = [\n path.join(fromApp ? beApp : bePkg, ...segs, 'page.meta.ts'),\n path.join(fromApp ? beApp : bePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `BM${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, path.basename(metaPath).replace(/\\.ts$/, '')].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `(${metaImportName}.metadata as any)`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n backendRoutes.push(\n `{ pattern: '${routePath}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n // Direct files\n for (const rel of files.filter((f) => !f.endsWith('/page.tsx') && f !== 'page.tsx')) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.tsx$/, '')\n const importName = `B${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const pageModName = `BM${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFile = path.join(beApp, ...segs, `${name}.tsx`)\n const fromApp = fs.existsSync(appFile)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, name].join('/')}`\n const routePath = '/backend/' + [modId, ...segs, name].filter(Boolean).join('/')\n const metaCandidates = [\n path.join(fromApp ? beApp : bePkg, ...segs, name + '.meta.ts'),\n path.join(fromApp ? beApp : bePkg, ...segs, 'meta.ts'),\n ]\n const metaPath = metaCandidates.find((p) => fs.existsSync(p))\n let metaExpr = 'undefined'\n if (metaPath) {\n const metaImportName = `BM${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaBase = path.basename(metaPath)\n const metaImportSub = metaBase === 'meta.ts' ? 'meta' : name + '.meta'\n const metaImportPath = `${fromApp ? appImportBase : imps.pkgBase}/backend/${[...segs, metaImportSub].join('/')}`\n imports.push(`import * as ${metaImportName} from '${metaImportPath}'`)\n metaExpr = `${metaImportName}.metadata`\n imports.push(`import ${importName} from '${importPath}'`)\n } else {\n metaExpr = `(${pageModName} as any).metadata`\n imports.push(`import ${importName}, * as ${pageModName} from '${importPath}'`)\n }\n backendRoutes.push(\n `{ pattern: '${routePath}', requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, Component: ${importName} }`\n )\n }\n }\n\n // APIs\n const apiApp = path.join(roots.appBase, 'api')\n const apiPkg = path.join(roots.pkgBase, 'api')\n if (fs.existsSync(apiApp) || fs.existsSync(apiPkg)) {\n // route.ts aggregations\n const routeFiles: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name === 'route.ts') routeFiles.push([...rel, e.name].join('/'))\n }\n }\n if (fs.existsSync(apiPkg)) walk(apiPkg)\n if (fs.existsSync(apiApp)) walk(apiApp)\n const routeList = Array.from(new Set(routeFiles))\n const isDynamicRoute = (p: string) => p.split('/').some((seg) => /\\[|\\[\\[\\.\\.\\./.test(seg))\n routeList.sort((a, b) => {\n const ad = isDynamicRoute(a) ? 1 : 0\n const bd = isDynamicRoute(b) ? 1 : 0\n if (ad !== bd) return ad - bd\n return a.localeCompare(b)\n })\n for (const rel of routeList) {\n const segs = rel.split('/')\n segs.pop()\n const reqSegs = [modId, ...segs]\n const importName = `R${importId++}_${toVar(modId)}_${toVar(segs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...segs, 'route.ts')\n const fromApp = fs.existsSync(appFile)\n const apiSegPath = segs.join('/')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${apiSegPath ? `/${apiSegPath}` : ''}/route`\n const routePath = '/' + reqSegs.filter(Boolean).join('/')\n const sourceFile = fromApp ? appFile : path.join(apiPkg, ...segs, 'route.ts')\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n\n // Single files\n const plainFiles: string[] = []\n const methodNames = new Set(['get', 'post', 'put', 'patch', 'delete'])\n const walkPlain = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (methodNames.has(e.name.toLowerCase())) continue\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walkPlain(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts') && e.name !== 'route.ts') {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n plainFiles.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(apiPkg)) walkPlain(apiPkg)\n if (fs.existsSync(apiApp)) walkPlain(apiApp)\n const plainList = Array.from(new Set(plainFiles))\n for (const rel of plainList) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `R${importId++}_${toVar(modId)}_${toVar(fullSegs.join('_') || 'index')}`\n const appFile = path.join(apiApp, ...fullSegs) + '.ts'\n const fromApp = fs.existsSync(appFile)\n const plainSegPath = fullSegs.join('/')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api${plainSegPath ? `/${plainSegPath}` : ''}`\n const pkgFile = path.join(apiPkg, ...fullSegs) + '.ts'\n const sourceFile = fromApp ? appFile : pkgFile\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${importName}.openApi` : ''\n imports.push(`import * as ${importName} from '${importPath}'`)\n apis.push(`{ path: '${routePath}', metadata: (${importName} as any).metadata, handlers: ${importName} as any${docsPart} }`)\n }\n // Legacy per-method\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']\n for (const method of methods) {\n const coreMethodDir = path.join(apiPkg, method.toLowerCase())\n const appMethodDir = path.join(apiApp, method.toLowerCase())\n const methodDir = fs.existsSync(appMethodDir) ? appMethodDir : coreMethodDir\n if (!fs.existsSync(methodDir)) continue\n const apiFiles: string[] = []\n const walk2 = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk2(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && e.name.endsWith('.ts')) {\n if (/\\.(test|spec)\\.ts$/.test(e.name)) continue\n apiFiles.push([...rel, e.name].join('/'))\n }\n }\n }\n walk2(methodDir)\n const methodList = Array.from(new Set(apiFiles))\n for (const rel of methodList) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const pathWithoutExt = file.replace(/\\.ts$/, '')\n const fullSegs = [...segs, pathWithoutExt]\n const routePath = '/' + [modId, ...fullSegs].filter(Boolean).join('/')\n const importName = `H${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const fromApp = methodDir === appMethodDir\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/api/${method.toLowerCase()}/${fullSegs.join('/')}`\n const metaName = `RM${importId++}_${toVar(modId)}_${toVar(method)}_${toVar(fullSegs.join('_'))}`\n const sourceFile = path.join(methodDir, ...segs, file)\n const hasOpenApi = await moduleHasExport(sourceFile, 'openApi')\n const docsPart = hasOpenApi ? `, docs: ${metaName}.openApi` : ''\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n apis.push(`{ method: '${method}', path: '${routePath}', handler: ${importName}, metadata: ${metaName}.metadata${docsPart} }`)\n }\n }\n }\n\n // CLI\n const cliApp = findModuleFile(roots.appBase, 'cli')\n const cliPkg = findModuleFile(roots.pkgBase, 'cli')\n const cliPath = cliApp ?? cliPkg\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n\n // Translations: merge core + app with app overriding\n const i18nApp = path.join(roots.appBase, 'i18n')\n const i18nCore = path.join(roots.pkgBase, 'i18n')\n const locales = new Set<string>()\n if (fs.existsSync(i18nCore))\n for (const e of fs.readdirSync(i18nCore, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n if (fs.existsSync(i18nApp))\n for (const e of fs.readdirSync(i18nApp, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n for (const locale of locales) {\n const coreHas = fs.existsSync(path.join(i18nCore, `${locale}.json`))\n const appHas = fs.existsSync(path.join(i18nApp, `${locale}.json`))\n if (coreHas && appHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(\n `'${locale}': { ...( ${cName} as unknown as Record<string,string> ), ...( ${aName} as unknown as Record<string,string> ) }`\n )\n } else if (appHas) {\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${aName} as unknown as Record<string,string>`)\n } else if (coreHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n\n // Subscribers: src/modules/<module>/subscribers/*.ts or *.js\n const subApp = path.join(roots.appBase, 'subscribers')\n const subPkg = path.join(roots.pkgBase, 'subscribers')\n if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {\n if (/\\.(test|spec)\\.(ts|js)$/.test(e.name)) continue\n if (e.name.endsWith('.d.ts')) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(subPkg)) walk(subPkg)\n if (fs.existsSync(subApp)) walk(subApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.(ts|js)$/, '')\n const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFileTs = path.join(subApp, ...segs, `${name}.ts`)\n const appFileJs = path.join(subApp, ...segs, `${name}.js`)\n const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const sid = [modId, ...segs, name].filter(Boolean).join(':')\n subscribers.push(\n `{ id: (((${metaName}.metadata) as any)?.id || '${sid}'), event: ((${metaName}.metadata) as any)?.event, persistent: ((${metaName}.metadata) as any)?.persistent, handler: ${importName} }`\n )\n }\n }\n\n // Workers: src/modules/<module>/workers/*.ts or *.js\n // Only includes files that export `metadata` with a `queue` property\n {\n const wrkApp = path.join(roots.appBase, 'workers')\n const wrkPkg = path.join(roots.pkgBase, 'workers')\n if (fs.existsSync(wrkApp) || fs.existsSync(wrkPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {\n if (/\\.(test|spec)\\.(ts|js)$/.test(e.name)) continue\n if (e.name.endsWith('.d.ts')) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(wrkPkg)) walk(wrkPkg)\n if (fs.existsSync(wrkApp)) walk(wrkApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.(ts|js)$/, '')\n const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`)\n const appFileJs = path.join(wrkApp, ...segs, `${name}.js`)\n const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)\n // Use package import path for checking exports (file path fails due to relative imports)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`\n // Only include files that export metadata with a queue property\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const wid = [modId, 'workers', ...segs, name].filter(Boolean).join(':')\n workers.push(\n `{ id: (${metaName}.metadata as { id?: string })?.id || '${wid}', queue: (${metaName}.metadata as { queue: string }).queue, concurrency: (${metaName}.metadata as { concurrency?: number })?.concurrency ?? 1, handler: ${importName} as (job: unknown, ctx: unknown) => Promise<void> }`\n )\n }\n }\n }\n\n // Build combined customFieldSets expression from data/fields.ts and ce.ts (entities[].fields)\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n // Dashboard widgets: src/modules/<module>/widgets/dashboard/**/widget.ts(x)\n {\n const widgetApp = path.join(roots.appBase, 'widgets', 'dashboard')\n const widgetPkg = path.join(roots.pkgBase, 'widgets', 'dashboard')\n if (fs.existsSync(widgetApp) || fs.existsSync(widgetPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && /^widget\\.(t|j)sx?$/.test(e.name)) {\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(widgetPkg)) walk(widgetPkg)\n if (fs.existsSync(widgetApp)) walk(widgetApp)\n const files = Array.from(new Set(found)).sort()\n for (const rel of files) {\n const appFile = path.join(widgetApp, ...rel.split('/'))\n const fromApp = fs.existsSync(appFile)\n const segs = rel.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/dashboard/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n dashboardWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allDashboardWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allDashboardWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n }\n\n // Injection widgets: src/modules/<module>/widgets/injection/**/widget.ts(x)\n {\n const widgetApp = path.join(roots.appBase, 'widgets', 'injection')\n const widgetPkg = path.join(roots.pkgBase, 'widgets', 'injection')\n if (fs.existsSync(widgetApp) || fs.existsSync(widgetPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && /^widget\\.(t|j)sx?$/.test(e.name)) {\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(widgetPkg)) walk(widgetPkg)\n if (fs.existsSync(widgetApp)) walk(widgetApp)\n const files = Array.from(new Set(found)).sort()\n for (const rel of files) {\n const appFile = path.join(widgetApp, ...rel.split('/'))\n const fromApp = fs.existsSync(appFile)\n const segs = rel.split('/')\n const file = segs.pop()!\n const base = file.replace(/\\.(t|j)sx?$/, '')\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/widgets/injection/${[...segs, base].join('/')}`\n const key = [modId, ...segs, base].filter(Boolean).join(':')\n const source = fromApp ? 'app' : 'package'\n injectionWidgets.push(\n `{ moduleId: '${modId}', key: '${key}', source: '${source}', loader: () => import('${importPath}').then((mod) => mod.default ?? mod) }`\n )\n const existing = allInjectionWidgets.get(key)\n if (!existing || (existing.source !== 'app' && source === 'app')) {\n allInjectionWidgets.set(key, { moduleId: modId, source, importPath })\n }\n }\n }\n }\n\n // Injection table: src/modules/<module>/widgets/injection-table.ts\n {\n const appFile = path.join(roots.appBase, 'widgets', 'injection-table.ts')\n const pkgFile = path.join(roots.pkgBase, 'widgets', 'injection-table.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(pkgFile)\n if (hasApp || hasPkg) {\n const importName = `InjTable_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/widgets/injection-table` : `${imps.pkgBase}/widgets/injection-table`\n imports.push(`import * as ${importName} from '${importPath}'`)\n injectionTableImportName = importName\n allInjectionTables.push({ moduleId: modId, importPath, importName })\n }\n }\n\n if (searchImportName) {\n searchConfigs.push(`{ moduleId: '${modId}', config: (${searchImportName}.default ?? ${searchImportName}.searchConfig ?? ${searchImportName}.config ?? null) }`)\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${frontendRoutes.length ? `frontendRoutes: [${frontendRoutes.join(', ')}],` : ''}\n ${backendRoutes.length ? `backendRoutes: [${backendRoutes.join(', ')}],` : ''}\n ${apis.length ? `apis: [${apis.join(', ')}],` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as import('@open-mercato/shared/modules/entities').EntityExtension[]) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${dashboardWidgets.length ? `dashboardWidgets: [${dashboardWidgets.join(', ')}],` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n const widgetEntriesList = Array.from(allDashboardWidgets.entries()).sort(([a], [b]) => a.localeCompare(b))\n const widgetDecls = widgetEntriesList.map(\n ([key, data]) =>\n ` { moduleId: '${data.moduleId}', key: '${key}', source: '${data.source}', loader: () => import('${data.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const widgetsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleDashboardWidgetEntry } from '@open-mercato/shared/modules/registry'\n\nexport const dashboardWidgetEntries: ModuleDashboardWidgetEntry[] = [\n${widgetDecls.join(',\\n')}\n]\n`\n const searchEntriesLiteral = searchConfigs.join(',\\n ')\n const searchImportSection = searchImports.join('\\n')\n const searchOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { SearchModuleConfig } from '@open-mercato/shared/modules/search'\n${searchImportSection ? `\\n${searchImportSection}\\n` : '\\n'}type SearchConfigEntry = { moduleId: string; config: SearchModuleConfig | null }\n\nconst entriesRaw: SearchConfigEntry[] = [\n${searchEntriesLiteral ? ` ${searchEntriesLiteral}\\n` : ''}]\nconst entries = entriesRaw.filter((entry): entry is { moduleId: string; config: SearchModuleConfig } => entry.config != null)\n\nexport const searchModuleConfigEntries = entries\nexport const searchModuleConfigs: SearchModuleConfig[] = entries.map((entry) => entry.config)\n`\n\n // Validate module dependencies declared via ModuleInfo.requires\n {\n const enabledIds = new Set(enabled.map((e) => e.id))\n const problems: string[] = []\n for (const [modId, reqs] of requiresByModule.entries()) {\n const missing = reqs.filter((r) => !enabledIds.has(r))\n if (missing.length) {\n problems.push(`- Module \"${modId}\" requires: ${missing.join(', ')}`)\n }\n }\n if (problems.length) {\n console.error('\\nModule dependency check failed:')\n for (const p of problems) console.error(p)\n console.error('\\nFix: Enable required module(s) in src/modules.ts. Example:')\n console.error(\n ' export const enabledModules = [ { id: \\'' +\n Array.from(new Set(requiresByModule.values()).values()).join(\"' }, { id: '\") +\n \"' } ]\"\n )\n process.exit(1)\n }\n }\n\n const structureChecksum = calculateStructureChecksum(Array.from(trackedRoots))\n\n const modulesChecksum = { content: calculateChecksum(output), structure: structureChecksum }\n const existingModulesChecksum = readChecksumRecord(checksumFile)\n const shouldWriteModules =\n !existingModulesChecksum ||\n existingModulesChecksum.content !== modulesChecksum.content ||\n existingModulesChecksum.structure !== modulesChecksum.structure\n if (shouldWriteModules) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true })\n fs.writeFileSync(outFile, output)\n writeChecksumRecord(checksumFile, modulesChecksum)\n result.filesWritten.push(outFile)\n } else {\n result.filesUnchanged.push(outFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), outFile), shouldWriteModules)\n\n const widgetsChecksum = { content: calculateChecksum(widgetsOutput), structure: structureChecksum }\n const existingWidgetsChecksum = readChecksumRecord(widgetsChecksumFile)\n const shouldWriteWidgets =\n !existingWidgetsChecksum ||\n existingWidgetsChecksum.content !== widgetsChecksum.content ||\n existingWidgetsChecksum.structure !== widgetsChecksum.structure\n if (shouldWriteWidgets) {\n fs.writeFileSync(widgetsOutFile, widgetsOutput)\n writeChecksumRecord(widgetsChecksumFile, widgetsChecksum)\n result.filesWritten.push(widgetsOutFile)\n } else {\n result.filesUnchanged.push(widgetsOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), widgetsOutFile), shouldWriteWidgets)\n\n const injectionWidgetEntriesList = Array.from(allInjectionWidgets.entries()).sort(([a], [b]) => a.localeCompare(b))\n const injectionWidgetDecls = injectionWidgetEntriesList.map(\n ([key, data]) =>\n ` { moduleId: '${data.moduleId}', key: '${key}', source: '${data.source}', loader: () => import('${data.importPath}').then((mod) => mod.default ?? mod) }`\n )\n const injectionWidgetsOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleInjectionWidgetEntry } from '@open-mercato/shared/modules/registry'\n\nexport const injectionWidgetEntries: ModuleInjectionWidgetEntry[] = [\n${injectionWidgetDecls.join(',\\n')}\n]\n`\n const injectionTableImports = allInjectionTables.map(\n (entry) => `import * as ${entry.importName} from '${entry.importPath}'`\n )\n const injectionTableDecls = allInjectionTables.map(\n (entry) =>\n ` { moduleId: '${entry.moduleId}', table: ((${entry.importName}.default ?? ${entry.importName}.injectionTable) as any) || {} }`\n )\n const injectionTablesOutput = `// AUTO-GENERATED by mercato generate registry\nimport type { ModuleInjectionTable } from '@open-mercato/shared/modules/widgets/injection'\n${injectionTableImports.join('\\n')}\n\nexport const injectionTables: Array<{ moduleId: string; table: ModuleInjectionTable }> = [\n${injectionTableDecls.join(',\\n')}\n]\n`\n const injectionWidgetsChecksum = { content: calculateChecksum(injectionWidgetsOutput), structure: structureChecksum }\n const existingInjectionWidgetsChecksum = readChecksumRecord(injectionWidgetsChecksumFile)\n const shouldWriteInjectionWidgets =\n !existingInjectionWidgetsChecksum ||\n existingInjectionWidgetsChecksum.content !== injectionWidgetsChecksum.content ||\n existingInjectionWidgetsChecksum.structure !== injectionWidgetsChecksum.structure\n if (shouldWriteInjectionWidgets) {\n fs.writeFileSync(injectionWidgetsOutFile, injectionWidgetsOutput)\n writeChecksumRecord(injectionWidgetsChecksumFile, injectionWidgetsChecksum)\n result.filesWritten.push(injectionWidgetsOutFile)\n } else {\n result.filesUnchanged.push(injectionWidgetsOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), injectionWidgetsOutFile), shouldWriteInjectionWidgets)\n\n const injectionTablesChecksum = { content: calculateChecksum(injectionTablesOutput), structure: structureChecksum }\n const existingInjectionTablesChecksum = readChecksumRecord(injectionTablesChecksumFile)\n const shouldWriteInjectionTables =\n !existingInjectionTablesChecksum ||\n existingInjectionTablesChecksum.content !== injectionTablesChecksum.content ||\n existingInjectionTablesChecksum.structure !== injectionTablesChecksum.structure\n if (shouldWriteInjectionTables) {\n fs.writeFileSync(injectionTablesOutFile, injectionTablesOutput)\n writeChecksumRecord(injectionTablesChecksumFile, injectionTablesChecksum)\n result.filesWritten.push(injectionTablesOutFile)\n } else {\n result.filesUnchanged.push(injectionTablesOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), injectionTablesOutFile), shouldWriteInjectionTables)\n\n const searchChecksum = { content: calculateChecksum(searchOutput), structure: structureChecksum }\n const existingSearchChecksum = readChecksumRecord(searchChecksumFile)\n const shouldWriteSearch =\n !existingSearchChecksum ||\n existingSearchChecksum.content !== searchChecksum.content ||\n existingSearchChecksum.structure !== searchChecksum.structure\n if (shouldWriteSearch) {\n fs.writeFileSync(searchOutFile, searchOutput)\n writeChecksumRecord(searchChecksumFile, searchChecksum)\n result.filesWritten.push(searchOutFile)\n } else {\n result.filesUnchanged.push(searchOutFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), searchOutFile), shouldWriteSearch)\n\n return result\n}\n\n/**\n * Generate a CLI-specific module registry that excludes Next.js dependent code.\n * This produces modules.cli.generated.ts which can be loaded without Next.js runtime.\n *\n * Includes: module metadata, CLI commands, translations, subscribers, workers, entity extensions,\n * features/ACL, custom entities, vector config, custom fields\n * Excludes: frontend routes, backend routes, API handlers, dashboard/injection widgets\n */\nexport async function generateModuleRegistryCli(options: ModuleRegistryOptions): Promise<GeneratorResult> {\n const { resolver, quiet = false } = options\n const result = createGeneratorResult()\n\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'modules.cli.generated.ts')\n const checksumFile = path.join(outputDir, 'modules.cli.generated.checksum')\n\n const enabled = resolver.loadEnabledModules()\n const imports: string[] = []\n const moduleDecls: string[] = []\n let importId = 0\n const trackedRoots = new Set<string>()\n const requiresByModule = new Map<string, string[]>()\n\n for (const entry of enabled) {\n const modId = entry.id\n const roots = resolver.getModulePaths(entry)\n const imps = resolver.getModuleImportBase(entry)\n trackedRoots.add(roots.appBase)\n trackedRoots.add(roots.pkgBase)\n\n // For @app modules, use relative paths since @/ alias doesn't work in Node.js runtime\n // From .mercato/generated/, go up two levels (../..) to reach the app root, then into src/modules/\n const isAppModule = entry.from === '@app'\n const appImportBase = isAppModule ? `../../src/modules/${modId}` : imps.appBase\n\n let cliImportName: string | null = null\n const translations: string[] = []\n const subscribers: string[] = []\n const workers: string[] = []\n let infoImportName: string | null = null\n let extensionsImportName: string | null = null\n let fieldsImportName: string | null = null\n let featuresImportName: string | null = null\n let customEntitiesImportName: string | null = null\n let vectorImportName: string | null = null\n let customFieldSetsExpr: string = '[]'\n\n // Module metadata: index.ts (overrideable)\n const appIndex = findModuleFile(roots.appBase, 'index')\n const pkgIndex = findModuleFile(roots.pkgBase, 'index')\n const indexTs = appIndex ?? pkgIndex\n if (indexTs) {\n infoImportName = `I${importId++}_${toVar(modId)}`\n const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`\n imports.push(`import * as ${infoImportName} from '${importPath}'`)\n // Try to eagerly read ModuleInfo.requires for dependency validation\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexTs)\n const reqs: string[] | undefined =\n mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : undefined\n if (reqs && reqs.length) requiresByModule.set(modId, reqs)\n } catch {}\n }\n\n // Entity extensions: src/modules/<module>/data/extensions.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'extensions')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'extensions')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `X_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`\n imports.push(`import * as ${importName} from '${importPath}'`)\n extensionsImportName = importName\n }\n }\n\n // RBAC feature declarations: module root acl.ts\n {\n const rootApp = findModuleFile(roots.appBase, 'acl')\n const rootPkg = findModuleFile(roots.pkgBase, 'acl')\n const hasRoot = rootApp || rootPkg\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importId++}`\n const useApp = rootApp ?? rootPkg!\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities declarations: module root ce.ts\n {\n const appFile = findModuleFile(roots.appBase, 'ce')\n const pkgFile = findModuleFile(roots.pkgBase, 'ce')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `CE_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`\n imports.push(`import * as ${importName} from '${importPath}'`)\n customEntitiesImportName = importName\n }\n }\n\n // Vector search configuration: module root vector.ts\n {\n const appFile = findModuleFile(roots.appBase, 'vector')\n const pkgFile = findModuleFile(roots.pkgBase, 'vector')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `VECTOR_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/vector` : `${imps.pkgBase}/vector`\n imports.push(`import * as ${importName} from '${importPath}'`)\n vectorImportName = importName\n }\n }\n\n // Custom field declarations: src/modules/<module>/data/fields.ts\n {\n const appFile = findModuleFile(roots.appBase, 'data', 'fields')\n const pkgFile = findModuleFile(roots.pkgBase, 'data', 'fields')\n const hasApp = !!appFile\n const hasPkg = !!pkgFile\n if (hasApp || hasPkg) {\n const importName = `F_${toVar(modId)}_${importId++}`\n const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`\n imports.push(`import * as ${importName} from '${importPath}'`)\n fieldsImportName = importName\n }\n }\n\n // CLI\n const cliApp = findModuleFile(roots.appBase, 'cli')\n const cliPkg = findModuleFile(roots.pkgBase, 'cli')\n const cliPath = cliApp ?? cliPkg\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n\n // Translations: merge core + app with app overriding\n const i18nApp = path.join(roots.appBase, 'i18n')\n const i18nCore = path.join(roots.pkgBase, 'i18n')\n const locales = new Set<string>()\n if (fs.existsSync(i18nCore))\n for (const e of fs.readdirSync(i18nCore, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n if (fs.existsSync(i18nApp))\n for (const e of fs.readdirSync(i18nApp, { withFileTypes: true }))\n if (e.isFile() && e.name.endsWith('.json')) locales.add(e.name.replace(/\\.json$/, ''))\n for (const locale of locales) {\n const coreHas = fs.existsSync(path.join(i18nCore, `${locale}.json`))\n const appHas = fs.existsSync(path.join(i18nApp, `${locale}.json`))\n if (coreHas && appHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(\n `'${locale}': { ...( ${cName} as unknown as Record<string,string> ), ...( ${aName} as unknown as Record<string,string> ) }`\n )\n } else if (appHas) {\n const aName = `T_${toVar(modId)}_${toVar(locale)}_A`\n imports.push(`import ${aName} from '${appImportBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${aName} as unknown as Record<string,string>`)\n } else if (coreHas) {\n const cName = `T_${toVar(modId)}_${toVar(locale)}_C`\n imports.push(`import ${cName} from '${imps.pkgBase}/i18n/${locale}.json'`)\n translations.push(`'${locale}': ${cName} as unknown as Record<string,string>`)\n }\n }\n\n // Subscribers: src/modules/<module>/subscribers/*.ts or *.js\n const subApp = path.join(roots.appBase, 'subscribers')\n const subPkg = path.join(roots.pkgBase, 'subscribers')\n if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {\n if (/\\.(test|spec)\\.(ts|js)$/.test(e.name)) continue\n if (e.name.endsWith('.d.ts')) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(subPkg)) walk(subPkg)\n if (fs.existsSync(subApp)) walk(subApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.(ts|js)$/, '')\n const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const appFileTs = path.join(subApp, ...segs, `${name}.ts`)\n const appFileJs = path.join(subApp, ...segs, `${name}.js`)\n const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const sid = [modId, ...segs, name].filter(Boolean).join(':')\n subscribers.push(\n `{ id: (((${metaName}.metadata) as any)?.id || '${sid}'), event: ((${metaName}.metadata) as any)?.event, persistent: ((${metaName}.metadata) as any)?.persistent, handler: ${importName} }`\n )\n }\n }\n\n // Workers: src/modules/<module>/workers/*.ts or *.js\n // Only includes files that export `metadata` with a `queue` property\n {\n const wrkApp = path.join(roots.appBase, 'workers')\n const wrkPkg = path.join(roots.pkgBase, 'workers')\n if (fs.existsSync(wrkApp) || fs.existsSync(wrkPkg)) {\n const found: string[] = []\n const walk = (dir: string, rel: string[] = []) => {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n if (e.isDirectory()) {\n if (e.name === '__tests__' || e.name === '__mocks__') continue\n walk(path.join(dir, e.name), [...rel, e.name])\n } else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {\n if (/\\.(test|spec)\\.(ts|js)$/.test(e.name)) continue\n if (e.name.endsWith('.d.ts')) continue\n found.push([...rel, e.name].join('/'))\n }\n }\n }\n if (fs.existsSync(wrkPkg)) walk(wrkPkg)\n if (fs.existsSync(wrkApp)) walk(wrkApp)\n const files = Array.from(new Set(found))\n for (const rel of files) {\n const segs = rel.split('/')\n const file = segs.pop()!\n const name = file.replace(/\\.(ts|js)$/, '')\n const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`)\n const appFileJs = path.join(wrkApp, ...segs, `${name}.js`)\n const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)\n // Use package import path for checking exports (file path fails due to relative imports)\n const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`\n // Only include files that export metadata with a queue property\n if (!(await moduleHasExport(importPath, 'metadata'))) continue\n const importName = `Worker${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n const metaName = `WorkerMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`\n imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)\n const wid = [modId, 'workers', ...segs, name].filter(Boolean).join(':')\n workers.push(\n `{ id: (${metaName}.metadata as { id?: string })?.id || '${wid}', queue: (${metaName}.metadata as { queue: string }).queue, concurrency: (${metaName}.metadata as { concurrency?: number })?.concurrency ?? 1, handler: ${importName} as (job: unknown, ctx: unknown) => Promise<void> }`\n )\n }\n }\n }\n\n // Build combined customFieldSets expression from data/fields.ts and ce.ts (entities[].fields)\n {\n const parts: string[] = []\n if (fieldsImportName)\n parts.push(`(( ${fieldsImportName}.default ?? ${fieldsImportName}.fieldSets) as any) || []`)\n if (customEntitiesImportName)\n parts.push(\n `((( ${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || []).filter((e: any) => Array.isArray(e.fields) && e.fields.length).map((e: any) => ({ entity: e.id, fields: e.fields, source: '${modId}' }))`\n )\n customFieldSetsExpr = parts.length ? `[...${parts.join(', ...')}]` : '[]'\n }\n\n moduleDecls.push(`{\n id: '${modId}',\n ${infoImportName ? `info: ${infoImportName}.metadata,` : ''}\n ${cliImportName ? `cli: ${cliImportName},` : ''}\n ${translations.length ? `translations: { ${translations.join(', ')} },` : ''}\n ${subscribers.length ? `subscribers: [${subscribers.join(', ')}],` : ''}\n ${workers.length ? `workers: [${workers.join(', ')}],` : ''}\n ${extensionsImportName ? `entityExtensions: ((${extensionsImportName}.default ?? ${extensionsImportName}.extensions) as any) || [],` : ''}\n customFieldSets: ${customFieldSetsExpr},\n ${featuresImportName ? `features: ((${featuresImportName}.default ?? ${featuresImportName}.features) as any) || [],` : ''}\n ${customEntitiesImportName ? `customEntities: ((${customEntitiesImportName}.default ?? ${customEntitiesImportName}.entities) as any) || [],` : ''}\n ${vectorImportName ? `vector: (${vectorImportName}.default ?? ${vectorImportName}.vectorConfig ?? ${vectorImportName}.config ?? undefined),` : ''}\n }`)\n }\n\n const output = `// AUTO-GENERATED by mercato generate registry (CLI version)\n// This file excludes Next.js dependent code (routes, APIs, widgets)\nimport type { Module } from '@open-mercato/shared/modules/registry'\n${imports.join('\\n')}\n\nexport const modules: Module[] = [\n ${moduleDecls.join(',\\n ')}\n]\nexport const modulesInfo = modules.map(m => ({ id: m.id, ...(m.info || {}) }))\nexport default modules\n`\n\n // Validate module dependencies declared via ModuleInfo.requires\n {\n const enabledIds = new Set(enabled.map((e) => e.id))\n const problems: string[] = []\n for (const [modId, reqs] of requiresByModule.entries()) {\n const missing = reqs.filter((r) => !enabledIds.has(r))\n if (missing.length) {\n problems.push(`- Module \"${modId}\" requires: ${missing.join(', ')}`)\n }\n }\n if (problems.length) {\n console.error('\\nModule dependency check failed:')\n for (const p of problems) console.error(p)\n console.error('\\nFix: Enable required module(s) in src/modules.ts. Example:')\n console.error(\n ' export const enabledModules = [ { id: \\'' +\n Array.from(new Set(requiresByModule.values()).values()).join(\"' }, { id: '\") +\n \"' } ]\"\n )\n process.exit(1)\n }\n }\n\n const structureChecksum = calculateStructureChecksum(Array.from(trackedRoots))\n\n const checksum = { content: calculateChecksum(output), structure: structureChecksum }\n const existingChecksum = readChecksumRecord(checksumFile)\n const shouldWrite =\n !existingChecksum ||\n existingChecksum.content !== checksum.content ||\n existingChecksum.structure !== checksum.structure\n if (shouldWrite) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true })\n fs.writeFileSync(outFile, output)\n writeChecksumRecord(checksumFile, checksum)\n result.filesWritten.push(outFile)\n } else {\n result.filesUnchanged.push(outFile)\n }\n if (!quiet) logGenerationResult(path.relative(process.cwd(), outFile), shouldWrite)\n\n return result\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/cli",
|
|
3
|
-
"version": "0.4.2-canary-
|
|
3
|
+
"version": "0.4.2-canary-f80d1bfa83",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"@mikro-orm/core": "^6.6.2",
|
|
56
56
|
"@mikro-orm/migrations": "^6.6.2",
|
|
57
57
|
"@mikro-orm/postgresql": "^6.6.2",
|
|
58
|
-
"@open-mercato/shared": "0.4.2-canary-
|
|
58
|
+
"@open-mercato/shared": "0.4.2-canary-f80d1bfa83",
|
|
59
59
|
"pg": "^8.16.3",
|
|
60
60
|
"typescript": "^5.9.3"
|
|
61
61
|
},
|
|
@@ -179,7 +179,8 @@ export async function generateEntityIds(options: EntityIdsOptions): Promise<Gene
|
|
|
179
179
|
const appDb = path.join(roots.appBase, 'db')
|
|
180
180
|
const pkgDb = path.join(roots.pkgBase, 'db')
|
|
181
181
|
const bases = [appData, pkgData, appDb, pkgDb]
|
|
182
|
-
|
|
182
|
+
// Check both .ts (src/monorepo) and .js (dist/production) extensions
|
|
183
|
+
const candidates = ['entities.override.ts', 'entities.override.js', 'entities.ts', 'entities.js', 'schema.ts', 'schema.js']
|
|
183
184
|
let importPath: string | null = null
|
|
184
185
|
let filePath: string | null = null
|
|
185
186
|
|
|
@@ -189,7 +190,8 @@ export async function generateEntityIds(options: EntityIdsOptions): Promise<Gene
|
|
|
189
190
|
if (fs.existsSync(p)) {
|
|
190
191
|
const fromApp = base.startsWith(roots.appBase)
|
|
191
192
|
const sub = path.basename(base) // 'data' | 'db'
|
|
192
|
-
|
|
193
|
+
const fileBaseName = f.replace(/\.(ts|js)$/, '')
|
|
194
|
+
importPath = `${fromApp ? imps.appBase : imps.pkgBase}/${sub}/${fileBaseName}`
|
|
193
195
|
filePath = p
|
|
194
196
|
break
|
|
195
197
|
}
|
|
@@ -34,10 +34,13 @@ export async function generateModuleDi(options: ModuleDiOptions): Promise<Genera
|
|
|
34
34
|
const modId = entry.id
|
|
35
35
|
const roots = resolver.getModulePaths(entry)
|
|
36
36
|
const imp = resolver.getModuleImportBase(entry)
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
const
|
|
37
|
+
// Check both .ts (src/monorepo) and .js (dist/production) extensions
|
|
38
|
+
const appDiTs = path.join(roots.appBase, 'di.ts')
|
|
39
|
+
const appDiJs = path.join(roots.appBase, 'di.js')
|
|
40
|
+
const pkgDiTs = path.join(roots.pkgBase, 'di.ts')
|
|
41
|
+
const pkgDiJs = path.join(roots.pkgBase, 'di.js')
|
|
42
|
+
const useApp = fs.existsSync(appDiTs) || fs.existsSync(appDiJs)
|
|
43
|
+
const usePkg = fs.existsSync(pkgDiTs) || fs.existsSync(pkgDiJs)
|
|
41
44
|
const importName = `D_${toVar(modId)}_${i++}`
|
|
42
45
|
|
|
43
46
|
if (useApp) {
|
|
@@ -525,7 +525,7 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
525
525
|
}
|
|
526
526
|
}
|
|
527
527
|
|
|
528
|
-
// Subscribers: src/modules/<module>/subscribers/*.ts
|
|
528
|
+
// Subscribers: src/modules/<module>/subscribers/*.ts or *.js
|
|
529
529
|
const subApp = path.join(roots.appBase, 'subscribers')
|
|
530
530
|
const subPkg = path.join(roots.pkgBase, 'subscribers')
|
|
531
531
|
if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {
|
|
@@ -535,8 +535,9 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
535
535
|
if (e.isDirectory()) {
|
|
536
536
|
if (e.name === '__tests__' || e.name === '__mocks__') continue
|
|
537
537
|
walk(path.join(dir, e.name), [...rel, e.name])
|
|
538
|
-
} else if (e.isFile() && e.name.endsWith('.ts')) {
|
|
539
|
-
if (/\.(test|spec)\.ts$/.test(e.name)) continue
|
|
538
|
+
} else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {
|
|
539
|
+
if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue
|
|
540
|
+
if (e.name.endsWith('.d.ts')) continue
|
|
540
541
|
found.push([...rel, e.name].join('/'))
|
|
541
542
|
}
|
|
542
543
|
}
|
|
@@ -547,11 +548,12 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
547
548
|
for (const rel of files) {
|
|
548
549
|
const segs = rel.split('/')
|
|
549
550
|
const file = segs.pop()!
|
|
550
|
-
const name = file.replace(/\.ts$/, '')
|
|
551
|
+
const name = file.replace(/\.(ts|js)$/, '')
|
|
551
552
|
const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`
|
|
552
553
|
const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`
|
|
553
|
-
const
|
|
554
|
-
const
|
|
554
|
+
const appFileTs = path.join(subApp, ...segs, `${name}.ts`)
|
|
555
|
+
const appFileJs = path.join(subApp, ...segs, `${name}.js`)
|
|
556
|
+
const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)
|
|
555
557
|
const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`
|
|
556
558
|
imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)
|
|
557
559
|
const sid = [modId, ...segs, name].filter(Boolean).join(':')
|
|
@@ -561,7 +563,7 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
561
563
|
}
|
|
562
564
|
}
|
|
563
565
|
|
|
564
|
-
// Workers: src/modules/<module>/workers/*.ts
|
|
566
|
+
// Workers: src/modules/<module>/workers/*.ts or *.js
|
|
565
567
|
// Only includes files that export `metadata` with a `queue` property
|
|
566
568
|
{
|
|
567
569
|
const wrkApp = path.join(roots.appBase, 'workers')
|
|
@@ -573,8 +575,9 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
573
575
|
if (e.isDirectory()) {
|
|
574
576
|
if (e.name === '__tests__' || e.name === '__mocks__') continue
|
|
575
577
|
walk(path.join(dir, e.name), [...rel, e.name])
|
|
576
|
-
} else if (e.isFile() && e.name.endsWith('.ts')) {
|
|
577
|
-
if (/\.(test|spec)\.ts$/.test(e.name)) continue
|
|
578
|
+
} else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {
|
|
579
|
+
if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue
|
|
580
|
+
if (e.name.endsWith('.d.ts')) continue
|
|
578
581
|
found.push([...rel, e.name].join('/'))
|
|
579
582
|
}
|
|
580
583
|
}
|
|
@@ -585,9 +588,10 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
585
588
|
for (const rel of files) {
|
|
586
589
|
const segs = rel.split('/')
|
|
587
590
|
const file = segs.pop()!
|
|
588
|
-
const name = file.replace(/\.ts$/, '')
|
|
589
|
-
const
|
|
590
|
-
const
|
|
591
|
+
const name = file.replace(/\.(ts|js)$/, '')
|
|
592
|
+
const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`)
|
|
593
|
+
const appFileJs = path.join(wrkApp, ...segs, `${name}.js`)
|
|
594
|
+
const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)
|
|
591
595
|
// Use package import path for checking exports (file path fails due to relative imports)
|
|
592
596
|
const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`
|
|
593
597
|
// Only include files that export metadata with a queue property
|
|
@@ -1075,7 +1079,7 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
1075
1079
|
}
|
|
1076
1080
|
}
|
|
1077
1081
|
|
|
1078
|
-
// Subscribers: src/modules/<module>/subscribers/*.ts
|
|
1082
|
+
// Subscribers: src/modules/<module>/subscribers/*.ts or *.js
|
|
1079
1083
|
const subApp = path.join(roots.appBase, 'subscribers')
|
|
1080
1084
|
const subPkg = path.join(roots.pkgBase, 'subscribers')
|
|
1081
1085
|
if (fs.existsSync(subApp) || fs.existsSync(subPkg)) {
|
|
@@ -1085,8 +1089,9 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
1085
1089
|
if (e.isDirectory()) {
|
|
1086
1090
|
if (e.name === '__tests__' || e.name === '__mocks__') continue
|
|
1087
1091
|
walk(path.join(dir, e.name), [...rel, e.name])
|
|
1088
|
-
} else if (e.isFile() && e.name.endsWith('.ts')) {
|
|
1089
|
-
if (/\.(test|spec)\.ts$/.test(e.name)) continue
|
|
1092
|
+
} else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {
|
|
1093
|
+
if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue
|
|
1094
|
+
if (e.name.endsWith('.d.ts')) continue
|
|
1090
1095
|
found.push([...rel, e.name].join('/'))
|
|
1091
1096
|
}
|
|
1092
1097
|
}
|
|
@@ -1097,11 +1102,12 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
1097
1102
|
for (const rel of files) {
|
|
1098
1103
|
const segs = rel.split('/')
|
|
1099
1104
|
const file = segs.pop()!
|
|
1100
|
-
const name = file.replace(/\.ts$/, '')
|
|
1105
|
+
const name = file.replace(/\.(ts|js)$/, '')
|
|
1101
1106
|
const importName = `Subscriber${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`
|
|
1102
1107
|
const metaName = `SubscriberMeta${importId++}_${toVar(modId)}_${toVar([...segs, name].join('_') || 'index')}`
|
|
1103
|
-
const
|
|
1104
|
-
const
|
|
1108
|
+
const appFileTs = path.join(subApp, ...segs, `${name}.ts`)
|
|
1109
|
+
const appFileJs = path.join(subApp, ...segs, `${name}.js`)
|
|
1110
|
+
const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)
|
|
1105
1111
|
const importPath = `${fromApp ? appImportBase : imps.pkgBase}/subscribers/${[...segs, name].join('/')}`
|
|
1106
1112
|
imports.push(`import ${importName}, * as ${metaName} from '${importPath}'`)
|
|
1107
1113
|
const sid = [modId, ...segs, name].filter(Boolean).join(':')
|
|
@@ -1111,7 +1117,7 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
1111
1117
|
}
|
|
1112
1118
|
}
|
|
1113
1119
|
|
|
1114
|
-
// Workers: src/modules/<module>/workers/*.ts
|
|
1120
|
+
// Workers: src/modules/<module>/workers/*.ts or *.js
|
|
1115
1121
|
// Only includes files that export `metadata` with a `queue` property
|
|
1116
1122
|
{
|
|
1117
1123
|
const wrkApp = path.join(roots.appBase, 'workers')
|
|
@@ -1123,8 +1129,9 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
1123
1129
|
if (e.isDirectory()) {
|
|
1124
1130
|
if (e.name === '__tests__' || e.name === '__mocks__') continue
|
|
1125
1131
|
walk(path.join(dir, e.name), [...rel, e.name])
|
|
1126
|
-
} else if (e.isFile() && e.name.endsWith('.ts')) {
|
|
1127
|
-
if (/\.(test|spec)\.ts$/.test(e.name)) continue
|
|
1132
|
+
} else if (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) {
|
|
1133
|
+
if (/\.(test|spec)\.(ts|js)$/.test(e.name)) continue
|
|
1134
|
+
if (e.name.endsWith('.d.ts')) continue
|
|
1128
1135
|
found.push([...rel, e.name].join('/'))
|
|
1129
1136
|
}
|
|
1130
1137
|
}
|
|
@@ -1135,9 +1142,10 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
1135
1142
|
for (const rel of files) {
|
|
1136
1143
|
const segs = rel.split('/')
|
|
1137
1144
|
const file = segs.pop()!
|
|
1138
|
-
const name = file.replace(/\.ts$/, '')
|
|
1139
|
-
const
|
|
1140
|
-
const
|
|
1145
|
+
const name = file.replace(/\.(ts|js)$/, '')
|
|
1146
|
+
const appFileTs = path.join(wrkApp, ...segs, `${name}.ts`)
|
|
1147
|
+
const appFileJs = path.join(wrkApp, ...segs, `${name}.js`)
|
|
1148
|
+
const fromApp = fs.existsSync(appFileTs) || fs.existsSync(appFileJs)
|
|
1141
1149
|
// Use package import path for checking exports (file path fails due to relative imports)
|
|
1142
1150
|
const importPath = `${fromApp ? appImportBase : imps.pkgBase}/workers/${[...segs, name].join('/')}`
|
|
1143
1151
|
// Only include files that export metadata with a queue property
|