@o3r/rules-engine
Version:
This module provides a rule engine that can be executed on your Otter application to customize your application (translations, placeholders and configs) based on a json file generated by your CMS.
100 lines • 5.62 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const node_fs_1 = require("node:fs");
const node_path_1 = require("node:path");
const architect_1 = require("@angular-devkit/architect");
const extractors_1 = require("@o3r/extractors");
const globby_1 = tslib_1.__importDefault(require("globby"));
const helpers_1 = require("./helpers");
const SCHEMA_FOLDER = 'fact-schemas';
exports.default = (0, architect_1.createBuilder)((0, extractors_1.createBuilderWithMetricsIfInstalled)(async (options, context) => {
context.reportRunning();
const outputFactsFile = (0, node_path_1.resolve)(context.currentDirectory, options.outputFactsDirectory, 'rules.facts.metadata.json');
const outputOperatorsFile = (0, node_path_1.resolve)(context.currentDirectory, options.outputOperatorsDirectory, 'rules.operators.metadata.json');
const basePath = (0, node_path_1.dirname)(outputFactsFile);
const schemaFolder = (0, node_path_1.resolve)(basePath, SCHEMA_FOLDER);
const extractor = new helpers_1.RulesEngineExtractor((0, node_path_1.resolve)(context.currentDirectory, options.tsConfig), context.currentDirectory, context.logger);
const metadataFiles = options.libraries.map((library) => (0, extractors_1.getLibraryCmsMetadata)(library, context.currentDirectory));
const rulesEngineFactsMetadataFiles = metadataFiles
.filter((metadataFile) => !options.ignoreFactsFromLibraries.includes(metadataFile.libraryName) && !!metadataFile.rulesEngineFactsFilePath)
.map((metadataFile) => metadataFile.rulesEngineFactsFilePath)
.filter((rulesEngineFactsFilePath) => !!rulesEngineFactsFilePath);
const rulesEngineOperatorsMetadataFiles = metadataFiles
.map((metadataFile) => metadataFile.rulesEngineOperatorsFilePath)
.filter((rulesEngineOperatorsFilePath) => !!rulesEngineOperatorsFilePath);
const rulesEngineFactsMetadataFileWithContent = {};
for (const file of rulesEngineFactsMetadataFiles) {
if ((0, node_fs_1.existsSync)(file)) {
rulesEngineFactsMetadataFileWithContent[file] = JSON.parse(await node_fs_1.promises.readFile(file, { encoding: 'utf8' }));
}
else {
context.logger.warn(`File ${file} doesn't exist but referenced in the library package.json, please notify the library owner.`);
}
}
const rulesEngineOperatorsMetadataFileWithContent = {};
for (const file of rulesEngineOperatorsMetadataFiles) {
if ((0, node_fs_1.existsSync)(file)) {
rulesEngineOperatorsMetadataFileWithContent[file] = JSON.parse(await node_fs_1.promises.readFile(file, { encoding: 'utf8' }));
}
else {
context.logger.warn(`File ${file} doesn't exist but referenced in the library package.json, please notify the library owner.`);
}
}
const librariesFacts = Object.values(rulesEngineFactsMetadataFileWithContent).reduce((acc, factsFile) => {
acc.push(...factsFile.facts);
return acc;
}, []);
const librariesOperators = Object.values(rulesEngineOperatorsMetadataFileWithContent).reduce((acc, operatorsFile) => {
acc.push(...operatorsFile.operators);
return acc;
}, []);
// create schema folder
try {
await node_fs_1.promises.mkdir(schemaFolder, { recursive: true });
}
catch { }
// copy schema files from the libraries
await Promise.all(Object.entries(rulesEngineFactsMetadataFileWithContent)
.reduce((acc, [metadataFilePath, factsFile]) => acc.concat((factsFile.facts || [])
.filter((fact) => fact.type === 'object' && !!fact.schemaFile)
.map(({ schemaFile }) => ({ fullPath: (0, node_path_1.resolve)((0, node_path_1.dirname)(metadataFilePath), schemaFile), relativePath: schemaFile }))), [])
.map(({ fullPath, relativePath }) => node_fs_1.promises.copyFile(fullPath, (0, node_path_1.resolve)(basePath, relativePath))));
/** Facts from the current project */
const newFactList = (await Promise.all((await Promise.all(options.factFilePatterns.map((pattern) => (0, globby_1.default)(pattern, { cwd: context.currentDirectory }))))
.flat()
.map((file, idx, arr) => {
context.reportProgress(idx, arr.length, `Parsing fact from ${file}`);
return extractor.extractFacts((0, node_path_1.resolve)(context.currentDirectory, file), schemaFolder, `./${SCHEMA_FOLDER}`);
}))).flat();
/** Operators from the current project */
const newOperatorList = (await Promise.all(options.operatorFilePatterns.map((pattern) => (0, globby_1.default)(pattern, { cwd: context.currentDirectory })))).flat()
.flatMap((file, idx, arr) => {
context.reportProgress(idx, arr.length, `Parsing operator from ${file}`);
return extractor.extractOperators((0, node_path_1.resolve)(context.currentDirectory, file));
});
try {
await node_fs_1.promises.mkdir((0, node_path_1.dirname)(outputFactsFile), { recursive: true });
}
catch { }
try {
await node_fs_1.promises.mkdir((0, node_path_1.dirname)(outputOperatorsFile), { recursive: true });
}
catch { }
await node_fs_1.promises.writeFile(outputFactsFile, JSON.stringify({
facts: [
...librariesFacts,
...newFactList
]
}, null, 2));
await node_fs_1.promises.writeFile(outputOperatorsFile, JSON.stringify({
operators: [
...librariesOperators,
...newOperatorList
]
}, null, 2));
return {
success: true
};
}));
//# sourceMappingURL=index.js.map
;