@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
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.Rule = void 0;
23
+ const header_parser_1 = require("@definitelytyped/header-parser");
24
+ const Lint = __importStar(require("tslint"));
25
+ const util_1 = require("../util");
26
+ class Rule extends Lint.Rules.AbstractRule {
27
+ apply(sourceFile) {
28
+ return this.applyWithFunction(sourceFile, walk);
29
+ }
30
+ }
31
+ exports.Rule = Rule;
32
+ Rule.metadata = {
33
+ ruleName: "dt-header",
34
+ description: "Ensure consistency of DefinitelyTyped headers.",
35
+ optionsDescription: "Not configurable.",
36
+ options: null,
37
+ type: "functionality",
38
+ typescriptOnly: true
39
+ };
40
+ function walk(ctx) {
41
+ const { sourceFile } = ctx;
42
+ const { text } = sourceFile;
43
+ const lookFor = (search, explanation) => {
44
+ const idx = text.indexOf(search);
45
+ if (idx !== -1) {
46
+ ctx.addFailureAt(idx, search.length, util_1.failure(Rule.metadata.ruleName, explanation));
47
+ }
48
+ };
49
+ if (!util_1.isMainFile(sourceFile.fileName, /*allowNested*/ true)) {
50
+ lookFor("// Type definitions for", "Header should only be in `index.d.ts` of the root.");
51
+ lookFor("// TypeScript Version", "TypeScript version should be specified under header in `index.d.ts`.");
52
+ lookFor("// Minimum TypeScript Version", "TypeScript version should be specified under header in `index.d.ts`.");
53
+ return;
54
+ }
55
+ lookFor("// Definitions by: My Self", "Author name should be your name, not the default.");
56
+ const error = header_parser_1.validate(text);
57
+ if (error) {
58
+ ctx.addFailureAt(error.index, 1, util_1.failure(Rule.metadata.ruleName, `Error parsing header. Expected: ${header_parser_1.renderExpected(error.expected)}.`));
59
+ }
60
+ // Don't recurse, we're done.
61
+ }
62
+ //# sourceMappingURL=dtHeaderRule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dtHeaderRule.js","sourceRoot":"","sources":["../../../src/rules/dtHeaderRule.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,kEAA0E;AAC1E,6CAA+B;AAE/B,kCAA8C;AAE9C,MAAa,IAAK,SAAQ,IAAI,CAAC,KAAK,CAAC,YAAY;IAU/C,KAAK,CAAC,UAAyB;QAC7B,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;;AAZH,oBAaC;AAZQ,aAAQ,GAAuB;IACpC,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,gDAAgD;IAC7D,kBAAkB,EAAE,mBAAmB;IACvC,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,eAAe;IACrB,cAAc,EAAE,IAAI;CACrB,CAAC;AAOJ,SAAS,IAAI,CAAC,GAA2B;IACvC,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;IAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;IAC5B,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,WAAmB,EAAE,EAAE;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;YACd,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,cAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;SACpF;IACH,CAAC,CAAC;IACF,IAAI,CAAC,iBAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE;QAC1D,OAAO,CAAC,yBAAyB,EAAE,oDAAoD,CAAC,CAAC;QACzF,OAAO,CAAC,uBAAuB,EAAE,sEAAsE,CAAC,CAAC;QACzG,OAAO,CAAC,+BAA+B,EAAE,sEAAsE,CAAC,CAAC;QACjH,OAAO;KACR;IAED,OAAO,CAAC,4BAA4B,EAAE,mDAAmD,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,wBAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,KAAK,EAAE;QACT,GAAG,CAAC,YAAY,CACd,KAAK,CAAC,KAAK,EACX,CAAC,EACD,cAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,mCAAmC,8BAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CACtG,CAAC;KACH;IACD,6BAA6B;AAC/B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import * as Lint from "tslint";
2
+ import * as TsType from "typescript";
3
+ declare type Program = TsType.Program;
4
+ declare type SourceFile = TsType.SourceFile;
5
+ export declare class Rule extends Lint.Rules.TypedRule {
6
+ static metadata: Lint.IRuleMetadata;
7
+ static FAILURE_STRING_DUPLICATE_ASSERTION: string;
8
+ static FAILURE_STRING_ASSERTION_MISSING_NODE: string;
9
+ static FAILURE_STRING_EXPECTED_ERROR: string;
10
+ static FAILURE_STRING(expectedVersion: string, expectedType: string, actualType: string): string;
11
+ applyWithProgram(sourceFile: SourceFile, lintProgram: Program): Lint.RuleFailure[];
12
+ }
13
+ export interface Options {
14
+ readonly tsconfigPath: string;
15
+ readonly versionsToTest: readonly VersionToTest[];
16
+ }
17
+ export interface VersionToTest {
18
+ readonly versionName: string;
19
+ readonly path: string;
20
+ }
21
+ /** Maps a tslint Program to one created with the version specified in `options`. */
22
+ export declare function getProgram(configFile: string, ts: typeof TsType, versionName: string, lintProgram: Program): Program;
23
+ export {};
@@ -0,0 +1,346 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.getProgram = exports.Rule = void 0;
23
+ const fs_1 = require("fs");
24
+ const os = require("os");
25
+ const path_1 = require("path");
26
+ const Lint = __importStar(require("tslint"));
27
+ const TsType = __importStar(require("typescript"));
28
+ const util_1 = require("../util");
29
+ // Based on https://github.com/danvk/typings-checker
30
+ const cacheDir = path_1.join(os.homedir(), ".dts");
31
+ const perfDir = path_1.join(os.homedir(), ".dts", "perf");
32
+ class Rule extends Lint.Rules.TypedRule {
33
+ // TODO: If this naming convention is required by tslint, dump it when switching to eslint
34
+ // eslint-disable-next-line @typescript-eslint/naming-convention
35
+ static FAILURE_STRING(expectedVersion, expectedType, actualType) {
36
+ return `TypeScript@${expectedVersion} expected type to be:\n ${expectedType}\ngot:\n ${actualType}`;
37
+ }
38
+ applyWithProgram(sourceFile, lintProgram) {
39
+ const options = this.ruleArguments[0];
40
+ if (!options) {
41
+ return this.applyWithFunction(sourceFile, ctx => walk(ctx, lintProgram, TsType, "next", /*nextHigherVersion*/ undefined));
42
+ }
43
+ const { tsconfigPath, versionsToTest } = options;
44
+ const getFailures = ({ versionName, path }, nextHigherVersion, writeOutput) => {
45
+ const ts = require(path);
46
+ const program = getProgram(tsconfigPath, ts, versionName, lintProgram);
47
+ const failures = this.applyWithFunction(sourceFile, ctx => walk(ctx, program, ts, versionName, nextHigherVersion));
48
+ if (writeOutput) {
49
+ const packageName = path_1.basename(path_1.dirname(tsconfigPath));
50
+ if (!packageName.match(/v\d+/) && !packageName.match(/ts\d\.\d/)) {
51
+ const d = {
52
+ [packageName]: {
53
+ typeCount: program.getTypeCount(),
54
+ memory: ts.sys.getMemoryUsage ? ts.sys.getMemoryUsage() : 0
55
+ }
56
+ };
57
+ if (!fs_1.existsSync(cacheDir)) {
58
+ fs_1.mkdirSync(cacheDir);
59
+ }
60
+ if (!fs_1.existsSync(perfDir)) {
61
+ fs_1.mkdirSync(perfDir);
62
+ }
63
+ fs_1.writeFileSync(path_1.join(perfDir, `${packageName}.json`), JSON.stringify(d));
64
+ }
65
+ }
66
+ return failures;
67
+ };
68
+ const maxFailures = getFailures(util_1.last(versionsToTest), undefined, /*writeOutput*/ true);
69
+ if (maxFailures.length) {
70
+ return maxFailures;
71
+ }
72
+ // As an optimization, check the earliest version for errors;
73
+ // assume that if it works on min and max, it works for everything in between.
74
+ const minFailures = getFailures(versionsToTest[0], undefined, /*writeOutput*/ false);
75
+ if (!minFailures.length) {
76
+ return [];
77
+ }
78
+ // There are no failures in the max version, but there are failures in the min version.
79
+ // Work backward to find the newest version with failures.
80
+ for (let i = versionsToTest.length - 2; i >= 0; i--) {
81
+ const failures = getFailures(versionsToTest[i], options.versionsToTest[i + 1].versionName, /*writeOutput*/ false);
82
+ if (failures.length) {
83
+ return failures;
84
+ }
85
+ }
86
+ throw new Error(); // unreachable -- at least the min version should have failures.
87
+ }
88
+ }
89
+ exports.Rule = Rule;
90
+ Rule.metadata = {
91
+ ruleName: "expect",
92
+ description: "Asserts types with $ExpectType and presence of errors with $ExpectError.",
93
+ optionsDescription: "Not configurable.",
94
+ options: null,
95
+ type: "functionality",
96
+ typescriptOnly: true,
97
+ requiresTypeInfo: true
98
+ };
99
+ Rule.FAILURE_STRING_DUPLICATE_ASSERTION = "This line has 2 $ExpectType assertions.";
100
+ Rule.FAILURE_STRING_ASSERTION_MISSING_NODE = "Can not match a node to this assertion.";
101
+ Rule.FAILURE_STRING_EXPECTED_ERROR = "Expected an error on this line, but found none.";
102
+ const programCache = new WeakMap();
103
+ /** Maps a tslint Program to one created with the version specified in `options`. */
104
+ function getProgram(configFile, ts, versionName, lintProgram) {
105
+ let versionToProgram = programCache.get(lintProgram);
106
+ if (versionToProgram === undefined) {
107
+ versionToProgram = new Map();
108
+ programCache.set(lintProgram, versionToProgram);
109
+ }
110
+ let newProgram = versionToProgram.get(versionName);
111
+ if (newProgram === undefined) {
112
+ newProgram = createProgram(configFile, ts);
113
+ versionToProgram.set(versionName, newProgram);
114
+ }
115
+ return newProgram;
116
+ }
117
+ exports.getProgram = getProgram;
118
+ function createProgram(configFile, ts) {
119
+ const projectDirectory = path_1.dirname(configFile);
120
+ const { config } = ts.readConfigFile(configFile, ts.sys.readFile);
121
+ const parseConfigHost = {
122
+ fileExists: fs_1.existsSync,
123
+ readDirectory: ts.sys.readDirectory,
124
+ readFile: file => fs_1.readFileSync(file, "utf8"),
125
+ useCaseSensitiveFileNames: true
126
+ };
127
+ const parsed = ts.parseJsonConfigFileContent(config, parseConfigHost, path_1.resolve(projectDirectory), {
128
+ noEmit: true
129
+ });
130
+ const host = ts.createCompilerHost(parsed.options, true);
131
+ return ts.createProgram(parsed.fileNames, parsed.options, host);
132
+ }
133
+ function walk(ctx, program, ts, versionName, nextHigherVersion) {
134
+ const { fileName } = ctx.sourceFile;
135
+ const sourceFile = program.getSourceFile(fileName);
136
+ if (!sourceFile) {
137
+ ctx.addFailure(0, 0, `Program source files differ between TypeScript versions. This may be a dtslint bug.\n` +
138
+ `Expected to find a file '${fileName}' present in ${TsType.version}, but did not find it in ts@${versionName}.`);
139
+ return;
140
+ }
141
+ const checker = program.getTypeChecker();
142
+ // Don't care about emit errors.
143
+ const diagnostics = ts.getPreEmitDiagnostics(program, sourceFile);
144
+ if (sourceFile.isDeclarationFile || !/\$Expect(Type|Error)/.test(sourceFile.text)) {
145
+ // Normal file.
146
+ for (const diagnostic of diagnostics) {
147
+ addDiagnosticFailure(diagnostic);
148
+ }
149
+ return;
150
+ }
151
+ const { errorLines, typeAssertions, duplicates } = parseAssertions(sourceFile);
152
+ for (const line of duplicates) {
153
+ addFailureAtLine(line, Rule.FAILURE_STRING_DUPLICATE_ASSERTION);
154
+ }
155
+ const seenDiagnosticsOnLine = new Set();
156
+ for (const diagnostic of diagnostics) {
157
+ const line = lineOfPosition(diagnostic.start, sourceFile);
158
+ seenDiagnosticsOnLine.add(line);
159
+ if (!errorLines.has(line)) {
160
+ addDiagnosticFailure(diagnostic);
161
+ }
162
+ }
163
+ for (const line of errorLines) {
164
+ if (!seenDiagnosticsOnLine.has(line)) {
165
+ addFailureAtLine(line, Rule.FAILURE_STRING_EXPECTED_ERROR);
166
+ }
167
+ }
168
+ const { unmetExpectations, unusedAssertions } = getExpectTypeFailures(sourceFile, typeAssertions, checker, ts);
169
+ for (const { node, expected, actual } of unmetExpectations) {
170
+ ctx.addFailureAtNode(node, Rule.FAILURE_STRING(versionName, expected, actual));
171
+ }
172
+ for (const line of unusedAssertions) {
173
+ addFailureAtLine(line, Rule.FAILURE_STRING_ASSERTION_MISSING_NODE);
174
+ }
175
+ function addDiagnosticFailure(diagnostic) {
176
+ const intro = getIntro();
177
+ if (diagnostic.file === sourceFile) {
178
+ const msg = `${intro}\n${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`;
179
+ ctx.addFailureAt(diagnostic.start, diagnostic.length, msg);
180
+ }
181
+ else {
182
+ ctx.addFailureAt(0, 0, `${intro}\n${fileName}${diagnostic.messageText}`);
183
+ }
184
+ }
185
+ function getIntro() {
186
+ if (nextHigherVersion === undefined) {
187
+ return `TypeScript@${versionName} compile error: `;
188
+ }
189
+ else {
190
+ const msg = `Compile error in typescript@${versionName} but not in typescript@${nextHigherVersion}.\n`;
191
+ const explain = nextHigherVersion === "next"
192
+ ? "TypeScript@next features not yet supported."
193
+ : `Fix with a comment '// Minimum TypeScript Version: ${nextHigherVersion}' just under the header.`;
194
+ return msg + explain;
195
+ }
196
+ }
197
+ function addFailureAtLine(line, failure) {
198
+ const start = sourceFile.getPositionOfLineAndCharacter(line, 0);
199
+ let end = start + sourceFile.text.split("\n")[line].length;
200
+ if (sourceFile.text[end - 1] === "\r") {
201
+ end--;
202
+ }
203
+ ctx.addFailure(start, end, `TypeScript@${versionName}: ${failure}`);
204
+ }
205
+ }
206
+ function parseAssertions(sourceFile) {
207
+ const errorLines = new Set();
208
+ const typeAssertions = new Map();
209
+ const duplicates = [];
210
+ const { text } = sourceFile;
211
+ const commentRegexp = /\/\/(.*)/g;
212
+ const lineStarts = sourceFile.getLineStarts();
213
+ let curLine = 0;
214
+ // eslint-disable-next-line no-constant-condition
215
+ while (true) {
216
+ const commentMatch = commentRegexp.exec(text);
217
+ if (commentMatch === null) {
218
+ break;
219
+ }
220
+ // Match on the contents of that comment so we do nothing in a commented-out assertion,
221
+ // i.e. `// foo; // $ExpectType number`
222
+ const match = /^ \$Expect((Type (.*))|Error)$/.exec(commentMatch[1]);
223
+ if (match === null) {
224
+ continue;
225
+ }
226
+ const line = getLine(commentMatch.index);
227
+ if (match[1] === "Error") {
228
+ if (errorLines.has(line)) {
229
+ duplicates.push(line);
230
+ }
231
+ errorLines.add(line);
232
+ }
233
+ else {
234
+ const expectedType = match[3];
235
+ // Don't bother with the assertion if there are 2 assertions on 1 line. Just fail for the duplicate.
236
+ if (typeAssertions.delete(line)) {
237
+ duplicates.push(line);
238
+ }
239
+ else {
240
+ typeAssertions.set(line, expectedType);
241
+ }
242
+ }
243
+ }
244
+ return { errorLines, typeAssertions, duplicates };
245
+ function getLine(pos) {
246
+ // advance curLine to be the line preceding 'pos'
247
+ while (lineStarts[curLine + 1] <= pos) {
248
+ curLine++;
249
+ }
250
+ // If this is the first token on the line, it applies to the next line.
251
+ // Otherwise, it applies to the text to the left of it.
252
+ return isFirstOnLine(text, lineStarts[curLine], pos) ? curLine + 1 : curLine;
253
+ }
254
+ }
255
+ function isFirstOnLine(text, lineStart, pos) {
256
+ for (let i = lineStart; i < pos; i++) {
257
+ if (text[i] !== " ") {
258
+ return false;
259
+ }
260
+ }
261
+ return true;
262
+ }
263
+ function matchReadonlyArray(actual, expected) {
264
+ if (!(/\breadonly\b/.test(actual) && /\bReadonlyArray\b/.test(expected)))
265
+ return false;
266
+ const readonlyArrayRegExp = /\bReadonlyArray</y;
267
+ const readonlyModifierRegExp = /\breadonly /y;
268
+ // A<ReadonlyArray<B<ReadonlyArray<C>>>>
269
+ // A<readonly B<readonly C[]>[]>
270
+ let expectedPos = 0;
271
+ let actualPos = 0;
272
+ let depth = 0;
273
+ while (expectedPos < expected.length && actualPos < actual.length) {
274
+ const expectedChar = expected.charAt(expectedPos);
275
+ const actualChar = actual.charAt(actualPos);
276
+ if (expectedChar === actualChar) {
277
+ expectedPos++;
278
+ actualPos++;
279
+ continue;
280
+ }
281
+ // check for end of readonly array
282
+ if (depth > 0 &&
283
+ expectedChar === ">" &&
284
+ actualChar === "[" &&
285
+ actualPos < actual.length - 1 &&
286
+ actual.charAt(actualPos + 1) === "]") {
287
+ depth--;
288
+ expectedPos++;
289
+ actualPos += 2;
290
+ continue;
291
+ }
292
+ // check for start of readonly array
293
+ readonlyArrayRegExp.lastIndex = expectedPos;
294
+ readonlyModifierRegExp.lastIndex = actualPos;
295
+ if (readonlyArrayRegExp.test(expected) && readonlyModifierRegExp.test(actual)) {
296
+ depth++;
297
+ expectedPos += 14; // "ReadonlyArray<".length;
298
+ actualPos += 9; // "readonly ".length;
299
+ continue;
300
+ }
301
+ return false;
302
+ }
303
+ return true;
304
+ }
305
+ function getExpectTypeFailures(sourceFile, typeAssertions, checker, ts) {
306
+ const unmetExpectations = [];
307
+ // Match assertions to the first node that appears on the line they apply to.
308
+ // `forEachChild` isn't available as a method in older TypeScript versions, so must use `ts.forEachChild` instead.
309
+ ts.forEachChild(sourceFile, function iterate(node) {
310
+ const line = lineOfPosition(node.getStart(sourceFile), sourceFile);
311
+ const expected = typeAssertions.get(line);
312
+ if (expected !== undefined) {
313
+ // https://github.com/Microsoft/TypeScript/issues/14077
314
+ if (node.kind === ts.SyntaxKind.ExpressionStatement) {
315
+ node = node.expression;
316
+ }
317
+ const type = checker.getTypeAtLocation(getNodeForExpectType(node, ts));
318
+ const actual = type
319
+ ? checker.typeToString(type, /*enclosingDeclaration*/ undefined, ts.TypeFormatFlags.NoTruncation)
320
+ : "";
321
+ if (!expected.split(/\s*\|\|\s*/).some(s => actual === s || matchReadonlyArray(actual, s))) {
322
+ unmetExpectations.push({ node, expected, actual });
323
+ }
324
+ typeAssertions.delete(line);
325
+ }
326
+ ts.forEachChild(node, iterate);
327
+ });
328
+ return { unmetExpectations, unusedAssertions: typeAssertions.keys() };
329
+ }
330
+ function getNodeForExpectType(node, ts) {
331
+ if (node.kind === ts.SyntaxKind.VariableStatement) {
332
+ // ts2.0 doesn't have `isVariableStatement`
333
+ const { declarationList: { declarations } } = node;
334
+ if (declarations.length === 1) {
335
+ const { initializer } = declarations[0];
336
+ if (initializer) {
337
+ return initializer;
338
+ }
339
+ }
340
+ }
341
+ return node;
342
+ }
343
+ function lineOfPosition(pos, sourceFile) {
344
+ return sourceFile.getLineAndCharacterOfPosition(pos).line;
345
+ }
346
+ //# sourceMappingURL=expectRule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expectRule.js","sourceRoot":"","sources":["../../../src/rules/expectRule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
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
+ static FAILURE_STRING: string;
6
+ apply(sourceFile: ts.SourceFile): Lint.RuleFailure[];
7
+ }
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.Rule = void 0;
23
+ const Lint = __importStar(require("tslint"));
24
+ const ts = __importStar(require("typescript"));
25
+ const util_1 = require("../util");
26
+ class Rule extends Lint.Rules.AbstractRule {
27
+ apply(sourceFile) {
28
+ return this.applyWithFunction(sourceFile, walk);
29
+ }
30
+ }
31
+ exports.Rule = Rule;
32
+ Rule.metadata = {
33
+ ruleName: "export-just-namespace",
34
+ description: "Forbid to `export = foo` where `foo` is a namespace and isn't merged with a function/class/type/interface.",
35
+ optionsDescription: "Not configurable.",
36
+ options: null,
37
+ type: "functionality",
38
+ typescriptOnly: true
39
+ };
40
+ Rule.FAILURE_STRING = util_1.failure(Rule.metadata.ruleName, "Instead of `export =`-ing a namespace, use the body of the namespace as the module body.");
41
+ function walk(ctx) {
42
+ const { sourceFile: { statements } } = ctx;
43
+ const exportEqualsNode = statements.find(isExportEquals);
44
+ if (!exportEqualsNode) {
45
+ return;
46
+ }
47
+ const expr = exportEqualsNode.expression;
48
+ if (!ts.isIdentifier(expr)) {
49
+ return;
50
+ }
51
+ const exportEqualsName = expr.text;
52
+ if (exportEqualsName && isJustNamespace(statements, exportEqualsName)) {
53
+ ctx.addFailureAtNode(exportEqualsNode, Rule.FAILURE_STRING);
54
+ }
55
+ }
56
+ function isExportEquals(node) {
57
+ return ts.isExportAssignment(node) && !!node.isExportEquals;
58
+ }
59
+ /** Returns true if there is a namespace but there are no functions/classes with the name. */
60
+ function isJustNamespace(statements, exportEqualsName) {
61
+ let anyNamespace = false;
62
+ for (const statement of statements) {
63
+ switch (statement.kind) {
64
+ case ts.SyntaxKind.ModuleDeclaration:
65
+ anyNamespace = anyNamespace || nameMatches(statement.name);
66
+ break;
67
+ case ts.SyntaxKind.VariableStatement:
68
+ if (statement.declarationList.declarations.some(d => nameMatches(d.name))) {
69
+ // OK. It's merged with a variable.
70
+ return false;
71
+ }
72
+ break;
73
+ case ts.SyntaxKind.FunctionDeclaration:
74
+ case ts.SyntaxKind.ClassDeclaration:
75
+ case ts.SyntaxKind.TypeAliasDeclaration:
76
+ case ts.SyntaxKind.InterfaceDeclaration:
77
+ if (nameMatches(statement.name)) {
78
+ // OK. It's merged with a function/class/type/interface.
79
+ return false;
80
+ }
81
+ break;
82
+ default:
83
+ }
84
+ }
85
+ return anyNamespace;
86
+ function nameMatches(nameNode) {
87
+ return nameNode !== undefined && ts.isIdentifier(nameNode) && nameNode.text === exportEqualsName;
88
+ }
89
+ }
90
+ /*
91
+ Tests:
92
+
93
+ OK:
94
+ export = foo;
95
+ declare namespace foo {}
96
+ declare function foo(): void; // or interface, type, class
97
+
98
+ Error:
99
+ export = foo;
100
+ declare namespace foo {}
101
+
102
+ OK: (it's assumed to come from elsewhere)
103
+ export = foo;
104
+ */
105
+ //# sourceMappingURL=exportJustNamespaceRule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportJustNamespaceRule.js","sourceRoot":"","sources":["../../../src/rules/exportJustNamespaceRule.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAC/B,+CAAiC;AAEjC,kCAAkC;AAElC,MAAa,IAAK,SAAQ,IAAI,CAAC,KAAK,CAAC,YAAY;IAgB/C,KAAK,CAAC,UAAyB;QAC7B,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;;AAlBH,oBAmBC;AAlBQ,aAAQ,GAAuB;IACpC,QAAQ,EAAE,uBAAuB;IACjC,WAAW,EACT,4GAA4G;IAC9G,kBAAkB,EAAE,mBAAmB;IACvC,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,eAAe;IACrB,cAAc,EAAE,IAAI;CACrB,CAAC;AAEK,mBAAc,GAAG,cAAO,CAC7B,IAAI,CAAC,QAAQ,CAAC,QAAQ,EACtB,0FAA0F,CAC3F,CAAC;AAOJ,SAAS,IAAI,CAAC,GAA2B;IACvC,MAAM,EACJ,UAAU,EAAE,EAAE,UAAU,EAAE,EAC3B,GAAG,GAAG,CAAC;IACR,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC,cAAc,CAAoC,CAAC;IAC5F,IAAI,CAAC,gBAAgB,EAAE;QACrB,OAAO;KACR;IACD,MAAM,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC;IACzC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;QAC1B,OAAO;KACR;IACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC;IAEnC,IAAI,gBAAgB,IAAI,eAAe,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE;QACrE,GAAG,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;KAC7D;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACnC,OAAO,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;AAC9D,CAAC;AAED,6FAA6F;AAC7F,SAAS,eAAe,CAAC,UAAmC,EAAE,gBAAwB;IACpF,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;QAClC,QAAQ,SAAS,CAAC,IAAI,EAAE;YACtB,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB;gBAClC,YAAY,GAAG,YAAY,IAAI,WAAW,CAAE,SAAkC,CAAC,IAAI,CAAC,CAAC;gBACrF,MAAM;YACR,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB;gBAClC,IAAK,SAAkC,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;oBACnG,mCAAmC;oBACnC,OAAO,KAAK,CAAC;iBACd;gBACD,MAAM;YACR,KAAK,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC;YACvC,KAAK,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;YACpC,KAAK,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC;YACxC,KAAK,EAAE,CAAC,UAAU,CAAC,oBAAoB;gBACrC,IAAI,WAAW,CAAE,SAAqC,CAAC,IAAI,CAAC,EAAE;oBAC5D,wDAAwD;oBACxD,OAAO,KAAK,CAAC;iBACd;gBACD,MAAM;YACR,QAAQ;SACT;KACF;IAED,OAAO,YAAY,CAAC;IAEpB,SAAS,WAAW,CAAC,QAA6B;QAChD,OAAO,QAAQ,KAAK,SAAS,IAAI,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,gBAAgB,CAAC;IACnG,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;EAcE"}
@@ -0,0 +1,7 @@
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
+ static FAILURE_STRING: string;
6
+ apply(sourceFile: ts.SourceFile): Lint.RuleFailure[];
7
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.Rule = void 0;
23
+ const Lint = __importStar(require("tslint"));
24
+ const ts = __importStar(require("typescript"));
25
+ const util_1 = require("../util");
26
+ class Rule extends Lint.Rules.AbstractRule {
27
+ apply(sourceFile) {
28
+ return this.applyWithFunction(sourceFile, walk);
29
+ }
30
+ }
31
+ exports.Rule = Rule;
32
+ Rule.metadata = {
33
+ ruleName: "no-any-union",
34
+ description: "Forbid a union to contain `any`",
35
+ optionsDescription: "Not configurable.",
36
+ options: null,
37
+ type: "functionality",
38
+ typescriptOnly: true
39
+ };
40
+ Rule.FAILURE_STRING = util_1.failure(Rule.metadata.ruleName, "Including `any` in a union will override all other members of the union.");
41
+ function walk(ctx) {
42
+ ctx.sourceFile.forEachChild(function recur(node) {
43
+ if (node.kind === ts.SyntaxKind.AnyKeyword && ts.isUnionTypeNode(node.parent)) {
44
+ ctx.addFailureAtNode(node, Rule.FAILURE_STRING);
45
+ }
46
+ node.forEachChild(recur);
47
+ });
48
+ }
49
+ //# sourceMappingURL=noAnyUnionRule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noAnyUnionRule.js","sourceRoot":"","sources":["../../../src/rules/noAnyUnionRule.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAC/B,+CAAiC;AAEjC,kCAAkC;AAElC,MAAa,IAAK,SAAQ,IAAI,CAAC,KAAK,CAAC,YAAY;IAe/C,KAAK,CAAC,UAAyB;QAC7B,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;;AAjBH,oBAkBC;AAjBQ,aAAQ,GAAuB;IACpC,QAAQ,EAAE,cAAc;IACxB,WAAW,EAAE,iCAAiC;IAC9C,kBAAkB,EAAE,mBAAmB;IACvC,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,eAAe;IACrB,cAAc,EAAE,IAAI;CACrB,CAAC;AAEK,mBAAc,GAAG,cAAO,CAC7B,IAAI,CAAC,QAAQ,CAAC,QAAQ,EACtB,0EAA0E,CAC3E,CAAC;AAOJ,SAAS,IAAI,CAAC,GAA2B;IACvC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,KAAK,CAAC,IAAI;QAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAO,CAAC,EAAE;YAC9E,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;SACjD;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
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
+ static FAILURE_STRING: string;
6
+ static FAILURE_STRING_REFERENCE_IN_TEST: string;
7
+ apply(sourceFile: ts.SourceFile): Lint.RuleFailure[];
8
+ }