@open-mercato/cli 0.4.2-canary-17c386eb25 → 0.4.2-canary-3f5eaf79f7
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.
|
@@ -10,6 +10,15 @@ import {
|
|
|
10
10
|
logGenerationResult,
|
|
11
11
|
createGeneratorResult
|
|
12
12
|
} from "../utils.js";
|
|
13
|
+
function findModuleFile(basePath, ...segments) {
|
|
14
|
+
const name = segments.pop();
|
|
15
|
+
const dir = segments.length ? path.join(basePath, ...segments) : basePath;
|
|
16
|
+
const tsPath = path.join(dir, `${name}.ts`);
|
|
17
|
+
if (fs.existsSync(tsPath)) return tsPath;
|
|
18
|
+
const jsPath = path.join(dir, `${name}.js`);
|
|
19
|
+
if (fs.existsSync(jsPath)) return jsPath;
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
13
22
|
async function generateModuleRegistry(options) {
|
|
14
23
|
const { resolver, quiet = false } = options;
|
|
15
24
|
const result = createGeneratorResult();
|
|
@@ -60,9 +69,9 @@ async function generateModuleRegistry(options) {
|
|
|
60
69
|
const dashboardWidgets = [];
|
|
61
70
|
const injectionWidgets = [];
|
|
62
71
|
let injectionTableImportName = null;
|
|
63
|
-
const appIndex =
|
|
64
|
-
const pkgIndex =
|
|
65
|
-
const indexTs =
|
|
72
|
+
const appIndex = findModuleFile(roots.appBase, "index");
|
|
73
|
+
const pkgIndex = findModuleFile(roots.pkgBase, "index");
|
|
74
|
+
const indexTs = appIndex ?? pkgIndex;
|
|
66
75
|
if (indexTs) {
|
|
67
76
|
infoImportName = `I${importId++}_${toVar(modId)}`;
|
|
68
77
|
const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`;
|
|
@@ -161,10 +170,10 @@ async function generateModuleRegistry(options) {
|
|
|
161
170
|
}
|
|
162
171
|
}
|
|
163
172
|
{
|
|
164
|
-
const appFile =
|
|
165
|
-
const pkgFile =
|
|
166
|
-
const hasApp =
|
|
167
|
-
const hasPkg =
|
|
173
|
+
const appFile = findModuleFile(roots.appBase, "data", "extensions");
|
|
174
|
+
const pkgFile = findModuleFile(roots.pkgBase, "data", "extensions");
|
|
175
|
+
const hasApp = !!appFile;
|
|
176
|
+
const hasPkg = !!pkgFile;
|
|
168
177
|
if (hasApp || hasPkg) {
|
|
169
178
|
const importName = `X_${toVar(modId)}_${importId++}`;
|
|
170
179
|
const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`;
|
|
@@ -173,22 +182,22 @@ async function generateModuleRegistry(options) {
|
|
|
173
182
|
}
|
|
174
183
|
}
|
|
175
184
|
{
|
|
176
|
-
const rootApp =
|
|
177
|
-
const rootPkg =
|
|
178
|
-
const hasRoot =
|
|
185
|
+
const rootApp = findModuleFile(roots.appBase, "acl");
|
|
186
|
+
const rootPkg = findModuleFile(roots.pkgBase, "acl");
|
|
187
|
+
const hasRoot = rootApp || rootPkg;
|
|
179
188
|
if (hasRoot) {
|
|
180
189
|
const importName = `ACL_${toVar(modId)}_${importId++}`;
|
|
181
|
-
const useApp =
|
|
190
|
+
const useApp = rootApp ?? rootPkg;
|
|
182
191
|
const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`;
|
|
183
192
|
imports.push(`import * as ${importName} from '${importPath}'`);
|
|
184
193
|
featuresImportName = importName;
|
|
185
194
|
}
|
|
186
195
|
}
|
|
187
196
|
{
|
|
188
|
-
const appFile =
|
|
189
|
-
const pkgFile =
|
|
190
|
-
const hasApp =
|
|
191
|
-
const hasPkg =
|
|
197
|
+
const appFile = findModuleFile(roots.appBase, "ce");
|
|
198
|
+
const pkgFile = findModuleFile(roots.pkgBase, "ce");
|
|
199
|
+
const hasApp = !!appFile;
|
|
200
|
+
const hasPkg = !!pkgFile;
|
|
192
201
|
if (hasApp || hasPkg) {
|
|
193
202
|
const importName = `CE_${toVar(modId)}_${importId++}`;
|
|
194
203
|
const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`;
|
|
@@ -197,10 +206,10 @@ async function generateModuleRegistry(options) {
|
|
|
197
206
|
}
|
|
198
207
|
}
|
|
199
208
|
{
|
|
200
|
-
const appFile =
|
|
201
|
-
const pkgFile =
|
|
202
|
-
const hasApp =
|
|
203
|
-
const hasPkg =
|
|
209
|
+
const appFile = findModuleFile(roots.appBase, "search");
|
|
210
|
+
const pkgFile = findModuleFile(roots.pkgBase, "search");
|
|
211
|
+
const hasApp = !!appFile;
|
|
212
|
+
const hasPkg = !!pkgFile;
|
|
204
213
|
if (hasApp || hasPkg) {
|
|
205
214
|
const importName = `SEARCH_${toVar(modId)}_${importId++}`;
|
|
206
215
|
const importPath = hasApp ? `${appImportBase}/search` : `${imps.pkgBase}/search`;
|
|
@@ -211,10 +220,10 @@ async function generateModuleRegistry(options) {
|
|
|
211
220
|
}
|
|
212
221
|
}
|
|
213
222
|
{
|
|
214
|
-
const appFile =
|
|
215
|
-
const pkgFile =
|
|
216
|
-
const hasApp =
|
|
217
|
-
const hasPkg =
|
|
223
|
+
const appFile = findModuleFile(roots.appBase, "data", "fields");
|
|
224
|
+
const pkgFile = findModuleFile(roots.pkgBase, "data", "fields");
|
|
225
|
+
const hasApp = !!appFile;
|
|
226
|
+
const hasPkg = !!pkgFile;
|
|
218
227
|
if (hasApp || hasPkg) {
|
|
219
228
|
const importName = `F_${toVar(modId)}_${importId++}`;
|
|
220
229
|
const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`;
|
|
@@ -419,9 +428,9 @@ async function generateModuleRegistry(options) {
|
|
|
419
428
|
}
|
|
420
429
|
}
|
|
421
430
|
}
|
|
422
|
-
const cliApp =
|
|
423
|
-
const cliPkg =
|
|
424
|
-
const cliPath =
|
|
431
|
+
const cliApp = findModuleFile(roots.appBase, "cli");
|
|
432
|
+
const cliPkg = findModuleFile(roots.pkgBase, "cli");
|
|
433
|
+
const cliPath = cliApp ?? cliPkg;
|
|
425
434
|
if (cliPath) {
|
|
426
435
|
const importName = `CLI_${toVar(modId)}`;
|
|
427
436
|
const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`;
|
|
@@ -819,9 +828,9 @@ async function generateModuleRegistryCli(options) {
|
|
|
819
828
|
let customEntitiesImportName = null;
|
|
820
829
|
let vectorImportName = null;
|
|
821
830
|
let customFieldSetsExpr = "[]";
|
|
822
|
-
const appIndex =
|
|
823
|
-
const pkgIndex =
|
|
824
|
-
const indexTs =
|
|
831
|
+
const appIndex = findModuleFile(roots.appBase, "index");
|
|
832
|
+
const pkgIndex = findModuleFile(roots.pkgBase, "index");
|
|
833
|
+
const indexTs = appIndex ?? pkgIndex;
|
|
825
834
|
if (indexTs) {
|
|
826
835
|
infoImportName = `I${importId++}_${toVar(modId)}`;
|
|
827
836
|
const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`;
|
|
@@ -834,10 +843,10 @@ async function generateModuleRegistryCli(options) {
|
|
|
834
843
|
}
|
|
835
844
|
}
|
|
836
845
|
{
|
|
837
|
-
const appFile =
|
|
838
|
-
const pkgFile =
|
|
839
|
-
const hasApp =
|
|
840
|
-
const hasPkg =
|
|
846
|
+
const appFile = findModuleFile(roots.appBase, "data", "extensions");
|
|
847
|
+
const pkgFile = findModuleFile(roots.pkgBase, "data", "extensions");
|
|
848
|
+
const hasApp = !!appFile;
|
|
849
|
+
const hasPkg = !!pkgFile;
|
|
841
850
|
if (hasApp || hasPkg) {
|
|
842
851
|
const importName = `X_${toVar(modId)}_${importId++}`;
|
|
843
852
|
const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`;
|
|
@@ -846,22 +855,22 @@ async function generateModuleRegistryCli(options) {
|
|
|
846
855
|
}
|
|
847
856
|
}
|
|
848
857
|
{
|
|
849
|
-
const rootApp =
|
|
850
|
-
const rootPkg =
|
|
851
|
-
const hasRoot =
|
|
858
|
+
const rootApp = findModuleFile(roots.appBase, "acl");
|
|
859
|
+
const rootPkg = findModuleFile(roots.pkgBase, "acl");
|
|
860
|
+
const hasRoot = rootApp || rootPkg;
|
|
852
861
|
if (hasRoot) {
|
|
853
862
|
const importName = `ACL_${toVar(modId)}_${importId++}`;
|
|
854
|
-
const useApp =
|
|
863
|
+
const useApp = rootApp ?? rootPkg;
|
|
855
864
|
const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`;
|
|
856
865
|
imports.push(`import * as ${importName} from '${importPath}'`);
|
|
857
866
|
featuresImportName = importName;
|
|
858
867
|
}
|
|
859
868
|
}
|
|
860
869
|
{
|
|
861
|
-
const appFile =
|
|
862
|
-
const pkgFile =
|
|
863
|
-
const hasApp =
|
|
864
|
-
const hasPkg =
|
|
870
|
+
const appFile = findModuleFile(roots.appBase, "ce");
|
|
871
|
+
const pkgFile = findModuleFile(roots.pkgBase, "ce");
|
|
872
|
+
const hasApp = !!appFile;
|
|
873
|
+
const hasPkg = !!pkgFile;
|
|
865
874
|
if (hasApp || hasPkg) {
|
|
866
875
|
const importName = `CE_${toVar(modId)}_${importId++}`;
|
|
867
876
|
const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`;
|
|
@@ -870,10 +879,10 @@ async function generateModuleRegistryCli(options) {
|
|
|
870
879
|
}
|
|
871
880
|
}
|
|
872
881
|
{
|
|
873
|
-
const appFile =
|
|
874
|
-
const pkgFile =
|
|
875
|
-
const hasApp =
|
|
876
|
-
const hasPkg =
|
|
882
|
+
const appFile = findModuleFile(roots.appBase, "vector");
|
|
883
|
+
const pkgFile = findModuleFile(roots.pkgBase, "vector");
|
|
884
|
+
const hasApp = !!appFile;
|
|
885
|
+
const hasPkg = !!pkgFile;
|
|
877
886
|
if (hasApp || hasPkg) {
|
|
878
887
|
const importName = `VECTOR_${toVar(modId)}_${importId++}`;
|
|
879
888
|
const importPath = hasApp ? `${appImportBase}/vector` : `${imps.pkgBase}/vector`;
|
|
@@ -882,10 +891,10 @@ async function generateModuleRegistryCli(options) {
|
|
|
882
891
|
}
|
|
883
892
|
}
|
|
884
893
|
{
|
|
885
|
-
const appFile =
|
|
886
|
-
const pkgFile =
|
|
887
|
-
const hasApp =
|
|
888
|
-
const hasPkg =
|
|
894
|
+
const appFile = findModuleFile(roots.appBase, "data", "fields");
|
|
895
|
+
const pkgFile = findModuleFile(roots.pkgBase, "data", "fields");
|
|
896
|
+
const hasApp = !!appFile;
|
|
897
|
+
const hasPkg = !!pkgFile;
|
|
889
898
|
if (hasApp || hasPkg) {
|
|
890
899
|
const importName = `F_${toVar(modId)}_${importId++}`;
|
|
891
900
|
const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`;
|
|
@@ -893,9 +902,9 @@ async function generateModuleRegistryCli(options) {
|
|
|
893
902
|
fieldsImportName = importName;
|
|
894
903
|
}
|
|
895
904
|
}
|
|
896
|
-
const cliApp =
|
|
897
|
-
const cliPkg =
|
|
898
|
-
const cliPath =
|
|
905
|
+
const cliApp = findModuleFile(roots.appBase, "cli");
|
|
906
|
+
const cliPkg = findModuleFile(roots.pkgBase, "cli");
|
|
907
|
+
const cliPath = cliApp ?? cliPkg;
|
|
899
908
|
if (cliPath) {
|
|
900
909
|
const importName = `CLI_${toVar(modId)}`;
|
|
901
910
|
const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`;
|
|
@@ -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\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 = path.join(roots.appBase, 'index.ts')\n const pkgIndex = path.join(roots.pkgBase, 'index.ts')\n const indexTs = fs.existsSync(appIndex) ? appIndex : fs.existsSync(pkgIndex) ? pkgIndex : null\n if (indexTs) {\n infoImportName = `I${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 = path.join(roots.appBase, 'data', 'extensions.ts')\n const pkgFile = path.join(roots.pkgBase, 'data', 'extensions.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(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 = path.join(roots.appBase, 'acl.ts')\n const rootPkg = path.join(roots.pkgBase, 'acl.ts')\n const hasRoot = fs.existsSync(rootApp) || fs.existsSync(rootPkg)\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importId++}`\n const useApp = fs.existsSync(rootApp) ? rootApp : rootPkg\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities declarations: module root ce.ts\n {\n const appFile = path.join(roots.appBase, 'ce.ts')\n const pkgFile = path.join(roots.pkgBase, 'ce.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(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 = path.join(roots.appBase, 'search.ts')\n const pkgFile = path.join(roots.pkgBase, 'search.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(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 = path.join(roots.appBase, 'data', 'fields.ts')\n const pkgFile = path.join(roots.pkgBase, 'data', 'fields.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(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 = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n\n // 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 = path.join(roots.appBase, 'index.ts')\n const pkgIndex = path.join(roots.pkgBase, 'index.ts')\n const indexTs = fs.existsSync(appIndex) ? appIndex : fs.existsSync(pkgIndex) ? pkgIndex : null\n if (indexTs) {\n infoImportName = `I${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 = path.join(roots.appBase, 'data', 'extensions.ts')\n const pkgFile = path.join(roots.pkgBase, 'data', 'extensions.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(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 = path.join(roots.appBase, 'acl.ts')\n const rootPkg = path.join(roots.pkgBase, 'acl.ts')\n const hasRoot = fs.existsSync(rootApp) || fs.existsSync(rootPkg)\n if (hasRoot) {\n const importName = `ACL_${toVar(modId)}_${importId++}`\n const useApp = fs.existsSync(rootApp) ? rootApp : rootPkg\n const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`\n imports.push(`import * as ${importName} from '${importPath}'`)\n featuresImportName = importName\n }\n }\n\n // Custom entities declarations: module root ce.ts\n {\n const appFile = path.join(roots.appBase, 'ce.ts')\n const pkgFile = path.join(roots.pkgBase, 'ce.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(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 = path.join(roots.appBase, 'vector.ts')\n const pkgFile = path.join(roots.pkgBase, 'vector.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(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 = path.join(roots.appBase, 'data', 'fields.ts')\n const pkgFile = path.join(roots.pkgBase, 'data', 'fields.ts')\n const hasApp = fs.existsSync(appFile)\n const hasPkg = fs.existsSync(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 = path.join(roots.appBase, 'cli.ts')\n const cliPkg = path.join(roots.pkgBase, 'cli.ts')\n const cliPath = fs.existsSync(cliApp) ? cliApp : fs.existsSync(cliPkg) ? cliPkg : null\n if (cliPath) {\n const importName = `CLI_${toVar(modId)}`\n const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`\n imports.push(`import ${importName} from '${importPath}'`)\n cliImportName = importName\n }\n\n // 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\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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",
|
|
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-3f5eaf79f7",
|
|
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-3f5eaf79f7",
|
|
59
59
|
"pg": "^8.16.3",
|
|
60
60
|
"typescript": "^5.9.3"
|
|
61
61
|
},
|
|
@@ -15,6 +15,21 @@ import {
|
|
|
15
15
|
|
|
16
16
|
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'
|
|
17
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Find a module file, checking for both .ts (src) and .js (dist) extensions.
|
|
20
|
+
* Supports both simple names (e.g., 'cli') and nested paths (e.g., 'data/extensions').
|
|
21
|
+
* Returns the path if found, null otherwise.
|
|
22
|
+
*/
|
|
23
|
+
function findModuleFile(basePath: string, ...segments: string[]): string | null {
|
|
24
|
+
const name = segments.pop()!
|
|
25
|
+
const dir = segments.length ? path.join(basePath, ...segments) : basePath
|
|
26
|
+
const tsPath = path.join(dir, `${name}.ts`)
|
|
27
|
+
if (fs.existsSync(tsPath)) return tsPath
|
|
28
|
+
const jsPath = path.join(dir, `${name}.js`)
|
|
29
|
+
if (fs.existsSync(jsPath)) return jsPath
|
|
30
|
+
return null
|
|
31
|
+
}
|
|
32
|
+
|
|
18
33
|
export interface ModuleRegistryOptions {
|
|
19
34
|
resolver: PackageResolver
|
|
20
35
|
quiet?: boolean
|
|
@@ -79,9 +94,9 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
79
94
|
let injectionTableImportName: string | null = null
|
|
80
95
|
|
|
81
96
|
// Module metadata: index.ts (overrideable)
|
|
82
|
-
const appIndex =
|
|
83
|
-
const pkgIndex =
|
|
84
|
-
const indexTs =
|
|
97
|
+
const appIndex = findModuleFile(roots.appBase, 'index')
|
|
98
|
+
const pkgIndex = findModuleFile(roots.pkgBase, 'index')
|
|
99
|
+
const indexTs = appIndex ?? pkgIndex
|
|
85
100
|
if (indexTs) {
|
|
86
101
|
infoImportName = `I${importId++}_${toVar(modId)}`
|
|
87
102
|
const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`
|
|
@@ -190,10 +205,10 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
190
205
|
|
|
191
206
|
// Entity extensions: src/modules/<module>/data/extensions.ts
|
|
192
207
|
{
|
|
193
|
-
const appFile =
|
|
194
|
-
const pkgFile =
|
|
195
|
-
const hasApp =
|
|
196
|
-
const hasPkg =
|
|
208
|
+
const appFile = findModuleFile(roots.appBase, 'data', 'extensions')
|
|
209
|
+
const pkgFile = findModuleFile(roots.pkgBase, 'data', 'extensions')
|
|
210
|
+
const hasApp = !!appFile
|
|
211
|
+
const hasPkg = !!pkgFile
|
|
197
212
|
if (hasApp || hasPkg) {
|
|
198
213
|
const importName = `X_${toVar(modId)}_${importId++}`
|
|
199
214
|
const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`
|
|
@@ -204,12 +219,12 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
204
219
|
|
|
205
220
|
// RBAC feature declarations: module root acl.ts
|
|
206
221
|
{
|
|
207
|
-
const rootApp =
|
|
208
|
-
const rootPkg =
|
|
209
|
-
const hasRoot =
|
|
222
|
+
const rootApp = findModuleFile(roots.appBase, 'acl')
|
|
223
|
+
const rootPkg = findModuleFile(roots.pkgBase, 'acl')
|
|
224
|
+
const hasRoot = rootApp || rootPkg
|
|
210
225
|
if (hasRoot) {
|
|
211
226
|
const importName = `ACL_${toVar(modId)}_${importId++}`
|
|
212
|
-
const useApp =
|
|
227
|
+
const useApp = rootApp ?? rootPkg!
|
|
213
228
|
const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`
|
|
214
229
|
imports.push(`import * as ${importName} from '${importPath}'`)
|
|
215
230
|
featuresImportName = importName
|
|
@@ -218,10 +233,10 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
218
233
|
|
|
219
234
|
// Custom entities declarations: module root ce.ts
|
|
220
235
|
{
|
|
221
|
-
const appFile =
|
|
222
|
-
const pkgFile =
|
|
223
|
-
const hasApp =
|
|
224
|
-
const hasPkg =
|
|
236
|
+
const appFile = findModuleFile(roots.appBase, 'ce')
|
|
237
|
+
const pkgFile = findModuleFile(roots.pkgBase, 'ce')
|
|
238
|
+
const hasApp = !!appFile
|
|
239
|
+
const hasPkg = !!pkgFile
|
|
225
240
|
if (hasApp || hasPkg) {
|
|
226
241
|
const importName = `CE_${toVar(modId)}_${importId++}`
|
|
227
242
|
const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`
|
|
@@ -232,10 +247,10 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
232
247
|
|
|
233
248
|
// Search module configuration: module root search.ts
|
|
234
249
|
{
|
|
235
|
-
const appFile =
|
|
236
|
-
const pkgFile =
|
|
237
|
-
const hasApp =
|
|
238
|
-
const hasPkg =
|
|
250
|
+
const appFile = findModuleFile(roots.appBase, 'search')
|
|
251
|
+
const pkgFile = findModuleFile(roots.pkgBase, 'search')
|
|
252
|
+
const hasApp = !!appFile
|
|
253
|
+
const hasPkg = !!pkgFile
|
|
239
254
|
if (hasApp || hasPkg) {
|
|
240
255
|
const importName = `SEARCH_${toVar(modId)}_${importId++}`
|
|
241
256
|
const importPath = hasApp ? `${appImportBase}/search` : `${imps.pkgBase}/search`
|
|
@@ -248,10 +263,10 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
248
263
|
|
|
249
264
|
// Custom field declarations: src/modules/<module>/data/fields.ts
|
|
250
265
|
{
|
|
251
|
-
const appFile =
|
|
252
|
-
const pkgFile =
|
|
253
|
-
const hasApp =
|
|
254
|
-
const hasPkg =
|
|
266
|
+
const appFile = findModuleFile(roots.appBase, 'data', 'fields')
|
|
267
|
+
const pkgFile = findModuleFile(roots.pkgBase, 'data', 'fields')
|
|
268
|
+
const hasApp = !!appFile
|
|
269
|
+
const hasPkg = !!pkgFile
|
|
255
270
|
if (hasApp || hasPkg) {
|
|
256
271
|
const importName = `F_${toVar(modId)}_${importId++}`
|
|
257
272
|
const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`
|
|
@@ -468,9 +483,9 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
468
483
|
}
|
|
469
484
|
|
|
470
485
|
// CLI
|
|
471
|
-
const cliApp =
|
|
472
|
-
const cliPkg =
|
|
473
|
-
const cliPath =
|
|
486
|
+
const cliApp = findModuleFile(roots.appBase, 'cli')
|
|
487
|
+
const cliPkg = findModuleFile(roots.pkgBase, 'cli')
|
|
488
|
+
const cliPath = cliApp ?? cliPkg
|
|
474
489
|
if (cliPath) {
|
|
475
490
|
const importName = `CLI_${toVar(modId)}`
|
|
476
491
|
const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`
|
|
@@ -930,9 +945,9 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
930
945
|
let customFieldSetsExpr: string = '[]'
|
|
931
946
|
|
|
932
947
|
// Module metadata: index.ts (overrideable)
|
|
933
|
-
const appIndex =
|
|
934
|
-
const pkgIndex =
|
|
935
|
-
const indexTs =
|
|
948
|
+
const appIndex = findModuleFile(roots.appBase, 'index')
|
|
949
|
+
const pkgIndex = findModuleFile(roots.pkgBase, 'index')
|
|
950
|
+
const indexTs = appIndex ?? pkgIndex
|
|
936
951
|
if (indexTs) {
|
|
937
952
|
infoImportName = `I${importId++}_${toVar(modId)}`
|
|
938
953
|
const importPath = indexTs.startsWith(roots.appBase) ? `${appImportBase}/index` : `${imps.pkgBase}/index`
|
|
@@ -949,10 +964,10 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
949
964
|
|
|
950
965
|
// Entity extensions: src/modules/<module>/data/extensions.ts
|
|
951
966
|
{
|
|
952
|
-
const appFile =
|
|
953
|
-
const pkgFile =
|
|
954
|
-
const hasApp =
|
|
955
|
-
const hasPkg =
|
|
967
|
+
const appFile = findModuleFile(roots.appBase, 'data', 'extensions')
|
|
968
|
+
const pkgFile = findModuleFile(roots.pkgBase, 'data', 'extensions')
|
|
969
|
+
const hasApp = !!appFile
|
|
970
|
+
const hasPkg = !!pkgFile
|
|
956
971
|
if (hasApp || hasPkg) {
|
|
957
972
|
const importName = `X_${toVar(modId)}_${importId++}`
|
|
958
973
|
const importPath = hasApp ? `${appImportBase}/data/extensions` : `${imps.pkgBase}/data/extensions`
|
|
@@ -963,12 +978,12 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
963
978
|
|
|
964
979
|
// RBAC feature declarations: module root acl.ts
|
|
965
980
|
{
|
|
966
|
-
const rootApp =
|
|
967
|
-
const rootPkg =
|
|
968
|
-
const hasRoot =
|
|
981
|
+
const rootApp = findModuleFile(roots.appBase, 'acl')
|
|
982
|
+
const rootPkg = findModuleFile(roots.pkgBase, 'acl')
|
|
983
|
+
const hasRoot = rootApp || rootPkg
|
|
969
984
|
if (hasRoot) {
|
|
970
985
|
const importName = `ACL_${toVar(modId)}_${importId++}`
|
|
971
|
-
const useApp =
|
|
986
|
+
const useApp = rootApp ?? rootPkg!
|
|
972
987
|
const importPath = useApp.startsWith(roots.appBase) ? `${appImportBase}/acl` : `${imps.pkgBase}/acl`
|
|
973
988
|
imports.push(`import * as ${importName} from '${importPath}'`)
|
|
974
989
|
featuresImportName = importName
|
|
@@ -977,10 +992,10 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
977
992
|
|
|
978
993
|
// Custom entities declarations: module root ce.ts
|
|
979
994
|
{
|
|
980
|
-
const appFile =
|
|
981
|
-
const pkgFile =
|
|
982
|
-
const hasApp =
|
|
983
|
-
const hasPkg =
|
|
995
|
+
const appFile = findModuleFile(roots.appBase, 'ce')
|
|
996
|
+
const pkgFile = findModuleFile(roots.pkgBase, 'ce')
|
|
997
|
+
const hasApp = !!appFile
|
|
998
|
+
const hasPkg = !!pkgFile
|
|
984
999
|
if (hasApp || hasPkg) {
|
|
985
1000
|
const importName = `CE_${toVar(modId)}_${importId++}`
|
|
986
1001
|
const importPath = hasApp ? `${appImportBase}/ce` : `${imps.pkgBase}/ce`
|
|
@@ -991,10 +1006,10 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
991
1006
|
|
|
992
1007
|
// Vector search configuration: module root vector.ts
|
|
993
1008
|
{
|
|
994
|
-
const appFile =
|
|
995
|
-
const pkgFile =
|
|
996
|
-
const hasApp =
|
|
997
|
-
const hasPkg =
|
|
1009
|
+
const appFile = findModuleFile(roots.appBase, 'vector')
|
|
1010
|
+
const pkgFile = findModuleFile(roots.pkgBase, 'vector')
|
|
1011
|
+
const hasApp = !!appFile
|
|
1012
|
+
const hasPkg = !!pkgFile
|
|
998
1013
|
if (hasApp || hasPkg) {
|
|
999
1014
|
const importName = `VECTOR_${toVar(modId)}_${importId++}`
|
|
1000
1015
|
const importPath = hasApp ? `${appImportBase}/vector` : `${imps.pkgBase}/vector`
|
|
@@ -1005,10 +1020,10 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
1005
1020
|
|
|
1006
1021
|
// Custom field declarations: src/modules/<module>/data/fields.ts
|
|
1007
1022
|
{
|
|
1008
|
-
const appFile =
|
|
1009
|
-
const pkgFile =
|
|
1010
|
-
const hasApp =
|
|
1011
|
-
const hasPkg =
|
|
1023
|
+
const appFile = findModuleFile(roots.appBase, 'data', 'fields')
|
|
1024
|
+
const pkgFile = findModuleFile(roots.pkgBase, 'data', 'fields')
|
|
1025
|
+
const hasApp = !!appFile
|
|
1026
|
+
const hasPkg = !!pkgFile
|
|
1012
1027
|
if (hasApp || hasPkg) {
|
|
1013
1028
|
const importName = `F_${toVar(modId)}_${importId++}`
|
|
1014
1029
|
const importPath = hasApp ? `${appImportBase}/data/fields` : `${imps.pkgBase}/data/fields`
|
|
@@ -1018,9 +1033,9 @@ export async function generateModuleRegistryCli(options: ModuleRegistryOptions):
|
|
|
1018
1033
|
}
|
|
1019
1034
|
|
|
1020
1035
|
// CLI
|
|
1021
|
-
const cliApp =
|
|
1022
|
-
const cliPkg =
|
|
1023
|
-
const cliPath =
|
|
1036
|
+
const cliApp = findModuleFile(roots.appBase, 'cli')
|
|
1037
|
+
const cliPkg = findModuleFile(roots.pkgBase, 'cli')
|
|
1038
|
+
const cliPath = cliApp ?? cliPkg
|
|
1024
1039
|
if (cliPath) {
|
|
1025
1040
|
const importName = `CLI_${toVar(modId)}`
|
|
1026
1041
|
const importPath = cliPath.startsWith(roots.appBase) ? `${appImportBase}/cli` : `${imps.pkgBase}/cli`
|