@o3r/schematics
Version:
Schematics module of the Otter framework
104 lines • 5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.registerDevtoolsToApplication = exports.injectServiceInMain = void 0;
const schematics_1 = require("@angular-devkit/schematics");
const ast_utils_1 = require("@schematics/angular/utility/ast-utils");
const change_1 = require("@schematics/angular/utility/change");
const ts = require("typescript");
const collection_1 = require("../../utility/collection");
const file_info_1 = require("../../utility/file-info");
const loaders_1 = require("../../utility/loaders");
const modules_1 = require("../../utility/modules");
const add_imports_1 = require("../add-imports");
const registerModule = (options) => (tree, context) => {
const moduleFilePath = (0, modules_1.getAppModuleFilePath)(tree, context, options.projectName);
if (!moduleFilePath) {
return tree;
}
const sourceFileContent = tree.read(moduleFilePath).toString();
const sourceFile = ts.createSourceFile(moduleFilePath, sourceFileContent, ts.ScriptTarget.ES2015, true);
if ((0, ast_utils_1.isImported)(sourceFile, options.moduleName, options.packageName)) {
return tree;
}
let recorder = tree.beginUpdate(moduleFilePath);
const { moduleIndex } = (0, file_info_1.getModuleIndex)(sourceFile, sourceFileContent);
const addImportToModuleFile = (name, file, moduleFunction) => recorder = (0, modules_1.addImportToModuleFile)(name, file, sourceFile, sourceFileContent, context, recorder, moduleFilePath, moduleIndex, moduleFunction);
addImportToModuleFile(options.moduleName, options.packageName, '.instrument({isActivatedOnBootstrap: true})');
tree.commitUpdate(recorder);
return tree;
};
/**
* Rule to inject a service after `bootstrapModule` or `bootstrapApplication`
* @param options
*/
const injectServiceInMain = (options) => (tree, context) => {
if (!options.serviceName) {
return tree;
}
const mainFilePath = (0, modules_1.getMainFilePath)(tree, context, options.projectName);
if (!mainFilePath || !tree.exists(mainFilePath)) {
return tree;
}
const content = tree.readText(mainFilePath);
if (content.includes(`inject(${options.serviceName})`)) {
return tree;
}
const match = /bootstrap(Module|Application)\([^)]*\)/.exec(content);
if (!match) {
return tree;
}
const recorder = tree.beginUpdate(mainFilePath);
const changes = [];
changes.push(new change_1.InsertChange(mainFilePath, match.index + match[0].length, `
.then((m) => {
runInInjectionContext(m.injector, () => {
inject(${options.serviceName});
});
return m;
})`));
(0, change_1.applyToUpdateRecorder)(recorder, changes);
tree.commitUpdate(recorder);
const sourceFile = ts.createSourceFile(mainFilePath, content, ts.ScriptTarget.ES2015, true);
const importsToAdd = new Map();
if (!(0, ast_utils_1.isImported)(sourceFile, options.serviceName, options.packageName)) {
importsToAdd.set(options.packageName, [options.serviceName]);
}
if (!(0, ast_utils_1.isImported)(sourceFile, 'inject', '@angular/core')) {
importsToAdd.set('@angular/core', ['inject']);
}
if (!(0, ast_utils_1.isImported)(sourceFile, 'runInInjectionContext', '@angular/core')) {
const angularCoreImportsToAdd = importsToAdd.get('@angular/core');
if (angularCoreImportsToAdd) {
angularCoreImportsToAdd.push('runInInjectionContext');
}
else {
importsToAdd.set('@angular/core', ['runInInjectionContext']);
}
}
return (0, add_imports_1.addImportsRule)(mainFilePath, [...importsToAdd.entries()]
.map(([from, importNames]) => ({ from, importNames })))(tree, context);
};
exports.injectServiceInMain = injectServiceInMain;
/**
* Register Devtools to the application
* @param options
*/
const registerDevtoolsToApplication = (options) => (tree, context) => {
const workspace = (0, loaders_1.getWorkspaceConfig)(tree);
const project = options.projectName ? workspace?.projects[options.projectName] : undefined;
if (!workspace || !project || project.projectType !== 'application') {
context.logger.warn(`Failed to determine the application to update, the devtool modules ${options.moduleName}.`);
return tree;
}
const schematicConfig = (0, collection_1.getDefaultOptionsForSchematic)(workspace, options.packageName, 'ng-add', options);
if (!schematicConfig?.registerDevtool) {
return tree;
}
return (0, schematics_1.chain)([
registerModule(options),
(0, exports.injectServiceInMain)(options),
(_, ctx) => ctx.logger.info(`The devtools module ${options.moduleName} has been registered and automatically activated${options.serviceName ? ', its activation can be driven via ' + options.serviceName : ''}.`)
])(tree, context);
};
exports.registerDevtoolsToApplication = registerDevtoolsToApplication;
//# sourceMappingURL=devtools-registration.js.map