-
Notifications
You must be signed in to change notification settings - Fork 86
Flip typesVersions #306
Flip typesVersions #306
Changes from all commits
e9fc1df
e3972df
0cfcb79
66136c7
4f88b9e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,13 +2,14 @@ | |
|
||
import { parseTypeScriptVersionLine } from "@definitelytyped/header-parser"; | ||
import { AllTypeScriptVersion, TypeScriptVersion } from "@definitelytyped/typescript-versions"; | ||
import assert = require("assert"); | ||
import { readdir, readFile, stat } from "fs-extra"; | ||
import { basename, dirname, join as joinPaths, resolve } from "path"; | ||
|
||
import { cleanTypeScriptInstalls, installAllTypeScriptVersions, installTypeScriptNext } from "@definitelytyped/utils"; | ||
import { checkPackageJson, checkTsconfig } from "./checks"; | ||
import { checkTslintJson, lint, TsVersion } from "./lint"; | ||
import { assertDefined, last, mapDefinedAsync, withoutPrefix } from "./util"; | ||
import { mapDefinedAsync, withoutPrefix } from "./util"; | ||
|
||
async function main(): Promise<void> { | ||
const args = process.argv.slice(2); | ||
|
@@ -151,61 +152,67 @@ async function runTests( | |
await checkPackageJson(dirPath, typesVersions); | ||
} | ||
|
||
const minVersion = maxVersion( | ||
getMinimumTypeScriptVersionFromComment(indexText), | ||
TypeScriptVersion.lowest) as TypeScriptVersion; | ||
if (onlyTestTsNext || tsLocal) { | ||
const tsVersion = tsLocal ? "local" : TypeScriptVersion.latest; | ||
if (typesVersions.length === 0) { | ||
await testTypesVersion(dirPath, tsVersion, tsVersion, isOlderVersion, dt, indexText, expectOnly, tsLocal); | ||
} else { | ||
const latestTypesVersion = last(typesVersions); | ||
const versionPath = joinPaths(dirPath, `ts${latestTypesVersion}`); | ||
const versionIndexText = await readFile(joinPaths(versionPath, "index.d.ts"), "utf-8"); | ||
await testTypesVersion( | ||
versionPath, tsVersion, tsVersion, | ||
isOlderVersion, dt, versionIndexText, expectOnly, tsLocal, /*inTypesVersionDirectory*/ true); | ||
} | ||
await testTypesVersion(dirPath, tsVersion, tsVersion, isOlderVersion, dt, expectOnly, tsLocal, /*isLatest*/ true); | ||
} else { | ||
await testTypesVersion(dirPath, undefined, getTsVersion(0), isOlderVersion, dt, indexText, expectOnly, undefined); | ||
for (let i = 0; i < typesVersions.length; i++) { | ||
const version = typesVersions[i]; | ||
const versionPath = joinPaths(dirPath, `ts${version}`); | ||
const versionIndexText = await readFile(joinPaths(versionPath, "index.d.ts"), "utf-8"); | ||
await testTypesVersion( | ||
versionPath, version, getTsVersion(i + 1), isOlderVersion, dt, versionIndexText, | ||
expectOnly, undefined, /*inTypesVersionDirectory*/ true); | ||
} | ||
|
||
function getTsVersion(i: number): TsVersion { | ||
return i === typesVersions.length | ||
? TypeScriptVersion.latest | ||
: assertDefined(TypeScriptVersion.previous(typesVersions[i])); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The all-versions code is completely rewritten -- it now generates low/hi ranges and iterates over them. Also, we only care about the |
||
// For example, typesVersions of [3.2, 3.5, 3.6] will have | ||
// associated ts3.2, ts3.5, ts3.6 directories, for | ||
// <=3.2, <=3.5, <=3.6 respectively; the root level is for 3.7 and above. | ||
// so this code needs to generate ranges [lowest-3.2, 3.3-3.5, 3.6-3.6, 3.7-latest] | ||
const lows = [TypeScriptVersion.lowest, ...typesVersions.map(next)]; | ||
const his = [...typesVersions, TypeScriptVersion.latest]; | ||
assert.strictEqual(lows.length, his.length); | ||
for (let i = 0; i < lows.length; i++) { | ||
const low = maxVersion(minVersion, lows[i]); | ||
const hi = his[i]; | ||
assert( | ||
parseFloat(hi) >= parseFloat(low), | ||
`'// Minimum TypeScript Version: ${minVersion}' in header skips ts${hi} folder.`); | ||
const isLatest = hi === TypeScriptVersion.latest; | ||
const versionPath = isLatest ? dirPath : joinPaths(dirPath, `ts${hi}`); | ||
if (lows.length > 1) { | ||
console.log("testing from", low, "to", hi, "in", versionPath); | ||
} | ||
await testTypesVersion(versionPath, low, hi, isOlderVersion, dt, expectOnly, undefined, isLatest); | ||
} | ||
} | ||
} | ||
|
||
function maxVersion(v1: TypeScriptVersion | undefined, v2: TypeScriptVersion): TypeScriptVersion; | ||
function maxVersion(v1: AllTypeScriptVersion | undefined, v2: AllTypeScriptVersion): AllTypeScriptVersion; | ||
function maxVersion(v1: AllTypeScriptVersion | undefined, v2: AllTypeScriptVersion) { | ||
if (!v1) return v2; | ||
if (!v2) return v1; | ||
if (parseFloat(v1) >= parseFloat(v2)) return v1; | ||
return v2; | ||
} | ||
|
||
function next(v: TypeScriptVersion): TypeScriptVersion { | ||
const index = TypeScriptVersion.supported.indexOf(v); | ||
assert.notStrictEqual(index, -1); | ||
assert(index < TypeScriptVersion.supported.length); | ||
return TypeScriptVersion.supported[index + 1]; | ||
} | ||
|
||
async function testTypesVersion( | ||
dirPath: string, | ||
lowVersion: TsVersion | undefined, | ||
maxVersion: TsVersion, | ||
lowVersion: TsVersion, | ||
hiVersion: TsVersion, | ||
isOlderVersion: boolean, | ||
dt: boolean, | ||
indexText: string, | ||
expectOnly: boolean, | ||
tsLocal: string | undefined, | ||
inTypesVersionDirectory?: boolean, | ||
isLatest: boolean, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. testTypesVersion is now called in many fewer places, so I
|
||
): Promise<void> { | ||
const minVersionFromComment = getTypeScriptVersionFromComment(indexText); | ||
if (minVersionFromComment !== undefined && inTypesVersionDirectory) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. headers are already not allowed in subdirectories, so this check isn't needed. |
||
throw new Error(`Already in the \`ts${lowVersion}\` directory, don't need \`// Minimum TypeScript Version\`.`); | ||
} | ||
const minVersion = lowVersion | ||
|| minVersionFromComment && TypeScriptVersion.isSupported(minVersionFromComment) && minVersionFromComment | ||
|| TypeScriptVersion.lowest; | ||
|
||
await checkTslintJson(dirPath, dt); | ||
await checkTsconfig(dirPath, dt | ||
? { relativeBaseUrl: ".." + (isOlderVersion ? "/.." : "") + (inTypesVersionDirectory ? "/.." : "") + "/" } | ||
? { relativeBaseUrl: ".." + (isOlderVersion ? "/.." : "") + (isLatest ? "" : "/..") + "/" } | ||
: undefined); | ||
const err = await lint(dirPath, minVersion, maxVersion, !!inTypesVersionDirectory, expectOnly, tsLocal); | ||
const err = await lint(dirPath, lowVersion, hiVersion, isLatest, expectOnly, tsLocal); | ||
if (err) { | ||
throw new Error(err); | ||
} | ||
|
@@ -237,7 +244,7 @@ function assertPathIsNotBanned(dirPath: string) { | |
} | ||
} | ||
|
||
function getTypeScriptVersionFromComment(text: string): AllTypeScriptVersion | undefined { | ||
function getMinimumTypeScriptVersionFromComment(text: string): AllTypeScriptVersion | undefined { | ||
const match = text.match(/\/\/ (?:Minimum )?TypeScript Version: /); | ||
if (!match) { | ||
return undefined; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the only-next/only-local case is now much simpler because it doesn't have to search for the latest version inside a ts* directory