@definitelytyped/dtslint 0.0.95 → 0.0.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/src/checks.d.ts +7 -0
- package/bin/src/checks.js +133 -0
- package/bin/src/checks.js.map +1 -0
- package/bin/src/index.d.ts +2 -0
- package/bin/src/index.js +233 -0
- package/bin/src/index.js.map +1 -0
- package/bin/src/lint.d.ts +6 -0
- package/bin/src/lint.js +194 -0
- package/bin/src/lint.js.map +1 -0
- package/bin/src/rules/dtHeaderRule.d.ts +6 -0
- package/bin/src/rules/dtHeaderRule.js +62 -0
- package/bin/src/rules/dtHeaderRule.js.map +1 -0
- package/bin/src/rules/expectRule.d.ts +23 -0
- package/bin/src/rules/expectRule.js +346 -0
- package/bin/src/rules/expectRule.js.map +1 -0
- package/bin/src/rules/exportJustNamespaceRule.d.ts +7 -0
- package/bin/src/rules/exportJustNamespaceRule.js +105 -0
- package/bin/src/rules/exportJustNamespaceRule.js.map +1 -0
- package/bin/src/rules/noAnyUnionRule.d.ts +7 -0
- package/bin/src/rules/noAnyUnionRule.js +49 -0
- package/bin/src/rules/noAnyUnionRule.js.map +1 -0
- package/bin/src/rules/noBadReferenceRule.d.ts +8 -0
- package/bin/src/rules/noBadReferenceRule.js +54 -0
- package/bin/src/rules/noBadReferenceRule.js.map +1 -0
- package/bin/src/rules/noConstEnumRule.d.ts +7 -0
- package/bin/src/rules/noConstEnumRule.js +51 -0
- package/bin/src/rules/noConstEnumRule.js.map +1 -0
- package/bin/src/rules/noDeadReferenceRule.d.ts +7 -0
- package/bin/src/rules/noDeadReferenceRule.js +62 -0
- package/bin/src/rules/noDeadReferenceRule.js.map +1 -0
- package/bin/src/rules/noDeclareCurrentPackageRule.d.ts +6 -0
- package/bin/src/rules/noDeclareCurrentPackageRule.js +56 -0
- package/bin/src/rules/noDeclareCurrentPackageRule.js.map +1 -0
- package/bin/src/rules/noImportDefaultOfExportEqualsRule.d.ts +7 -0
- package/bin/src/rules/noImportDefaultOfExportEqualsRule.js +71 -0
- package/bin/src/rules/noImportDefaultOfExportEqualsRule.js.map +1 -0
- package/bin/src/rules/noOutsideDependenciesRule.d.ts +6 -0
- package/bin/src/rules/noOutsideDependenciesRule.js +52 -0
- package/bin/src/rules/noOutsideDependenciesRule.js.map +1 -0
- package/bin/src/rules/noPaddingRule.d.ts +7 -0
- package/bin/src/rules/noPaddingRule.js +98 -0
- package/bin/src/rules/noPaddingRule.js.map +1 -0
- package/bin/src/rules/noRedundantJsdoc2Rule.d.ts +10 -0
- package/bin/src/rules/noRedundantJsdoc2Rule.js +245 -0
- package/bin/src/rules/noRedundantJsdoc2Rule.js.map +1 -0
- package/bin/src/rules/noRelativeImportInTestRule.d.ts +11 -0
- package/bin/src/rules/noRelativeImportInTestRule.js +60 -0
- package/bin/src/rules/noRelativeImportInTestRule.js.map +1 -0
- package/bin/src/rules/noSelfImportRule.d.ts +6 -0
- package/bin/src/rules/noSelfImportRule.js +51 -0
- package/bin/src/rules/noSelfImportRule.js.map +1 -0
- package/bin/src/rules/noSingleDeclareModuleRule.d.ts +7 -0
- package/bin/src/rules/noSingleDeclareModuleRule.js +68 -0
- package/bin/src/rules/noSingleDeclareModuleRule.js.map +1 -0
- package/bin/src/rules/noSingleElementTupleTypeRule.d.ts +6 -0
- package/bin/src/rules/noSingleElementTupleTypeRule.js +50 -0
- package/bin/src/rules/noSingleElementTupleTypeRule.js.map +1 -0
- package/bin/src/rules/noUnnecessaryGenericsRule.d.ts +8 -0
- package/bin/src/rules/noUnnecessaryGenericsRule.js +130 -0
- package/bin/src/rules/noUnnecessaryGenericsRule.js.map +1 -0
- package/bin/src/rules/noUselessFilesRule.d.ts +7 -0
- package/bin/src/rules/noUselessFilesRule.js +46 -0
- package/bin/src/rules/noUselessFilesRule.js.map +1 -0
- package/bin/src/rules/npmNamingRule.d.ts +21 -0
- package/bin/src/rules/npmNamingRule.js +291 -0
- package/bin/src/rules/npmNamingRule.js.map +1 -0
- package/bin/src/rules/preferDeclareFunctionRule.d.ts +7 -0
- package/bin/src/rules/preferDeclareFunctionRule.js +52 -0
- package/bin/src/rules/preferDeclareFunctionRule.js.map +1 -0
- package/bin/src/rules/redundantUndefinedRule.d.ts +6 -0
- package/bin/src/rules/redundantUndefinedRule.js +55 -0
- package/bin/src/rules/redundantUndefinedRule.js.map +1 -0
- package/bin/src/rules/strictExportDeclareModifiersRule.d.ts +6 -0
- package/bin/src/rules/strictExportDeclareModifiersRule.js +162 -0
- package/bin/src/rules/strictExportDeclareModifiersRule.js.map +1 -0
- package/bin/src/rules/trimFileRule.d.ts +8 -0
- package/bin/src/rules/trimFileRule.js +51 -0
- package/bin/src/rules/trimFileRule.js.map +1 -0
- package/bin/src/rules/voidReturnRule.d.ts +7 -0
- package/bin/src/rules/voidReturnRule.js +85 -0
- package/bin/src/rules/voidReturnRule.js.map +1 -0
- package/bin/src/suggestions.d.ts +12 -0
- package/bin/src/suggestions.js +62 -0
- package/bin/src/suggestions.js.map +1 -0
- package/bin/src/updateConfig.d.ts +1 -0
- package/bin/src/updateConfig.js +220 -0
- package/bin/src/updateConfig.js.map +1 -0
- package/bin/src/util.d.ts +12 -0
- package/bin/src/util.js +130 -0
- package/bin/src/util.js.map +1 -0
- package/bin/tsconfig.tsbuildinfo +1 -0
- package/dtslint-expect-only.json +1 -1
- package/dtslint.json +1 -1
- package/package.json +7 -6
package/README.md
CHANGED
|
@@ -154,7 +154,7 @@ npm run watch
|
|
|
154
154
|
## Test
|
|
155
155
|
|
|
156
156
|
Use `npm run test` to run all tests.
|
|
157
|
-
To run a single test: `node node_modules/tslint/bin/tslint --rules-dir bin/rules --test test/expect`.
|
|
157
|
+
To run a single test: `node node_modules/tslint/bin/tslint --rules-dir bin/src/rules --test test/expect`.
|
|
158
158
|
|
|
159
159
|
## Publish
|
|
160
160
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TypeScriptVersion } from "@definitelytyped/typescript-versions";
|
|
2
|
+
export declare function checkPackageJson(dirPath: string, typesVersions: readonly TypeScriptVersion[]): Promise<void>;
|
|
3
|
+
export interface DefinitelyTypedInfo {
|
|
4
|
+
/** "../" or "../../" or "../../../". This should use '/' even on windows. */
|
|
5
|
+
readonly relativeBaseUrl: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function checkTsconfig(dirPath: string, dt: DefinitelyTypedInfo | undefined): Promise<void>;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkTsconfig = exports.checkPackageJson = void 0;
|
|
4
|
+
const header_parser_1 = require("@definitelytyped/header-parser");
|
|
5
|
+
const assert = require("assert");
|
|
6
|
+
const fs_extra_1 = require("fs-extra");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const util_1 = require("./util");
|
|
9
|
+
async function checkPackageJson(dirPath, typesVersions) {
|
|
10
|
+
const pkgJsonPath = path_1.join(dirPath, "package.json");
|
|
11
|
+
const needsTypesVersions = typesVersions.length !== 0;
|
|
12
|
+
if (!(await fs_extra_1.pathExists(pkgJsonPath))) {
|
|
13
|
+
if (needsTypesVersions) {
|
|
14
|
+
throw new Error(`${dirPath}: Must have 'package.json' for "typesVersions"`);
|
|
15
|
+
}
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const pkgJson = (await util_1.readJson(pkgJsonPath));
|
|
19
|
+
if (pkgJson.private !== true) {
|
|
20
|
+
throw new Error(`${pkgJsonPath} should set \`"private": true\``);
|
|
21
|
+
}
|
|
22
|
+
if (needsTypesVersions) {
|
|
23
|
+
assert.strictEqual(pkgJson.types, "index", `"types" in '${pkgJsonPath}' should be "index".`);
|
|
24
|
+
const expected = header_parser_1.makeTypesVersionsForPackageJson(typesVersions);
|
|
25
|
+
assert.deepEqual(pkgJson.typesVersions, expected, `"typesVersions" in '${pkgJsonPath}' is not set right. Should be: ${JSON.stringify(expected, undefined, 4)}`);
|
|
26
|
+
}
|
|
27
|
+
for (const key in pkgJson) {
|
|
28
|
+
// tslint:disable-line forin
|
|
29
|
+
switch (key) {
|
|
30
|
+
case "private":
|
|
31
|
+
case "dependencies":
|
|
32
|
+
case "license":
|
|
33
|
+
case "imports":
|
|
34
|
+
case "exports":
|
|
35
|
+
case "type":
|
|
36
|
+
// "private"/"typesVersions"/"types" checked above, "dependencies" / "license" checked by types-publisher,
|
|
37
|
+
break;
|
|
38
|
+
case "typesVersions":
|
|
39
|
+
case "types":
|
|
40
|
+
if (!needsTypesVersions) {
|
|
41
|
+
throw new Error(`${pkgJsonPath} doesn't need to set "${key}" when no 'ts3.x' directories exist.`);
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
default:
|
|
45
|
+
throw new Error(`${pkgJsonPath} should not include field ${key}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.checkPackageJson = checkPackageJson;
|
|
50
|
+
async function checkTsconfig(dirPath, dt) {
|
|
51
|
+
const options = await util_1.getCompilerOptions(dirPath);
|
|
52
|
+
if (dt) {
|
|
53
|
+
const { relativeBaseUrl } = dt;
|
|
54
|
+
const mustHave = {
|
|
55
|
+
module: "commonjs",
|
|
56
|
+
noEmit: true,
|
|
57
|
+
forceConsistentCasingInFileNames: true,
|
|
58
|
+
baseUrl: relativeBaseUrl,
|
|
59
|
+
typeRoots: [relativeBaseUrl],
|
|
60
|
+
types: []
|
|
61
|
+
};
|
|
62
|
+
for (const key of Object.getOwnPropertyNames(mustHave)) {
|
|
63
|
+
const expected = mustHave[key];
|
|
64
|
+
const actual = options[key];
|
|
65
|
+
if (!deepEquals(expected, actual)) {
|
|
66
|
+
throw new Error(`Expected compilerOptions[${JSON.stringify(key)}] === ${JSON.stringify(expected)}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
for (const key in options) {
|
|
70
|
+
// tslint:disable-line forin
|
|
71
|
+
switch (key) {
|
|
72
|
+
case "lib":
|
|
73
|
+
case "noImplicitAny":
|
|
74
|
+
case "noImplicitThis":
|
|
75
|
+
case "strict":
|
|
76
|
+
case "strictNullChecks":
|
|
77
|
+
case "noUncheckedIndexedAccess":
|
|
78
|
+
case "strictFunctionTypes":
|
|
79
|
+
case "esModuleInterop":
|
|
80
|
+
case "allowSyntheticDefaultImports":
|
|
81
|
+
// Allow any value
|
|
82
|
+
break;
|
|
83
|
+
case "target":
|
|
84
|
+
case "paths":
|
|
85
|
+
case "jsx":
|
|
86
|
+
case "jsxFactory":
|
|
87
|
+
case "experimentalDecorators":
|
|
88
|
+
case "noUnusedLocals":
|
|
89
|
+
case "noUnusedParameters":
|
|
90
|
+
// OK. "paths" checked further by types-publisher
|
|
91
|
+
break;
|
|
92
|
+
default:
|
|
93
|
+
if (!(key in mustHave)) {
|
|
94
|
+
throw new Error(`Unexpected compiler option ${key}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (!("lib" in options)) {
|
|
100
|
+
throw new Error('Must specify "lib", usually to `"lib": ["es6"]` or `"lib": ["es6", "dom"]`.');
|
|
101
|
+
}
|
|
102
|
+
if ("strict" in options) {
|
|
103
|
+
if (options.strict !== true) {
|
|
104
|
+
throw new Error('When "strict" is present, it must be set to `true`.');
|
|
105
|
+
}
|
|
106
|
+
for (const key of ["noImplicitAny", "noImplicitThis", "strictNullChecks", "strictFunctionTypes"]) {
|
|
107
|
+
if (key in options) {
|
|
108
|
+
throw new TypeError(`Expected "${key}" to not be set when "strict" is \`true\`.`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
for (const key of ["noImplicitAny", "noImplicitThis", "strictNullChecks", "strictFunctionTypes"]) {
|
|
114
|
+
if (!(key in options)) {
|
|
115
|
+
throw new Error(`Expected \`"${key}": true\` or \`"${key}": false\`.`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (options.types && options.types.length) {
|
|
120
|
+
throw new Error('Use `/// <reference types="..." />` directives in source files and ensure ' +
|
|
121
|
+
'that the "types" field in your tsconfig is an empty array.');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.checkTsconfig = checkTsconfig;
|
|
125
|
+
function deepEquals(expected, actual) {
|
|
126
|
+
if (expected instanceof Array) {
|
|
127
|
+
return (actual instanceof Array && actual.length === expected.length && expected.every((e, i) => deepEquals(e, actual[i])));
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
return expected === actual;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/checks.ts"],"names":[],"mappings":"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"}
|
package/bin/src/index.js
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const header_parser_1 = require("@definitelytyped/header-parser");
|
|
5
|
+
const typescript_versions_1 = require("@definitelytyped/typescript-versions");
|
|
6
|
+
const assert = require("assert");
|
|
7
|
+
const fs_extra_1 = require("fs-extra");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const utils_1 = require("@definitelytyped/utils");
|
|
10
|
+
const checks_1 = require("./checks");
|
|
11
|
+
const lint_1 = require("./lint");
|
|
12
|
+
const util_1 = require("./util");
|
|
13
|
+
async function main() {
|
|
14
|
+
const args = process.argv.slice(2);
|
|
15
|
+
let dirPath = process.cwd();
|
|
16
|
+
let onlyTestTsNext = false;
|
|
17
|
+
let expectOnly = false;
|
|
18
|
+
let shouldListen = false;
|
|
19
|
+
let lookingForTsLocal = false;
|
|
20
|
+
let tsLocal;
|
|
21
|
+
for (const arg of args) {
|
|
22
|
+
if (lookingForTsLocal) {
|
|
23
|
+
if (arg.startsWith("--")) {
|
|
24
|
+
throw new Error("Looking for local path for TS, but got " + arg);
|
|
25
|
+
}
|
|
26
|
+
tsLocal = path_1.resolve(arg);
|
|
27
|
+
lookingForTsLocal = false;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
switch (arg) {
|
|
31
|
+
case "--installAll":
|
|
32
|
+
console.log("Cleaning old installs and installing for all TypeScript versions...");
|
|
33
|
+
console.log("Working...");
|
|
34
|
+
await utils_1.cleanTypeScriptInstalls();
|
|
35
|
+
await utils_1.installAllTypeScriptVersions();
|
|
36
|
+
return;
|
|
37
|
+
case "--localTs":
|
|
38
|
+
lookingForTsLocal = true;
|
|
39
|
+
break;
|
|
40
|
+
case "--version":
|
|
41
|
+
console.log(require("../package.json").version);
|
|
42
|
+
return;
|
|
43
|
+
case "--expectOnly":
|
|
44
|
+
expectOnly = true;
|
|
45
|
+
break;
|
|
46
|
+
case "--onlyTestTsNext":
|
|
47
|
+
onlyTestTsNext = true;
|
|
48
|
+
break;
|
|
49
|
+
// Only for use by types-publisher.
|
|
50
|
+
// Listens for { path, onlyTestTsNext } messages and ouputs { path, status }.
|
|
51
|
+
case "--listen":
|
|
52
|
+
shouldListen = true;
|
|
53
|
+
break;
|
|
54
|
+
default: {
|
|
55
|
+
if (arg.startsWith("--")) {
|
|
56
|
+
console.error(`Unknown option '${arg}'`);
|
|
57
|
+
usage();
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
const path = arg.indexOf("@") === 0 && arg.indexOf("/") !== -1
|
|
61
|
+
? // we have a scoped module, e.g. @bla/foo
|
|
62
|
+
// which should be converted to bla__foo
|
|
63
|
+
arg.substr(1).replace("/", "__")
|
|
64
|
+
: arg;
|
|
65
|
+
dirPath = path_1.join(dirPath, path);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (lookingForTsLocal) {
|
|
70
|
+
throw new Error("Path for --localTs was not provided.");
|
|
71
|
+
}
|
|
72
|
+
if (shouldListen) {
|
|
73
|
+
listen(dirPath, tsLocal, onlyTestTsNext);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
await installTypeScriptAsNeeded(tsLocal, onlyTestTsNext);
|
|
77
|
+
await runTests(dirPath, onlyTestTsNext, expectOnly, tsLocal);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async function installTypeScriptAsNeeded(tsLocal, onlyTestTsNext) {
|
|
81
|
+
if (tsLocal)
|
|
82
|
+
return;
|
|
83
|
+
if (onlyTestTsNext) {
|
|
84
|
+
return utils_1.installTypeScriptNext();
|
|
85
|
+
}
|
|
86
|
+
return utils_1.installAllTypeScriptVersions();
|
|
87
|
+
}
|
|
88
|
+
function usage() {
|
|
89
|
+
console.error("Usage: dtslint [--version] [--installAll] [--onlyTestTsNext] [--expectOnly] [--localTs path]");
|
|
90
|
+
console.error("Args:");
|
|
91
|
+
console.error(" --version Print version and exit.");
|
|
92
|
+
console.error(" --installAll Cleans and installs all TypeScript versions.");
|
|
93
|
+
console.error(" --expectOnly Run only the ExpectType lint rule.");
|
|
94
|
+
console.error(" --onlyTestTsNext Only run with `typescript@next`, not with the minimum version.");
|
|
95
|
+
console.error(" --localTs path Run with *path* as the latest version of TS.");
|
|
96
|
+
console.error("");
|
|
97
|
+
console.error("onlyTestTsNext and localTs are (1) mutually exclusive and (2) test a single version of TS");
|
|
98
|
+
}
|
|
99
|
+
function listen(dirPath, tsLocal, alwaysOnlyTestTsNext) {
|
|
100
|
+
// Don't await this here to ensure that messages sent during installation aren't dropped.
|
|
101
|
+
const installationPromise = installTypeScriptAsNeeded(tsLocal, alwaysOnlyTestTsNext);
|
|
102
|
+
process.on("message", async (message) => {
|
|
103
|
+
const { path, onlyTestTsNext, expectOnly } = message;
|
|
104
|
+
await installationPromise;
|
|
105
|
+
runTests(path_1.join(dirPath, path), onlyTestTsNext, !!expectOnly, tsLocal)
|
|
106
|
+
.catch(e => e.stack)
|
|
107
|
+
.then(maybeError => {
|
|
108
|
+
process.send({ path, status: maybeError === undefined ? "OK" : maybeError });
|
|
109
|
+
})
|
|
110
|
+
.catch(e => console.error(e.stack));
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async function runTests(dirPath, onlyTestTsNext, expectOnly, tsLocal) {
|
|
114
|
+
const isOlderVersion = /^v(0\.)?\d+$/.test(path_1.basename(dirPath));
|
|
115
|
+
const indexText = await fs_extra_1.readFile(path_1.join(dirPath, "index.d.ts"), "utf-8");
|
|
116
|
+
// If this *is* on DefinitelyTyped, types-publisher will fail if it can't parse the header.
|
|
117
|
+
const dt = indexText.includes("// Type definitions for");
|
|
118
|
+
if (dt) {
|
|
119
|
+
// Someone may have copied text from DefinitelyTyped to their type definition and included a header,
|
|
120
|
+
// so assert that we're really on DefinitelyTyped.
|
|
121
|
+
assertPathIsInDefinitelyTyped(dirPath);
|
|
122
|
+
assertPathIsNotBanned(dirPath);
|
|
123
|
+
}
|
|
124
|
+
const typesVersions = await util_1.mapDefinedAsync(await fs_extra_1.readdir(dirPath), async (name) => {
|
|
125
|
+
if (name === "tsconfig.json" || name === "tslint.json" || name === "tsutils") {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
const version = util_1.withoutPrefix(name, "ts");
|
|
129
|
+
if (version === undefined || !(await fs_extra_1.stat(path_1.join(dirPath, name))).isDirectory()) {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
if (!typescript_versions_1.TypeScriptVersion.isTypeScriptVersion(version)) {
|
|
133
|
+
throw new Error(`There is an entry named ${name}, but ${version} is not a valid TypeScript version.`);
|
|
134
|
+
}
|
|
135
|
+
if (!typescript_versions_1.TypeScriptVersion.isRedirectable(version)) {
|
|
136
|
+
throw new Error(`At ${dirPath}/${name}: TypeScript version directories only available starting with ts3.1.`);
|
|
137
|
+
}
|
|
138
|
+
return version;
|
|
139
|
+
});
|
|
140
|
+
if (dt) {
|
|
141
|
+
await checks_1.checkPackageJson(dirPath, typesVersions);
|
|
142
|
+
}
|
|
143
|
+
const minVersion = maxVersion(getMinimumTypeScriptVersionFromComment(indexText), typescript_versions_1.TypeScriptVersion.lowest);
|
|
144
|
+
if (onlyTestTsNext || tsLocal) {
|
|
145
|
+
const tsVersion = tsLocal ? "local" : typescript_versions_1.TypeScriptVersion.latest;
|
|
146
|
+
await testTypesVersion(dirPath, tsVersion, tsVersion, isOlderVersion, dt, expectOnly, tsLocal, /*isLatest*/ true);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// For example, typesVersions of [3.2, 3.5, 3.6] will have
|
|
150
|
+
// associated ts3.2, ts3.5, ts3.6 directories, for
|
|
151
|
+
// <=3.2, <=3.5, <=3.6 respectively; the root level is for 3.7 and above.
|
|
152
|
+
// so this code needs to generate ranges [lowest-3.2, 3.3-3.5, 3.6-3.6, 3.7-latest]
|
|
153
|
+
const lows = [typescript_versions_1.TypeScriptVersion.lowest, ...typesVersions.map(next)];
|
|
154
|
+
const his = [...typesVersions, typescript_versions_1.TypeScriptVersion.latest];
|
|
155
|
+
assert.strictEqual(lows.length, his.length);
|
|
156
|
+
for (let i = 0; i < lows.length; i++) {
|
|
157
|
+
const low = maxVersion(minVersion, lows[i]);
|
|
158
|
+
const hi = his[i];
|
|
159
|
+
assert(parseFloat(hi) >= parseFloat(low), `'// Minimum TypeScript Version: ${minVersion}' in header skips ts${hi} folder.`);
|
|
160
|
+
const isLatest = hi === typescript_versions_1.TypeScriptVersion.latest;
|
|
161
|
+
const versionPath = isLatest ? dirPath : path_1.join(dirPath, `ts${hi}`);
|
|
162
|
+
if (lows.length > 1) {
|
|
163
|
+
console.log("testing from", low, "to", hi, "in", versionPath);
|
|
164
|
+
}
|
|
165
|
+
await testTypesVersion(versionPath, low, hi, isOlderVersion, dt, expectOnly, undefined, isLatest);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function maxVersion(v1, v2) {
|
|
170
|
+
if (!v1)
|
|
171
|
+
return v2;
|
|
172
|
+
if (!v2)
|
|
173
|
+
return v1;
|
|
174
|
+
if (parseFloat(v1) >= parseFloat(v2))
|
|
175
|
+
return v1;
|
|
176
|
+
return v2;
|
|
177
|
+
}
|
|
178
|
+
function next(v) {
|
|
179
|
+
const index = typescript_versions_1.TypeScriptVersion.supported.indexOf(v);
|
|
180
|
+
assert.notStrictEqual(index, -1);
|
|
181
|
+
assert(index < typescript_versions_1.TypeScriptVersion.supported.length);
|
|
182
|
+
return typescript_versions_1.TypeScriptVersion.supported[index + 1];
|
|
183
|
+
}
|
|
184
|
+
async function testTypesVersion(dirPath, lowVersion, hiVersion, isOlderVersion, dt, expectOnly, tsLocal, isLatest) {
|
|
185
|
+
await lint_1.checkTslintJson(dirPath, dt);
|
|
186
|
+
await checks_1.checkTsconfig(dirPath, dt ? { relativeBaseUrl: ".." + (isOlderVersion ? "/.." : "") + (isLatest ? "" : "/..") + "/" } : undefined);
|
|
187
|
+
const err = await lint_1.lint(dirPath, lowVersion, hiVersion, isLatest, expectOnly, tsLocal);
|
|
188
|
+
if (err) {
|
|
189
|
+
throw new Error(err);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function assertPathIsInDefinitelyTyped(dirPath) {
|
|
193
|
+
const parent = path_1.dirname(dirPath);
|
|
194
|
+
const types = /^v\d+(\.\d+)?$/.test(path_1.basename(dirPath)) ? path_1.dirname(parent) : parent;
|
|
195
|
+
// TODO: It's not clear whether this assertion makes sense, and it's broken on Azure Pipelines
|
|
196
|
+
// Re-enable it later if it makes sense.
|
|
197
|
+
// const dt = dirname(types);
|
|
198
|
+
// if (basename(dt) !== "DefinitelyTyped" || basename(types) !== "types") {
|
|
199
|
+
if (path_1.basename(types) !== "types") {
|
|
200
|
+
throw new Error("Since this type definition includes a header (a comment starting with `// Type definitions for`), " +
|
|
201
|
+
"assumed this was a DefinitelyTyped package.\n" +
|
|
202
|
+
"But it is not in a `DefinitelyTyped/types/xxx` directory: " +
|
|
203
|
+
dirPath);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function assertPathIsNotBanned(dirPath) {
|
|
207
|
+
const basedir = path_1.basename(dirPath);
|
|
208
|
+
if (/(^|\W)download($|\W)/.test(basedir) &&
|
|
209
|
+
basedir !== "download" &&
|
|
210
|
+
basedir !== "downloadjs" &&
|
|
211
|
+
basedir !== "s3-download-stream") {
|
|
212
|
+
// Since npm won't release their banned-words list, we'll have to manually add to this list.
|
|
213
|
+
throw new Error(`${dirPath}: Contains the word 'download', which is banned by npm.`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function getMinimumTypeScriptVersionFromComment(text) {
|
|
217
|
+
const match = text.match(/\/\/ (?:Minimum )?TypeScript Version: /);
|
|
218
|
+
if (!match) {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
let line = text.slice(match.index, text.indexOf("\n", match.index));
|
|
222
|
+
if (line.endsWith("\r")) {
|
|
223
|
+
line = line.slice(0, line.length - 1);
|
|
224
|
+
}
|
|
225
|
+
return header_parser_1.parseTypeScriptVersionLine(line);
|
|
226
|
+
}
|
|
227
|
+
if (!module.parent) {
|
|
228
|
+
main().catch(err => {
|
|
229
|
+
console.error(err.stack);
|
|
230
|
+
process.exit(1);
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAEA,kEAA4E;AAC5E,8EAA+F;AAC/F,iCAAkC;AAClC,uCAAmD;AACnD,+BAAqE;AAErE,kDAAsH;AACtH,qCAA2D;AAC3D,iCAA0D;AAC1D,iCAAwD;AAExD,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC5B,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAC9B,IAAI,OAA2B,CAAC;IAEhC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACtB,IAAI,iBAAiB,EAAE;YACrB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBACxB,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,GAAG,CAAC,CAAC;aAClE;YACD,OAAO,GAAG,cAAO,CAAC,GAAG,CAAC,CAAC;YACvB,iBAAiB,GAAG,KAAK,CAAC;YAC1B,SAAS;SACV;QACD,QAAQ,GAAG,EAAE;YACX,KAAK,cAAc;gBACjB,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;gBACnF,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAC1B,MAAM,+BAAuB,EAAE,CAAC;gBAChC,MAAM,oCAA4B,EAAE,CAAC;gBACrC,OAAO;YACT,KAAK,WAAW;gBACd,iBAAiB,GAAG,IAAI,CAAC;gBACzB,MAAM;YACR,KAAK,WAAW;gBACd,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC;gBAChD,OAAO;YACT,KAAK,cAAc;gBACjB,UAAU,GAAG,IAAI,CAAC;gBAClB,MAAM;YACR,KAAK,kBAAkB;gBACrB,cAAc,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,mCAAmC;YACnC,6EAA6E;YAC7E,KAAK,UAAU;gBACb,YAAY,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,OAAO,CAAC,CAAC;gBACP,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;oBACxB,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,GAAG,CAAC,CAAC;oBACzC,KAAK,EAAE,CAAC;oBACR,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBACjB;gBAED,MAAM,IAAI,GACR,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAC/C,CAAC,CAAC,yCAAyC;wBACzC,0CAA0C;wBAC1C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC;oBAClC,CAAC,CAAC,GAAG,CAAC;gBACV,OAAO,GAAG,WAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;aACpC;SACF;KACF;IACD,IAAI,iBAAiB,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;KACzD;IAED,IAAI,YAAY,EAAE;QAChB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;KAC1C;SAAM;QACL,MAAM,yBAAyB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACzD,MAAM,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;KAC9D;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,OAA2B,EAAE,cAAuB;IAC3F,IAAI,OAAO;QAAE,OAAO;IACpB,IAAI,cAAc,EAAE;QAClB,OAAO,6BAAqB,EAAE,CAAC;KAChC;IACD,OAAO,oCAA4B,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,KAAK;IACZ,OAAO,CAAC,KAAK,CAAC,8FAA8F,CAAC,CAAC;IAC9G,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC5D,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACjF,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;IACnG,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACjF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;AAC7G,CAAC;AAED,SAAS,MAAM,CAAC,OAAe,EAAE,OAA2B,EAAE,oBAA6B;IACzF,yFAAyF;IACzF,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IACrF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAgB,EAAE,EAAE;QAC/C,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,OAI5C,CAAC;QAEF,MAAM,mBAAmB,CAAC;QAC1B,QAAQ,CAAC,WAAS,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC;aACtE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;aACnB,IAAI,CAAC,UAAU,CAAC,EAAE;YACjB,OAAO,CAAC,IAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QAChF,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,OAAe,EACf,cAAuB,EACvB,UAAmB,EACnB,OAA2B;IAE3B,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,eAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAE9D,MAAM,SAAS,GAAG,MAAM,mBAAQ,CAAC,WAAS,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5E,2FAA2F;IAC3F,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IACzD,IAAI,EAAE,EAAE;QACN,oGAAoG;QACpG,kDAAkD;QAClD,6BAA6B,CAAC,OAAO,CAAC,CAAC;QACvC,qBAAqB,CAAC,OAAO,CAAC,CAAC;KAChC;IAED,MAAM,aAAa,GAAG,MAAM,sBAAe,CAAC,MAAM,kBAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAC,IAAI,EAAC,EAAE;QAC/E,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,SAAS,EAAE;YAC5E,OAAO,SAAS,CAAC;SAClB;QACD,MAAM,OAAO,GAAG,oBAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,eAAI,CAAC,WAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE;YAClF,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,CAAC,uCAAiB,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE;YACnD,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,SAAS,OAAO,qCAAqC,CAAC,CAAC;SACvG;QACD,IAAI,CAAC,uCAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;YAC9C,MAAM,IAAI,KAAK,CAAC,MAAM,OAAO,IAAI,IAAI,sEAAsE,CAAC,CAAC;SAC9G;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,EAAE;QACN,MAAM,yBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KAChD;IAED,MAAM,UAAU,GAAG,UAAU,CAC3B,sCAAsC,CAAC,SAAS,CAAC,EACjD,uCAAiB,CAAC,MAAM,CACJ,CAAC;IACvB,IAAI,cAAc,IAAI,OAAO,EAAE;QAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAiB,CAAC,MAAM,CAAC;QAC/D,MAAM,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;KACnH;SAAM;QACL,0DAA0D;QAC1D,kDAAkD;QAClD,yEAAyE;QACzE,mFAAmF;QACnF,MAAM,IAAI,GAAG,CAAC,uCAAiB,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,CAAC,GAAG,aAAa,EAAE,uCAAiB,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,UAAU,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EACjC,mCAAmC,UAAU,uBAAuB,EAAE,UAAU,CACjF,CAAC;YACF,MAAM,QAAQ,GAAG,EAAE,KAAK,uCAAiB,CAAC,MAAM,CAAC;YACjD,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAS,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;aAC/D;YACD,MAAM,gBAAgB,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;SACnG;KACF;AACH,CAAC;AAID,SAAS,UAAU,CAAC,EAAoC,EAAE,EAAwB;IAChF,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACnB,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,IAAI,CAAC,CAAoB;IAChC,MAAM,KAAK,GAAG,uCAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,GAAG,uCAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,uCAAiB,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,OAAe,EACf,UAAqB,EACrB,SAAoB,EACpB,cAAuB,EACvB,EAAW,EACX,UAAmB,EACnB,OAA2B,EAC3B,QAAiB;IAEjB,MAAM,sBAAe,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,sBAAa,CACjB,OAAO,EACP,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAC3G,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,WAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACtF,IAAI,GAAG,EAAE;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;KACtB;AACH,CAAC;AAED,SAAS,6BAA6B,CAAC,OAAe;IACpD,MAAM,MAAM,GAAG,cAAO,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,eAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAClF,8FAA8F;IAC9F,wCAAwC;IACxC,6BAA6B;IAC7B,2EAA2E;IAC3E,IAAI,eAAQ,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE;QAC/B,MAAM,IAAI,KAAK,CACb,oGAAoG;YAClG,+CAA+C;YAC/C,4DAA4D;YAC5D,OAAO,CACV,CAAC;KACH;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,MAAM,OAAO,GAAG,eAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,IACE,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;QACpC,OAAO,KAAK,UAAU;QACtB,OAAO,KAAK,YAAY;QACxB,OAAO,KAAK,oBAAoB,EAChC;QACA,4FAA4F;QAC5F,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,yDAAyD,CAAC,CAAC;KACtF;AACH,CAAC;AAED,SAAS,sCAAsC,CAAC,IAAY;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACvB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KACvC;IACD,OAAO,0CAA0B,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;IAClB,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QACjB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;CACJ"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TypeScriptVersion } from "@definitelytyped/typescript-versions";
|
|
2
|
+
import * as TsType from "typescript";
|
|
3
|
+
export declare function lint(dirPath: string, minVersion: TsVersion, maxVersion: TsVersion, isLatest: boolean, expectOnly: boolean, tsLocal: string | undefined): Promise<string | undefined>;
|
|
4
|
+
export declare function isExternalDependency(file: TsType.SourceFile, dirPath: string, program: TsType.Program): boolean;
|
|
5
|
+
export declare function checkTslintJson(dirPath: string, dt: boolean): Promise<void>;
|
|
6
|
+
export declare type TsVersion = TypeScriptVersion | "local";
|
package/bin/src/lint.js
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkTslintJson = exports.isExternalDependency = exports.lint = void 0;
|
|
4
|
+
const typescript_versions_1 = require("@definitelytyped/typescript-versions");
|
|
5
|
+
const utils_1 = require("@definitelytyped/utils");
|
|
6
|
+
const assert = require("assert");
|
|
7
|
+
const fs_extra_1 = require("fs-extra");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const tslint_1 = require("tslint");
|
|
10
|
+
const expectRule_1 = require("./rules/expectRule");
|
|
11
|
+
const util_1 = require("./util");
|
|
12
|
+
async function lint(dirPath, minVersion, maxVersion, isLatest, expectOnly, tsLocal) {
|
|
13
|
+
const tsconfigPath = path_1.join(dirPath, "tsconfig.json");
|
|
14
|
+
const lintProgram = tslint_1.Linter.createProgram(tsconfigPath);
|
|
15
|
+
for (const version of [maxVersion, minVersion]) {
|
|
16
|
+
const errors = testDependencies(version, dirPath, lintProgram, tsLocal);
|
|
17
|
+
if (errors) {
|
|
18
|
+
return errors;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const lintOptions = {
|
|
22
|
+
fix: false,
|
|
23
|
+
formatter: "stylish"
|
|
24
|
+
};
|
|
25
|
+
const linter = new tslint_1.Linter(lintOptions, lintProgram);
|
|
26
|
+
const configPath = expectOnly ? path_1.join(__dirname, "..", "dtslint-expect-only.json") : getConfigPath(dirPath);
|
|
27
|
+
const config = await getLintConfig(configPath, tsconfigPath, minVersion, maxVersion, tsLocal);
|
|
28
|
+
for (const file of lintProgram.getSourceFiles()) {
|
|
29
|
+
if (lintProgram.isSourceFileDefaultLibrary(file)) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const { fileName, text } = file;
|
|
33
|
+
if (!fileName.includes("node_modules")) {
|
|
34
|
+
const err = testNoTsIgnore(text) || testNoTslintDisables(text);
|
|
35
|
+
if (err) {
|
|
36
|
+
const { pos, message } = err;
|
|
37
|
+
const place = file.getLineAndCharacterOfPosition(pos);
|
|
38
|
+
return `At ${fileName}:${JSON.stringify(place)}: ${message}`;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// External dependencies should have been handled by `testDependencies`;
|
|
42
|
+
// typesVersions should be handled in a separate lint
|
|
43
|
+
if (!isExternalDependency(file, dirPath, lintProgram) && (!isLatest || !isTypesVersionPath(fileName, dirPath))) {
|
|
44
|
+
linter.lint(fileName, text, config);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const result = linter.getResult();
|
|
48
|
+
return result.failures.length ? result.output : undefined;
|
|
49
|
+
}
|
|
50
|
+
exports.lint = lint;
|
|
51
|
+
function testDependencies(version, dirPath, lintProgram, tsLocal) {
|
|
52
|
+
const tsconfigPath = path_1.join(dirPath, "tsconfig.json");
|
|
53
|
+
assert(version !== "local" || tsLocal);
|
|
54
|
+
const ts = require(utils_1.typeScriptPath(version, tsLocal));
|
|
55
|
+
const program = expectRule_1.getProgram(tsconfigPath, ts, version, lintProgram);
|
|
56
|
+
const diagnostics = ts
|
|
57
|
+
.getPreEmitDiagnostics(program)
|
|
58
|
+
.filter(d => !d.file || isExternalDependency(d.file, dirPath, program));
|
|
59
|
+
if (!diagnostics.length) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const showDiags = ts.formatDiagnostics(diagnostics, {
|
|
63
|
+
getCanonicalFileName: f => f,
|
|
64
|
+
getCurrentDirectory: () => dirPath,
|
|
65
|
+
getNewLine: () => "\n"
|
|
66
|
+
});
|
|
67
|
+
const message = `Errors in typescript@${version} for external dependencies:\n${showDiags}`;
|
|
68
|
+
// Add an edge-case for someone needing to `npm install` in react when they first edit a DT module which depends on it - #226
|
|
69
|
+
const cannotFindDepsDiags = diagnostics.find(d => d.code === 2307 && d.messageText.toString().includes("Cannot find module"));
|
|
70
|
+
if (cannotFindDepsDiags && cannotFindDepsDiags.file) {
|
|
71
|
+
const path = cannotFindDepsDiags.file.fileName;
|
|
72
|
+
const typesFolder = path_1.dirname(path);
|
|
73
|
+
return `
|
|
74
|
+
A module look-up failed, this often occurs when you need to run \`npm install\` on a dependent module before you can lint.
|
|
75
|
+
|
|
76
|
+
Before you debug, first try running:
|
|
77
|
+
|
|
78
|
+
npm install --prefix ${typesFolder}
|
|
79
|
+
|
|
80
|
+
Then re-run. Full error logs are below.
|
|
81
|
+
|
|
82
|
+
${message}`;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return message;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function isExternalDependency(file, dirPath, program) {
|
|
89
|
+
return !startsWithDirectory(file.fileName, dirPath) || program.isSourceFileFromExternalLibrary(file);
|
|
90
|
+
}
|
|
91
|
+
exports.isExternalDependency = isExternalDependency;
|
|
92
|
+
function normalizePath(file) {
|
|
93
|
+
// replaces '\' with '/' and forces all DOS drive letters to be upper-case
|
|
94
|
+
return path_1.normalize(file)
|
|
95
|
+
.replace(/\\/g, "/")
|
|
96
|
+
.replace(/^[a-z](?=:)/, c => c.toUpperCase());
|
|
97
|
+
}
|
|
98
|
+
function isTypesVersionPath(fileName, dirPath) {
|
|
99
|
+
const normalFileName = normalizePath(fileName);
|
|
100
|
+
const normalDirPath = normalizePath(dirPath);
|
|
101
|
+
const subdirPath = util_1.withoutPrefix(normalFileName, normalDirPath);
|
|
102
|
+
return subdirPath && /^\/ts\d+\.\d/.test(subdirPath);
|
|
103
|
+
}
|
|
104
|
+
function startsWithDirectory(filePath, dirPath) {
|
|
105
|
+
const normalFilePath = normalizePath(filePath);
|
|
106
|
+
const normalDirPath = normalizePath(dirPath).replace(/\/$/, "");
|
|
107
|
+
return normalFilePath.startsWith(normalDirPath + "/") || normalFilePath.startsWith(normalDirPath + "\\");
|
|
108
|
+
}
|
|
109
|
+
function testNoTsIgnore(text) {
|
|
110
|
+
const tsIgnore = "ts-ignore";
|
|
111
|
+
const pos = text.indexOf(tsIgnore);
|
|
112
|
+
return pos === -1 ? undefined : { pos, message: "'ts-ignore' is forbidden." };
|
|
113
|
+
}
|
|
114
|
+
function testNoTslintDisables(text) {
|
|
115
|
+
const tslintDisable = "tslint:disable";
|
|
116
|
+
let lastIndex = 0;
|
|
117
|
+
// eslint-disable-next-line no-constant-condition
|
|
118
|
+
while (true) {
|
|
119
|
+
const pos = text.indexOf(tslintDisable, lastIndex);
|
|
120
|
+
if (pos === -1) {
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
const end = pos + tslintDisable.length;
|
|
124
|
+
const nextChar = text.charAt(end);
|
|
125
|
+
if (nextChar !== "-" && nextChar !== ":") {
|
|
126
|
+
const message = "'tslint:disable' is forbidden. " +
|
|
127
|
+
"('tslint:disable:rulename', tslint:disable-line' and 'tslint:disable-next-line' are allowed.)";
|
|
128
|
+
return { pos, message };
|
|
129
|
+
}
|
|
130
|
+
lastIndex = end;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function checkTslintJson(dirPath, dt) {
|
|
134
|
+
const configPath = getConfigPath(dirPath);
|
|
135
|
+
const shouldExtend = `dtslint/${dt ? "dt" : "dtslint"}.json`;
|
|
136
|
+
const validateExtends = (extend) => extend === shouldExtend || (!dt && Array.isArray(extend) && extend.some(val => val === shouldExtend));
|
|
137
|
+
if (!(await fs_extra_1.pathExists(configPath))) {
|
|
138
|
+
if (dt) {
|
|
139
|
+
throw new Error(`On DefinitelyTyped, must include \`tslint.json\` containing \`{ "extends": "${shouldExtend}" }\`.\n` +
|
|
140
|
+
"This was inferred as a DefinitelyTyped package because it contains a `// Type definitions for` header.");
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const tslintJson = await util_1.readJson(configPath);
|
|
145
|
+
if (!validateExtends(tslintJson.extends)) {
|
|
146
|
+
throw new Error(`If 'tslint.json' is present, it should extend "${shouldExtend}"`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.checkTslintJson = checkTslintJson;
|
|
150
|
+
function getConfigPath(dirPath) {
|
|
151
|
+
return path_1.join(dirPath, "tslint.json");
|
|
152
|
+
}
|
|
153
|
+
async function getLintConfig(expectedConfigPath, tsconfigPath, minVersion, maxVersion, tsLocal) {
|
|
154
|
+
const configExists = await fs_extra_1.pathExists(expectedConfigPath);
|
|
155
|
+
const configPath = configExists ? expectedConfigPath : path_1.join(__dirname, "..", "dtslint.json");
|
|
156
|
+
// Second param to `findConfiguration` doesn't matter, since config path is provided.
|
|
157
|
+
const config = tslint_1.Configuration.findConfiguration(configPath, "").results;
|
|
158
|
+
if (!config) {
|
|
159
|
+
throw new Error(`Could not load config at ${configPath}`);
|
|
160
|
+
}
|
|
161
|
+
const expectRule = config.rules.get("expect");
|
|
162
|
+
if (!expectRule || expectRule.ruleSeverity !== "error") {
|
|
163
|
+
throw new Error("'expect' rule should be enabled, else compile errors are ignored");
|
|
164
|
+
}
|
|
165
|
+
if (expectRule) {
|
|
166
|
+
const versionsToTest = range(minVersion, maxVersion).map(versionName => ({
|
|
167
|
+
versionName,
|
|
168
|
+
path: utils_1.typeScriptPath(versionName, tsLocal)
|
|
169
|
+
}));
|
|
170
|
+
const expectOptions = { tsconfigPath, versionsToTest };
|
|
171
|
+
expectRule.ruleArguments = [expectOptions];
|
|
172
|
+
}
|
|
173
|
+
return config;
|
|
174
|
+
}
|
|
175
|
+
function range(minVersion, maxVersion) {
|
|
176
|
+
if (minVersion === "local") {
|
|
177
|
+
assert(maxVersion === "local");
|
|
178
|
+
return ["local"];
|
|
179
|
+
}
|
|
180
|
+
if (minVersion === typescript_versions_1.TypeScriptVersion.latest) {
|
|
181
|
+
assert(maxVersion === typescript_versions_1.TypeScriptVersion.latest);
|
|
182
|
+
return [typescript_versions_1.TypeScriptVersion.latest];
|
|
183
|
+
}
|
|
184
|
+
assert(maxVersion !== "local");
|
|
185
|
+
const minIdx = typescript_versions_1.TypeScriptVersion.shipped.indexOf(minVersion);
|
|
186
|
+
assert(minIdx >= 0);
|
|
187
|
+
if (maxVersion === typescript_versions_1.TypeScriptVersion.latest) {
|
|
188
|
+
return [...typescript_versions_1.TypeScriptVersion.shipped.slice(minIdx), typescript_versions_1.TypeScriptVersion.latest];
|
|
189
|
+
}
|
|
190
|
+
const maxIdx = typescript_versions_1.TypeScriptVersion.shipped.indexOf(maxVersion);
|
|
191
|
+
assert(maxIdx >= minIdx);
|
|
192
|
+
return typescript_versions_1.TypeScriptVersion.shipped.slice(minIdx, maxIdx + 1);
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/lint.ts"],"names":[],"mappings":"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"}
|