@nrwl/schematics
Version:
294 lines (290 loc) • 12.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const schematics_1 = require("@angular-devkit/schematics");
const literals_1 = require("@angular-devkit/core/src/utils/literals");
const workspace_1 = require("@nrwl/workspace");
const typescript_1 = require("typescript");
const ast_utils_1 = require("@nrwl/workspace/src/utils/ast-utils");
const path_1 = require("path");
const ignore = require('ignore');
function addDependencies() {
return (host, context) => {
const dependencies = workspace_1.readJsonInTree(host, 'package.json').dependencies;
const builders = new Set();
const projects = workspace_1.readWorkspace(host).projects;
Object.values(projects)
.filter(project => typeof project === 'object' && project.hasOwnProperty('architect'))
.forEach(project => {
Object.values(project.architect).forEach(target => {
const [builderDependency] = target.builder.split(':');
builders.add(builderDependency);
});
});
const newDependencies = {};
const newDevDependencies = {
'@nrwl/workspace': '8.0.0'
};
context.logger.info(`Adding @nrwl/workspace as a dependency`);
if (dependencies['@angular/core']) {
newDependencies['@nrwl/angular'] = '8.0.0';
context.logger.info(`Adding @nrwl/angular as a dependency`);
}
if (dependencies['react']) {
newDevDependencies['@nrwl/react'] = '8.0.0';
context.logger.info(`Adding @nrwl/react as a dependency`);
}
if (dependencies['@nestjs/core']) {
newDevDependencies['@nrwl/nest'] = '8.0.0';
context.logger.info(`Adding @nrwl/nest as a dependency`);
}
if (dependencies.express) {
newDevDependencies['@nrwl/express'] = '8.0.0';
newDevDependencies['@nrwl/node'] = '8.0.0';
context.logger.info(`Adding @nrwl/express as a dependency`);
}
if (builders.has('@nrwl/web')) {
newDevDependencies['@nrwl/web'] = '8.0.0';
context.logger.info(`Adding @nrwl/web as a dependency`);
}
if (builders.has('@nrwl/node')) {
newDevDependencies['@nrwl/node'] = '8.0.0';
context.logger.info(`Adding @nrwl/node as a dependency`);
}
if (builders.has('@nrwl/jest')) {
newDevDependencies['@nrwl/jest'] = '8.0.0';
context.logger.info(`Adding @nrwl/jest as a dependency`);
}
if (builders.has('@nrwl/cypress')) {
newDevDependencies['@nrwl/cypress'] = '8.0.0';
context.logger.info(`Adding @nrwl/cypress as a dependency`);
}
return schematics_1.chain([workspace_1.addDepsToPackageJson(newDependencies, newDevDependencies)]);
};
}
const removeOldDependencies = workspace_1.updateJsonInTree('package.json', (json, context) => {
json.dependencies = json.dependencies || {};
json.devDependencies = json.devDependencies || {};
delete json.dependencies['@nrwl/nx'];
delete json.devDependencies['@nrwl/nx'];
delete json.dependencies['@nrwl/schematics'];
delete json.devDependencies['@nrwl/schematics'];
delete json.dependencies['@nrwl/builders'];
delete json.devDependencies['@nrwl/builders'];
context.logger.info(`Removing @nrwl/schematics as a dependency`);
context.logger.info(`Removing @nrwl/builders as a dependency`);
context.logger.info(`Removing @nrwl/nx as a dependency`);
return json;
});
const updateUpdateScript = workspace_1.updateJsonInTree('package.json', json => {
json.scripts = json.scripts || {};
json.scripts.update = 'ng update @nrwl/workspace';
return json;
});
const updateBuilders = workspace_1.updateWorkspaceInTree(json => {
if (!json.projects) {
return json;
}
Object.entries(json.projects).forEach(([projectKey, project]) => {
if (!project.architect) {
return;
}
Object.entries(project.architect).forEach(([targetKey, target]) => {
if (target.builder === '@nrwl/builders:jest') {
json.projects[projectKey].architect[targetKey].builder =
'@nrwl/jest:jest';
}
if (target.builder === '@nrwl/builders:cypress') {
json.projects[projectKey].architect[targetKey].builder =
'@nrwl/cypress:cypress';
}
if (target.builder === '@nrwl/builders:web-build') {
json.projects[projectKey].architect[targetKey].builder =
'@nrwl/web:build';
}
if (target.builder === '@nrwl/builders:web-dev-server') {
json.projects[projectKey].architect[targetKey].builder =
'@nrwl/web:dev-server';
}
if (target.builder === '@nrwl/builders:node-build') {
json.projects[projectKey].architect[targetKey].builder =
'@nrwl/node:build';
}
if (target.builder === '@nrwl/builders:node-execute') {
json.projects[projectKey].architect[targetKey].builder =
'@nrwl/node:execute';
}
if (target.builder === '@nrwl/builders:run-commands') {
json.projects[projectKey].architect[targetKey].builder =
'@nrwl/workspace:run-commands';
}
});
});
return json;
});
const displayInformation = (host, context) => {
context.logger.info(literals_1.stripIndents `
Nx has been repackaged. We are installing and migrating your dependencies to the ones necessary.
If you have workspace schematics, we tried to migrate your imports from "@nrwl/schematics" to "@nrwl/workspace" but your externalSchematics may be broken.
Read this guide to see where to find familiar features: https://nx.dev/guides/nx7-to-nx8
This migration may take a few minutes.
`);
};
const updateNxModuleImports = (host) => {
let ig;
if (host.exists('.gitignore')) {
ig = ignore();
ig.add(host.read('.gitignore').toString());
}
host.visit(path => {
if (!path.endsWith('.ts')) {
return;
}
if (ig && ig.ignores(path_1.relative('/', path))) {
return;
}
const sourceFile = typescript_1.createSourceFile(path, host.read(path).toString(), typescript_1.ScriptTarget.Latest, true);
const changes = [];
sourceFile.statements.forEach(statement => {
if (typescript_1.isImportDeclaration(statement) &&
typescript_1.isStringLiteral(statement.moduleSpecifier)) {
const nodeText = statement.moduleSpecifier.getText(sourceFile);
const modulePath = statement.moduleSpecifier
.getText(sourceFile)
.substr(1, nodeText.length - 2);
if (modulePath === '@nrwl/nx') {
changes.push(new ast_utils_1.ReplaceChange(path, statement.moduleSpecifier.getStart(sourceFile), nodeText, `'@nrwl/angular'`));
}
if (modulePath === '@nrwl/nx/testing') {
changes.push(new ast_utils_1.ReplaceChange(path, statement.moduleSpecifier.getStart(sourceFile), nodeText, `'@nrwl/angular/testing'`));
}
if (modulePath.startsWith('@nrwl/schematics')) {
changes.push(new ast_utils_1.ReplaceChange(path, statement.moduleSpecifier.getStart(sourceFile), nodeText, nodeText.replace('@nrwl/schematics', '@nrwl/workspace')));
}
}
});
workspace_1.insert(host, path, changes);
});
};
const updateJestPlugin = (host) => {
if (!host.exists('jest.config.js')) {
return host;
}
const sourceFile = typescript_1.createSourceFile('jest.config.js', host.read('jest.config.js').toString(), typescript_1.ScriptTarget.Latest, true);
const changes = [];
ast_utils_1.getSourceNodes(sourceFile).forEach(node => {
if (typescript_1.isStringLiteral(node)) {
const value = node
.getText(sourceFile)
.substr(1, node.getText(sourceFile).length - 2);
if (value === '@nrwl/builders/plugins/jest/resolver') {
changes.push(new ast_utils_1.ReplaceChange('jest.config.js', node.getStart(sourceFile), node.getText(sourceFile), `'@nrwl/jest/plugins/resolver'`));
}
}
});
workspace_1.insert(host, 'jest.config.js', changes);
};
const updateTslintRules = workspace_1.updateJsonInTree('tslint.json', json => {
const { rulesDirectory } = json;
json.rulesDirectory = rulesDirectory.map(directory => {
return directory === 'node_modules/@nrwl/schematics/src/tslint'
? 'node_modules/@nrwl/workspace/src/tslint'
: directory;
});
return json;
});
const updateDefaultCollection = (host, context) => {
const { dependencies, devDependencies } = workspace_1.readJsonInTree(host, 'package.json');
return workspace_1.updateWorkspaceInTree(json => {
json.cli = json.cli || {};
if (dependencies['@nrwl/angular']) {
json.cli.defaultCollection = '@nrwl/angular';
}
else if (devDependencies['@nrwl/react']) {
json.cli.defaultCollection = '@nrwl/react';
}
else if (devDependencies['@nrwl/nest']) {
json.cli.defaultCollection = '@nrwl/nest';
}
else if (devDependencies['@nrwl/express']) {
json.cli.defaultCollection = '@nrwl/express';
}
else if (devDependencies['@nrwl/web']) {
json.cli.defaultCollection = '@nrwl/web';
}
else if (devDependencies['@nrwl/node']) {
json.cli.defaultCollection = '@nrwl/node';
}
else {
json.cli.defaultCollection = '@nrwl/workspace';
}
context.logger.info(`Default collection is now set to ${json.cli.defaultCollection}`);
return json;
});
};
const setRootDirAndUpdateOurDir = (host) => {
let ig;
if (host.exists('.gitignore')) {
ig = ignore();
ig.add(host.read('.gitignore').toString());
}
host.visit(path => {
if (!path.endsWith('.json')) {
return;
}
if (ig && ig.ignores(path_1.relative('/', path))) {
return;
}
const json = host.read(path).toString();
const match = json.match(/"outDir"\s*:\s*"([^"]+)"/);
if (match) {
const outParts = match[1].split('out-tsc');
if (outParts.length > 1) {
const updatedJson = json.replace(/"outDir"\s*:\s*"([^"]+)"/, `"outDir": "${outParts[0]}out-tsc"`);
host.overwrite(path, updatedJson);
}
}
});
workspace_1.updateJsonInTree('tsconfig.json', json => {
json.compilerOptions = json.compilerOptions || {};
json.compilerOptions.rootDir = '.';
return json;
})(host, null);
};
exports.runAngularMigrations = (host, context) => {
const { dependencies } = workspace_1.readJsonInTree(host, 'package.json');
return schematics_1.chain([
workspace_1.addUpdateTask('@angular/cli', '8.0.1'),
...(dependencies['@angular/core']
? [workspace_1.addUpdateTask('@angular/core', '8.0.0')]
: [])
]);
};
const updateNestDependencies = workspace_1.updateJsonInTree('package.json', json => {
json.dependencies = json.dependencies || {};
json.devDependencies = json.devDependencies || {};
if (!json.devDependencies['@nrwl/nest']) {
return json;
}
const nestFrameworkVersion = '^6.2.4';
json.dependencies = Object.assign({}, json.dependencies, { '@nestjs/common': nestFrameworkVersion, '@nestjs/core': nestFrameworkVersion, '@nestjs/platform-express': nestFrameworkVersion, 'reflect-metadata': '^0.1.12' });
json.devDependencies = Object.assign({}, json.devDependencies, { '@nestjs/schematics': '^6.3.0', '@nestjs/testing': nestFrameworkVersion });
return json;
});
function default_1() {
return schematics_1.chain([
displayInformation,
exports.runAngularMigrations,
removeOldDependencies,
updateUpdateScript,
updateBuilders,
updateJestPlugin,
updateNxModuleImports,
updateTslintRules,
addDependencies(),
updateNestDependencies,
updateDefaultCollection,
setRootDirAndUpdateOurDir,
workspace_1.formatFiles()
]);
}
exports.default = default_1;