eslint-plugin-tyrant 0.1.0 → 0.1.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.
package/README.md CHANGED
@@ -7,6 +7,7 @@ Pure TypeScript ESLint plugin with a rule that requires a TSDoc file comment at
7
7
  - `tyrant/require-file-tsdoc`: require every `.ts`, `.tsx`, `.mts`, and `.cts` file to begin with a `/** ... */` TSDoc comment.
8
8
  - Accepted preamble before that TSDoc: UTF-8 BOM, a single shebang line, and optional empty lines after the shebang.
9
9
  - `tyrant/require-empty-line-after-file-tsdoc`: require at least one empty line after the top-level file TSDoc comment.
10
+ - `tyrant/require-index-module-organization-tsdoc`: require TypeScript `index.*` modules to include `Flat modules` or `Hierarchial modules` in the top-level file TSDoc comment to describe how modules in the directory are organized.
10
11
  - `tyrant/require-tsdoc-style-comments-before-exports`: if a comment block exists immediately before an export, every comment in that block must use `/** ... */` TSDoc style.
11
12
  - This rule is not auto-fixable. If a file does not need module-level docs, disable the rule in that file explicitly.
12
13
 
@@ -20,8 +21,8 @@ export default [
20
21
  files: ["**/*.{ts,tsx,mts,cts}"],
21
22
  plugins: { tyrant },
22
23
  rules: {
23
- "tyrant/require-file-tsdoc": "error"
24
- }
25
- }
24
+ "tyrant/require-file-tsdoc": "error",
25
+ },
26
+ },
26
27
  ];
