fix(core): migrate tsconfig references in eslintrc (#3373)
This commit is contained in:
parent
39a34a9836
commit
64c09f2d46
@ -99,6 +99,11 @@
|
|||||||
"version": "10.0.0-beta.0",
|
"version": "10.0.0-beta.0",
|
||||||
"description": "Migrate tsconfigs to solution style tsconfigs",
|
"description": "Migrate tsconfigs to solution style tsconfigs",
|
||||||
"factory": "./src/migrations/update-10-0-0/solution-tsconfigs"
|
"factory": "./src/migrations/update-10-0-0/solution-tsconfigs"
|
||||||
|
},
|
||||||
|
"migrate-eslintrc-tsconfig": {
|
||||||
|
"version": "10.0.1-beta.0",
|
||||||
|
"description": "Migrate .eslintrc files to reference new tsconfig",
|
||||||
|
"factory": "./src/migrations/update-10-0-1/migrate-eslintrc"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"packageJsonUpdates": {
|
"packageJsonUpdates": {
|
||||||
|
|||||||
@ -1,19 +1,13 @@
|
|||||||
import { basename, dirname, join, normalize, Path } from '@angular-devkit/core';
|
import { basename, dirname, join, normalize, Path } from '@angular-devkit/core';
|
||||||
import {
|
import { chain, Rule, Tree } from '@angular-devkit/schematics';
|
||||||
callRule,
|
|
||||||
chain,
|
|
||||||
Rule,
|
|
||||||
SchematicContext,
|
|
||||||
Tree,
|
|
||||||
} from '@angular-devkit/schematics';
|
|
||||||
import {
|
import {
|
||||||
formatFiles,
|
formatFiles,
|
||||||
NxJson,
|
NxJson,
|
||||||
readJsonInTree,
|
readJsonInTree,
|
||||||
updateJsonInTree,
|
updateJsonInTree,
|
||||||
} from '@nrwl/workspace';
|
} from '@nrwl/workspace';
|
||||||
import ignore from 'ignore';
|
|
||||||
import { relative } from 'path';
|
import { relative } from 'path';
|
||||||
|
import { visitNotIgnoredFiles } from '../../utils/rules/visit-not-ignored-files';
|
||||||
|
|
||||||
function renameRootTsconfig(host: Tree) {
|
function renameRootTsconfig(host: Tree) {
|
||||||
if (!host.exists('tsconfig.json')) {
|
if (!host.exists('tsconfig.json')) {
|
||||||
@ -23,40 +17,6 @@ function renameRootTsconfig(host: Tree) {
|
|||||||
host.rename('tsconfig.json', 'tsconfig.base.json');
|
host.rename('tsconfig.json', 'tsconfig.base.json');
|
||||||
}
|
}
|
||||||
|
|
||||||
function visitNotIgnoredFiles(
|
|
||||||
visitor: (file: Path, host: Tree, context: SchematicContext) => void | Rule,
|
|
||||||
dir: Path = normalize('')
|
|
||||||
): Rule {
|
|
||||||
return (host, context) => {
|
|
||||||
let ig;
|
|
||||||
if (host.exists('.gitignore')) {
|
|
||||||
ig = ignore();
|
|
||||||
ig.add(host.read('.gitignore').toString());
|
|
||||||
}
|
|
||||||
function visit(_dir: Path) {
|
|
||||||
if (_dir && ig?.ignores(_dir)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const dirEntry = host.getDir(_dir);
|
|
||||||
dirEntry.subfiles.forEach((file) => {
|
|
||||||
if (ig?.ignores(join(_dir, file))) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const maybeRule = visitor(join(_dir, file), host, context);
|
|
||||||
if (maybeRule) {
|
|
||||||
callRule(maybeRule, host, context).subscribe();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
dirEntry.subdirs.forEach((subdir) => {
|
|
||||||
visit(join(_dir, subdir));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
visit(dir);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function moveIncludesToProjectTsconfig(
|
function moveIncludesToProjectTsconfig(
|
||||||
file: Path,
|
file: Path,
|
||||||
extendedTsconfigPath: Path,
|
extendedTsconfigPath: Path,
|
||||||
|
|||||||
@ -0,0 +1,53 @@
|
|||||||
|
import { Tree } from '@angular-devkit/schematics';
|
||||||
|
import { callRule, runMigration } from '../../utils/testing';
|
||||||
|
import { readJsonInTree, updateJsonInTree } from '@nrwl/workspace';
|
||||||
|
|
||||||
|
describe('Eslintrc Migration', () => {
|
||||||
|
let tree: Tree;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
tree = Tree.empty();
|
||||||
|
tree = await callRule(
|
||||||
|
updateJsonInTree('.eslintrc', () => ({
|
||||||
|
parserOptions: {
|
||||||
|
project: './tsconfig.json',
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
tree
|
||||||
|
);
|
||||||
|
tree = await callRule(
|
||||||
|
updateJsonInTree('project1/.eslintrc', () => ({
|
||||||
|
parserOptions: {
|
||||||
|
project: '../tsconfig.json',
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
tree
|
||||||
|
);
|
||||||
|
tree = await callRule(
|
||||||
|
updateJsonInTree('project2/.eslintrc', () => ({
|
||||||
|
parserOptions: {
|
||||||
|
project: './tsconfig.json',
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
tree
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should reference tsconfig.base.json', async () => {
|
||||||
|
const result = await runMigration('migrate-eslintrc-tsconfig', {}, tree);
|
||||||
|
const eslintrc = readJsonInTree(result, '.eslintrc');
|
||||||
|
expect(eslintrc.parserOptions.project).toEqual('./tsconfig.base.json');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should reference tsconfig.base.json from .eslintrc files not in the root', async () => {
|
||||||
|
const result = await runMigration('migrate-eslintrc-tsconfig', {}, tree);
|
||||||
|
const eslintrc = readJsonInTree(result, 'project1/.eslintrc');
|
||||||
|
expect(eslintrc.parserOptions.project).toEqual('../tsconfig.base.json');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should reference tsconfig.base.json in .eslintrc that don't reference the root tsconfig.json", async () => {
|
||||||
|
const result = await runMigration('migrate-eslintrc-tsconfig', {}, tree);
|
||||||
|
const eslintrc = readJsonInTree(result, 'project2/.eslintrc');
|
||||||
|
expect(eslintrc.parserOptions.project).toEqual('./tsconfig.json');
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
import { basename, dirname, join } from '@angular-devkit/core';
|
||||||
|
import { chain, Rule } from '@angular-devkit/schematics';
|
||||||
|
import { formatFiles, updateJsonInTree } from '@nrwl/workspace';
|
||||||
|
import { visitNotIgnoredFiles } from '../../utils/rules/visit-not-ignored-files';
|
||||||
|
|
||||||
|
export default function (schema: any): Rule {
|
||||||
|
return chain([
|
||||||
|
visitNotIgnoredFiles((file, host, context) => {
|
||||||
|
if (basename(file) !== '.eslintrc') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return updateJsonInTree(file, (json) => {
|
||||||
|
const tsconfig = json?.parserOptions?.project;
|
||||||
|
if (tsconfig) {
|
||||||
|
const tsconfigPath = join(dirname(file), tsconfig);
|
||||||
|
if (tsconfigPath === 'tsconfig.json') {
|
||||||
|
json.parserOptions.project = json.parserOptions.project.replace(
|
||||||
|
/tsconfig.json$/,
|
||||||
|
'tsconfig.base.json'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return json;
|
||||||
|
} else {
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
formatFiles(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
import { join, normalize, Path } from '@angular-devkit/core';
|
||||||
|
import {
|
||||||
|
callRule,
|
||||||
|
Rule,
|
||||||
|
SchematicContext,
|
||||||
|
Tree,
|
||||||
|
} from '@angular-devkit/schematics';
|
||||||
|
import ignore from 'ignore';
|
||||||
|
|
||||||
|
export function visitNotIgnoredFiles(
|
||||||
|
visitor: (file: Path, host: Tree, context: SchematicContext) => void | Rule,
|
||||||
|
dir: Path = normalize('')
|
||||||
|
): Rule {
|
||||||
|
return (host, context) => {
|
||||||
|
let ig;
|
||||||
|
if (host.exists('.gitignore')) {
|
||||||
|
ig = ignore();
|
||||||
|
ig.add(host.read('.gitignore').toString());
|
||||||
|
}
|
||||||
|
function visit(_dir: Path) {
|
||||||
|
if (_dir && ig?.ignores(_dir)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const dirEntry = host.getDir(_dir);
|
||||||
|
dirEntry.subfiles.forEach((file) => {
|
||||||
|
if (ig?.ignores(join(_dir, file))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const maybeRule = visitor(join(_dir, file), host, context);
|
||||||
|
if (maybeRule) {
|
||||||
|
callRule(maybeRule, host, context).subscribe();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
dirEntry.subdirs.forEach((subdir) => {
|
||||||
|
visit(join(_dir, subdir));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
visit(dir);
|
||||||
|
};
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user