@nrwl/linter 16.0.0-beta.0 → 16.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/executors.json +5 -5
- package/generators.json +2 -28
- package/index.d.ts +1 -5
- package/index.js +1 -13
- package/index.js.map +1 -1
- package/package.json +7 -20
- package/README.md +0 -61
- package/migrations.json +0 -226
- package/src/executors/eslint/compat.d.ts +0 -2
- package/src/executors/eslint/compat.js +0 -6
- package/src/executors/eslint/compat.js.map +0 -1
- package/src/executors/eslint/hasher.d.ts +0 -7
- package/src/executors/eslint/hasher.js +0 -47
- package/src/executors/eslint/hasher.js.map +0 -1
- package/src/executors/eslint/lint.impl.d.ts +0 -5
- package/src/executors/eslint/lint.impl.js +0 -116
- package/src/executors/eslint/lint.impl.js.map +0 -1
- package/src/executors/eslint/schema.d.ts +0 -38
- package/src/executors/eslint/schema.json +0 -139
- package/src/executors/eslint/utility/eslint-utils.d.ts +0 -4
- package/src/executors/eslint/utility/eslint-utils.js +0 -52
- package/src/executors/eslint/utility/eslint-utils.js.map +0 -1
- package/src/generators/init/global-eslint-config.d.ts +0 -36
- package/src/generators/init/global-eslint-config.js +0 -77
- package/src/generators/init/global-eslint-config.js.map +0 -1
- package/src/generators/init/init-migration.d.ts +0 -3
- package/src/generators/init/init-migration.js +0 -68
- package/src/generators/init/init-migration.js.map +0 -1
- package/src/generators/init/init.d.ts +0 -9
- package/src/generators/init/init.js +0 -63
- package/src/generators/init/init.js.map +0 -1
- package/src/generators/lint-project/lint-project.d.ts +0 -16
- package/src/generators/lint-project/lint-project.js +0 -137
- package/src/generators/lint-project/lint-project.js.map +0 -1
- package/src/generators/utils/eslint-file.d.ts +0 -4
- package/src/generators/utils/eslint-file.js +0 -27
- package/src/generators/utils/eslint-file.js.map +0 -1
- package/src/generators/utils/eslint-targets.d.ts +0 -2
- package/src/generators/utils/eslint-targets.js +0 -13
- package/src/generators/utils/eslint-targets.js.map +0 -1
- package/src/generators/utils/linter.d.ts +0 -4
- package/src/generators/utils/linter.js +0 -9
- package/src/generators/utils/linter.js.map +0 -1
- package/src/generators/workspace-rule/files/__name__.spec.ts__tmpl__ +0 -11
- package/src/generators/workspace-rule/files/__name__.ts__tmpl__ +0 -37
- package/src/generators/workspace-rule/schema.json +0 -26
- package/src/generators/workspace-rule/workspace-rule.d.ts +0 -7
- package/src/generators/workspace-rule/workspace-rule.js +0 -79
- package/src/generators/workspace-rule/workspace-rule.js.map +0 -1
- package/src/generators/workspace-rules-project/files/index.ts__tmpl__ +0 -27
- package/src/generators/workspace-rules-project/files/tsconfig.json__tmpl__ +0 -13
- package/src/generators/workspace-rules-project/files/tsconfig.lint.json__tmpl__ +0 -9
- package/src/generators/workspace-rules-project/schema.json +0 -23
- package/src/generators/workspace-rules-project/workspace-rules-project.d.ts +0 -8
- package/src/generators/workspace-rules-project/workspace-rules-project.js +0 -86
- package/src/generators/workspace-rules-project/workspace-rules-project.js.map +0 -1
- package/src/migrations/update-12-4-0/remove-eslint-project-config-if-no-type-checking-rules.d.ts +0 -2
- package/src/migrations/update-12-4-0/remove-eslint-project-config-if-no-type-checking-rules.js +0 -32
- package/src/migrations/update-12-4-0/remove-eslint-project-config-if-no-type-checking-rules.js.map +0 -1
- package/src/migrations/update-12-9-0/add-outputs.d.ts +0 -2
- package/src/migrations/update-12-9-0/add-outputs.js +0 -23
- package/src/migrations/update-12-9-0/add-outputs.js.map +0 -1
- package/src/migrations/update-13-3-0/eslint-8-updates.d.ts +0 -2
- package/src/migrations/update-13-3-0/eslint-8-updates.js +0 -44
- package/src/migrations/update-13-3-0/eslint-8-updates.js.map +0 -1
- package/src/migrations/update-14-1-9/add-swc-deps-if-needed.d.ts +0 -2
- package/src/migrations/update-14-1-9/add-swc-deps-if-needed.js +0 -20
- package/src/migrations/update-14-1-9/add-swc-deps-if-needed.js.map +0 -1
- package/src/migrations/update-14-4-4/experimental-to-utils-deps.d.ts +0 -2
- package/src/migrations/update-14-4-4/experimental-to-utils-deps.js +0 -30
- package/src/migrations/update-14-4-4/experimental-to-utils-deps.js.map +0 -1
- package/src/migrations/update-14-4-4/experimental-to-utils-rules.d.ts +0 -2
- package/src/migrations/update-14-4-4/experimental-to-utils-rules.js +0 -38
- package/src/migrations/update-14-4-4/experimental-to-utils-rules.js.map +0 -1
- package/src/migrations/update-15-0-0/add-eslint-inputs.d.ts +0 -2
- package/src/migrations/update-15-0-0/add-eslint-inputs.js +0 -33
- package/src/migrations/update-15-0-0/add-eslint-inputs.js.map +0 -1
- package/src/migrations/update-15-7-1/add-eslint-ignore.d.ts +0 -2
- package/src/migrations/update-15-7-1/add-eslint-ignore.js +0 -42
- package/src/migrations/update-15-7-1/add-eslint-ignore.js.map +0 -1
- package/src/utils/convert-tslint-to-eslint/convert-nx-enforce-module-boundaries-rule.d.ts +0 -5
- package/src/utils/convert-tslint-to-eslint/convert-nx-enforce-module-boundaries-rule.js +0 -57
- package/src/utils/convert-tslint-to-eslint/convert-nx-enforce-module-boundaries-rule.js.map +0 -1
- package/src/utils/convert-tslint-to-eslint/convert-to-eslint-config.d.ts +0 -9
- package/src/utils/convert-tslint-to-eslint/convert-to-eslint-config.js +0 -152
- package/src/utils/convert-tslint-to-eslint/convert-to-eslint-config.js.map +0 -1
- package/src/utils/convert-tslint-to-eslint/example-tslint-configs.d.ts +0 -326
- package/src/utils/convert-tslint-to-eslint/example-tslint-configs.js +0 -325
- package/src/utils/convert-tslint-to-eslint/example-tslint-configs.js.map +0 -1
- package/src/utils/convert-tslint-to-eslint/index.d.ts +0 -2
- package/src/utils/convert-tslint-to-eslint/index.js +0 -9
- package/src/utils/convert-tslint-to-eslint/index.js.map +0 -1
- package/src/utils/convert-tslint-to-eslint/project-converter.d.ts +0 -72
- package/src/utils/convert-tslint-to-eslint/project-converter.js +0 -396
- package/src/utils/convert-tslint-to-eslint/project-converter.js.map +0 -1
- package/src/utils/convert-tslint-to-eslint/utils.d.ts +0 -10
- package/src/utils/convert-tslint-to-eslint/utils.js +0 -91
- package/src/utils/convert-tslint-to-eslint/utils.js.map +0 -1
- package/src/utils/rules-requiring-type-checking.d.ts +0 -3
- package/src/utils/rules-requiring-type-checking.js +0 -88
- package/src/utils/rules-requiring-type-checking.js.map +0 -1
- package/src/utils/testing.d.ts +0 -2
- package/src/utils/testing.js +0 -13
- package/src/utils/testing.js.map +0 -1
- package/src/utils/versions.d.ts +0 -5
- package/src/utils/versions.js +0 -9
- package/src/utils/versions.js.map +0 -1
- package/src/utils/workspace-lint-rules.d.ts +0 -1
- package/src/utils/workspace-lint-rules.js +0 -6
- package/src/utils/workspace-lint-rules.js.map +0 -1
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import type { GeneratorCallback, ProjectConfiguration, Tree } from '@nrwl/devkit';
|
|
2
|
-
import type { Linter } from 'eslint';
|
|
3
|
-
/**
|
|
4
|
-
* Common schema used by all implementations of convert-tslint-to-eslint generators
|
|
5
|
-
*/
|
|
6
|
-
export interface ConvertTSLintToESLintSchema {
|
|
7
|
-
project: string;
|
|
8
|
-
ignoreExistingTslintConfig: boolean;
|
|
9
|
-
removeTSLintIfNoMoreTSLintTargets: boolean;
|
|
10
|
-
skipFormat?: boolean;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* When we convert a TSLint setup to an ESLint setup for a particular project, there are a number of
|
|
14
|
-
* shared/common concerns (implemented as library utilities within @nrwl/linter), and a few things
|
|
15
|
-
* which are specific to this package and the types of projects it produces.
|
|
16
|
-
*
|
|
17
|
-
* The key structure of the converted ESLint support is as follows:
|
|
18
|
-
*
|
|
19
|
-
* - We will first generate a workspace root .eslintrc.json which is the same as the one generated
|
|
20
|
-
* for new workspaces (i.e. it is NOT just a converted version of their root tslint.json). This allows us
|
|
21
|
-
* to have a consistent base for all users, as well as standardized patterns around "overrides".
|
|
22
|
-
*
|
|
23
|
-
* - The user's original root tslint.json will be converted and any applicable settings will be stored
|
|
24
|
-
* within ADDITIONAL override blocks within the root .eslintrc.json.
|
|
25
|
-
*
|
|
26
|
-
* - The user's project-level tslint.json file will be converted into a corresponding .eslintrc.json file
|
|
27
|
-
* and it will extend from the root workspace .eslintrc.json file as normal.
|
|
28
|
-
*/
|
|
29
|
-
export declare class ProjectConverter {
|
|
30
|
-
private readonly projectConfig;
|
|
31
|
-
private readonly rootTSLintJsonPath;
|
|
32
|
-
private readonly rootTSLintJson;
|
|
33
|
-
private readonly projectTSLintJsonPath;
|
|
34
|
-
private readonly projectTSLintJson;
|
|
35
|
-
private readonly host;
|
|
36
|
-
private readonly projectName;
|
|
37
|
-
private readonly ignoreExistingTslintConfig;
|
|
38
|
-
private readonly eslintInitializer;
|
|
39
|
-
/**
|
|
40
|
-
* Using an object as the argument to the constructor means we sacrifice some
|
|
41
|
-
* authoring sugar around initializing these properties but it makes the usage
|
|
42
|
-
* of the class much easier to read and maintain.
|
|
43
|
-
*/
|
|
44
|
-
constructor({ host, projectName, ignoreExistingTslintConfig, eslintInitializer, }: {
|
|
45
|
-
host: Tree;
|
|
46
|
-
projectName: string;
|
|
47
|
-
ignoreExistingTslintConfig: boolean;
|
|
48
|
-
eslintInitializer: (projectInfo: {
|
|
49
|
-
projectName: string;
|
|
50
|
-
projectConfig: ProjectConfiguration;
|
|
51
|
-
}) => Promise<void>;
|
|
52
|
-
});
|
|
53
|
-
initESLint(): Promise<GeneratorCallback>;
|
|
54
|
-
/**
|
|
55
|
-
* If the package-specific shareable config already exists then the workspace must already
|
|
56
|
-
* be part way through migrating from TSLint to ESLint. In this case we do not want to convert
|
|
57
|
-
* the root tslint.json again (and this utility will return a noop task), and we instead just
|
|
58
|
-
* focus on the project-level config conversion.
|
|
59
|
-
*/
|
|
60
|
-
convertRootTSLintConfig(applyPackageSpecificModifications: (json: Linter.Config) => Linter.Config, rootEslintConfigExists?: boolean): Promise<Exclude<GeneratorCallback, void>>;
|
|
61
|
-
convertProjectConfig(applyPackageSpecificModifications: (json: Linter.Config) => Linter.Config): Promise<GeneratorCallback>;
|
|
62
|
-
removeProjectTSLintFile(): void;
|
|
63
|
-
isTSLintUsedInWorkspace(): boolean;
|
|
64
|
-
removeTSLintFromWorkspace(): GeneratorCallback;
|
|
65
|
-
private cleanUpGeneratorsConfig;
|
|
66
|
-
/**
|
|
67
|
-
* If the project which is the subject of the ProjectConverter instance is an application,
|
|
68
|
-
* figure out its associated e2e project's name.
|
|
69
|
-
*/
|
|
70
|
-
getE2EProjectName(): string | null;
|
|
71
|
-
setDefaults(collectionName: string, defaults: Partial<ConvertTSLintToESLintSchema>): void;
|
|
72
|
-
}
|
|
@@ -1,396 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ProjectConverter = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const devkit_1 = require("@nrwl/devkit");
|
|
6
|
-
const rules_requiring_type_checking_1 = require("../rules-requiring-type-checking");
|
|
7
|
-
const convert_to_eslint_config_1 = require("./convert-to-eslint-config");
|
|
8
|
-
const utils_1 = require("./utils");
|
|
9
|
-
/**
|
|
10
|
-
* When we convert a TSLint setup to an ESLint setup for a particular project, there are a number of
|
|
11
|
-
* shared/common concerns (implemented as library utilities within @nrwl/linter), and a few things
|
|
12
|
-
* which are specific to this package and the types of projects it produces.
|
|
13
|
-
*
|
|
14
|
-
* The key structure of the converted ESLint support is as follows:
|
|
15
|
-
*
|
|
16
|
-
* - We will first generate a workspace root .eslintrc.json which is the same as the one generated
|
|
17
|
-
* for new workspaces (i.e. it is NOT just a converted version of their root tslint.json). This allows us
|
|
18
|
-
* to have a consistent base for all users, as well as standardized patterns around "overrides".
|
|
19
|
-
*
|
|
20
|
-
* - The user's original root tslint.json will be converted and any applicable settings will be stored
|
|
21
|
-
* within ADDITIONAL override blocks within the root .eslintrc.json.
|
|
22
|
-
*
|
|
23
|
-
* - The user's project-level tslint.json file will be converted into a corresponding .eslintrc.json file
|
|
24
|
-
* and it will extend from the root workspace .eslintrc.json file as normal.
|
|
25
|
-
*/
|
|
26
|
-
class ProjectConverter {
|
|
27
|
-
/**
|
|
28
|
-
* Using an object as the argument to the constructor means we sacrifice some
|
|
29
|
-
* authoring sugar around initializing these properties but it makes the usage
|
|
30
|
-
* of the class much easier to read and maintain.
|
|
31
|
-
*/
|
|
32
|
-
constructor({ host, projectName, ignoreExistingTslintConfig, eslintInitializer, }) {
|
|
33
|
-
this.rootTSLintJsonPath = 'tslint.json';
|
|
34
|
-
this.host = host;
|
|
35
|
-
this.projectName = projectName;
|
|
36
|
-
this.ignoreExistingTslintConfig = ignoreExistingTslintConfig;
|
|
37
|
-
this.eslintInitializer = eslintInitializer;
|
|
38
|
-
this.projectConfig = (0, devkit_1.readProjectConfiguration)(this.host, this.projectName);
|
|
39
|
-
this.projectTSLintJsonPath = (0, devkit_1.joinPathFragments)(this.projectConfig.root, 'tslint.json');
|
|
40
|
-
/**
|
|
41
|
-
* Given the user is converting a project from TSLint to ESLint, we expect them
|
|
42
|
-
* to have both a root and a project-specific tslint.json
|
|
43
|
-
*/
|
|
44
|
-
if (!ignoreExistingTslintConfig) {
|
|
45
|
-
if (!host.exists(this.rootTSLintJsonPath)) {
|
|
46
|
-
throw new Error('We could not find a tslint.json at the root of your workspace, maybe you have already migrated to ESLint?');
|
|
47
|
-
}
|
|
48
|
-
this.rootTSLintJson = (0, devkit_1.readJson)(host, this.rootTSLintJsonPath);
|
|
49
|
-
if (!host.exists(this.projectTSLintJsonPath)) {
|
|
50
|
-
devkit_1.logger.warn(`We could not find a tslint.json for the selected project "${this.projectTSLintJsonPath}", maybe you have already migrated to ESLint?`);
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
this.projectTSLintJson = (0, devkit_1.readJson)(host, this.projectTSLintJsonPath);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* We are not able to support --dry-run in this generator, because we need to dynamically install
|
|
58
|
-
* and use the tslint-to-eslint-config package within the same execution.
|
|
59
|
-
*
|
|
60
|
-
* This is a worthwhile trade-off and the dry-run output doesn't offer a ton of value for this use-case anyway.
|
|
61
|
-
*/
|
|
62
|
-
if (process.argv.includes('--dry-run') ||
|
|
63
|
-
process.argv.includes('--dryRun') ||
|
|
64
|
-
process.argv.includes('-d')) {
|
|
65
|
-
throw new Error('NOTE: This generator does not support --dry-run. If you are running this in Nx Console, it should execute fine once you hit the "Run" button.\n');
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
initESLint() {
|
|
69
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
70
|
-
yield this.eslintInitializer({
|
|
71
|
-
projectName: this.projectName,
|
|
72
|
-
projectConfig: this.projectConfig,
|
|
73
|
-
});
|
|
74
|
-
// Ensure that all the dependencies added as part ESLint initialization are installed
|
|
75
|
-
return () => {
|
|
76
|
-
(0, devkit_1.installPackagesTask)(this.host);
|
|
77
|
-
};
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* If the package-specific shareable config already exists then the workspace must already
|
|
82
|
-
* be part way through migrating from TSLint to ESLint. In this case we do not want to convert
|
|
83
|
-
* the root tslint.json again (and this utility will return a noop task), and we instead just
|
|
84
|
-
* focus on the project-level config conversion.
|
|
85
|
-
*/
|
|
86
|
-
convertRootTSLintConfig(applyPackageSpecificModifications, rootEslintConfigExists) {
|
|
87
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
88
|
-
if (this.ignoreExistingTslintConfig) {
|
|
89
|
-
return Promise.resolve(() => { });
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* If root eslint already exists, we will not override it with converted tslint
|
|
93
|
-
* as this might break existing configuration in place. This is the common scenario
|
|
94
|
-
* when large projects are migrating one project at a time and apply custom
|
|
95
|
-
* changes to root config in the meantime.
|
|
96
|
-
*
|
|
97
|
-
* We warn user of this action in case .eslintrc.json was created accidentally
|
|
98
|
-
*/
|
|
99
|
-
if (rootEslintConfigExists) {
|
|
100
|
-
devkit_1.logger.warn(`Root '.eslintrc.json' found. Assuming conversion was already run for other projects.`);
|
|
101
|
-
return Promise.resolve(() => { });
|
|
102
|
-
}
|
|
103
|
-
const convertedRoot = yield (0, utils_1.convertTSLintConfig)(this.rootTSLintJson, this.rootTSLintJsonPath, []);
|
|
104
|
-
const convertedRootESLintConfig = convertedRoot.convertedESLintConfig;
|
|
105
|
-
/**
|
|
106
|
-
* Already set by Nx's shareable configs
|
|
107
|
-
*/
|
|
108
|
-
delete convertedRootESLintConfig.env;
|
|
109
|
-
delete convertedRootESLintConfig.parser;
|
|
110
|
-
delete convertedRootESLintConfig.parserOptions;
|
|
111
|
-
if (convertedRootESLintConfig.plugins) {
|
|
112
|
-
convertedRootESLintConfig.plugins =
|
|
113
|
-
convertedRootESLintConfig.plugins.filter((p) => p !== '@typescript-eslint/tslint');
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* The only piece of the converted root tslint.json that we need to pull out to
|
|
117
|
-
* apply to the existing overrides within the root .eslintrc.json is the
|
|
118
|
-
* @nrwl/nx/enforce-module-boundaries rule.
|
|
119
|
-
*/
|
|
120
|
-
const nxRuleName = '@nrwl/nx/enforce-module-boundaries';
|
|
121
|
-
const nxEnforceModuleBoundariesRule = convertedRootESLintConfig.rules[nxRuleName];
|
|
122
|
-
if (nxEnforceModuleBoundariesRule) {
|
|
123
|
-
(0, devkit_1.updateJson)(this.host, '.eslintrc.json', (json) => {
|
|
124
|
-
if (!json.overrides) {
|
|
125
|
-
return json;
|
|
126
|
-
}
|
|
127
|
-
for (const o of json.overrides) {
|
|
128
|
-
if (!o.rules) {
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
if (!o.rules[nxRuleName]) {
|
|
132
|
-
continue;
|
|
133
|
-
}
|
|
134
|
-
o.rules[nxRuleName] = nxEnforceModuleBoundariesRule;
|
|
135
|
-
}
|
|
136
|
-
return json;
|
|
137
|
-
});
|
|
138
|
-
/**
|
|
139
|
-
* Remove it once we've used it on the root, so that is isn't applied
|
|
140
|
-
* to the package-specific shareable config
|
|
141
|
-
*/
|
|
142
|
-
delete convertedRootESLintConfig.rules[nxRuleName];
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Update the root workspace .eslintrc.json with additional overrides
|
|
146
|
-
*/
|
|
147
|
-
const finalConvertedRootESLintConfig = applyPackageSpecificModifications(convertedRootESLintConfig);
|
|
148
|
-
(0, devkit_1.updateJson)(this.host, '.eslintrc.json', (json) => {
|
|
149
|
-
json.overrides || (json.overrides = []);
|
|
150
|
-
if (finalConvertedRootESLintConfig.overrides &&
|
|
151
|
-
finalConvertedRootESLintConfig.overrides.length) {
|
|
152
|
-
json.overrides = [
|
|
153
|
-
...json.overrides,
|
|
154
|
-
...finalConvertedRootESLintConfig.overrides,
|
|
155
|
-
];
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
json.overrides.push(Object.assign({ files: ['*.ts'] }, finalConvertedRootESLintConfig));
|
|
159
|
-
}
|
|
160
|
-
json.overrides = (0, utils_1.deduplicateOverrides)(json.overrides);
|
|
161
|
-
/**
|
|
162
|
-
* Remove the parserOptions.project config if it is not required for the final config,
|
|
163
|
-
* so that lint runs can be as fast and efficient as possible.
|
|
164
|
-
*/
|
|
165
|
-
return (0, rules_requiring_type_checking_1.removeParserOptionsProjectIfNotRequired)(json);
|
|
166
|
-
});
|
|
167
|
-
/**
|
|
168
|
-
* Through converting the config we may encounter TSLint rules whose closest
|
|
169
|
-
* equivalent in the ESLint ecosystem comes from a separate package/plugin.
|
|
170
|
-
*
|
|
171
|
-
* We therefore automatically install those extra packages for the user and
|
|
172
|
-
* explain that that's what we are doing.
|
|
173
|
-
*/
|
|
174
|
-
return (0, utils_1.ensureESLintPluginsAreInstalled)(this.host, convertedRoot.ensureESLintPlugins);
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
convertProjectConfig(applyPackageSpecificModifications) {
|
|
178
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
179
|
-
if (this.ignoreExistingTslintConfig || !this.projectTSLintJson) {
|
|
180
|
-
return Promise.resolve(() => { });
|
|
181
|
-
}
|
|
182
|
-
const convertedProjectConfig = yield (0, utils_1.convertTSLintConfig)(this.projectTSLintJson, this.projectTSLintJsonPath,
|
|
183
|
-
// Strip the extends on workspace tslint.json (see this util's docs for more info)
|
|
184
|
-
[`${(0, devkit_1.offsetFromRoot)(this.projectConfig.root)}tslint.json`]);
|
|
185
|
-
const convertedProjectESLintConfig = convertedProjectConfig.convertedESLintConfig;
|
|
186
|
-
/**
|
|
187
|
-
* Already set by Nx's shareable configs
|
|
188
|
-
*/
|
|
189
|
-
delete convertedProjectESLintConfig.env;
|
|
190
|
-
delete convertedProjectESLintConfig.parser;
|
|
191
|
-
delete convertedProjectESLintConfig.parserOptions;
|
|
192
|
-
if (convertedProjectESLintConfig.plugins) {
|
|
193
|
-
convertedProjectESLintConfig.plugins =
|
|
194
|
-
convertedProjectESLintConfig.plugins.filter((p) => p !== '@typescript-eslint/tslint');
|
|
195
|
-
}
|
|
196
|
-
const projectESLintConfigPath = (0, devkit_1.joinPathFragments)(this.projectConfig.root, '.eslintrc.json');
|
|
197
|
-
/**
|
|
198
|
-
* Apply updates to the new .eslintrc.json file for the project
|
|
199
|
-
*/
|
|
200
|
-
(0, devkit_1.updateJson)(this.host, projectESLintConfigPath, (json) => {
|
|
201
|
-
var _a;
|
|
202
|
-
if (typeof json.extends === 'string') {
|
|
203
|
-
json.extends = [json.extends];
|
|
204
|
-
}
|
|
205
|
-
// Custom extends from conversion
|
|
206
|
-
if (Array.isArray(convertedProjectESLintConfig.extends) &&
|
|
207
|
-
convertedProjectESLintConfig.extends.length) {
|
|
208
|
-
// Ignore any tslint-to-eslint-config default extends that do not apply to Nx
|
|
209
|
-
const applicableExtends = convertedProjectESLintConfig.extends.filter((ext) => !ext.startsWith('prettier'));
|
|
210
|
-
if (applicableExtends.length) {
|
|
211
|
-
json.extends = [...json.extends, ...applicableExtends];
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
// Custom plugins from conversion
|
|
215
|
-
if (Array.isArray(convertedProjectESLintConfig.plugins) &&
|
|
216
|
-
convertedProjectESLintConfig.plugins.length) {
|
|
217
|
-
json.plugins = [
|
|
218
|
-
...((_a = json.plugins) !== null && _a !== void 0 ? _a : []),
|
|
219
|
-
...convertedProjectESLintConfig.plugins,
|
|
220
|
-
];
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Custom rules
|
|
224
|
-
*
|
|
225
|
-
* By default, tslint-to-eslint-config will try and apply any rules without known converters
|
|
226
|
-
* by using eslint-plugin-tslint. We instead explicitly warn the user about this missing converter,
|
|
227
|
-
* and therefore at this point we strip out any rules which start with @typescript-eslint/tslint/config
|
|
228
|
-
*/
|
|
229
|
-
json.rules || (json.rules = {});
|
|
230
|
-
if (convertedProjectESLintConfig.rules &&
|
|
231
|
-
Object.keys(convertedProjectESLintConfig.rules).length) {
|
|
232
|
-
for (const [ruleName, ruleConfig] of Object.entries(convertedProjectESLintConfig.rules)) {
|
|
233
|
-
if (!ruleName.startsWith('@typescript-eslint/tslint/config')) {
|
|
234
|
-
// Prioritize the converted rules over any base implementations from the original Nx generator
|
|
235
|
-
json.rules[ruleName] = ruleConfig;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Apply any package-specific modifications to the converted config before
|
|
241
|
-
* updating the config file.
|
|
242
|
-
*/
|
|
243
|
-
const finalJson = applyPackageSpecificModifications(json);
|
|
244
|
-
/**
|
|
245
|
-
* Remove the parserOptions.project config if it is not required for the final config,
|
|
246
|
-
* so that lint runs can be as fast and efficient as possible.
|
|
247
|
-
*/
|
|
248
|
-
return (0, rules_requiring_type_checking_1.removeParserOptionsProjectIfNotRequired)(finalJson);
|
|
249
|
-
});
|
|
250
|
-
/**
|
|
251
|
-
* Convert any instances of comment-based configuration in the source files
|
|
252
|
-
* of the project
|
|
253
|
-
*/
|
|
254
|
-
(0, convert_to_eslint_config_1.convertTSLintDisableCommentsForProject)(this.host, this.projectName);
|
|
255
|
-
/**
|
|
256
|
-
* Through converting the config we may encounter TSLint rules whose closest
|
|
257
|
-
* equivalent in the ESLint ecosystem comes from a separate package/plugin.
|
|
258
|
-
*
|
|
259
|
-
* We therefore automatically install those extra packages for the user and
|
|
260
|
-
* explain that that's what we are doing.
|
|
261
|
-
*/
|
|
262
|
-
return (0, utils_1.ensureESLintPluginsAreInstalled)(this.host, convertedProjectConfig.ensureESLintPlugins);
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
removeProjectTSLintFile() {
|
|
266
|
-
this.host.delete((0, devkit_1.joinPathFragments)(this.projectConfig.root, 'tslint.json'));
|
|
267
|
-
}
|
|
268
|
-
isTSLintUsedInWorkspace() {
|
|
269
|
-
const projects = (0, devkit_1.getProjects)(this.host);
|
|
270
|
-
for (const [, projectConfig] of projects.entries()) {
|
|
271
|
-
for (const [, targetConfig] of Object.entries(projectConfig.targets)) {
|
|
272
|
-
if (targetConfig.executor === '@angular-devkit/build-angular:tslint') {
|
|
273
|
-
// Workspace is still using TSLint, exit early
|
|
274
|
-
return true;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
// If we got this far the user has no remaining TSLint usage
|
|
279
|
-
return false;
|
|
280
|
-
}
|
|
281
|
-
removeTSLintFromWorkspace() {
|
|
282
|
-
devkit_1.logger.info(`No TSLint usage will remain in the workspace, removing TSLint...`);
|
|
283
|
-
/**
|
|
284
|
-
* Delete the root tslint.json
|
|
285
|
-
*/
|
|
286
|
-
this.host.delete(this.rootTSLintJsonPath);
|
|
287
|
-
/**
|
|
288
|
-
* Prepare the package.json and the uninstall task
|
|
289
|
-
*/
|
|
290
|
-
const uninstallTask = (0, devkit_1.removeDependenciesFromPackageJson)(this.host, [], ['tslint', 'codelyzer']);
|
|
291
|
-
/**
|
|
292
|
-
* Update global linter configuration defaults in project configuration
|
|
293
|
-
*/
|
|
294
|
-
const nxJson = (0, devkit_1.readNxJson)(this.host);
|
|
295
|
-
this.cleanUpGeneratorsConfig(nxJson);
|
|
296
|
-
(0, devkit_1.updateNxJson)(this.host, nxJson);
|
|
297
|
-
/**
|
|
298
|
-
* Update project-level linter configuration defaults in project configuration
|
|
299
|
-
*/
|
|
300
|
-
const projects = (0, devkit_1.getProjects)(this.host);
|
|
301
|
-
for (const [projectName, { generators }] of projects.entries()) {
|
|
302
|
-
if (!generators || Object.keys(generators).length === 0) {
|
|
303
|
-
continue;
|
|
304
|
-
}
|
|
305
|
-
const project = (0, devkit_1.readProjectConfiguration)(this.host, projectName);
|
|
306
|
-
this.cleanUpGeneratorsConfig(project);
|
|
307
|
-
(0, devkit_1.updateProjectConfiguration)(this.host, projectName, project);
|
|
308
|
-
}
|
|
309
|
-
return uninstallTask;
|
|
310
|
-
}
|
|
311
|
-
cleanUpGeneratorsConfig(parentConfig) {
|
|
312
|
-
if (!parentConfig.generators ||
|
|
313
|
-
Object.keys(parentConfig.generators).length === 0) {
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
for (const [collectionName, maybeGeneratorConfig] of Object.entries(parentConfig.generators)) {
|
|
317
|
-
// Shorthand syntax is possible
|
|
318
|
-
if (collectionName.includes(':')) {
|
|
319
|
-
const generatorConfig = maybeGeneratorConfig;
|
|
320
|
-
for (const optionName of Object.keys(generatorConfig)) {
|
|
321
|
-
if (optionName === 'linter') {
|
|
322
|
-
// Default is eslint, so in all cases we can just remove the config altogether
|
|
323
|
-
delete generatorConfig[optionName];
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
// If removing linter leaves no other options in the config, remove the config as well
|
|
327
|
-
if (Object.keys(generatorConfig).length === 0) {
|
|
328
|
-
delete parentConfig.generators[collectionName];
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
else {
|
|
332
|
-
// Not shorthand syntax, so next level down is generator name -> config mapping
|
|
333
|
-
const collectionConfig = maybeGeneratorConfig;
|
|
334
|
-
for (const [generatorName, generatorConfig] of Object.entries(collectionConfig)) {
|
|
335
|
-
if (generatorName === 'convert-tslint-to-eslint') {
|
|
336
|
-
// No longer relevant because of TSLint is being removed the conversion process must be complete
|
|
337
|
-
delete collectionConfig[generatorName];
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
for (const optionName of Object.keys(generatorConfig)) {
|
|
341
|
-
if (optionName === 'linter') {
|
|
342
|
-
// Default is eslint, so in all cases we can just remove the config altogether
|
|
343
|
-
delete generatorConfig[optionName];
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
// If removing linter leaves no other options in the config, remove the generator config as well
|
|
347
|
-
if (Object.keys(generatorConfig).length === 0) {
|
|
348
|
-
delete collectionConfig[generatorName];
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
// If removing the generator leaves no other generators in the config, remove the config as well
|
|
352
|
-
if (parentConfig.generators[collectionName] &&
|
|
353
|
-
Object.keys(parentConfig.generators[collectionName]).length === 0) {
|
|
354
|
-
delete parentConfig.generators[collectionName];
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
// If removing the linter defaults leaves absolutely no generators configuration remaining, remove it
|
|
359
|
-
if (Object.keys(parentConfig.generators).length === 0) {
|
|
360
|
-
delete parentConfig.generators;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* If the project which is the subject of the ProjectConverter instance is an application,
|
|
365
|
-
* figure out its associated e2e project's name.
|
|
366
|
-
*/
|
|
367
|
-
getE2EProjectName() {
|
|
368
|
-
if (this.projectConfig.projectType !== 'application') {
|
|
369
|
-
return null;
|
|
370
|
-
}
|
|
371
|
-
let e2eProjectName = null;
|
|
372
|
-
const projects = (0, devkit_1.getProjects)(this.host);
|
|
373
|
-
for (const [projectName, projectConfig] of projects.entries()) {
|
|
374
|
-
for (const [, targetConfig] of Object.entries(projectConfig.targets)) {
|
|
375
|
-
if (targetConfig.executor === '@nrwl/cypress:cypress') {
|
|
376
|
-
if (targetConfig.options.devServerTarget === `${this.projectName}:serve`) {
|
|
377
|
-
e2eProjectName = projectName;
|
|
378
|
-
devkit_1.logger.info(`Found e2e project for "${this.projectName}" called "${e2eProjectName}", converting that project as well...`);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
return e2eProjectName;
|
|
384
|
-
}
|
|
385
|
-
setDefaults(collectionName, defaults) {
|
|
386
|
-
var _a;
|
|
387
|
-
const nxJson = (0, devkit_1.readNxJson)(this.host);
|
|
388
|
-
nxJson.generators || (nxJson.generators = {});
|
|
389
|
-
(_a = nxJson.generators)[collectionName] || (_a[collectionName] = {});
|
|
390
|
-
const prev = nxJson.generators[collectionName];
|
|
391
|
-
nxJson.generators = Object.assign(Object.assign({}, nxJson.generators), { [collectionName]: Object.assign(Object.assign({}, prev), { 'convert-tslint-to-eslint': Object.assign(Object.assign({}, prev['convert-tslint-to-eslint']), defaults) }) });
|
|
392
|
-
(0, devkit_1.updateNxJson)(this.host, nxJson);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
exports.ProjectConverter = ProjectConverter;
|
|
396
|
-
//# sourceMappingURL=project-converter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-converter.js","sourceRoot":"","sources":["../../../../../../packages/linter/src/utils/convert-tslint-to-eslint/project-converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { Tree, GeneratorCallback } from '@nrwl/devkit';
|
|
2
|
-
import type { Linter } from 'eslint';
|
|
3
|
-
import type { TSLintRuleOptions } from 'tslint-to-eslint-config';
|
|
4
|
-
export declare function ensureESLintPluginsAreInstalled(host: Tree, eslintPluginsToBeInstalled: string[]): GeneratorCallback;
|
|
5
|
-
export declare function convertTSLintConfig(rawTSLintJson: any, tslintJsonPath: string, ignoreExtendsVals: string[]): Promise<{
|
|
6
|
-
convertedESLintConfig: Linter.Config<Linter.RulesRecord, Linter.RulesRecord>;
|
|
7
|
-
unconvertedTSLintRules: TSLintRuleOptions[];
|
|
8
|
-
ensureESLintPlugins: string[];
|
|
9
|
-
}>;
|
|
10
|
-
export declare function deduplicateOverrides(overrides?: Linter.Config['overrides']): any[];
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.deduplicateOverrides = exports.convertTSLintConfig = exports.ensureESLintPluginsAreInstalled = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const devkit_1 = require("@nrwl/devkit");
|
|
6
|
-
const convert_nx_enforce_module_boundaries_rule_1 = require("./convert-nx-enforce-module-boundaries-rule");
|
|
7
|
-
const convert_to_eslint_config_1 = require("./convert-to-eslint-config");
|
|
8
|
-
function ensureESLintPluginsAreInstalled(host, eslintPluginsToBeInstalled) {
|
|
9
|
-
if (!(eslintPluginsToBeInstalled === null || eslintPluginsToBeInstalled === void 0 ? void 0 : eslintPluginsToBeInstalled.length)) {
|
|
10
|
-
return () => undefined;
|
|
11
|
-
}
|
|
12
|
-
const additionalDevDependencies = {};
|
|
13
|
-
for (const pluginName of eslintPluginsToBeInstalled) {
|
|
14
|
-
additionalDevDependencies[pluginName] = 'latest';
|
|
15
|
-
}
|
|
16
|
-
devkit_1.logger.info('\nINFO: To most closely match your tslint.json, we will ensure the `latest` version of the following eslint plugin(s) are installed:');
|
|
17
|
-
devkit_1.logger.info('\n - ' + eslintPluginsToBeInstalled.join('\n - '));
|
|
18
|
-
devkit_1.logger.info('\nPlease note, you may later wish to pin these to a specific version number in your package.json, rather than leaving it open to `latest`.\n');
|
|
19
|
-
return (0, devkit_1.addDependenciesToPackageJson)(host, {}, additionalDevDependencies);
|
|
20
|
-
}
|
|
21
|
-
exports.ensureESLintPluginsAreInstalled = ensureESLintPluginsAreInstalled;
|
|
22
|
-
/**
|
|
23
|
-
* We don't want the user to depend on the TSLint fallback plugin, we will instead
|
|
24
|
-
* explicitly inform them of the rules that could not be converted automatically and
|
|
25
|
-
* advise them on what to do next.
|
|
26
|
-
*/
|
|
27
|
-
function warnInCaseOfUnconvertedRules(tslintConfigPath, unconvertedTSLintRules) {
|
|
28
|
-
const unconvertedTSLintRuleNames = unconvertedTSLintRules
|
|
29
|
-
.filter(
|
|
30
|
-
// Ignore formatting related rules, they are handled by Nx format/prettier
|
|
31
|
-
(unconverted) => !['import-spacing', 'whitespace', 'typedef'].includes(unconverted.ruleName))
|
|
32
|
-
.map((unconverted) => unconverted.ruleName);
|
|
33
|
-
if (unconvertedTSLintRuleNames.length > 0) {
|
|
34
|
-
devkit_1.logger.warn(`\nWARNING: Within "${tslintConfigPath}", the following ${unconvertedTSLintRuleNames.length} rule(s) did not have known converters in https://github.com/typescript-eslint/tslint-to-eslint-config`);
|
|
35
|
-
devkit_1.logger.warn('\n - ' + unconvertedTSLintRuleNames.join('\n - '));
|
|
36
|
-
devkit_1.logger.warn('\nYou will need to decide on how to handle the above manually, but everything else has been handled for you automatically.\n');
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
function convertTSLintConfig(rawTSLintJson, tslintJsonPath, ignoreExtendsVals) {
|
|
40
|
-
var _a;
|
|
41
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
42
|
-
const convertedProject = yield (0, convert_to_eslint_config_1.convertToESLintConfig)(tslintJsonPath, rawTSLintJson, ignoreExtendsVals);
|
|
43
|
-
(_a = convertedProject.convertedESLintConfig).rules || (_a.rules = {});
|
|
44
|
-
/**
|
|
45
|
-
* Apply the custom converter for the nx-module-boundaries rule if applicable
|
|
46
|
-
*/
|
|
47
|
-
const convertedNxRule = (0, convert_nx_enforce_module_boundaries_rule_1.convertTslintNxRuleToEslintNxRule)(rawTSLintJson);
|
|
48
|
-
if (convertedNxRule) {
|
|
49
|
-
convertedProject.convertedESLintConfig.rules[convertedNxRule.ruleName] =
|
|
50
|
-
convertedNxRule.ruleConfig;
|
|
51
|
-
}
|
|
52
|
-
// Remove the `@typescript-eslint/tslint/config` rule
|
|
53
|
-
if (convertedProject.convertedESLintConfig.rules['@typescript-eslint/tslint/config']) {
|
|
54
|
-
delete convertedProject.convertedESLintConfig.rules['@typescript-eslint/tslint/config'];
|
|
55
|
-
}
|
|
56
|
-
warnInCaseOfUnconvertedRules(tslintJsonPath, convertedProject.unconvertedTSLintRules);
|
|
57
|
-
return convertedProject;
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
exports.convertTSLintConfig = convertTSLintConfig;
|
|
61
|
-
function deduplicateOverrides(overrides = []) {
|
|
62
|
-
const map = new Map();
|
|
63
|
-
for (const o of overrides) {
|
|
64
|
-
const mapKey = typeof o.files === 'string' ? o.files : o.files.join(',');
|
|
65
|
-
const existing = map.get(mapKey);
|
|
66
|
-
if (existing) {
|
|
67
|
-
existing.add(o);
|
|
68
|
-
map.set(mapKey, existing);
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
const set = new Set();
|
|
72
|
-
set.add(o);
|
|
73
|
-
map.set(mapKey, set);
|
|
74
|
-
}
|
|
75
|
-
let dedupedOverrides = [];
|
|
76
|
-
for (const [, overrides] of map.entries()) {
|
|
77
|
-
const overridesArr = Array.from(overrides);
|
|
78
|
-
if (overridesArr.length === 1) {
|
|
79
|
-
dedupedOverrides = [...dedupedOverrides, ...overridesArr];
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
82
|
-
let mergedOverride = {};
|
|
83
|
-
for (const o of overridesArr) {
|
|
84
|
-
mergedOverride = Object.assign(Object.assign({}, mergedOverride), o);
|
|
85
|
-
}
|
|
86
|
-
dedupedOverrides.push(mergedOverride);
|
|
87
|
-
}
|
|
88
|
-
return dedupedOverrides;
|
|
89
|
-
}
|
|
90
|
-
exports.deduplicateOverrides = deduplicateOverrides;
|
|
91
|
-
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../packages/linter/src/utils/convert-tslint-to-eslint/utils.ts"],"names":[],"mappings":"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"}
|