@definitelytyped/eslint-plugin 0.0.206 → 0.0.207

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @definitelytyped/eslint-plugin
2
2
 
3
+ ## 0.0.207
4
+
5
+ ### Patch Changes
6
+
7
+ - 57628b68: Add new no-type-only-packages lint rule
8
+
3
9
  ## 0.0.206
4
10
 
5
11
  ### Patch Changes
@@ -24,4 +24,5 @@ export declare const rules: {
24
24
  readonly path: string;
25
25
  }[] | undefined;
26
26
  }], "noTsconfig" | "twoAssertions" | "failure" | "diagnostic" | "programContents" | "noMatch" | "needInstall">;
27
+ "no-type-only-packages": import("../util").RuleModule<never[], "onlyTypes">;
27
28
  };
@@ -21,6 +21,7 @@ const noOldDTHeader = require("./no-old-dt-header");
21
21
  const noImportOfDevDependencies = require("./no-import-of-dev-dependencies");
22
22
  const npmNaming = require("./npm-naming");
23
23
  const expect = require("./expect");
24
+ const noTypeOnlyPackages = require("./no-type-only-packages");
24
25
  exports.rules = {
25
26
  "export-just-namespace": exportJustNamespace,
26
27
  "no-any-union": noAnyUnion,
@@ -42,5 +43,6 @@ exports.rules = {
42
43
  "no-import-of-dev-dependencies": noImportOfDevDependencies,
43
44
  "npm-naming": npmNaming,
44
45
  expect,
46
+ "no-type-only-packages": noTypeOnlyPackages,
45
47
  };
46
48
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":";;;AAAA,+DAAgE;AAChE,6CAA8C;AAC9C,qDAAsD;AACtD,+CAAgD;AAChD,uDAAwD;AACxD,wEAAyE;AACzE,sFAAuF;AACvF,uEAAwE;AACxE,iDAAkD;AAClD,2EAA4E;AAC5E,mEAAoE;AACpE,qDAAsD;AACtD,mEAAoE;AACpE,4DAA6D;AAC7D,kFAAmF;AACnF,oEAAqE;AACrE,oDAAqD;AACrD,6EAA8E;AAC9E,0CAA2C;AAC3C,mCAAoC;AAEvB,QAAA,KAAK,GAAG;IACnB,uBAAuB,EAAE,mBAAmB;IAC5C,cAAc,EAAE,UAAU;IAC1B,kBAAkB,EAAE,cAAc;IAClC,eAAe,EAAE,WAAW;IAC5B,mBAAmB,EAAE,eAAe;IACpC,4BAA4B,EAAE,uBAAuB;IACrD,oCAAoC,EAAE,6BAA6B;IACnE,4BAA4B,EAAE,sBAAsB;IACpD,gBAAgB,EAAE,YAAY;IAC9B,8BAA8B,EAAE,wBAAwB;IACxD,yBAAyB,EAAE,qBAAqB;IAChD,kBAAkB,EAAE,cAAc;IAClC,yBAAyB,EAAE,qBAAqB;IAChD,qBAAqB,EAAE,kBAAkB;IACzC,iCAAiC,EAAE,4BAA4B;IAC/D,0BAA0B,EAAE,qBAAqB;IACjD,kBAAkB,EAAE,aAAa;IACjC,+BAA+B,EAAE,yBAAyB;IAC1D,YAAY,EAAE,SAAS;IACvB,MAAM;CACP,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":";;;AAAA,+DAAgE;AAChE,6CAA8C;AAC9C,qDAAsD;AACtD,+CAAgD;AAChD,uDAAwD;AACxD,wEAAyE;AACzE,sFAAuF;AACvF,uEAAwE;AACxE,iDAAkD;AAClD,2EAA4E;AAC5E,mEAAoE;AACpE,qDAAsD;AACtD,mEAAoE;AACpE,4DAA6D;AAC7D,kFAAmF;AACnF,oEAAqE;AACrE,oDAAqD;AACrD,6EAA8E;AAC9E,0CAA2C;AAC3C,mCAAoC;AACpC,8DAA+D;AAElD,QAAA,KAAK,GAAG;IACnB,uBAAuB,EAAE,mBAAmB;IAC5C,cAAc,EAAE,UAAU;IAC1B,kBAAkB,EAAE,cAAc;IAClC,eAAe,EAAE,WAAW;IAC5B,mBAAmB,EAAE,eAAe;IACpC,4BAA4B,EAAE,uBAAuB;IACrD,oCAAoC,EAAE,6BAA6B;IACnE,4BAA4B,EAAE,sBAAsB;IACpD,gBAAgB,EAAE,YAAY;IAC9B,8BAA8B,EAAE,wBAAwB;IACxD,yBAAyB,EAAE,qBAAqB;IAChD,kBAAkB,EAAE,cAAc;IAClC,yBAAyB,EAAE,qBAAqB;IAChD,qBAAqB,EAAE,kBAAkB;IACzC,iCAAiC,EAAE,4BAA4B;IAC/D,0BAA0B,EAAE,qBAAqB;IACjD,kBAAkB,EAAE,aAAa;IACjC,+BAA+B,EAAE,yBAAyB;IAC1D,YAAY,EAAE,SAAS;IACvB,MAAM;IACN,uBAAuB,EAAE,kBAAkB;CAC5C,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const rule: import("../util").RuleModule<never[], "onlyTypes">;
2
+ export = rule;
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ const util_1 = require("../util");
29
+ const utils_1 = require("@typescript-eslint/utils");
30
+ const ts = __importStar(require("typescript"));
31
+ const path_1 = __importDefault(require("path"));
32
+ const rule = (0, util_1.createRule)({
33
+ name: "no-type-only-packages",
34
+ defaultOptions: [],
35
+ meta: {
36
+ type: "problem",
37
+ docs: {
38
+ description: "Forbids type-only packages",
39
+ },
40
+ messages: {
41
+ onlyTypes: "Packages should contain value components, not just types.",
42
+ },
43
+ schema: [],
44
+ },
45
+ create(context) {
46
+ if (!(0, util_1.isMainFile)(context.filename, true)) {
47
+ return {};
48
+ }
49
+ const pkg = (0, util_1.findTypesPackage)(context.filename);
50
+ if (!pkg) {
51
+ return {};
52
+ }
53
+ const program = utils_1.ESLintUtils.getParserServices(context).program;
54
+ let hasValueDeclaration = false;
55
+ let hasNonEmptyFile = false;
56
+ function isOutsidePackage(fileName) {
57
+ return fileName.includes("node_modules") || path_1.default.relative(pkg.dir, fileName).startsWith("..");
58
+ }
59
+ for (const sourceFile of program.getSourceFiles()) {
60
+ if (!sourceFile.isDeclarationFile ||
61
+ sourceFile.statements.length === 0 ||
62
+ isOutsidePackage(sourceFile.fileName)) {
63
+ continue;
64
+ }
65
+ hasNonEmptyFile = true;
66
+ function isValueDeclaration(node) {
67
+ switch (node.kind) {
68
+ case ts.SyntaxKind.VariableDeclaration:
69
+ case ts.SyntaxKind.FunctionDeclaration:
70
+ case ts.SyntaxKind.ClassDeclaration:
71
+ case ts.SyntaxKind.EnumDeclaration:
72
+ return true;
73
+ }
74
+ return false;
75
+ }
76
+ function getSymbol(node) {
77
+ const checker = program.getTypeChecker();
78
+ let symbol = checker.getSymbolAtLocation(node);
79
+ if (symbol && symbol.flags & ts.SymbolFlags.Alias) {
80
+ symbol = checker.getAliasedSymbol(symbol);
81
+ }
82
+ return symbol;
83
+ }
84
+ function symbolIsValue(node) {
85
+ const symbol = getSymbol(node);
86
+ if (symbol) {
87
+ return !!symbol.valueDeclaration;
88
+ }
89
+ return undefined;
90
+ }
91
+ function symbolDefinedOutsidePackage(node) {
92
+ var _a, _b, _c;
93
+ return ((_c = (_b = (_a = getSymbol(node)) === null || _a === void 0 ? void 0 : _a.getDeclarations()) === null || _b === void 0 ? void 0 : _b.some((declaration) => isOutsidePackage(declaration.getSourceFile().fileName))) !== null && _c !== void 0 ? _c : false);
94
+ }
95
+ function containsValueDeclaration(node) {
96
+ var _a, _b, _c, _d;
97
+ if (isValueDeclaration(node)) {
98
+ return true;
99
+ }
100
+ if (ts.isImportDeclaration(node) || ts.isImportEqualsDeclaration(node)) {
101
+ return false;
102
+ }
103
+ if (ts.isExportAssignment(node)) {
104
+ return (_a = symbolIsValue(node.expression)) !== null && _a !== void 0 ? _a : ts.isLiteralTypeLiteral(node.expression);
105
+ }
106
+ if (ts.isNamespaceExportDeclaration(node)) {
107
+ return (_b = symbolIsValue(node.name)) !== null && _b !== void 0 ? _b : false;
108
+ }
109
+ if (ts.isNamedExports(node)) {
110
+ return node.elements.some((element) => symbolIsValue(element.name));
111
+ }
112
+ if (ts.isExportDeclaration(node) && !node.isTypeOnly && !node.exportClause && node.moduleSpecifier) {
113
+ return (_c = symbolIsValue(node.moduleSpecifier)) !== null && _c !== void 0 ? _c : false;
114
+ }
115
+ if (ts.isInterfaceDeclaration(node)) {
116
+ // If we're extending the interface of an external declaration, allow it.
117
+ return symbolDefinedOutsidePackage(node.name);
118
+ }
119
+ if (ts.isModuleDeclaration(node) && !(ts.isIdentifier(node.name) && node.name.escapedText === "global")) {
120
+ if (symbolDefinedOutsidePackage(node.name)) {
121
+ // If we're extending a namespace in another package, allow it.
122
+ return true;
123
+ }
124
+ // Otherwise, recurse and check for a value component.
125
+ }
126
+ return (_d = ts.forEachChild(node, containsValueDeclaration)) !== null && _d !== void 0 ? _d : false;
127
+ }
128
+ if (containsValueDeclaration(sourceFile)) {
129
+ hasValueDeclaration = true;
130
+ break;
131
+ }
132
+ }
133
+ if (hasNonEmptyFile && !hasValueDeclaration) {
134
+ context.report({
135
+ loc: { line: 1, column: 0 },
136
+ messageId: "onlyTypes",
137
+ });
138
+ }
139
+ return {};
140
+ },
141
+ });
142
+ module.exports = rule;
143
+ //# sourceMappingURL=no-type-only-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-type-only-packages.js","sourceRoot":"","sources":["../../src/rules/no-type-only-packages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ # no-type-only-packages
2
+
3
+ If there's no source JavaScript code at all, for example if you're writing helper types or types for a spec, you should publish the types yourself, not on Definitely Typed.
4
+ Because they're meant to provide types for existing JavaScript code, `@types` packages are not meant to be imported directly.
5
+ That is, you shouldn't create a Definitely Typed package that's meant to be used like `import type { ... } from "@types/foo"`.
6
+ Nor should you expect to write `import type { ... } from "foo"` when there's no `foo` installed.
7
+
8
+ **Bad**:
9
+
10
+ ```ts
11
+ export interface SomeInterface {
12
+ someProperty: string;
13
+ }
14
+ ```
15
+
16
+ **Good**:
17
+
18
+ ```ts
19
+ export interface SomeInterface {
20
+ someProperty: string;
21
+ }
22
+
23
+ export function someLibraryFunction(): SomeInterface;
24
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@definitelytyped/eslint-plugin",
3
- "version": "0.0.206",
3
+ "version": "0.0.207",
4
4
  "description": "ESLint rules for DefinitelyTyped",
5
5
  "main": "./dist/index.js",
6
6
  "publishConfig": {