@open-mercato/cli 0.6.6-develop.6361.1.e790d2aa34 → 0.6.6-develop.6363.1.03c5e3429a

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.
@@ -985,6 +985,9 @@ function detectExportedHttpMethods(sourceFile) {
985
985
  function buildPageRouteProps(metaExpr, routePath) {
986
986
  return `pattern: ${toLiteral(routePath || "/")}, requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, requireCustomerAuth: (${metaExpr})?.requireCustomerAuth, requireCustomerFeatures: (${metaExpr})?.requireCustomerFeatures, nav: (${metaExpr})?.nav, 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, pageContext: (${metaExpr})?.pageContext, placement: (${metaExpr})?.placement`;
987
987
  }
988
+ function buildPageRouteManifestSpread(metaExpr, routePath) {
989
+ return `...resolvePageRouteMetadata(${toLiteral(routePath || "/")}, ${metaExpr})`;
990
+ }
988
991
  function normalizeBreadcrumb(raw) {
989
992
  if (!Array.isArray(raw)) return void 0;
990
993
  const breadcrumb = raw.map((entry) => {
@@ -1147,7 +1150,7 @@ async function processPageFiles(options) {
1147
1150
  sourceFile: metaPath,
1148
1151
  metaPath,
1149
1152
  runtimeExpr: `(((${manifestMetaImportName} as any).metadata) as any)`,
1150
- allowRuntimeFallback: type === "backend"
1153
+ allowRuntimeFallback: true
1151
1154
  });
1152
1155
  manifestMetaExpr = manifestMetadata.manifestExpr;
1153
1156
  if (manifestMetadata.requiresRuntimeImport) {
@@ -1165,7 +1168,7 @@ async function processPageFiles(options) {
1165
1168
  const manifestMetadata = await loadPageMetadataForManifest({
1166
1169
  sourceFile,
1167
1170
  runtimeExpr: `(((${manifestMetaImportName} as any).metadata) as any)`,
1168
- allowRuntimeFallback: type === "backend"
1171
+ allowRuntimeFallback: true
1169
1172
  });
1170
1173
  manifestMetaExpr = manifestMetadata.manifestExpr;
1171
1174
  if (manifestMetadata.requiresRuntimeImport) {
@@ -1178,7 +1181,7 @@ async function processPageFiles(options) {
1178
1181
  }
1179
1182
  const baseProps = buildPageRouteProps(metaExpr, routePath);
1180
1183
  const runtimeBaseProps = buildPageRouteProps(runtimeMetaExpr, routePath);
1181
- const manifestBaseProps = buildPageRouteProps(manifestMetaExpr, routePath);
1184
+ const manifestBaseProps = buildPageRouteManifestSpread(manifestMetaExpr, routePath);
1182
1185
  eagerRoutes.push(`{ ${baseProps}, Component: ${buildLazyRouteComponentExpression(importPath)} }`);
1183
1186
  runtimeRoutes.push(`{ ${runtimeBaseProps}, Component: ${buildLazyRouteComponentExpression(importPath)} }`);
1184
1187
  manifestRoutes.push(`{ moduleId: ${toLiteral(modId)}, ${manifestBaseProps}, load: async () => { const mod = await ${buildDynamicImportExpression(importPath)}; return (mod.default ?? mod) as any } }`);
@@ -1219,7 +1222,7 @@ async function processPageFiles(options) {
1219
1222
  sourceFile: metaPath,
1220
1223
  metaPath,
1221
1224
  runtimeExpr: `(((${manifestMetaImportName} as any).metadata) as any)`,
1222
- allowRuntimeFallback: type === "backend"
1225
+ allowRuntimeFallback: false
1223
1226
  });
1224
1227
  manifestMetaExpr = manifestMetadata.manifestExpr;
1225
1228
  if (manifestMetadata.requiresRuntimeImport) {
@@ -1237,7 +1240,7 @@ async function processPageFiles(options) {
1237
1240
  const manifestMetadata = await loadPageMetadataForManifest({
1238
1241
  sourceFile,
1239
1242
  runtimeExpr: `(((${manifestMetaImportName} as any).metadata) as any)`,
1240
- allowRuntimeFallback: type === "backend"
1243
+ allowRuntimeFallback: false
1241
1244
  });
1242
1245
  manifestMetaExpr = manifestMetadata.manifestExpr;
1243
1246
  if (manifestMetadata.requiresRuntimeImport) {
@@ -1250,7 +1253,7 @@ async function processPageFiles(options) {
1250
1253
  }
1251
1254
  const baseProps = buildPageRouteProps(metaExpr, routePath);
1252
1255
  const runtimeBaseProps = buildPageRouteProps(runtimeMetaExpr, routePath);
1253
- const manifestBaseProps = buildPageRouteProps(manifestMetaExpr, routePath);
1256
+ const manifestBaseProps = buildPageRouteManifestSpread(manifestMetaExpr, routePath);
1254
1257
  eagerRoutes.push(`{ ${baseProps}, Component: ${buildLazyRouteComponentExpression(importPath)} }`);
1255
1258
  runtimeRoutes.push(`{ ${runtimeBaseProps}, Component: ${buildLazyRouteComponentExpression(importPath)} }`);
1256
1259
  manifestRoutes.push(`{ moduleId: ${toLiteral(modId)}, ${manifestBaseProps}, load: async () => { const mod = await ${buildDynamicImportExpression(importPath)}; return (mod.default ?? mod) as any } }`);
@@ -1746,8 +1749,9 @@ export default modules
1746
1749
  `;
1747
1750
  }
1748
1751
  function renderAstLegacyManifestOutput(options) {
1752
+ const usesPageRouteMetadataHelper = options.typeName === "FrontendRouteManifestEntry" || options.typeName === "BackendRouteManifestEntry";
1749
1753
  const importSection = [
1750
- `import type { ${options.typeName} } from '@open-mercato/shared/modules/registry'`,
1754
+ usesPageRouteMetadataHelper ? `import { resolvePageRouteMetadata, type ${options.typeName} } from '@open-mercato/shared/modules/registry'` : `import type { ${options.typeName} } from '@open-mercato/shared/modules/registry'`,
1751
1755
  ...(options.imports ?? []).map((entry) => serializeGeneratedImport(entry))
1752
1756
  ].join("\n");
1753
1757
  return `// AUTO-GENERATED by mercato generate registry
@@ -2035,7 +2039,7 @@ async function processWorkersAst(options) {
2035
2039
  return workers;
2036
2040
  }
2037
2041
  function processTranslationsAst(options) {
2038
- const { roots, modId, appImportBase, pkgImportBase, imports } = options;
2042
+ const { roots, modId, appImportBase, pkgImportBase, imports, extraImports } = options;
2039
2043
  const i18nApp = path.join(roots.appBase, "i18n");
2040
2044
  const pkgI18nBase = resolveStandaloneSourceMirrorBase(roots.pkgBase) ?? roots.pkgBase;
2041
2045
  const i18nCore = path.join(pkgI18nBase, "i18n");
@@ -2063,6 +2067,8 @@ function processTranslationsAst(options) {
2063
2067
  const appName = `T_${toVar(modId)}_${toVar(locale)}_A`;
2064
2068
  imports.push(buildImportStatement(coreName, `${pkgImportBase}/i18n/${locale}.json`));
2065
2069
  imports.push(buildImportStatement(appName, `${appImportBase}/i18n/${locale}.json`));
2070
+ extraImports?.push(buildImportStatement(coreName, `${pkgImportBase}/i18n/${locale}.json`));
2071
+ extraImports?.push(buildImportStatement(appName, `${appImportBase}/i18n/${locale}.json`));
2066
2072
  translations.push({
2067
2073
  name: JSON.stringify(locale),
2068
2074
  value: objectLiteral([
@@ -2075,6 +2081,7 @@ function processTranslationsAst(options) {
2075
2081
  if (appHas) {
2076
2082
  const appName = `T_${toVar(modId)}_${toVar(locale)}_A`;
2077
2083
  imports.push(buildImportStatement(appName, `${appImportBase}/i18n/${locale}.json`));
2084
+ extraImports?.push(buildImportStatement(appName, `${appImportBase}/i18n/${locale}.json`));
2078
2085
  translations.push({
2079
2086
  name: JSON.stringify(locale),
2080
2087
  value: asExpression(identifier(appName), "unknown as Record<string, string>")
@@ -2084,6 +2091,7 @@ function processTranslationsAst(options) {
2084
2091
  if (coreHas) {
2085
2092
  const coreName = `T_${toVar(modId)}_${toVar(locale)}_C`;
2086
2093
  imports.push(buildImportStatement(coreName, `${pkgImportBase}/i18n/${locale}.json`));
2094
+ extraImports?.push(buildImportStatement(coreName, `${pkgImportBase}/i18n/${locale}.json`));
2087
2095
  translations.push({
2088
2096
  name: JSON.stringify(locale),
2089
2097
  value: asExpression(identifier(coreName), "unknown as Record<string, string>")
@@ -2671,6 +2679,10 @@ async function generateModuleRegistryApp(options) {
2671
2679
  const outputDir = resolver.getOutputDir();
2672
2680
  const outFile = path.join(outputDir, "modules.app.generated.ts");
2673
2681
  const checksumFile = path.join(outputDir, "modules.app.generated.checksum");
2682
+ const bootstrapOutFile = path.join(outputDir, "modules.bootstrap.generated.ts");
2683
+ const bootstrapChecksumFile = path.join(outputDir, "modules.bootstrap.generated.checksum");
2684
+ const i18nOutFile = path.join(outputDir, "modules.i18n.generated.ts");
2685
+ const i18nChecksumFile = path.join(outputDir, "modules.i18n.generated.checksum");
2674
2686
  const legacyOutFile = path.join(outputDir, "bootstrap-modules.generated.ts");
2675
2687
  const legacyChecksumFile = path.join(outputDir, "bootstrap-modules.generated.checksum");
2676
2688
  const enabledIdsOutFile = path.join(outputDir, "enabled-module-ids.generated.ts");
@@ -2682,7 +2694,11 @@ async function generateModuleRegistryApp(options) {
2682
2694
  verifyThirdPartyModuleShape(entry, resolver.getModulePaths(entry).pkgBase);
2683
2695
  }
2684
2696
  const imports = [];
2697
+ const bootstrapImports = [];
2698
+ const i18nImports = [];
2685
2699
  const moduleDecls = [];
2700
+ const bootstrapModuleDecls = [];
2701
+ const i18nModuleDecls = [];
2686
2702
  const importIdRef = { value: 0 };
2687
2703
  const trackedRoots = /* @__PURE__ */ new Set();
2688
2704
  const requiresByModule = /* @__PURE__ */ new Map();
@@ -2717,6 +2733,7 @@ async function generateModuleRegistryApp(options) {
2717
2733
  infoImportName = `I${importIdRef.value++}_${toVar(modId)}`;
2718
2734
  const importPath = sanitizeGeneratedModuleSpecifier(indexResolved.importPath);
2719
2735
  imports.push(buildImportStatement(`* as ${infoImportName}`, importPath));
2736
+ bootstrapImports.push(buildImportStatement(`* as ${infoImportName}`, importPath));
2720
2737
  try {
2721
2738
  const mod = require(indexResolved.absolutePath);
2722
2739
  const reqs = mod?.metadata && Array.isArray(mod.metadata.requires) ? mod.metadata.requires : void 0;
@@ -2726,10 +2743,12 @@ async function generateModuleRegistryApp(options) {
2726
2743
  }
2727
2744
  {
2728
2745
  const setup = resolveConventionFile(roots, imps, "setup.ts", "SETUP", modId, importIdRef, imports);
2746
+ if (setup) bootstrapImports.push(buildImportStatement(`* as ${setup.importName}`, setup.importPath));
2729
2747
  if (setup) setupImportName = setup.importName;
2730
2748
  }
2731
2749
  {
2732
2750
  const encryption = resolveConventionFile(roots, imps, "encryption.ts", "ENCRYPTION", modId, importIdRef, imports);
2751
+ if (encryption) bootstrapImports.push(buildImportStatement(`* as ${encryption.importName}`, encryption.importPath));
2733
2752
  if (encryption) encryptionImportName = encryption.importName;
2734
2753
  }
2735
2754
  {
@@ -2737,11 +2756,12 @@ async function generateModuleRegistryApp(options) {
2737
2756
  if (resolved) {
2738
2757
  const importName = `INTEGRATION_${toVar(modId)}_${importIdRef.value++}`;
2739
2758
  imports.push(buildImportStatement(`* as ${importName}`, resolved.importPath));
2759
+ bootstrapImports.push(buildImportStatement(`* as ${importName}`, resolved.importPath));
2740
2760
  integrationImportName = importName;
2741
2761
  }
2742
2762
  }
2743
2763
  {
2744
- const ext = resolveConventionFile(roots, imps, "data/extensions.ts", "X", modId, importIdRef, imports);
2764
+ const ext = resolveConventionFile(roots, imps, "data/extensions.ts", "X", modId, importIdRef, imports, bootstrapImports);
2745
2765
  if (ext) extensionsImportName = ext.importName;
2746
2766
  }
2747
2767
  {
@@ -2750,15 +2770,16 @@ async function generateModuleRegistryApp(options) {
2750
2770
  const importName = `ACL_${toVar(modId)}_${importIdRef.value++}`;
2751
2771
  const importPath = sanitizeGeneratedModuleSpecifier(aclResolved.importPath);
2752
2772
  imports.push(buildImportStatement(`* as ${importName}`, importPath));
2773
+ bootstrapImports.push(buildImportStatement(`* as ${importName}`, importPath));
2753
2774
  featuresImportName = importName;
2754
2775
  }
2755
2776
  }
2756
2777
  {
2757
- const ce = resolveConventionFile(roots, imps, "ce.ts", "CE", modId, importIdRef, imports);
2778
+ const ce = resolveConventionFile(roots, imps, "ce.ts", "CE", modId, importIdRef, imports, bootstrapImports);
2758
2779
  if (ce) customEntitiesImportName = ce.importName;
2759
2780
  }
2760
2781
  {
2761
- const fields = resolveConventionFile(roots, imps, "data/fields.ts", "F", modId, importIdRef, imports);
2782
+ const fields = resolveConventionFile(roots, imps, "data/fields.ts", "F", modId, importIdRef, imports, bootstrapImports);
2762
2783
  if (fields) fieldsImportName = fields.importName;
2763
2784
  }
2764
2785
  {
@@ -2799,13 +2820,17 @@ async function generateModuleRegistryApp(options) {
2799
2820
  hasRouteComponents = true;
2800
2821
  }
2801
2822
  }
2823
+ const translationImports = [];
2802
2824
  translations.push(...processTranslationsAst({
2803
2825
  roots,
2804
2826
  modId,
2805
2827
  appImportBase,
2806
2828
  pkgImportBase: imps.pkgBase,
2807
- imports
2829
+ imports,
2830
+ extraImports: translationImports
2808
2831
  }));
2832
+ bootstrapImports.push(...translationImports);
2833
+ i18nImports.push(...translationImports);
2809
2834
  subscribers.push(...await processSubscribersAst({
2810
2835
  roots,
2811
2836
  modId,
@@ -2831,17 +2856,15 @@ async function generateModuleRegistryApp(options) {
2831
2856
  { name: "id", value: modId },
2832
2857
  { name: "customFieldSets", value: buildModuleCustomFieldSetsValue({ fieldsImportName, customEntitiesImportName, moduleId: modId }) }
2833
2858
  ];
2859
+ const i18nModuleEntries = [
2860
+ { name: "id", value: modId }
2861
+ ];
2834
2862
  if (infoImportName) {
2835
2863
  moduleEntries.push({ name: "info", value: propertyAccess(identifier(infoImportName), "metadata") });
2836
2864
  }
2837
- if (frontendRoutes.length > 0) {
2838
- moduleEntries.push({ name: "frontendRoutes", value: arrayLiteral(frontendRoutes, writeValue) });
2839
- }
2840
- if (backendRoutes.length > 0) {
2841
- moduleEntries.push({ name: "backendRoutes", value: arrayLiteral(backendRoutes, writeValue) });
2842
- }
2843
2865
  if (translations.length > 0) {
2844
2866
  moduleEntries.push({ name: "translations", value: objectLiteral(translations) });
2867
+ i18nModuleEntries.push({ name: "translations", value: objectLiteral(translations) });
2845
2868
  }
2846
2869
  if (subscribers.length > 0) {
2847
2870
  moduleEntries.push({ name: "subscribers", value: arrayLiteral(subscribers, writeValue) });
@@ -2924,7 +2947,16 @@ async function generateModuleRegistryApp(options) {
2924
2947
  )
2925
2948
  });
2926
2949
  }
2927
- moduleDecls.push(objectLiteral(moduleEntries));
2950
+ const routeAwareModuleEntries = [...moduleEntries];
2951
+ if (frontendRoutes.length > 0) {
2952
+ routeAwareModuleEntries.push({ name: "frontendRoutes", value: arrayLiteral(frontendRoutes, writeValue) });
2953
+ }
2954
+ if (backendRoutes.length > 0) {
2955
+ routeAwareModuleEntries.push({ name: "backendRoutes", value: arrayLiteral(backendRoutes, writeValue) });
2956
+ }
2957
+ moduleDecls.push(objectLiteral(routeAwareModuleEntries));
2958
+ bootstrapModuleDecls.push(objectLiteral(moduleEntries));
2959
+ i18nModuleDecls.push(objectLiteral(i18nModuleEntries));
2928
2960
  }
2929
2961
  const output = renderAstModuleRegistryFile({
2930
2962
  fileName: "modules.app.generated.ts",
@@ -2933,11 +2965,23 @@ async function generateModuleRegistryApp(options) {
2933
2965
  moduleEntries: moduleDecls,
2934
2966
  includeCreateElementImport: hasRouteComponents
2935
2967
  });
2968
+ const bootstrapOutput = renderAstModuleRegistryFile({
2969
+ fileName: "modules.bootstrap.generated.ts",
2970
+ generator: "registry (bootstrap version)",
2971
+ imports: bootstrapImports,
2972
+ moduleEntries: bootstrapModuleDecls
2973
+ });
2974
+ const i18nOutput = renderAstModuleRegistryFile({
2975
+ fileName: "modules.i18n.generated.ts",
2976
+ generator: "registry (i18n version)",
2977
+ imports: i18nImports,
2978
+ moduleEntries: i18nModuleDecls
2979
+ });
2936
2980
  const legacyOutput = renderAstLegacyAliasFile({
2937
2981
  fileName: "bootstrap-modules.generated.ts",
2938
2982
  exportName: "bootstrapModules",
2939
2983
  exportType: "Module[]",
2940
- sourceFileName: "modules.app.generated.ts",
2984
+ sourceFileName: "modules.bootstrap.generated.ts",
2941
2985
  initializer: identifier("modules")
2942
2986
  });
2943
2987
  {
@@ -2961,6 +3005,8 @@ async function generateModuleRegistryApp(options) {
2961
3005
  }
2962
3006
  const structureChecksum = calculateStructureChecksum(Array.from(trackedRoots));
2963
3007
  writeGeneratedFile({ outFile, checksumFile, content: output, structureChecksum, result, quiet });
3008
+ writeGeneratedFile({ outFile: bootstrapOutFile, checksumFile: bootstrapChecksumFile, content: bootstrapOutput, structureChecksum, result, quiet });
3009
+ writeGeneratedFile({ outFile: i18nOutFile, checksumFile: i18nChecksumFile, content: i18nOutput, structureChecksum, result, quiet });
2964
3010
  writeGeneratedFile({ outFile: legacyOutFile, checksumFile: legacyChecksumFile, content: legacyOutput, structureChecksum, result, quiet });
2965
3011
  const enabledIdsOutput = renderEnabledModuleIdsFile(enabled.map((entry) => entry.id));
2966
3012
  writeGeneratedFile({ outFile: enabledIdsOutFile, checksumFile: enabledIdsChecksumFile, content: enabledIdsOutput, structureChecksum, result, quiet });