@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.
103 lines • 5.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ngAdd = void 0;
const tslib_1 = require("tslib");
const fs = tslib_1.__importStar(require("node:fs"));
const path = tslib_1.__importStar(require("node:path"));
const schematics_1 = require("@angular-devkit/schematics");
const utility_1 = require("@schematics/angular/utility");
const ast_utils_1 = require("@schematics/angular/utility/ast-utils");
const ts = tslib_1.__importStar(require("typescript"));
const cms_adapter_1 = require("../cms-adapter");
const devtools_registration_1 = require("./helpers/devtools-registration");
const devDependenciesToInstall = [
'jsonpath-plus'
];
const reportMissingSchematicsDep = (logger) => (reason) => {
logger.error(`[ERROR]: Adding @o3r/rules-engine has failed.
If the error is related to missing @o3r dependencies you need to install '@o3r/core' to be able to use the rules-engine package. Please run 'ng add @o3r/core' .
Otherwise, use the error message as guidance.`);
throw reason;
};
const updateAppModuleOrAppConfig = (projectName) => async (tree, context) => {
const { getAppModuleFilePath } = await Promise.resolve().then(() => tslib_1.__importStar(require('@o3r/schematics')));
const moduleFilePath = getAppModuleFilePath(tree, context, projectName);
if (!moduleFilePath) {
return () => tree;
}
const sourceFileContent = tree.readText(moduleFilePath);
const sourceFile = ts.createSourceFile(moduleFilePath, sourceFileContent, ts.ScriptTarget.ES2015, true);
if ((0, ast_utils_1.isImported)(sourceFile, 'RulesEngineRunnerModule', '@o3r/rules-engine')) {
return () => tree;
}
return (0, utility_1.addRootImport)(projectName, ({ code, external }) => code `\n${external('RulesEngineRunnerModule', '@o3r/rules-engine')}.forRoot()`);
};
/**
* Add Otter rules-engine to an Angular Project
* @param options
*/
function ngAddFn(options) {
/* ng add rules */
return async (tree, context) => {
const { setupDependencies, getPackageInstallConfig, getDefaultOptionsForSchematic, getO3rPeerDeps, getProjectNewDependenciesTypes, getWorkspaceConfig, getExternalDependenciesVersionRange, removePackages, setupSchematicsParamsForProject, registerPackageCollectionSchematics } = await Promise.resolve().then(() => tslib_1.__importStar(require('@o3r/schematics')));
options = { ...getDefaultOptionsForSchematic(getWorkspaceConfig(tree), '@o3r/rules-engine', 'ng-add', options), ...options };
const packageJsonPath = path.resolve(__dirname, '..', '..', 'package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, { encoding: 'utf8' }));
const depsInfo = getO3rPeerDeps(packageJsonPath);
if (options.enableMetadataExtract) {
depsInfo.o3rPeerDeps = [...depsInfo.o3rPeerDeps, '@o3r/extractors'];
}
const workspaceProject = options.projectName ? getWorkspaceConfig(tree)?.projects[options.projectName] : undefined;
const dependencies = depsInfo.o3rPeerDeps.reduce((acc, dep) => {
acc[dep] = {
inManifest: [{
range: `${options.exactO3rVersion ? '' : '~'}${depsInfo.packageVersion}`,
types: getProjectNewDependenciesTypes(workspaceProject)
}],
ngAddOptions: { exactO3rVersion: options.exactO3rVersion }
};
return acc;
}, getPackageInstallConfig(packageJsonPath, tree, options.projectName, false, !!options.exactO3rVersion));
Object.entries(getExternalDependenciesVersionRange(devDependenciesToInstall, packageJsonPath, context.logger))
.forEach(([dep, range]) => {
dependencies[dep] = {
inManifest: [{
range,
types: getProjectNewDependenciesTypes(workspaceProject)
}]
};
});
const schematicsDefaultOptions = {
useRulesEngine: undefined
};
const rule = (0, schematics_1.chain)([
registerPackageCollectionSchematics(packageJson),
setupSchematicsParamsForProject({
'@o3r/core:component': schematicsDefaultOptions,
'@o3r/core:component-container': schematicsDefaultOptions
}, options.projectName),
removePackages(['@otter/rules-engine', '@otter/rules-engine-core']),
setupDependencies({
projectName: options.projectName,
dependencies,
ngAddToRun: depsInfo.o3rPeerDeps
}),
...(options.enableMetadataExtract ? [(0, cms_adapter_1.updateCmsAdapter)(options)] : []),
await (0, devtools_registration_1.registerDevtools)(options),
updateAppModuleOrAppConfig(options.projectName)
]);
context.logger.info(`The package ${depsInfo.packageName} comes with a debug mechanism`);
context.logger.info('Get information on https://github.com/AmadeusITGroup/otter/tree/main/docs/rules-engine/how-to-use/debug.md');
return rule;
};
}
/**
* Add Otter rules-engine to an Angular Project
* @param options
*/
const ngAdd = (options) => async (_, { logger }) => {
const { createOtterSchematic } = await Promise.resolve().then(() => tslib_1.__importStar(require('@o3r/schematics'))).catch(reportMissingSchematicsDep(logger));
return createOtterSchematic(ngAddFn)(options);
};
exports.ngAdd = ngAdd;
//# sourceMappingURL=index.js.map