UNPKG

@o3r/schematics

Version:

Schematics module of the Otter framework

106 lines 5.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerDevtoolsToApplication = exports.injectServiceInMain = void 0; const tslib_1 = require("tslib"); 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 = tslib_1.__importStar(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 = [ 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