UNPKG

@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
"use strict"; 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