79 lines
2.7 KiB
TypeScript
79 lines
2.7 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
import {chain, noop, Rule, SchematicContext, SchematicsException, Tree} from '@angular-devkit/schematics';
|
|
import {NodePackageInstallTask} from '@angular-devkit/schematics/tasks';
|
|
import {addPackageJsonDependency, NodeDependencyType} from '@schematics/angular/utility/dependencies';
|
|
import {getWorkspace} from '@schematics/angular/utility/workspace';
|
|
|
|
import {Schema} from './schema';
|
|
|
|
export default function(options: Schema): Rule {
|
|
return chain([
|
|
options && options.skipPackageJson ? noop() : addPolyfillDependency(),
|
|
addPolyfill(options),
|
|
]);
|
|
}
|
|
|
|
/** Adds a package.json dependency for document-register-element */
|
|
function addPolyfillDependency(): Rule {
|
|
return (host: Tree, context: SchematicContext) => {
|
|
addPackageJsonDependency(host, {
|
|
type: NodeDependencyType.Default,
|
|
name: 'document-register-element',
|
|
version: '^1.7.2',
|
|
});
|
|
context.logger.info('Added "document-register-element" as a dependency.');
|
|
|
|
// Install the dependency
|
|
context.addTask(new NodePackageInstallTask());
|
|
};
|
|
}
|
|
|
|
/** Adds the document-register-element.js to the polyfills file. */
|
|
function addPolyfill(options: Schema): Rule {
|
|
return async (host: Tree, context: SchematicContext) => {
|
|
const projectName = options.project;
|
|
|
|
if (!projectName) {
|
|
throw new SchematicsException('Option "project" is required.');
|
|
}
|
|
|
|
const workspace = await getWorkspace(host);
|
|
const project = workspace.projects.get(projectName);
|
|
|
|
if (!project) {
|
|
throw new SchematicsException(`Project ${projectName} is not defined in this workspace.`);
|
|
}
|
|
|
|
if (project.extensions['projectType'] !== 'application') {
|
|
throw new SchematicsException(
|
|
`@angular/elements requires a project type of "application" but ${projectName} isn't.`);
|
|
}
|
|
|
|
const buildTarget = project.targets.get('build');
|
|
if (!buildTarget || !buildTarget.options) {
|
|
throw new SchematicsException(`Cannot find 'options' for ${projectName} build target.`);
|
|
}
|
|
|
|
const {polyfills} = buildTarget.options;
|
|
if (typeof polyfills !== 'string') {
|
|
throw new SchematicsException(`polyfills for ${projectName} build target is not a string.`);
|
|
}
|
|
|
|
const content = host.read(polyfills).toString();
|
|
if (!content.includes('document-register-element')) {
|
|
// Add string at the end of the file.
|
|
const recorder = host.beginUpdate(polyfills);
|
|
recorder.insertRight(content.length, `import 'document-register-element';\n`);
|
|
host.commitUpdate(recorder);
|
|
}
|
|
|
|
context.logger.info('Added "document-register-element" to polyfills.');
|
|
};
|
|
}
|