From 9048c0c5879ab89f4855f70579471770e33e8aa7 Mon Sep 17 00:00:00 2001 From: Junyoung Choi Date: Tue, 25 Dec 2018 14:16:13 +0900 Subject: [PATCH 1/3] Modify outDir --- .gitignore | 2 +- package-lock.json | 8 ++++---- package.json | 4 ++-- src/{ => bin}/index.ts | 8 ++++---- tsconfig.json | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) rename src/{ => bin}/index.ts (97%) diff --git a/.gitignore b/.gitignore index 6e36a8e8..6793298c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -bin node_modules typescript-installs +dist diff --git a/package-lock.json b/package-lock.json index 7104d163..b5f4a189 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dtslint", - "version": "0.4.0", + "version": "0.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -361,9 +361,9 @@ } }, "typescript": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.1.tgz", - "integrity": "sha512-jw7P2z/h6aPT4AENXDGjcfHTu5CSqzsbZc6YlUIebTyBAq8XaKp78x7VcSh30xwSCcsu5irZkYZUSFP1MrAMbg==" + "version": "3.3.0-dev.20181218", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.0-dev.20181218.tgz", + "integrity": "sha512-3UkemHFrD3IIoYvcjUCVbhFK+Sf3PTT5uuRJYeorncPChHHWvH8O+aSm8pG5/glBHhKcznhXDRaY0RtCWR1sLA==" }, "universalify": { "version": "0.1.2", diff --git a/package.json b/package.json index 8ba9588e..845a0999 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,8 @@ "dt.json", "dtslint.json" ], - "main": "bin", - "bin": "./bin/index.js", + "main": "dist", + "bin": "./dist/bin/index.js", "contributors": [ "Andy Hanson (https://github.com/andy-ms)", "Dan Vanderkam (https://github.com/danvk)" diff --git a/src/index.ts b/src/bin/index.ts similarity index 97% rename from src/index.ts rename to src/bin/index.ts index 77d91376..4b23e7dd 100644 --- a/src/index.ts +++ b/src/bin/index.ts @@ -3,10 +3,10 @@ import { isTypeScriptVersion, parseTypeScriptVersionLine, TypeScriptVersion } fr import { readdir, readFile, stat } from "fs-extra"; import { basename, dirname, join as joinPaths } from "path"; -import { checkPackageJson, checkTsconfig } from "./checks"; -import { cleanInstalls, installAll } from "./installer"; -import { checkTslintJson, lint, TsVersion } from "./lint"; -import { assertDefined, last, mapDefinedAsync, withoutPrefix } from "./util"; +import { checkPackageJson, checkTsconfig } from "../checks"; +import { cleanInstalls, installAll } from "../installer"; +import { checkTslintJson, lint, TsVersion } from "../lint"; +import { assertDefined, last, mapDefinedAsync, withoutPrefix } from "../util"; async function main(): Promise { const args = process.argv.slice(2); diff --git a/tsconfig.json b/tsconfig.json index 7a4fd814..f89c9202 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "module": "commonjs", "target": "es6", "lib": ["es2017"], - "outDir": "bin", + "outDir": "dist", "sourceMap": true, "newLine": "lf", From 2f73d38272af1e2fc5b7c26fbc5c004cc4d144a1 Mon Sep 17 00:00:00 2001 From: Junyoung Choi Date: Tue, 25 Dec 2018 14:33:00 +0900 Subject: [PATCH 2/3] Update rulesDirectory of tslint.json files for testing --- test/dt-header/correct/tslint.json | 2 +- test/dt-header/wrong/tslint.json | 2 +- test/expect/tslint.json | 2 +- test/export-just-namespace/tslint.json | 2 +- test/no-any-union/tslint.json | 2 +- test/no-bad-reference/tslint.json | 2 +- test/no-const-enum/tslint.json | 2 +- test/no-dead-reference/tslint.json | 2 +- .../bad-ambient-modules/tslint.json | 2 +- .../bad-external-modules/tslint.json | 3 +-- .../good-ambient-modules/tslint.json | 2 +- test/no-padding/tslint.json | 2 +- test/no-redundant-undefined/tslint.json | 2 +- test/no-relative-import-in-test/tslint.json | 2 +- test/no-single-declare-module/tslint.json | 2 +- test/no-single-element-tuple-type/tslint.json | 2 +- test/no-unnecessary-generics/tslint.json | 2 +- test/no-useless-files/tslint.json | 2 +- test/prefer-declare-function/tslint.json | 2 +- test/strict-export-declare-modifiers/tslint.json | 2 +- test/trim-file/tslint.json | 2 +- test/void-return/tslint.json | 2 +- 22 files changed, 22 insertions(+), 23 deletions(-) diff --git a/test/dt-header/correct/tslint.json b/test/dt-header/correct/tslint.json index e43c1125..cea32b63 100644 --- a/test/dt-header/correct/tslint.json +++ b/test/dt-header/correct/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../../bin/rules"], + "rulesDirectory": ["../../../dist/rules"], "rules": { "dt-header": true } diff --git a/test/dt-header/wrong/tslint.json b/test/dt-header/wrong/tslint.json index e43c1125..cea32b63 100644 --- a/test/dt-header/wrong/tslint.json +++ b/test/dt-header/wrong/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../../bin/rules"], + "rulesDirectory": ["../../../dist/rules"], "rules": { "dt-header": true } diff --git a/test/expect/tslint.json b/test/expect/tslint.json index e8646206..3b9861d4 100644 --- a/test/expect/tslint.json +++ b/test/expect/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "expect": true } diff --git a/test/export-just-namespace/tslint.json b/test/export-just-namespace/tslint.json index 5c3ab252..b4635bf6 100644 --- a/test/export-just-namespace/tslint.json +++ b/test/export-just-namespace/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "export-just-namespace": true } diff --git a/test/no-any-union/tslint.json b/test/no-any-union/tslint.json index a6f28f6d..2799a1d8 100644 --- a/test/no-any-union/tslint.json +++ b/test/no-any-union/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "no-any-union": true } diff --git a/test/no-bad-reference/tslint.json b/test/no-bad-reference/tslint.json index 6477de50..de428a0c 100644 --- a/test/no-bad-reference/tslint.json +++ b/test/no-bad-reference/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "no-bad-reference": true } diff --git a/test/no-const-enum/tslint.json b/test/no-const-enum/tslint.json index f301cb1e..af4a9888 100644 --- a/test/no-const-enum/tslint.json +++ b/test/no-const-enum/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "no-const-enum": true } diff --git a/test/no-dead-reference/tslint.json b/test/no-dead-reference/tslint.json index 3d9bb37b..8468ead5 100644 --- a/test/no-dead-reference/tslint.json +++ b/test/no-dead-reference/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "no-dead-reference": true } diff --git a/test/no-import-default-of-export-equals/bad-ambient-modules/tslint.json b/test/no-import-default-of-export-equals/bad-ambient-modules/tslint.json index f4f43559..58016318 100644 --- a/test/no-import-default-of-export-equals/bad-ambient-modules/tslint.json +++ b/test/no-import-default-of-export-equals/bad-ambient-modules/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../../bin/rules"], + "rulesDirectory": ["../../../dist/rules"], "rules": { "no-import-default-of-export-equals": true } diff --git a/test/no-import-default-of-export-equals/bad-external-modules/tslint.json b/test/no-import-default-of-export-equals/bad-external-modules/tslint.json index 42c7451f..9f366bdd 100644 --- a/test/no-import-default-of-export-equals/bad-external-modules/tslint.json +++ b/test/no-import-default-of-export-equals/bad-external-modules/tslint.json @@ -1,7 +1,6 @@ { - "rulesDirectory": ["../../../bin/rules"], + "rulesDirectory": ["../../../dist/rules"], "rules": { "no-import-default-of-export-equals": true } } - \ No newline at end of file diff --git a/test/no-import-default-of-export-equals/good-ambient-modules/tslint.json b/test/no-import-default-of-export-equals/good-ambient-modules/tslint.json index f4f43559..58016318 100644 --- a/test/no-import-default-of-export-equals/good-ambient-modules/tslint.json +++ b/test/no-import-default-of-export-equals/good-ambient-modules/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../../bin/rules"], + "rulesDirectory": ["../../../dist/rules"], "rules": { "no-import-default-of-export-equals": true } diff --git a/test/no-padding/tslint.json b/test/no-padding/tslint.json index e8b7989d..5e60482b 100644 --- a/test/no-padding/tslint.json +++ b/test/no-padding/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "no-padding": true } diff --git a/test/no-redundant-undefined/tslint.json b/test/no-redundant-undefined/tslint.json index 0bda6a48..d24a9554 100644 --- a/test/no-redundant-undefined/tslint.json +++ b/test/no-redundant-undefined/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "no-redundant-undefined": true } diff --git a/test/no-relative-import-in-test/tslint.json b/test/no-relative-import-in-test/tslint.json index 66391a9a..b03fdcdb 100644 --- a/test/no-relative-import-in-test/tslint.json +++ b/test/no-relative-import-in-test/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "no-relative-import-in-test": true } diff --git a/test/no-single-declare-module/tslint.json b/test/no-single-declare-module/tslint.json index 9da0ac73..c6b13c3f 100644 --- a/test/no-single-declare-module/tslint.json +++ b/test/no-single-declare-module/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "no-single-declare-module": true } diff --git a/test/no-single-element-tuple-type/tslint.json b/test/no-single-element-tuple-type/tslint.json index 07abf62e..3b3ab378 100644 --- a/test/no-single-element-tuple-type/tslint.json +++ b/test/no-single-element-tuple-type/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "no-single-element-tuple-type": true } diff --git a/test/no-unnecessary-generics/tslint.json b/test/no-unnecessary-generics/tslint.json index dd1b74a5..0ad24bae 100644 --- a/test/no-unnecessary-generics/tslint.json +++ b/test/no-unnecessary-generics/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "no-unnecessary-generics": true } diff --git a/test/no-useless-files/tslint.json b/test/no-useless-files/tslint.json index 91da4fd1..468af240 100644 --- a/test/no-useless-files/tslint.json +++ b/test/no-useless-files/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "no-useless-files": true } diff --git a/test/prefer-declare-function/tslint.json b/test/prefer-declare-function/tslint.json index 0e67bed5..06473197 100644 --- a/test/prefer-declare-function/tslint.json +++ b/test/prefer-declare-function/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "prefer-declare-function": true } diff --git a/test/strict-export-declare-modifiers/tslint.json b/test/strict-export-declare-modifiers/tslint.json index 466c95a0..ee7a94ac 100644 --- a/test/strict-export-declare-modifiers/tslint.json +++ b/test/strict-export-declare-modifiers/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "strict-export-declare-modifiers": true } diff --git a/test/trim-file/tslint.json b/test/trim-file/tslint.json index 92f3f78e..ac69c1c4 100644 --- a/test/trim-file/tslint.json +++ b/test/trim-file/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "trim-file": true } diff --git a/test/void-return/tslint.json b/test/void-return/tslint.json index 6f223be6..ca7aa6cd 100644 --- a/test/void-return/tslint.json +++ b/test/void-return/tslint.json @@ -1,5 +1,5 @@ { - "rulesDirectory": ["../../bin/rules"], + "rulesDirectory": ["../../dist/rules"], "rules": { "void-return": true } From e82f3b7f79e416d82217b02bc2c55e5011ca21be Mon Sep 17 00:00:00 2001 From: Junyoung Choi Date: Tue, 25 Dec 2018 14:38:42 +0900 Subject: [PATCH 3/3] Extract and expose apis --- src/bin/index.ts | 118 +--------------------------------------------- src/index.ts | 119 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 116 deletions(-) create mode 100644 src/index.ts diff --git a/src/bin/index.ts b/src/bin/index.ts index 5bd0e971..80299cce 100644 --- a/src/bin/index.ts +++ b/src/bin/index.ts @@ -1,12 +1,7 @@ #!/usr/bin/env node -import { isTypeScriptVersion, parseTypeScriptVersionLine, TypeScriptVersion } from "definitelytyped-header-parser"; -import { readdir, readFile, stat } from "fs-extra"; -import { basename, dirname, join as joinPaths } from "path"; +import { join as joinPaths } from "path"; -import { checkPackageJson, checkTsconfig } from "../checks"; -import { cleanInstalls, installAll, installNext } from "../installer"; -import { checkTslintJson, lint, TsVersion } from "../lint"; -import { assertDefined, last, mapDefinedAsync, withoutPrefix } from "../util"; +import { cleanInstalls, installAll, installNext, runTests } from "../"; async function main(): Promise { const args = process.argv.slice(2); @@ -86,115 +81,6 @@ function listen(dirPath: string): void { }); } -async function runTests(dirPath: string, onlyTestTsNext: boolean): Promise { - const isOlderVersion = /^v\d+$/.test(basename(dirPath)); - - const indexText = await readFile(joinPaths(dirPath, "index.d.ts"), "utf-8"); - // If this *is* on DefinitelyTyped, types-publisher will fail if it can't parse the header. - const dt = indexText.includes("// Type definitions for"); - if (dt) { - // Someone may have copied text from DefinitelyTyped to their type definition and included a header, - // so assert that we're really on DefinitelyTyped. - assertPathIsInDefinitelyTyped(dirPath); - } - - const typesVersions = await mapDefinedAsync(await readdir(dirPath), async name => { - if (name === "tsconfig.json" || name === "tslint.json" || name === "tsutils") { return undefined; } - const version = withoutPrefix(name, "ts"); - if (version === undefined || !(await stat(joinPaths(dirPath, name))).isDirectory()) { return undefined; } - - if (!isTypeScriptVersion(version)) { - throw new Error(`There is an entry named ${name}, but ${version} is not a valid TypeScript version.`); - } - if (!TypeScriptVersion.isRedirectable(version)) { - throw new Error(`At ${dirPath}/${name}: TypeScript version directories only available starting with ts3.1.`); - } - return version; - }); - - if (dt) { - await checkPackageJson(dirPath, typesVersions); - } - - if (onlyTestTsNext) { - if (typesVersions.length === 0) { - await testTypesVersion(dirPath, "next", "next", isOlderVersion, dt, indexText); - } 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, "next", "next", isOlderVersion, dt, versionIndexText); - } - } else { - await testTypesVersion(dirPath, undefined, getTsVersion(0), isOlderVersion, dt, indexText); - 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, - /*inTypesVersionDirectory*/ true); - } - - function getTsVersion(i: number): TsVersion { - return i === typesVersions.length ? "next" : assertDefined(TypeScriptVersion.previous(typesVersions[i])); - } - } -} - -async function testTypesVersion( - dirPath: string, - lowVersion: TsVersion | undefined, - maxVersion: TsVersion, - isOlderVersion: boolean, - dt: boolean, - indexText: string, - inTypesVersionDirectory?: boolean, -): Promise { - const minVersionFromComment = getTypeScriptVersionFromComment(indexText); - if (minVersionFromComment !== undefined && inTypesVersionDirectory) { - throw new Error(`Already in the \`ts${lowVersion}\` directory, don't need \`// TypeScript Version\`.`); - } - if (minVersionFromComment !== undefined && TypeScriptVersion.isRedirectable(minVersionFromComment)) { - throw new Error(`Don't use \`// TypeScript Version\` for newer TS versions, use typesVerisons instead.`); - } - const minVersion = lowVersion || minVersionFromComment || TypeScriptVersion.lowest; - - await checkTslintJson(dirPath, dt); - await checkTsconfig(dirPath, dt - ? { relativeBaseUrl: ".." + (isOlderVersion ? "/.." : "") + (inTypesVersionDirectory ? "/.." : "") + "/" } - : undefined); - const err = await lint(dirPath, minVersion, maxVersion, !!inTypesVersionDirectory); - if (err) { - throw new Error(err); - } -} - -function assertPathIsInDefinitelyTyped(dirPath: string): void { - const parent = dirname(dirPath); - const types = /^v\d+$/.test(basename(dirPath)) ? dirname(parent) : parent; - const dt = dirname(types); - if (basename(dt) !== "DefinitelyTyped" || basename(types) !== "types") { - throw new Error("Since this type definition includes a header (a comment starting with `// Type definitions for`), " - + "assumed this was a DefinitelyTyped package.\n" - + "But it is not in a `DefinitelyTyped/types/xxx` directory."); - } -} - -function getTypeScriptVersionFromComment(text: string): TypeScriptVersion | undefined { - const searchString = "// TypeScript Version: "; - const x = text.indexOf(searchString); - if (x === -1) { - return undefined; - } - - let line = text.slice(x, text.indexOf("\n", x)); - if (line.endsWith("\r")) { - line = line.slice(0, line.length - 1); - } - return parseTypeScriptVersionLine(line); -} - if (!module.parent) { main().catch(err => { console.error(err.stack); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..de2b3063 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,119 @@ +#!/usr/bin/env node +import { isTypeScriptVersion, parseTypeScriptVersionLine, TypeScriptVersion } from "definitelytyped-header-parser"; +import { readdir, readFile, stat } from "fs-extra"; +import { basename, dirname, join as joinPaths } from "path"; + +import { checkPackageJson, checkTsconfig } from "./checks"; +import { checkTslintJson, lint, TsVersion } from "./lint"; +import { assertDefined, last, mapDefinedAsync, withoutPrefix } from "./util"; + +export { cleanInstalls, installAll, installNext } from "./installer"; + +export async function runTests(dirPath: string, onlyTestTsNext: boolean): Promise { + const isOlderVersion = /^v\d+$/.test(basename(dirPath)); + + const indexText = await readFile(joinPaths(dirPath, "index.d.ts"), "utf-8"); + // If this *is* on DefinitelyTyped, types-publisher will fail if it can't parse the header. + const dt = indexText.includes("// Type definitions for"); + if (dt) { + // Someone may have copied text from DefinitelyTyped to their type definition and included a header, + // so assert that we're really on DefinitelyTyped. + assertPathIsInDefinitelyTyped(dirPath); + } + + const typesVersions = await mapDefinedAsync(await readdir(dirPath), async name => { + if (name === "tsconfig.json" || name === "tslint.json" || name === "tsutils") { return undefined; } + const version = withoutPrefix(name, "ts"); + if (version === undefined || !(await stat(joinPaths(dirPath, name))).isDirectory()) { return undefined; } + + if (!isTypeScriptVersion(version)) { + throw new Error(`There is an entry named ${name}, but ${version} is not a valid TypeScript version.`); + } + if (!TypeScriptVersion.isRedirectable(version)) { + throw new Error(`At ${dirPath}/${name}: TypeScript version directories only available starting with ts3.1.`); + } + return version; + }); + + if (dt) { + await checkPackageJson(dirPath, typesVersions); + } + + if (onlyTestTsNext) { + if (typesVersions.length === 0) { + await testTypesVersion(dirPath, "next", "next", isOlderVersion, dt, indexText); + } 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, "next", "next", isOlderVersion, dt, versionIndexText); + } + } else { + await testTypesVersion(dirPath, undefined, getTsVersion(0), isOlderVersion, dt, indexText); + 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, + /*inTypesVersionDirectory*/ true); + } + + function getTsVersion(i: number): TsVersion { + return i === typesVersions.length ? "next" : assertDefined(TypeScriptVersion.previous(typesVersions[i])); + } + } +} + +async function testTypesVersion( + dirPath: string, + lowVersion: TsVersion | undefined, + maxVersion: TsVersion, + isOlderVersion: boolean, + dt: boolean, + indexText: string, + inTypesVersionDirectory?: boolean, +): Promise { + const minVersionFromComment = getTypeScriptVersionFromComment(indexText); + if (minVersionFromComment !== undefined && inTypesVersionDirectory) { + throw new Error(`Already in the \`ts${lowVersion}\` directory, don't need \`// TypeScript Version\`.`); + } + if (minVersionFromComment !== undefined && TypeScriptVersion.isRedirectable(minVersionFromComment)) { + throw new Error(`Don't use \`// TypeScript Version\` for newer TS versions, use typesVerisons instead.`); + } + const minVersion = lowVersion || minVersionFromComment || TypeScriptVersion.lowest; + + await checkTslintJson(dirPath, dt); + await checkTsconfig(dirPath, dt + ? { relativeBaseUrl: ".." + (isOlderVersion ? "/.." : "") + (inTypesVersionDirectory ? "/.." : "") + "/" } + : undefined); + const err = await lint(dirPath, minVersion, maxVersion, !!inTypesVersionDirectory); + if (err) { + throw new Error(err); + } +} + +function assertPathIsInDefinitelyTyped(dirPath: string): void { + const parent = dirname(dirPath); + const types = /^v\d+$/.test(basename(dirPath)) ? dirname(parent) : parent; + const dt = dirname(types); + if (basename(dt) !== "DefinitelyTyped" || basename(types) !== "types") { + throw new Error("Since this type definition includes a header (a comment starting with `// Type definitions for`), " + + "assumed this was a DefinitelyTyped package.\n" + + "But it is not in a `DefinitelyTyped/types/xxx` directory."); + } +} + +function getTypeScriptVersionFromComment(text: string): TypeScriptVersion | undefined { + const searchString = "// TypeScript Version: "; + const x = text.indexOf(searchString); + if (x === -1) { + return undefined; + } + + let line = text.slice(x, text.indexOf("\n", x)); + if (line.endsWith("\r")) { + line = line.slice(0, line.length - 1); + } + return parseTypeScriptVersionLine(line); +}