@api-extractor-tools/eslint-plugin 0.1.0-alpha.0 → 0.1.0-alpha.1

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 (104) hide show
  1. package/ARCHITECTURE.md +201 -0
  2. package/CHANGELOG.md +24 -0
  3. package/README.md +306 -10
  4. package/api-extractor.json +1 -0
  5. package/dist/configs/recommended.d.ts +1 -1
  6. package/dist/configs/recommended.d.ts.map +1 -1
  7. package/dist/configs/recommended.js +7 -1
  8. package/dist/configs/recommended.js.map +1 -1
  9. package/dist/index.d.ts +9 -16
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +11 -15
  12. package/dist/index.js.map +1 -1
  13. package/dist/node.d.ts +28 -0
  14. package/dist/node.d.ts.map +1 -0
  15. package/dist/node.js +41 -0
  16. package/dist/node.js.map +1 -0
  17. package/dist/rules/extra-release-tag.d.ts +24 -0
  18. package/dist/rules/extra-release-tag.d.ts.map +1 -0
  19. package/dist/rules/extra-release-tag.js +141 -0
  20. package/dist/rules/extra-release-tag.js.map +1 -0
  21. package/dist/rules/forgotten-export.d.ts +24 -0
  22. package/dist/rules/forgotten-export.d.ts.map +1 -0
  23. package/dist/rules/forgotten-export.js +212 -0
  24. package/dist/rules/forgotten-export.js.map +1 -0
  25. package/dist/rules/incompatible-release-tags.d.ts +25 -0
  26. package/dist/rules/incompatible-release-tags.d.ts.map +1 -0
  27. package/dist/rules/incompatible-release-tags.js +237 -0
  28. package/dist/rules/incompatible-release-tags.js.map +1 -0
  29. package/dist/rules/index.d.ts +2 -6
  30. package/dist/rules/index.d.ts.map +1 -1
  31. package/dist/rules/index.js +13 -1
  32. package/dist/rules/index.js.map +1 -1
  33. package/dist/rules/missing-release-tag.d.ts +4 -0
  34. package/dist/rules/missing-release-tag.d.ts.map +1 -1
  35. package/dist/rules/missing-release-tag.js +14 -21
  36. package/dist/rules/missing-release-tag.js.map +1 -1
  37. package/dist/rules/override-keyword.d.ts +4 -0
  38. package/dist/rules/override-keyword.d.ts.map +1 -1
  39. package/dist/rules/override-keyword.js +9 -11
  40. package/dist/rules/override-keyword.js.map +1 -1
  41. package/dist/rules/package-documentation.d.ts +1 -1
  42. package/dist/rules/package-documentation.d.ts.map +1 -1
  43. package/dist/rules/package-documentation.js +7 -28
  44. package/dist/rules/package-documentation.js.map +1 -1
  45. package/dist/rules/public-on-non-exported.d.ts +24 -0
  46. package/dist/rules/public-on-non-exported.d.ts.map +1 -0
  47. package/dist/rules/public-on-non-exported.js +191 -0
  48. package/dist/rules/public-on-non-exported.js.map +1 -0
  49. package/dist/rules/public-on-private-member.d.ts +24 -0
  50. package/dist/rules/public-on-private-member.d.ts.map +1 -0
  51. package/dist/rules/public-on-private-member.js +111 -0
  52. package/dist/rules/public-on-private-member.js.map +1 -0
  53. package/dist/rules/valid-enum-type.d.ts +17 -0
  54. package/dist/rules/valid-enum-type.d.ts.map +1 -0
  55. package/dist/rules/valid-enum-type.js +206 -0
  56. package/dist/rules/valid-enum-type.js.map +1 -0
  57. package/dist/types.d.ts +63 -35
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/types.js +4 -1
  60. package/dist/types.js.map +1 -1
  61. package/dist/utils/tsdoc-parser.d.ts +35 -0
  62. package/dist/utils/tsdoc-parser.d.ts.map +1 -1
  63. package/dist/utils/tsdoc-parser.js +40 -0
  64. package/dist/utils/tsdoc-parser.js.map +1 -1
  65. package/docs/rules/valid-enum-type.md +153 -0
  66. package/package.json +22 -8
  67. package/src/configs/recommended.ts +7 -1
  68. package/src/index.ts +21 -15
  69. package/src/node.ts +50 -0
  70. package/src/rules/extra-release-tag.ts +201 -0
  71. package/src/rules/forgotten-export.ts +274 -0
  72. package/src/rules/incompatible-release-tags.ts +331 -0
  73. package/src/rules/index.ts +13 -1
  74. package/src/rules/missing-release-tag.ts +11 -26
  75. package/src/rules/override-keyword.ts +6 -8
  76. package/src/rules/package-documentation.ts +5 -31
  77. package/src/rules/public-on-non-exported.ts +265 -0
  78. package/src/rules/public-on-private-member.ts +157 -0
  79. package/src/rules/valid-enum-type.ts +252 -0
  80. package/src/types.ts +60 -17
  81. package/src/utils/config-loader.ts +1 -0
  82. package/src/utils/entry-point.ts +1 -0
  83. package/src/utils/tsdoc-parser.ts +67 -0
  84. package/temp/eslint-plugin.api.md +96 -47
  85. package/test/index.test.ts +1 -0
  86. package/test/rules/extra-release-tag.test.ts +276 -0
  87. package/test/rules/forgotten-export.test.ts +190 -0
  88. package/test/rules/incompatible-release-tags.test.ts +340 -0
  89. package/test/rules/missing-release-tag.test.ts +2 -1
  90. package/test/rules/override-keyword.test.ts +2 -1
  91. package/test/rules/package-documentation.test.ts +8 -6
  92. package/test/rules/public-on-non-exported.test.ts +201 -0
  93. package/test/rules/public-on-private-member.test.ts +207 -0
  94. package/test/rules/valid-enum-type.test.ts +409 -0
  95. package/test/types.test-d.ts +20 -0
  96. package/test/utils/config-loader.test.ts +1 -0
  97. package/test/utils/tsdoc-parser.test.ts +117 -9
  98. package/tsconfig.json +1 -0
  99. package/vitest.config.mts +1 -0
  100. package/dist/utils/index.d.ts +0 -8
  101. package/dist/utils/index.d.ts.map +0 -1
  102. package/dist/utils/index.js +0 -21
  103. package/dist/utils/index.js.map +0 -1
  104. package/src/utils/index.ts +0 -17
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ESLint rule preventing the use of @public tag on non-exported symbols.
3
+ *
4
+ * @remarks
5
+ * The @public tag indicates that a symbol is part of the public API, but non-exported
6
+ * symbols cannot be accessed by consumers and should not be marked as public.
7
+ *
8
+ * @internal
9
+ */
10
+ import { ESLintUtils } from '@typescript-eslint/utils';
11
+ import type { ApiExtractorLogLevel } from '../types';
12
+ /**
13
+ * Options for the public-on-non-exported rule.
14
+ * @alpha
15
+ */
16
+ export interface PublicOnNonExportedRuleOptions {
17
+ /**
18
+ * Severity level for public tags on non-exported symbols.
19
+ * @defaultValue 'error'
20
+ */
21
+ severity?: ApiExtractorLogLevel;
22
+ }
23
+ export declare const publicOnNonExported: ESLintUtils.RuleModule<"publicOnNonExported", [PublicOnNonExportedRuleOptions], unknown, ESLintUtils.RuleListener>;
24
+ //# sourceMappingURL=public-on-non-exported.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-on-non-exported.d.ts","sourceRoot":"","sources":["../../src/rules/public-on-non-exported.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAkB,WAAW,EAAY,MAAM,0BAA0B,CAAA;AAMhF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AASpD;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC7C;;;OAGG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAChC;AAED,eAAO,MAAM,mBAAmB,oHAmO9B,CAAA"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ /**
3
+ * ESLint rule preventing the use of @public tag on non-exported symbols.
4
+ *
5
+ * @remarks
6
+ * The @public tag indicates that a symbol is part of the public API, but non-exported
7
+ * symbols cannot be accessed by consumers and should not be marked as public.
8
+ *
9
+ * @internal
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.publicOnNonExported = void 0;
13
+ const utils_1 = require("@typescript-eslint/utils");
14
+ const tsdoc_parser_1 = require("../utils/tsdoc-parser");
15
+ const createRule = utils_1.ESLintUtils.RuleCreator((name) => `https://github.com/mike-north/api-extractor-tools/blob/main/tools/eslint-plugin/docs/rules/${name}.md`);
16
+ exports.publicOnNonExported = createRule({
17
+ name: 'public-on-non-exported',
18
+ meta: {
19
+ type: 'problem',
20
+ docs: {
21
+ description: 'Prevent the use of @public tag on symbols that are not exported',
22
+ },
23
+ messages: {
24
+ publicOnNonExported: 'Symbol "{{name}}" has the @public tag but is not exported. Only exported symbols can be marked as @public.',
25
+ },
26
+ schema: [
27
+ {
28
+ type: 'object',
29
+ properties: {
30
+ severity: {
31
+ type: 'string',
32
+ enum: ['error', 'warning', 'none'],
33
+ description: 'Severity level for public tags on non-exported symbols',
34
+ },
35
+ },
36
+ additionalProperties: false,
37
+ },
38
+ ],
39
+ },
40
+ defaultOptions: [{}],
41
+ create(context) {
42
+ const options = context.options[0] ?? {};
43
+ const severity = options.severity ?? 'error';
44
+ // If severity is 'none', disable the rule
45
+ if (severity === 'none') {
46
+ return {};
47
+ }
48
+ const sourceCode = context.sourceCode;
49
+ const exportedSymbols = new Set();
50
+ const symbolsWithPublicTag = new Map();
51
+ /**
52
+ * Checks if a node has the @public release tag.
53
+ */
54
+ function hasPublicTag(node) {
55
+ const commentText = (0, tsdoc_parser_1.getLeadingTSDocComment)(sourceCode, node);
56
+ if (!commentText) {
57
+ return false;
58
+ }
59
+ const parsed = (0, tsdoc_parser_1.parseTSDocComment)(commentText);
60
+ if (parsed.docComment) {
61
+ const tag = (0, tsdoc_parser_1.extractReleaseTag)(parsed.docComment);
62
+ return tag === 'public';
63
+ }
64
+ return false;
65
+ }
66
+ /**
67
+ * Gets the name of a declaration.
68
+ */
69
+ function getDeclarationName(node) {
70
+ if (node.type === utils_1.AST_NODE_TYPES.VariableDeclaration) {
71
+ const firstDeclarator = node.declarations[0];
72
+ if (firstDeclarator?.id.type === utils_1.AST_NODE_TYPES.Identifier) {
73
+ return firstDeclarator.id.name;
74
+ }
75
+ return undefined;
76
+ }
77
+ if ('id' in node && node.id) {
78
+ return node.id.name;
79
+ }
80
+ return undefined;
81
+ }
82
+ /**
83
+ * Collects all exported symbol names.
84
+ */
85
+ function collectExportedSymbols(node) {
86
+ if (node.type === utils_1.AST_NODE_TYPES.ExportNamedDeclaration) {
87
+ // export { foo, bar }
88
+ if (node.specifiers) {
89
+ for (const specifier of node.specifiers) {
90
+ if (specifier.type === utils_1.AST_NODE_TYPES.ExportSpecifier) {
91
+ if (specifier.exported.type === utils_1.AST_NODE_TYPES.Identifier) {
92
+ exportedSymbols.add(specifier.exported.name);
93
+ }
94
+ // Also add the local name in case it's different
95
+ if (specifier.local.type === utils_1.AST_NODE_TYPES.Identifier) {
96
+ exportedSymbols.add(specifier.local.name);
97
+ }
98
+ }
99
+ }
100
+ }
101
+ // export function foo() {} or export class Bar {}
102
+ if (node.declaration) {
103
+ const decl = node.declaration;
104
+ if ('id' in decl &&
105
+ decl.id &&
106
+ decl.id.type === utils_1.AST_NODE_TYPES.Identifier) {
107
+ exportedSymbols.add(decl.id.name);
108
+ }
109
+ else if (decl.type === utils_1.AST_NODE_TYPES.VariableDeclaration) {
110
+ for (const declarator of decl.declarations) {
111
+ if (declarator.id.type === utils_1.AST_NODE_TYPES.Identifier) {
112
+ exportedSymbols.add(declarator.id.name);
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+ /**
120
+ * Checks if a node is directly exported.
121
+ */
122
+ function isDirectlyExported(node) {
123
+ const parent = node.parent;
124
+ return (parent?.type === utils_1.AST_NODE_TYPES.ExportNamedDeclaration ||
125
+ parent?.type === utils_1.AST_NODE_TYPES.ExportDefaultDeclaration);
126
+ }
127
+ /**
128
+ * Collects symbols with @public tag.
129
+ */
130
+ function collectSymbolWithPublicTag(node) {
131
+ // Check if the node has @public tag
132
+ if (!hasPublicTag(node) && !isDirectlyExported(node)) {
133
+ // Check if the export has the tag
134
+ const parent = node.parent;
135
+ if (parent &&
136
+ (parent.type === utils_1.AST_NODE_TYPES.ExportNamedDeclaration ||
137
+ parent.type === utils_1.AST_NODE_TYPES.ExportDefaultDeclaration)) {
138
+ if (!hasPublicTag(parent)) {
139
+ return;
140
+ }
141
+ }
142
+ else {
143
+ return;
144
+ }
145
+ }
146
+ const name = getDeclarationName(node);
147
+ if (name && hasPublicTag(node)) {
148
+ symbolsWithPublicTag.set(name, { node, name });
149
+ }
150
+ }
151
+ return {
152
+ ExportNamedDeclaration(node) {
153
+ collectExportedSymbols(node);
154
+ },
155
+ ExportDefaultDeclaration(node) {
156
+ collectExportedSymbols(node);
157
+ },
158
+ FunctionDeclaration(node) {
159
+ collectSymbolWithPublicTag(node);
160
+ },
161
+ ClassDeclaration(node) {
162
+ collectSymbolWithPublicTag(node);
163
+ },
164
+ TSInterfaceDeclaration(node) {
165
+ collectSymbolWithPublicTag(node);
166
+ },
167
+ TSTypeAliasDeclaration(node) {
168
+ collectSymbolWithPublicTag(node);
169
+ },
170
+ TSEnumDeclaration(node) {
171
+ collectSymbolWithPublicTag(node);
172
+ },
173
+ VariableDeclaration(node) {
174
+ collectSymbolWithPublicTag(node);
175
+ },
176
+ 'Program:exit'() {
177
+ // Check for @public on non-exported symbols
178
+ for (const [name, { node }] of symbolsWithPublicTag) {
179
+ if (!exportedSymbols.has(name)) {
180
+ context.report({
181
+ node,
182
+ messageId: 'publicOnNonExported',
183
+ data: { name },
184
+ });
185
+ }
186
+ }
187
+ },
188
+ };
189
+ },
190
+ });
191
+ //# sourceMappingURL=public-on-non-exported.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-on-non-exported.js","sourceRoot":"","sources":["../../src/rules/public-on-non-exported.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ESLint rule preventing the use of @public tag on private or protected class members.
3
+ *
4
+ * @remarks
5
+ * Private and protected members cannot be public API since they are not accessible
6
+ * outside the class or to external consumers.
7
+ *
8
+ * @internal
9
+ */
10
+ import { ESLintUtils } from '@typescript-eslint/utils';
11
+ import type { ApiExtractorLogLevel } from '../types';
12
+ /**
13
+ * Options for the public-on-private-member rule.
14
+ * @alpha
15
+ */
16
+ export interface PublicOnPrivateMemberRuleOptions {
17
+ /**
18
+ * Severity level for public tags on private/protected members.
19
+ * @defaultValue 'error'
20
+ */
21
+ severity?: ApiExtractorLogLevel;
22
+ }
23
+ export declare const publicOnPrivateMember: ESLintUtils.RuleModule<"publicOnPrivateMember", [PublicOnPrivateMemberRuleOptions], unknown, ESLintUtils.RuleListener>;
24
+ //# sourceMappingURL=public-on-private-member.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-on-private-member.d.ts","sourceRoot":"","sources":["../../src/rules/public-on-private-member.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAkB,WAAW,EAAY,MAAM,0BAA0B,CAAA;AAMhF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AASpD;;;GAGG;AACH,MAAM,WAAW,gCAAgC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAChC;AAED,eAAO,MAAM,qBAAqB,wHAuHhC,CAAA"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ /**
3
+ * ESLint rule preventing the use of @public tag on private or protected class members.
4
+ *
5
+ * @remarks
6
+ * Private and protected members cannot be public API since they are not accessible
7
+ * outside the class or to external consumers.
8
+ *
9
+ * @internal
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.publicOnPrivateMember = void 0;
13
+ const utils_1 = require("@typescript-eslint/utils");
14
+ const tsdoc_parser_1 = require("../utils/tsdoc-parser");
15
+ const createRule = utils_1.ESLintUtils.RuleCreator((name) => `https://github.com/mike-north/api-extractor-tools/blob/main/tools/eslint-plugin/docs/rules/${name}.md`);
16
+ exports.publicOnPrivateMember = createRule({
17
+ name: 'public-on-private-member',
18
+ meta: {
19
+ type: 'problem',
20
+ docs: {
21
+ description: 'Prevent the use of @public tag on private or protected class members',
22
+ },
23
+ messages: {
24
+ publicOnPrivateMember: '{{accessibility}} member "{{name}}" cannot have the @public tag. Only public members can be marked as @public.',
25
+ },
26
+ schema: [
27
+ {
28
+ type: 'object',
29
+ properties: {
30
+ severity: {
31
+ type: 'string',
32
+ enum: ['error', 'warning', 'none'],
33
+ description: 'Severity level for public tags on private/protected members',
34
+ },
35
+ },
36
+ additionalProperties: false,
37
+ },
38
+ ],
39
+ },
40
+ defaultOptions: [{}],
41
+ create(context) {
42
+ const options = context.options[0] ?? {};
43
+ const severity = options.severity ?? 'error';
44
+ // If severity is 'none', disable the rule
45
+ if (severity === 'none') {
46
+ return {};
47
+ }
48
+ const sourceCode = context.sourceCode;
49
+ /**
50
+ * Checks if a node has the @public release tag.
51
+ */
52
+ function hasPublicTag(node) {
53
+ const commentText = (0, tsdoc_parser_1.getLeadingTSDocComment)(sourceCode, node);
54
+ if (!commentText) {
55
+ return false;
56
+ }
57
+ const parsed = (0, tsdoc_parser_1.parseTSDocComment)(commentText);
58
+ if (parsed.docComment) {
59
+ const tag = (0, tsdoc_parser_1.extractReleaseTag)(parsed.docComment);
60
+ return tag === 'public';
61
+ }
62
+ return false;
63
+ }
64
+ /**
65
+ * Gets the name of a member.
66
+ */
67
+ function getMemberName(node) {
68
+ if (node.key.type === utils_1.AST_NODE_TYPES.Identifier) {
69
+ return node.key.name;
70
+ }
71
+ if (node.key.type === utils_1.AST_NODE_TYPES.Literal &&
72
+ typeof node.key.value === 'string') {
73
+ return node.key.value;
74
+ }
75
+ return '<computed>';
76
+ }
77
+ /**
78
+ * Checks a class member for @public tag on private/protected members.
79
+ */
80
+ function checkClassMember(node) {
81
+ // Skip if not private or protected
82
+ if (node.accessibility !== 'private' &&
83
+ node.accessibility !== 'protected') {
84
+ return;
85
+ }
86
+ // Check if it has @public tag
87
+ if (hasPublicTag(node)) {
88
+ const name = getMemberName(node);
89
+ const accessibility = node.accessibility.charAt(0).toUpperCase() +
90
+ node.accessibility.slice(1);
91
+ context.report({
92
+ node,
93
+ messageId: 'publicOnPrivateMember',
94
+ data: {
95
+ name,
96
+ accessibility,
97
+ },
98
+ });
99
+ }
100
+ }
101
+ return {
102
+ PropertyDefinition(node) {
103
+ checkClassMember(node);
104
+ },
105
+ MethodDefinition(node) {
106
+ checkClassMember(node);
107
+ },
108
+ };
109
+ },
110
+ });
111
+ //# sourceMappingURL=public-on-private-member.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-on-private-member.js","sourceRoot":"","sources":["../../src/rules/public-on-private-member.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ESLint rule for validating `@enumType` TSDoc tag usage.
3
+ *
4
+ * @remarks
5
+ * This rule validates that `@enumType` tags are:
6
+ * - Only used on enum declarations or string literal union type aliases
7
+ * - Have a valid value ('open' or 'closed')
8
+ * - Not duplicated on a single declaration
9
+ *
10
+ * @internal
11
+ */
12
+ import { ESLintUtils } from '@typescript-eslint/utils';
13
+ import type { ValidEnumTypeRuleOptions } from '../types';
14
+ type MessageIds = 'missingValue' | 'invalidValue' | 'multipleEnumTypes' | 'invalidConstruct' | 'missingEnumType';
15
+ export declare const validEnumType: ESLintUtils.RuleModule<MessageIds, [ValidEnumTypeRuleOptions], unknown, ESLintUtils.RuleListener>;
16
+ export {};
17
+ //# sourceMappingURL=valid-enum-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-enum-type.d.ts","sourceRoot":"","sources":["../../src/rules/valid-enum-type.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAkB,WAAW,EAAY,MAAM,0BAA0B,CAAA;AAEhF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAOxD,KAAK,UAAU,GACX,cAAc,GACd,cAAc,GACd,mBAAmB,GACnB,kBAAkB,GAClB,iBAAiB,CAAA;AAErB,eAAO,MAAM,aAAa,mGA+NzB,CAAA"}
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /**
3
+ * ESLint rule for validating `@enumType` TSDoc tag usage.
4
+ *
5
+ * @remarks
6
+ * This rule validates that `@enumType` tags are:
7
+ * - Only used on enum declarations or string literal union type aliases
8
+ * - Have a valid value ('open' or 'closed')
9
+ * - Not duplicated on a single declaration
10
+ *
11
+ * @internal
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.validEnumType = void 0;
15
+ const utils_1 = require("@typescript-eslint/utils");
16
+ const tsdoc_parser_1 = require("../utils/tsdoc-parser");
17
+ const createRule = utils_1.ESLintUtils.RuleCreator((name) => `https://github.com/mike-north/api-extractor-tools/blob/main/tools/eslint-plugin/docs/rules/${name}.md`);
18
+ exports.validEnumType = createRule({
19
+ name: 'valid-enum-type',
20
+ meta: {
21
+ type: 'problem',
22
+ docs: {
23
+ description: 'Validate @enumType TSDoc tag usage on enums and string literal unions',
24
+ },
25
+ messages: {
26
+ missingValue: '@enumType tag requires a value of "open" or "closed"',
27
+ invalidValue: '@enumType tag value "{{value}}" is invalid. Use "open" or "closed"',
28
+ multipleEnumTypes: 'Multiple @enumType tags found. Only one is allowed',
29
+ invalidConstruct: '@enumType is only valid on enum declarations and string literal union type aliases',
30
+ missingEnumType: 'Exported {{kind}} "{{name}}" is missing @enumType tag. Add @enumType open or @enumType closed',
31
+ },
32
+ schema: [
33
+ {
34
+ type: 'object',
35
+ properties: {
36
+ requireOnExported: {
37
+ type: 'boolean',
38
+ description: 'Require @enumType on all exported enums and string literal unions',
39
+ },
40
+ },
41
+ additionalProperties: false,
42
+ },
43
+ ],
44
+ },
45
+ defaultOptions: [{}],
46
+ create(context) {
47
+ const options = context.options[0] ?? {};
48
+ const requireOnExported = options.requireOnExported ?? false;
49
+ const sourceCode = context.sourceCode;
50
+ /**
51
+ * Gets the TSDoc comment text for a node, checking both the node and its export parent.
52
+ */
53
+ function getTSDocComment(node) {
54
+ // First check the node itself
55
+ let commentText = (0, tsdoc_parser_1.getLeadingTSDocComment)(sourceCode, node);
56
+ if (commentText) {
57
+ return commentText;
58
+ }
59
+ // If node is inside an export, check the export statement
60
+ const parent = node.parent;
61
+ if (parent?.type === utils_1.AST_NODE_TYPES.ExportNamedDeclaration ||
62
+ parent?.type === utils_1.AST_NODE_TYPES.ExportDefaultDeclaration) {
63
+ commentText = (0, tsdoc_parser_1.getLeadingTSDocComment)(sourceCode, parent);
64
+ if (commentText) {
65
+ return commentText;
66
+ }
67
+ }
68
+ return undefined;
69
+ }
70
+ /**
71
+ * Checks if a node is exported.
72
+ */
73
+ function isExported(node) {
74
+ const parent = node.parent;
75
+ if (parent?.type === utils_1.AST_NODE_TYPES.ExportNamedDeclaration) {
76
+ return true;
77
+ }
78
+ if (parent?.type === utils_1.AST_NODE_TYPES.ExportDefaultDeclaration) {
79
+ return true;
80
+ }
81
+ return false;
82
+ }
83
+ /**
84
+ * Checks if a type alias is a string literal union.
85
+ * A string literal union is a union type where all members are string literal types.
86
+ */
87
+ function isStringLiteralUnion(typeAnnotation) {
88
+ // Check if it's a union type
89
+ if (typeAnnotation.type !== utils_1.AST_NODE_TYPES.TSUnionType) {
90
+ // Could be a single string literal - that's also valid
91
+ return (typeAnnotation.type === utils_1.AST_NODE_TYPES.TSLiteralType &&
92
+ typeAnnotation.literal.type === utils_1.AST_NODE_TYPES.Literal &&
93
+ typeof typeAnnotation.literal.value === 'string');
94
+ }
95
+ // All union members must be string literals
96
+ return typeAnnotation.types.every((member) => {
97
+ if (member.type === utils_1.AST_NODE_TYPES.TSLiteralType) {
98
+ return (member.literal.type === utils_1.AST_NODE_TYPES.Literal &&
99
+ typeof member.literal.value === 'string');
100
+ }
101
+ return false;
102
+ });
103
+ }
104
+ /**
105
+ * Validates `@enumType` usage on a node that should have it (enum or string literal union).
106
+ */
107
+ function validateEnumTypeTag(node, kind) {
108
+ const commentText = getTSDocComment(node);
109
+ const name = node.id.name;
110
+ if (!commentText) {
111
+ // No TSDoc comment - check if we should require `@enumType`
112
+ if (requireOnExported && isExported(node)) {
113
+ context.report({
114
+ node,
115
+ messageId: 'missingEnumType',
116
+ data: { kind, name },
117
+ });
118
+ }
119
+ return;
120
+ }
121
+ const extraction = (0, tsdoc_parser_1.extractEnumType)(commentText);
122
+ if (!extraction.found) {
123
+ // No @enumType tag - check if we should require it
124
+ if (requireOnExported && isExported(node)) {
125
+ context.report({
126
+ node,
127
+ messageId: 'missingEnumType',
128
+ data: { kind, name },
129
+ });
130
+ }
131
+ return;
132
+ }
133
+ // Multiple @enumType tags
134
+ if (extraction.count > 1) {
135
+ context.report({
136
+ node,
137
+ messageId: 'multipleEnumTypes',
138
+ });
139
+ return;
140
+ }
141
+ // @enumType without value
142
+ if (!extraction.rawValue) {
143
+ context.report({
144
+ node,
145
+ messageId: 'missingValue',
146
+ });
147
+ return;
148
+ }
149
+ // Invalid value
150
+ if (!extraction.isValid) {
151
+ context.report({
152
+ node,
153
+ messageId: 'invalidValue',
154
+ data: { value: extraction.rawValue },
155
+ });
156
+ }
157
+ }
158
+ /**
159
+ * Checks for `@enumType` on invalid constructs (non-enum, non-string-literal-union).
160
+ */
161
+ function checkInvalidEnumTypeUsage(node) {
162
+ const commentText = getTSDocComment(node);
163
+ if (!commentText) {
164
+ return;
165
+ }
166
+ const extraction = (0, tsdoc_parser_1.extractEnumType)(commentText);
167
+ if (extraction.found) {
168
+ context.report({
169
+ node,
170
+ messageId: 'invalidConstruct',
171
+ });
172
+ }
173
+ }
174
+ return {
175
+ // Check enum declarations - @enumType is valid here
176
+ TSEnumDeclaration(node) {
177
+ validateEnumTypeTag(node, 'enum');
178
+ },
179
+ // Check type alias declarations
180
+ TSTypeAliasDeclaration(node) {
181
+ if (isStringLiteralUnion(node.typeAnnotation)) {
182
+ // This is a string literal union - @enumType is valid
183
+ validateEnumTypeTag(node, 'type');
184
+ }
185
+ else {
186
+ // Not a string literal union - @enumType is invalid
187
+ checkInvalidEnumTypeUsage(node);
188
+ }
189
+ },
190
+ // Check invalid constructs - @enumType should not be on these
191
+ FunctionDeclaration(node) {
192
+ checkInvalidEnumTypeUsage(node);
193
+ },
194
+ ClassDeclaration(node) {
195
+ checkInvalidEnumTypeUsage(node);
196
+ },
197
+ TSInterfaceDeclaration(node) {
198
+ checkInvalidEnumTypeUsage(node);
199
+ },
200
+ VariableDeclaration(node) {
201
+ checkInvalidEnumTypeUsage(node);
202
+ },
203
+ };
204
+ },
205
+ });
206
+ //# sourceMappingURL=valid-enum-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-enum-type.js","sourceRoot":"","sources":["../../src/rules/valid-enum-type.ts"],"names":[],"mappings":"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"}