From bdd47ef22849beab7c5de10da926c564849d3812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Thu, 16 Mar 2023 23:35:45 +0100 Subject: [PATCH 1/2] Rewrite getPropFromRaw slightly to surface T in the parameters --- src/compiler/commandLineParser.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index ab3909d8e2385..7508c2870407d 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -2974,7 +2974,7 @@ function parseJsonConfigFileContentWorker( }; function getConfigFileSpecs(): ConfigFileSpecs { - const referencesOfRaw = getPropFromRaw("references", element => typeof element === "object", "object"); + const referencesOfRaw = getPropFromRaw("references", (element): element is ProjectReference => typeof element === "object", "object"); const filesSpecs = toPropValue(getSpecsFromRaw("files")); if (filesSpecs) { const hasZeroOrNoReferences = referencesOfRaw === "no-prop" || isArray(referencesOfRaw) && referencesOfRaw.length === 0; @@ -3049,7 +3049,7 @@ function parseJsonConfigFileContentWorker( function getProjectReferences(basePath: string): readonly ProjectReference[] | undefined { let projectReferences: ProjectReference[] | undefined; - const referencesOfRaw = getPropFromRaw("references", element => typeof element === "object", "object"); + const referencesOfRaw = getPropFromRaw("references", (element): element is ProjectReference => typeof element === "object", "object"); if (isArray(referencesOfRaw)) { for (const ref of referencesOfRaw) { if (typeof ref.path !== "string") { @@ -3077,7 +3077,7 @@ function parseJsonConfigFileContentWorker( return getPropFromRaw(prop, isString, "string"); } - function getPropFromRaw(prop: "files" | "include" | "exclude" | "references", validateElement: (value: unknown) => boolean, elementTypeName: string): PropOfRaw { + function getPropFromRaw(prop: "files" | "include" | "exclude" | "references", validateElement: (value: unknown) => value is T, elementTypeName: string): PropOfRaw { if (hasProperty(raw, prop) && !isNullOrUndefined(raw[prop])) { if (isArray(raw[prop])) { const result = raw[prop] as T[]; From 29e6c4818b941df1371c6827d44831a85dce0270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Fri, 17 Mar 2023 08:47:52 +0100 Subject: [PATCH 2/2] Make getPropFromRaw even safer --- src/compiler/commandLineParser.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index 7508c2870407d..0ceebb399cbdb 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -29,7 +29,6 @@ import { emptyArray, endsWith, ensureTrailingDirectorySeparator, - every, Expression, extend, Extension, @@ -2974,7 +2973,7 @@ function parseJsonConfigFileContentWorker( }; function getConfigFileSpecs(): ConfigFileSpecs { - const referencesOfRaw = getPropFromRaw("references", (element): element is ProjectReference => typeof element === "object", "object"); + const referencesOfRaw = getPropFromRaw("references", (element): element is ProjectReference => !!element && typeof element === "object", "object"); const filesSpecs = toPropValue(getSpecsFromRaw("files")); if (filesSpecs) { const hasZeroOrNoReferences = referencesOfRaw === "no-prop" || isArray(referencesOfRaw) && referencesOfRaw.length === 0; @@ -3049,7 +3048,7 @@ function parseJsonConfigFileContentWorker( function getProjectReferences(basePath: string): readonly ProjectReference[] | undefined { let projectReferences: ProjectReference[] | undefined; - const referencesOfRaw = getPropFromRaw("references", (element): element is ProjectReference => typeof element === "object", "object"); + const referencesOfRaw = getPropFromRaw("references", (element): element is ProjectReference => !!element && typeof element === "object", "object"); if (isArray(referencesOfRaw)) { for (const ref of referencesOfRaw) { if (typeof ref.path !== "string") { @@ -3079,9 +3078,10 @@ function parseJsonConfigFileContentWorker( function getPropFromRaw(prop: "files" | "include" | "exclude" | "references", validateElement: (value: unknown) => value is T, elementTypeName: string): PropOfRaw { if (hasProperty(raw, prop) && !isNullOrUndefined(raw[prop])) { - if (isArray(raw[prop])) { - const result = raw[prop] as T[]; - if (!sourceFile && !every(result, validateElement)) { + const value = raw[prop]; + if (isArray(value)) { + const result = filter(value, validateElement); + if (!sourceFile && result.length !== value.length) { errors.push(createCompilerDiagnostic(Diagnostics.Compiler_option_0_requires_a_value_of_type_1, prop, elementTypeName)); } return result;