diff --git a/.eslintrc b/.eslintrc index 43ddf74d8f3..de2a3fc1f1f 100644 --- a/.eslintrc +++ b/.eslintrc @@ -4,7 +4,7 @@ "warnOnUnsupportedTypeScriptVersion": false, "ecmaVersion": 6, "sourceType": "module", - "project": "./src/tsconfig-base.json" + "project": "./tsconfig.eslint.json" }, "env": { "browser": false, @@ -16,11 +16,12 @@ ], "rules": { "@typescript-eslint/adjacent-overload-signatures": "error", - "@typescript-eslint/array-type": "off", + "@typescript-eslint/array-type": ["error", { "default": "array", "readonly": "generic" }], "@typescript-eslint/ban-types": "off", "camelcase": "off", "@typescript-eslint/camelcase": ["error", { "properties": "never", "allow": ["^[A-Za-z][a-zA-Za-z]+_[A-Za-z]+$"] }], "@typescript-eslint/class-name-casing": "error", + "@typescript-eslint/consistent-type-assertions": "off", "@typescript-eslint/consistent-type-definitions": ["error", "interface"], "@typescript-eslint/explicit-member-accessibility": "off", "@typescript-eslint/import/order": "off", @@ -34,13 +35,11 @@ }], "@typescript-eslint/interface-name-prefix": "error", "@typescript-eslint/member-ordering": "off", - "@typescript-eslint/no-angle-bracket-type-assertion": "off", "@typescript-eslint/no-empty-interface": "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-inferrable-types": "error", "@typescript-eslint/no-misused-new": "error", "@typescript-eslint/no-namespace": "off", - "@typescript-eslint/no-object-literal-type-assertion": "off", "@typescript-eslint/no-parameter-properties": "off", "@typescript-eslint/no-this-alias": "error", "@typescript-eslint/no-unnecessary-qualifier": "error", diff --git a/package.json b/package.json index 6e25ee46e19..a5b0fb9ee9c 100644 --- a/package.json +++ b/package.json @@ -54,9 +54,9 @@ "@types/through2": "latest", "@types/travis-fold": "latest", "@types/xml2js": "^0.4.0", - "@typescript-eslint/eslint-plugin": "1.13.0", - "@typescript-eslint/experimental-utils": "1.13.0", - "@typescript-eslint/parser": "1.13.0", + "@typescript-eslint/eslint-plugin": "2.0.0-alpha.4", + "@typescript-eslint/experimental-utils": "2.0.0-alpha.4", + "@typescript-eslint/parser": "2.0.0-alpha.4", "async": "latest", "azure-devops-node-api": "^8.0.0", "browser-resolve": "^1.11.2", @@ -68,7 +68,7 @@ "eslint": "6.1.0", "eslint-formatter-autolinkable-stylish": "1.0.0", "eslint-plugin-import": "2.18.2", - "eslint-plugin-jsdoc": "15.6.1", + "eslint-plugin-jsdoc": "15.7.2", "eslint-plugin-no-null": "1.0.2", "fancy-log": "latest", "fs-extra": "^6.0.1", diff --git a/scripts/errorCheck.ts b/scripts/errorCheck.ts index 8c367d9d0c1..dfd78724115 100644 --- a/scripts/errorCheck.ts +++ b/scripts/errorCheck.ts @@ -20,7 +20,7 @@ fs.readFile("src/compiler/diagnosticMessages.json", "utf-8", (err, data) => { fs.readdir(baseDir, (err, files) => { files = files.filter(f => f.indexOf(".errors.txt") > 0); - const tasks: Array<(callback: () => void) => void> = []; + const tasks: ((callback: () => void) => void)[] = []; files.forEach(f => tasks.push(done => { fs.readFile(baseDir + f, "utf-8", (err, baseline) => { if (err) throw err; diff --git a/src/compiler/builder.ts b/src/compiler/builder.ts index dde62302f78..b29d86dbb46 100644 --- a/src/compiler/builder.ts +++ b/src/compiler/builder.ts @@ -996,7 +996,7 @@ namespace ts { } } - function addToAffectedFilesPendingEmit(state: BuilderProgramState, affectedFilesPendingEmit: readonly Path[]) { + function addToAffectedFilesPendingEmit(state: BuilderProgramState, affectedFilesPendingEmit: ReadonlyArray) { state.affectedFilesPendingEmit = concatenate(state.affectedFilesPendingEmit, affectedFilesPendingEmit); // affectedFilesPendingEmitIndex === undefined // - means the emit state.affectedFilesPendingEmit was undefined before adding current affected files diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index fd0b1dbcece..ebc096143d0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7402,7 +7402,7 @@ namespace ts { setStructuredTypeMembers(type, emptySymbols, callSignatures || emptyArray, constructSignatures || emptyArray, stringIndexInfo, numberIndexInfo); } - function appendSignatures(signatures: Signature[] | undefined, newSignatures: readonly Signature[]) { + function appendSignatures(signatures: Signature[] | undefined, newSignatures: ReadonlyArray) { for (const sig of newSignatures) { if (!signatures || every(signatures, s => !compareSignaturesIdentical(s, sig, /*partialMatch*/ false, /*ignoreThisTypes*/ false, /*ignoreReturnTypes*/ false, compareTypesIdentical))) { signatures = append(signatures, sig); @@ -13226,7 +13226,7 @@ namespace ts { return result; } - function propagateSidebandVarianceFlags(typeArguments: readonly Type[], variances: VarianceFlags[]) { + function propagateSidebandVarianceFlags(typeArguments: ReadonlyArray, variances: VarianceFlags[]) { for (let i = 0; i < variances.length; i++) { const v = variances[i]; if (v & VarianceFlags.Unmeasurable) { @@ -15677,7 +15677,7 @@ namespace ts { } } - function inferFromTypeArguments(sourceTypes: readonly Type[], targetTypes: readonly Type[], variances: readonly VarianceFlags[]) { + function inferFromTypeArguments(sourceTypes: ReadonlyArray, targetTypes: ReadonlyArray, variances: ReadonlyArray) { const count = sourceTypes.length < targetTypes.length ? sourceTypes.length : targetTypes.length; for (let i = 0; i < count; i++) { if (i < variances.length && (variances[i] & VarianceFlags.VarianceMask) === VarianceFlags.Contravariant) { diff --git a/src/compiler/core.ts b/src/compiler/core.ts index f029a74c1e2..5fcec4fdde2 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -2200,13 +2200,13 @@ namespace ts { return result; } - export function cartesianProduct(arrays: readonly T[][]) { + export function cartesianProduct(arrays: ReadonlyArray[]) { const result: T[][] = []; cartesianProductWorker(arrays, result, /*outer*/ undefined, 0); return result; } - function cartesianProductWorker(arrays: readonly (readonly T[])[], result: (readonly T[])[], outer: readonly T[] | undefined, index: number) { + function cartesianProductWorker(arrays: ReadonlyArray>, result: (ReadonlyArray)[], outer: ReadonlyArray | undefined, index: number) { for (const element of arrays[index]) { let inner: T[]; if (outer) { diff --git a/src/compiler/tsbuild.ts b/src/compiler/tsbuild.ts index a4346e02bd1..86c36fe0da8 100644 --- a/src/compiler/tsbuild.ts +++ b/src/compiler/tsbuild.ts @@ -372,7 +372,7 @@ namespace ts { readonly extendedConfigCache: Map; readonly builderPrograms: ConfigFileMap; - readonly diagnostics: ConfigFileMap; + readonly diagnostics: ConfigFileMap>; readonly projectPendingBuild: ConfigFileMap; readonly projectErrorsReported: ConfigFileMap; @@ -380,7 +380,7 @@ namespace ts { readonly moduleResolutionCache: ModuleResolutionCache | undefined; // Mutable state - buildOrder: readonly ResolvedConfigFileName[] | undefined; + buildOrder: ReadonlyArray | undefined; readFileWithCache: (f: string) => string | undefined; projectCompilerOptions: CompilerOptions; cache: SolutionBuilderStateCache | undefined; @@ -524,7 +524,7 @@ namespace ts { return resolveConfigFileProjectName(resolvePath(state.currentDirectory, name)); } - function createBuildOrder(state: SolutionBuilderState, roots: readonly ResolvedConfigFileName[]): readonly ResolvedConfigFileName[] { + function createBuildOrder(state: SolutionBuilderState, roots: ReadonlyArray): ReadonlyArray { const temporaryMarks = createMap() as ConfigFileMap; const permanentMarks = createMap() as ConfigFileMap; const circularityReportStack: string[] = []; @@ -683,7 +683,7 @@ namespace ts { readonly kind: InvalidatedProjectKind; readonly project: ResolvedConfigFileName; /*@internal*/ readonly projectPath: ResolvedConfigFilePath; - /*@internal*/ readonly buildOrder: readonly ResolvedConfigFileName[]; + /*@internal*/ readonly buildOrder: ReadonlyArray; /** * To dispose this project and ensure that all the necessary actions are taken and state is updated accordingly */ @@ -750,7 +750,7 @@ namespace ts { project: ResolvedConfigFileName, projectPath: ResolvedConfigFilePath, config: ParsedCommandLine, - buildOrder: readonly ResolvedConfigFileName[] + buildOrder: ReadonlyArray ): UpdateOutputFileStampsProject { let updateOutputFileStampsPending = true; return { @@ -780,7 +780,7 @@ namespace ts { projectPath: ResolvedConfigFilePath, projectIndex: number, config: ParsedCommandLine, - buildOrder: readonly ResolvedConfigFileName[], + buildOrder: ReadonlyArray, ): BuildInvalidedProject | UpdateBundleProject { enum Step { CreateProgram, @@ -1195,7 +1195,7 @@ namespace ts { function getNextInvalidatedProject( state: SolutionBuilderState, - buildOrder: readonly ResolvedConfigFileName[], + buildOrder: ReadonlyArray, reportQueue: boolean ): InvalidatedProject | undefined { if (!state.projectPendingBuild.size) return undefined; @@ -1631,7 +1631,7 @@ namespace ts { projectPath: ResolvedConfigFilePath, projectIndex: number, config: ParsedCommandLine, - buildOrder: readonly ResolvedConfigFileName[], + buildOrder: ReadonlyArray, buildResult: BuildResultFlags ) { // Queue only if there are no errors @@ -1913,7 +1913,7 @@ namespace ts { ); } - function startWatching(state: SolutionBuilderState, buildOrder: readonly ResolvedConfigFileName[]) { + function startWatching(state: SolutionBuilderState, buildOrder: ReadonlyArray) { if (!state.watchAllProjectsPending) return; state.watchAllProjectsPending = false; for (const resolved of buildOrder) { @@ -1990,7 +1990,7 @@ namespace ts { reportAndStoreErrors(state, proj, [state.configFileCache.get(proj) as Diagnostic]); } - function reportErrorSummary(state: SolutionBuilderState, buildOrder: readonly ResolvedConfigFileName[]) { + function reportErrorSummary(state: SolutionBuilderState, buildOrder: ReadonlyArray) { if (!state.needsSummary || (!state.watch && !state.host.reportErrorSummary)) return; state.needsSummary = false; const { diagnostics } = state; @@ -2014,7 +2014,7 @@ namespace ts { /** * Report the build ordering inferred from the current project graph if we're in verbose mode */ - function reportBuildQueue(state: SolutionBuilderState, buildQueue: readonly ResolvedConfigFileName[]) { + function reportBuildQueue(state: SolutionBuilderState, buildQueue: ReadonlyArray) { if (state.options.verbose) { reportStatus(state, Diagnostics.Projects_in_this_build_Colon_0, buildQueue.map(s => "\r\n * " + relName(state, s)).join("")); } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index cc49c1d5646..8ee12efc875 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -3039,8 +3039,8 @@ namespace ts { /*@internal*/ export interface EmitTransformers { - scriptTransformers: readonly TransformerFactory[]; - declarationTransformers: readonly TransformerFactory[]; + scriptTransformers: ReadonlyArray>; + declarationTransformers: ReadonlyArray>; } export interface SourceMapSpan { @@ -6098,7 +6098,7 @@ namespace ts { (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never; /* @internal */ - type ArgumentDefinitionToFieldUnion[]> = { + type ArgumentDefinitionToFieldUnion>> = { [K in keyof T]: PragmaArgTypeOptional }[Extract]; // The mapped type maps over only the tuple members, but this reindex gets _all_ members - by extracting only `number` keys, we get only the tuple members @@ -6107,7 +6107,7 @@ namespace ts { */ /* @internal */ type PragmaArgumentType = - ConcretePragmaSpecs[KPrag] extends { args: readonly PragmaArgumentSpecification[] } + ConcretePragmaSpecs[KPrag] extends { args: ReadonlyArray> } ? UnionToIntersection> : never; diff --git a/src/lib/es2019.object.d.ts b/src/lib/es2019.object.d.ts index 69b185d7ca9..7d50b6d1508 100644 --- a/src/lib/es2019.object.d.ts +++ b/src/lib/es2019.object.d.ts @@ -11,5 +11,5 @@ interface ObjectConstructor { * Returns an object created by key-value entries for properties and methods * @param entries An iterable object that contains key-value entries for properties and methods. */ - fromEntries(entries: Iterable): any; + fromEntries(entries: Iterable>): any; } diff --git a/src/lib/es5.d.ts b/src/lib/es5.d.ts index dfc23e5b960..bb5b46a13c2 100644 --- a/src/lib/es5.d.ts +++ b/src/lib/es5.d.ts @@ -1341,8 +1341,8 @@ interface ArrayConstructor { (arrayLength?: number): any[]; (arrayLength: number): T[]; (...items: T[]): T[]; - isArray(arg: any): arg is Array; - readonly prototype: Array; + isArray(arg: any): arg is any[]; + readonly prototype: any[]; } declare var Array: ArrayConstructor; diff --git a/src/testRunner/unittests/tsbuild/helpers.ts b/src/testRunner/unittests/tsbuild/helpers.ts index bda5579b706..d0746a0fc27 100644 --- a/src/testRunner/unittests/tsbuild/helpers.ts +++ b/src/testRunner/unittests/tsbuild/helpers.ts @@ -82,13 +82,13 @@ declare const console: { log(msg: any): void; };`; return fs; } - export function verifyOutputsPresent(fs: vfs.FileSystem, outputs: readonly string[]) { + export function verifyOutputsPresent(fs: vfs.FileSystem, outputs: ReadonlyArray) { for (const output of outputs) { assert(fs.existsSync(output), `Expect file ${output} to exist`); } } - export function verifyOutputsAbsent(fs: vfs.FileSystem, outputs: readonly string[]) { + export function verifyOutputsAbsent(fs: vfs.FileSystem, outputs: ReadonlyArray) { for (const output of outputs) { assert.isFalse(fs.existsSync(output), `Expect file ${output} to not exist`); } diff --git a/src/testRunner/unittests/tsbuild/sample.ts b/src/testRunner/unittests/tsbuild/sample.ts index 420c7a468aa..bf56279f169 100644 --- a/src/testRunner/unittests/tsbuild/sample.ts +++ b/src/testRunner/unittests/tsbuild/sample.ts @@ -407,8 +407,8 @@ namespace ts { function verifyBuildNextResult( expected: SolutionBuilderResult | undefined, - presentOutputs: readonly string[], - absentOutputs: readonly string[] + presentOutputs: ReadonlyArray, + absentOutputs: ReadonlyArray ) { const project = builder.getNextInvalidatedProject(); const result = project && project.done(); diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 00000000000..a9a2de7c864 --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,7 @@ +{ + "extends": "./src/tsconfig-base.json", + "include": [ + "src/**/*.ts", + "scripts/**/*.ts", + ] +} \ No newline at end of file