@open-mercato/cli 0.6.6-develop.6362.1.a3dd164018 → 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.
- package/dist/lib/generators/module-registry.js +66 -20
- package/dist/lib/generators/module-registry.js.map +2 -2
- package/dist/lib/utils.js +1 -1
- package/dist/lib/utils.js.map +2 -2
- package/package.json +5 -5
- package/src/lib/generators/__tests__/module-subset.test.ts +37 -13
- package/src/lib/generators/__tests__/output-snapshots.test.ts +2 -0
- package/src/lib/generators/__tests__/structural-contracts.test.ts +40 -5
- package/src/lib/generators/module-registry.ts +71 -19
- package/src/lib/utils.ts +1 -0
|
@@ -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:
|
|
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:
|
|
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 =
|
|
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:
|
|
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:
|
|
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 =
|
|
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
|
-
|
|
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.
|
|
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 });
|