Skip to content

Commit d67a4bf

Browse files
committed
feat(@angular-devkit/schematics): allow tslintfix task on files
Before we only allowed tsconfig files (with includes added). This is necessary for the lint fixing for schematics to target specific files. Also added a feature that look for the tslint.json file if no tslint.json file or configuration object was passed. Skipping the first argument to the task constructor will look for the tslint closest to EVERY files being linted.
1 parent c45e778 commit d67a4bf

File tree

3 files changed

+43
-22
lines changed

3 files changed

+43
-22
lines changed

packages/angular_devkit/schematics/tasks/tslint-fix/executor.ts

+18-6
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ function _loadConfiguration(
3131
if (options.tslintConfig) {
3232
return Configuration.parseConfigFile(options.tslintConfig, root);
3333
} else if (options.tslintPath) {
34-
const tslintPath = path.join(root, options.tslintPath);
35-
36-
return Configuration.findConfiguration(tslintPath, file && path.join(root, file)).results;
34+
return Configuration.findConfiguration(path.join(root, options.tslintPath)).results;
35+
} else if (file) {
36+
return Configuration.findConfiguration(null, file).results;
3737
} else {
3838
throw new Error('Executor must specify a tslint configuration.');
3939
}
@@ -103,13 +103,18 @@ export default function(): TaskExecutor<TslintFixTaskOptions> {
103103
? options.includes
104104
: (options.includes ? [options.includes] : [])
105105
);
106+
const files = (
107+
Array.isArray(options.files)
108+
? options.files
109+
: (options.files ? [options.files] : [])
110+
);
106111

107112
const Linter = tslint.Linter as LinterT;
108113
const Configuration = tslint.Configuration as ConfigurationT;
109114
let program: ts.Program | undefined = undefined;
110-
let filesToLint: string[] = [];
115+
let filesToLint: string[] = files;
111116

112-
if (options.tsConfigPath) {
117+
if (options.tsConfigPath && files.length == 0) {
113118
const tsConfigPath = path.join(process.cwd(), options.tsConfigPath);
114119

115120
if (!fs.existsSync(tsConfigPath)) {
@@ -148,9 +153,16 @@ export default function(): TaskExecutor<TslintFixTaskOptions> {
148153
};
149154

150155
const linter = new Linter(lintOptions, program);
151-
const config = _loadConfiguration(Configuration, options, root);
156+
// If directory doesn't change, we
157+
let lastDirectory: string | null = null;
158+
let config;
152159

153160
for (const file of filesToLint) {
161+
const dir = path.dirname(file);
162+
if (lastDirectory !== dir) {
163+
lastDirectory = dir;
164+
config = _loadConfiguration(Configuration, options, root, file);
165+
}
154166
const content = _getFileContent(file, options, program);
155167

156168
if (!content) {

packages/angular_devkit/schematics/tasks/tslint-fix/options.ts

+4-10
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,10 @@ export interface TslintFixTaskOptionsBase {
1717
ignoreErrors?: boolean;
1818

1919
includes?: string | string[];
20-
}
21-
22-
export interface TslintFixTaskOptionsPath extends TslintFixTaskOptionsBase {
23-
tslintPath: string;
24-
tslintConfig?: never;
25-
}
20+
files?: string | string[];
2621

27-
export interface TslintFixTaskOptionsConfig extends TslintFixTaskOptionsBase {
28-
tslintPath?: never;
29-
tslintConfig: JsonObject;
22+
tslintPath?: string;
23+
tslintConfig?: JsonObject;
3024
}
3125

32-
export type TslintFixTaskOptions = TslintFixTaskOptionsPath | TslintFixTaskOptionsConfig;
26+
export type TslintFixTaskOptions = TslintFixTaskOptionsBase;

packages/angular_devkit/schematics/tasks/tslint-fix/task.ts

+21-6
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,34 @@ import { TslintFixName, TslintFixTaskOptions, TslintFixTaskOptionsBase } from '.
1111

1212

1313
export class TslintFixTask implements TaskConfigurationGenerator<TslintFixTaskOptions> {
14+
protected _configOrPath: null | string | JsonObject;
15+
protected _options: TslintFixTaskOptionsBase;
16+
1417
constructor(config: JsonObject, options: TslintFixTaskOptionsBase);
18+
constructor(options: TslintFixTaskOptionsBase);
1519
constructor(path: string, options: TslintFixTaskOptionsBase);
1620
constructor(
17-
protected _configOrPath: string | JsonObject,
18-
protected _options: TslintFixTaskOptionsBase,
19-
) {}
21+
configOrPath: string | JsonObject | TslintFixTaskOptionsBase,
22+
options?: TslintFixTaskOptionsBase,
23+
) {
24+
if (options) {
25+
this._configOrPath = configOrPath as string | JsonObject;
26+
this._options = options;
27+
} else {
28+
this._options = configOrPath as TslintFixTaskOptionsBase;
29+
this._configOrPath = null;
30+
}
31+
}
2032

2133
toConfiguration(): TaskConfiguration<TslintFixTaskOptions> {
34+
const path = typeof this._configOrPath == 'string' ? { tslintPath: this._configOrPath } : {};
35+
const config = typeof this._configOrPath == 'object' && this._configOrPath !== null
36+
? { tslintConfig: this._configOrPath }
37+
: {};
2238
const options = {
2339
...this._options,
24-
...((typeof this._configOrPath == 'string'
25-
? { tslintPath: this._configOrPath }
26-
: { tslintConfig: this._configOrPath })),
40+
...path,
41+
...config,
2742
};
2843

2944
return { name: TslintFixName, options };

0 commit comments

Comments
 (0)