27
28
  ```
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export declare const rules: {
2
2
  readonly "require-empty-line-after-file-tsdoc": import("eslint").Rule.RuleModule;
3
3
  readonly "require-file-tsdoc": import("eslint").Rule.RuleModule;
4
+ readonly "require-index-module-organization-tsdoc": import("eslint").Rule.RuleModule;
4
5
  readonly "require-tsdoc-style-comments-before-exports": import("eslint").Rule.RuleModule;
5
6
  };
6
7
  export declare const configs: {
@@ -15,6 +16,7 @@ export declare const configs: {
15
16
  rules: {
16
17
  readonly "require-empty-line-after-file-tsdoc": import("eslint").Rule.RuleModule;
17
18
  readonly "require-file-tsdoc": import("eslint").Rule.RuleModule;
19
+ readonly "require-index-module-organization-tsdoc": import("eslint").Rule.RuleModule;
18
20
  readonly "require-tsdoc-style-comments-before-exports": import("eslint").Rule.RuleModule;
19
21
  };
20
22
  };
@@ -22,6 +24,7 @@ export declare const configs: {
22
24
  rules: {
23
25
  "tyrant/require-empty-line-after-file-tsdoc": "error";
24
26
  "tyrant/require-file-tsdoc": "error";
27
+ "tyrant/require-index-module-organization-tsdoc": "error";
25
28
  "tyrant/require-tsdoc-style-comments-before-exports": "error";
26
29
  };
27
30
  }[];
@@ -36,6 +39,7 @@ export declare const configs: {
36
39
  rules: {
37
40
  readonly "require-empty-line-after-file-tsdoc": import("eslint").Rule.RuleModule;
38
41
  readonly "require-file-tsdoc": import("eslint").Rule.RuleModule;
42
+ readonly "require-index-module-organization-tsdoc": import("eslint").Rule.RuleModule;
39
43
  readonly "require-tsdoc-style-comments-before-exports": import("eslint").Rule.RuleModule;
40
44
  };
41
45
  };
@@ -43,6 +47,7 @@ export declare const configs: {
43
47
  rules: {
44
48
  "tyrant/require-empty-line-after-file-tsdoc": "error";
45
49
  "tyrant/require-file-tsdoc": "error";
50
+ "tyrant/require-index-module-organization-tsdoc": "error";
46
51
  "tyrant/require-tsdoc-style-comments-before-exports": "error";
47
52
  };
48
53
  }[];
@@ -55,6 +60,7 @@ declare const plugin: {
55
60
  rules: {
56
61
  readonly "require-empty-line-after-file-tsdoc": import("eslint").Rule.RuleModule;
57
62
  readonly "require-file-tsdoc": import("eslint").Rule.RuleModule;
63
+ readonly "require-index-module-organization-tsdoc": import("eslint").Rule.RuleModule;
58
64
  readonly "require-tsdoc-style-comments-before-exports": import("eslint").Rule.RuleModule;
59
65
  };
60
66
  configs: {
@@ -69,6 +75,7 @@ declare const plugin: {
69
75
  rules: {
70
76
  readonly "require-empty-line-after-file-tsdoc": import("eslint").Rule.RuleModule;
71
77
  readonly "require-file-tsdoc": import("eslint").Rule.RuleModule;
78
+ readonly "require-index-module-organization-tsdoc": import("eslint").Rule.RuleModule;
72
79
  readonly "require-tsdoc-style-comments-before-exports": import("eslint").Rule.RuleModule;
73
80
  };
74
81
  };
@@ -76,6 +83,7 @@ declare const plugin: {
76
83
  rules: {
77
84
  "tyrant/require-empty-line-after-file-tsdoc": "error";
78
85
  "tyrant/require-file-tsdoc": "error";
86
+ "tyrant/require-index-module-organization-tsdoc": "error";
79
87
  "tyrant/require-tsdoc-style-comments-before-exports": "error";
80
88
  };
81
89
  }[];
@@ -90,6 +98,7 @@ declare const plugin: {
90
98
  rules: {
91
99
  readonly "require-empty-line-after-file-tsdoc": import("eslint").Rule.RuleModule;
92
100
  readonly "require-file-tsdoc": import("eslint").Rule.RuleModule;
101
+ readonly "require-index-module-organization-tsdoc": import("eslint").Rule.RuleModule;
93
102
  readonly "require-tsdoc-style-comments-before-exports": import("eslint").Rule.RuleModule;
94
103
  };
95
104
  };
@@ -97,6 +106,7 @@ declare const plugin: {
97
106
  rules: {
98
107
  "tyrant/require-empty-line-after-file-tsdoc": "error";
99
108
  "tyrant/require-file-tsdoc": "error";
109
+ "tyrant/require-index-module-organization-tsdoc": "error";
100
110
  "tyrant/require-tsdoc-style-comments-before-exports": "error";
101
111
  };
102
112
  }[];
package/dist/index.js CHANGED
@@ -1,9 +1,11 @@
1
1
  import { requireEmptyLineAfterFileTSDocRule } from "./rules/require-empty-line-after-file-tsdoc.js";
2
2
  import { requireFileTSDocRule } from "./rules/require-file-tsdoc.js";
3
+ import { requireIndexModuleOrganizationTSDocRule } from "./rules/require-index-module-organization-tsdoc.js";
3
4
  import { requireTSDocStyleCommentsBeforeExportsRule } from "./rules/require-tsdoc-style-comments-before-exports.js";
4
5
  export const rules = {
5
6
  "require-empty-line-after-file-tsdoc": requireEmptyLineAfterFileTSDocRule,
6
7
  "require-file-tsdoc": requireFileTSDocRule,
8
+ "require-index-module-organization-tsdoc": requireIndexModuleOrganizationTSDocRule,
7
9
  "require-tsdoc-style-comments-before-exports": requireTSDocStyleCommentsBeforeExportsRule
8
10
  };
9
11
  const pluginMeta = {
@@ -24,6 +26,7 @@ export const configs = {
24
26
  rules: {
25
27
  "tyrant/require-empty-line-after-file-tsdoc": "error",
26
28
  "tyrant/require-file-tsdoc": "error",
29
+ "tyrant/require-index-module-organization-tsdoc": "error",
27
30
  "tyrant/require-tsdoc-style-comments-before-exports": "error"
28
31
  }
29
32
  }
@@ -37,6 +40,7 @@ export const configs = {
37
40
  rules: {
38
41
  "tyrant/require-empty-line-after-file-tsdoc": "error",
39
42
  "tyrant/require-file-tsdoc": "error",
43
+ "tyrant/require-index-module-organization-tsdoc": "error",
40
44
  "tyrant/require-tsdoc-style-comments-before-exports": "error"
41
45
  }
42
46
  }
@@ -0,0 +1,2 @@
1
+ import type { Rule } from "eslint";
2
+ export declare const requireIndexModuleOrganizationTSDocRule: Rule.RuleModule;
@@ -0,0 +1,47 @@
1
+ import path from "node:path";
2
+ import { getTopLevelTSDocComment, isTypeScriptFilename } from "./file-tsdoc-utils.js";
3
+ const MESSAGE_ID = "missingIndexModuleOrganizationTSDoc";
4
+ const REQUIRED_MARKERS = ["Flat modules", "Hierarchial modules"];
5
+ function isTypeScriptIndexFilename(filename) {
6
+ return isTypeScriptFilename(filename) && path.parse(filename).name === "index";
7
+ }
8
+ export const requireIndexModuleOrganizationTSDocRule = {
9
+ meta: {
10
+ type: "suggestion",
11
+ docs: {
12
+ description: "Require index TypeScript modules to document whether the directory uses Flat modules or Hierarchial modules."
13
+ },
14
+ hasSuggestions: false,
15
+ schema: [],
16
+ messages: {
17
+ [MESSAGE_ID]: 'Directory index modules must have a top-level TSDoc comment containing either "Flat modules" or "Hierarchial modules".'
18
+ }
19
+ },
20
+ create(context) {
21
+ if (!isTypeScriptIndexFilename(context.filename)) {
22
+ return {};
23
+ }
24
+ return {
25
+ Program(node) {
26
+ const fileTSDocComment = getTopLevelTSDocComment(context.sourceCode);
27
+ if (!fileTSDocComment) {
28
+ context.report({
29
+ node,
30
+ loc: { line: 1, column: 0 },
31
+ messageId: MESSAGE_ID
32
+ });
33
+ return;
34
+ }
35
+ const fileTSDocText = context.sourceCode.getText().slice(fileTSDocComment.start, fileTSDocComment.end);
36
+ if (REQUIRED_MARKERS.some((marker) => fileTSDocText.includes(marker))) {
37
+ return;
38
+ }
39
+ context.report({
40
+ node,
41
+ loc: context.sourceCode.getLocFromIndex(fileTSDocComment.start),
42
+ messageId: MESSAGE_ID
43
+ });
44
+ }
45
+ };
46
+ }
47
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-tyrant",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "ESLint plugin with TypeScript-focused rules.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",