@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.
Files changed (95) hide show
  1. package/README.md +1 -1
  2. package/bin/src/checks.d.ts +7 -0
  3. package/bin/src/checks.js +133 -0
  4. package/bin/src/checks.js.map +1 -0
  5. package/bin/src/index.d.ts +2 -0
  6. package/bin/src/index.js +233 -0
  7. package/bin/src/index.js.map +1 -0
  8. package/bin/src/lint.d.ts +6 -0
  9. package/bin/src/lint.js +194 -0
  10. package/bin/src/lint.js.map +1 -0
  11. package/bin/src/rules/dtHeaderRule.d.ts +6 -0
  12. package/bin/src/rules/dtHeaderRule.js +62 -0
  13. package/bin/src/rules/dtHeaderRule.js.map +1 -0
  14. package/bin/src/rules/expectRule.d.ts +23 -0
  15. package/bin/src/rules/expectRule.js +346 -0
  16. package/bin/src/rules/expectRule.js.map +1 -0
  17. package/bin/src/rules/exportJustNamespaceRule.d.ts +7 -0
  18. package/bin/src/rules/exportJustNamespaceRule.js +105 -0
  19. package/bin/src/rules/exportJustNamespaceRule.js.map +1 -0
  20. package/bin/src/rules/noAnyUnionRule.d.ts +7 -0
  21. package/bin/src/rules/noAnyUnionRule.js +49 -0
  22. package/bin/src/rules/noAnyUnionRule.js.map +1 -0
  23. package/bin/src/rules/noBadReferenceRule.d.ts +8 -0
  24. package/bin/src/rules/noBadReferenceRule.js +54 -0
  25. package/bin/src/rules/noBadReferenceRule.js.map +1 -0
  26. package/bin/src/rules/noConstEnumRule.d.ts +7 -0
  27. package/bin/src/rules/noConstEnumRule.js +51 -0
  28. package/bin/src/rules/noConstEnumRule.js.map +1 -0
  29. package/bin/src/rules/noDeadReferenceRule.d.ts +7 -0
  30. package/bin/src/rules/noDeadReferenceRule.js +62 -0
  31. package/bin/src/rules/noDeadReferenceRule.js.map +1 -0
  32. package/bin/src/rules/noDeclareCurrentPackageRule.d.ts +6 -0
  33. package/bin/src/rules/noDeclareCurrentPackageRule.js +56 -0
  34. package/bin/src/rules/noDeclareCurrentPackageRule.js.map +1 -0
  35. package/bin/src/rules/noImportDefaultOfExportEqualsRule.d.ts +7 -0
  36. package/bin/src/rules/noImportDefaultOfExportEqualsRule.js +71 -0
  37. package/bin/src/rules/noImportDefaultOfExportEqualsRule.js.map +1 -0
  38. package/bin/src/rules/noOutsideDependenciesRule.d.ts +6 -0
  39. package/bin/src/rules/noOutsideDependenciesRule.js +52 -0
  40. package/bin/src/rules/noOutsideDependenciesRule.js.map +1 -0
  41. package/bin/src/rules/noPaddingRule.d.ts +7 -0
  42. package/bin/src/rules/noPaddingRule.js +98 -0
  43. package/bin/src/rules/noPaddingRule.js.map +1 -0
  44. package/bin/src/rules/noRedundantJsdoc2Rule.d.ts +10 -0
  45. package/bin/src/rules/noRedundantJsdoc2Rule.js +245 -0
  46. package/bin/src/rules/noRedundantJsdoc2Rule.js.map +1 -0
  47. package/bin/src/rules/noRelativeImportInTestRule.d.ts +11 -0
  48. package/bin/src/rules/noRelativeImportInTestRule.js +60 -0
  49. package/bin/src/rules/noRelativeImportInTestRule.js.map +1 -0
  50. package/bin/src/rules/noSelfImportRule.d.ts +6 -0
  51. package/bin/src/rules/noSelfImportRule.js +51 -0
  52. package/bin/src/rules/noSelfImportRule.js.map +1 -0
  53. package/bin/src/rules/noSingleDeclareModuleRule.d.ts +7 -0
  54. package/bin/src/rules/noSingleDeclareModuleRule.js +68 -0
  55. package/bin/src/rules/noSingleDeclareModuleRule.js.map +1 -0
  56. package/bin/src/rules/noSingleElementTupleTypeRule.d.ts +6 -0
  57. package/bin/src/rules/noSingleElementTupleTypeRule.js +50 -0
  58. package/bin/src/rules/noSingleElementTupleTypeRule.js.map +1 -0
  59. package/bin/src/rules/noUnnecessaryGenericsRule.d.ts +8 -0
  60. package/bin/src/rules/noUnnecessaryGenericsRule.js +130 -0
  61. package/bin/src/rules/noUnnecessaryGenericsRule.js.map +1 -0
  62. package/bin/src/rules/noUselessFilesRule.d.ts +7 -0
  63. package/bin/src/rules/noUselessFilesRule.js +46 -0
  64. package/bin/src/rules/noUselessFilesRule.js.map +1 -0
  65. package/bin/src/rules/npmNamingRule.d.ts +21 -0
  66. package/bin/src/rules/npmNamingRule.js +291 -0
  67. package/bin/src/rules/npmNamingRule.js.map +1 -0
  68. package/bin/src/rules/preferDeclareFunctionRule.d.ts +7 -0
  69. package/bin/src/rules/preferDeclareFunctionRule.js +52 -0
  70. package/bin/src/rules/preferDeclareFunctionRule.js.map +1 -0
  71. package/bin/src/rules/redundantUndefinedRule.d.ts +6 -0
  72. package/bin/src/rules/redundantUndefinedRule.js +55 -0
  73. package/bin/src/rules/redundantUndefinedRule.js.map +1 -0
  74. package/bin/src/rules/strictExportDeclareModifiersRule.d.ts +6 -0
  75. package/bin/src/rules/strictExportDeclareModifiersRule.js +162 -0
  76. package/bin/src/rules/strictExportDeclareModifiersRule.js.map +1 -0
  77. package/bin/src/rules/trimFileRule.d.ts +8 -0
  78. package/bin/src/rules/trimFileRule.js +51 -0
  79. package/bin/src/rules/trimFileRule.js.map +1 -0
  80. package/bin/src/rules/voidReturnRule.d.ts +7 -0
  81. package/bin/src/rules/voidReturnRule.js +85 -0
  82. package/bin/src/rules/voidReturnRule.js.map +1 -0
  83. package/bin/src/suggestions.d.ts +12 -0
  84. package/bin/src/suggestions.js +62 -0
  85. package/bin/src/suggestions.js.map +1 -0
  86. package/bin/src/updateConfig.d.ts +1 -0
  87. package/bin/src/updateConfig.js +220 -0
  88. package/bin/src/updateConfig.js.map +1 -0
  89. package/bin/src/util.d.ts +12 -0
  90. package/bin/src/util.js +130 -0
  91. package/bin/src/util.js.map +1 -0
  92. package/bin/tsconfig.tsbuildinfo +1 -0
  93. package/dtslint-expect-only.json +1 -1
  94. package/dtslint.json +1 -1
  95. 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":";;;AAAA,kEAAiF;AAEjF,iCAAkC;AAClC,uCAAsC;AACtC,+BAAyC;AAEzC,iCAAsD;AAE/C,KAAK,UAAU,gBAAgB,CAAC,OAAe,EAAE,aAA2C;IACjG,MAAM,WAAW,GAAG,WAAS,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACvD,MAAM,kBAAkB,GAAG,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,MAAM,qBAAU,CAAC,WAAW,CAAC,CAAC,EAAE;QACpC,IAAI,kBAAkB,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,gDAAgD,CAAC,CAAC;SAC7E;QACD,OAAO;KACR;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,eAAQ,CAAC,WAAW,CAAC,CAA4B,CAAC;IAEzE,IAAK,OAAe,CAAC,OAAO,KAAK,IAAI,EAAE;QACrC,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,iCAAiC,CAAC,CAAC;KAClE;IAED,IAAI,kBAAkB,EAAE;QACtB,MAAM,CAAC,WAAW,CAAE,OAAe,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe,WAAW,sBAAsB,CAAC,CAAC;QACtG,MAAM,QAAQ,GAAG,+CAA+B,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CACb,OAAe,CAAC,aAAa,EAC9B,QAAQ,EACR,uBAAuB,WAAW,kCAAkC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAC7G,CAAC;KACH;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;QACzB,4BAA4B;QAC5B,QAAQ,GAAG,EAAE;YACX,KAAK,SAAS,CAAC;YACf,KAAK,cAAc,CAAC;YACpB,KAAK,SAAS,CAAC;YACf,KAAK,SAAS,CAAC;YACf,KAAK,SAAS,CAAC;YACf,KAAK,MAAM;gBACT,0GAA0G;gBAC1G,MAAM;YACR,KAAK,eAAe,CAAC;YACrB,KAAK,OAAO;gBACV,IAAI,CAAC,kBAAkB,EAAE;oBACvB,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,yBAAyB,GAAG,sCAAsC,CAAC,CAAC;iBACnG;gBACD,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,6BAA6B,GAAG,EAAE,CAAC,CAAC;SACrE;KACF;AACH,CAAC;AA/CD,4CA+CC;AAMM,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,EAAmC;IACtF,MAAM,OAAO,GAAG,MAAM,yBAAkB,CAAC,OAAO,CAAC,CAAC;IAElD,IAAI,EAAE,EAAE;QACN,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC;QAE/B,MAAM,QAAQ,GAAG;YACf,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,IAAI;YACZ,gCAAgC,EAAE,IAAI;YACtC,OAAO,EAAE,eAAe;YACxB,SAAS,EAAE,CAAC,eAAe,CAAC;YAC5B,KAAK,EAAE,EAAE;SACV,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAA8B,EAAE;YACnF,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;aACrG;SACF;QAED,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;YACzB,4BAA4B;YAC5B,QAAQ,GAAG,EAAE;gBACX,KAAK,KAAK,CAAC;gBACX,KAAK,eAAe,CAAC;gBACrB,KAAK,gBAAgB,CAAC;gBACtB,KAAK,QAAQ,CAAC;gBACd,KAAK,kBAAkB,CAAC;gBACxB,KAAK,0BAA0B,CAAC;gBAChC,KAAK,qBAAqB,CAAC;gBAC3B,KAAK,iBAAiB,CAAC;gBACvB,KAAK,8BAA8B;oBACjC,kBAAkB;oBAClB,MAAM;gBACR,KAAK,QAAQ,CAAC;gBACd,KAAK,OAAO,CAAC;gBACb,KAAK,KAAK,CAAC;gBACX,KAAK,YAAY,CAAC;gBAClB,KAAK,wBAAwB,CAAC;gBAC9B,KAAK,gBAAgB,CAAC;gBACtB,KAAK,oBAAoB;oBACvB,iDAAiD;oBACjD,MAAM;gBACR;oBACE,IAAI,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE;wBACtB,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;qBACtD;aACJ;SACF;KACF;IAED,IAAI,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;KAChG;IAED,IAAI,QAAQ,IAAI,OAAO,EAAE;QACvB,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;SACxE;QAED,KAAK,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,CAAC,EAAE;YAChG,IAAI,GAAG,IAAI,OAAO,EAAE;gBAClB,MAAM,IAAI,SAAS,CAAC,aAAa,GAAG,4CAA4C,CAAC,CAAC;aACnF;SACF;KACF;SAAM;QACL,KAAK,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,CAAC,EAAE;YAChG,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE;gBACrB,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,mBAAmB,GAAG,aAAa,CAAC,CAAC;aACxE;SACF;KACF;IAED,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;QACzC,MAAM,IAAI,KAAK,CACb,4EAA4E;YAC1E,4DAA4D,CAC/D,CAAC;KACH;AACH,CAAC;AAlFD,sCAkFC;AAED,SAAS,UAAU,CAAC,QAAiB,EAAE,MAAe;IACpD,IAAI,QAAQ,YAAY,KAAK,EAAE;QAC7B,OAAO,CACL,MAAM,YAAY,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CACnH,CAAC;KACH;SAAM;QACL,OAAO,QAAQ,KAAK,MAAM,CAAC;KAC5B;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -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":"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"}
@@ -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";
@@ -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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"}
@@ -0,0 +1,6 @@
1
+ import * as Lint from "tslint";
2
+ import * as ts from "typescript";
3
+ export declare class Rule extends Lint.Rules.AbstractRule {
4
+ static metadata: Lint.IRuleMetadata;
5
+ apply(sourceFile: ts.SourceFile): Lint.RuleFailure[];
6
+ }