@codeperfect/eslint-plugin 1.0.0

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 (248) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts +16 -0
  5. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +1 -0
  6. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +131 -0
  7. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +48 -0
  8. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -0
  9. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.js +126 -0
  10. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts +40 -0
  11. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts.map +1 -0
  12. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.js +90 -0
  13. package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts +11 -0
  14. package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -0
  15. package/dist/architecture/consistent-barrel-files/exports-only-rule.js +218 -0
  16. package/dist/architecture/consistent-barrel-files/index.d.ts +5 -0
  17. package/dist/architecture/consistent-barrel-files/index.d.ts.map +1 -0
  18. package/dist/architecture/consistent-barrel-files/index.js +4 -0
  19. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts +11 -0
  20. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -0
  21. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +100 -0
  22. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts +40 -0
  23. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts.map +1 -0
  24. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.js +90 -0
  25. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts +65 -0
  26. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -0
  27. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +154 -0
  28. package/dist/architecture/consistent-barrel-files/rule.d.ts +11 -0
  29. package/dist/architecture/consistent-barrel-files/rule.d.ts.map +1 -0
  30. package/dist/architecture/consistent-barrel-files/rule.js +58 -0
  31. package/dist/architecture/consistent-barrel-files/test-helpers.d.ts +141 -0
  32. package/dist/architecture/consistent-barrel-files/test-helpers.d.ts.map +1 -0
  33. package/dist/architecture/consistent-barrel-files/test-helpers.js +229 -0
  34. package/dist/architecture/consistent-barrel-files/types.d.ts +25 -0
  35. package/dist/architecture/consistent-barrel-files/types.d.ts.map +1 -0
  36. package/dist/architecture/consistent-barrel-files/types.js +2 -0
  37. package/dist/architecture/index.d.ts +2 -0
  38. package/dist/architecture/index.d.ts.map +1 -0
  39. package/dist/architecture/index.js +2 -0
  40. package/dist/benchmark-rules.d.ts +83 -0
  41. package/dist/benchmark-rules.d.ts.map +1 -0
  42. package/dist/benchmark-rules.js +175 -0
  43. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  44. package/dist/codeperfect-plugin.d.ts +46 -0
  45. package/dist/codeperfect-plugin.d.ts.map +1 -0
  46. package/dist/codeperfect-plugin.js +29 -0
  47. package/dist/core/index.d.ts +3 -0
  48. package/dist/core/index.d.ts.map +1 -0
  49. package/dist/core/index.js +3 -0
  50. package/dist/core/no-multiple-declarators/index.d.ts +2 -0
  51. package/dist/core/no-multiple-declarators/index.d.ts.map +1 -0
  52. package/dist/core/no-multiple-declarators/index.js +2 -0
  53. package/dist/core/no-multiple-declarators/rule.d.ts +4 -0
  54. package/dist/core/no-multiple-declarators/rule.d.ts.map +1 -0
  55. package/dist/core/no-multiple-declarators/rule.js +100 -0
  56. package/dist/core/prefer-interface-types/index.d.ts +2 -0
  57. package/dist/core/prefer-interface-types/index.d.ts.map +1 -0
  58. package/dist/core/prefer-interface-types/index.js +2 -0
  59. package/dist/core/prefer-interface-types/rule.d.ts +5 -0
  60. package/dist/core/prefer-interface-types/rule.d.ts.map +1 -0
  61. package/dist/core/prefer-interface-types/rule.js +145 -0
  62. package/dist/core/prefer-interface-types/test-helpers.d.ts +110 -0
  63. package/dist/core/prefer-interface-types/test-helpers.d.ts.map +1 -0
  64. package/dist/core/prefer-interface-types/test-helpers.js +116 -0
  65. package/dist/custom-rule-documentation.d.ts +36 -0
  66. package/dist/custom-rule-documentation.d.ts.map +1 -0
  67. package/dist/custom-rule-documentation.js +35 -0
  68. package/dist/custom-rules.d.ts +61 -0
  69. package/dist/custom-rules.d.ts.map +1 -0
  70. package/dist/custom-rules.js +70 -0
  71. package/dist/docs/index.d.ts +4 -0
  72. package/dist/docs/index.d.ts.map +1 -0
  73. package/dist/docs/index.js +4 -0
  74. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts +89 -0
  75. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts.map +1 -0
  76. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.js +129 -0
  77. package/dist/docs/no-interface-member-docs/comment-utilities.d.ts +48 -0
  78. package/dist/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -0
  79. package/dist/docs/no-interface-member-docs/comment-utilities.js +146 -0
  80. package/dist/docs/no-interface-member-docs/index.d.ts +2 -0
  81. package/dist/docs/no-interface-member-docs/index.d.ts.map +1 -0
  82. package/dist/docs/no-interface-member-docs/index.js +2 -0
  83. package/dist/docs/no-interface-member-docs/parameter-tags.d.ts +13 -0
  84. package/dist/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -0
  85. package/dist/docs/no-interface-member-docs/parameter-tags.js +101 -0
  86. package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts +24 -0
  87. package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -0
  88. package/dist/docs/no-interface-member-docs/parameter-utilities.js +125 -0
  89. package/dist/docs/no-interface-member-docs/rule.d.ts +5 -0
  90. package/dist/docs/no-interface-member-docs/rule.d.ts.map +1 -0
  91. package/dist/docs/no-interface-member-docs/rule.js +168 -0
  92. package/dist/docs/no-interface-member-docs/test-helpers.d.ts +103 -0
  93. package/dist/docs/no-interface-member-docs/test-helpers.d.ts.map +1 -0
  94. package/dist/docs/no-interface-member-docs/test-helpers.js +157 -0
  95. package/dist/docs/no-interface-member-docs/types.d.ts +30 -0
  96. package/dist/docs/no-interface-member-docs/types.d.ts.map +1 -0
  97. package/dist/docs/no-interface-member-docs/types.js +2 -0
  98. package/dist/docs/require-example-language/empty-fence-fixes.d.ts +29 -0
  99. package/dist/docs/require-example-language/empty-fence-fixes.d.ts.map +1 -0
  100. package/dist/docs/require-example-language/empty-fence-fixes.js +169 -0
  101. package/dist/docs/require-example-language/example-utilities.d.ts +70 -0
  102. package/dist/docs/require-example-language/example-utilities.d.ts.map +1 -0
  103. package/dist/docs/require-example-language/example-utilities.js +76 -0
  104. package/dist/docs/require-example-language/examples.d.ts +36 -0
  105. package/dist/docs/require-example-language/examples.d.ts.map +1 -0
  106. package/dist/docs/require-example-language/examples.js +181 -0
  107. package/dist/docs/require-example-language/fixes.d.ts +49 -0
  108. package/dist/docs/require-example-language/fixes.d.ts.map +1 -0
  109. package/dist/docs/require-example-language/fixes.js +182 -0
  110. package/dist/docs/require-example-language/index.d.ts +3 -0
  111. package/dist/docs/require-example-language/index.d.ts.map +1 -0
  112. package/dist/docs/require-example-language/index.js +2 -0
  113. package/dist/docs/require-example-language/reporting.d.ts +60 -0
  114. package/dist/docs/require-example-language/reporting.d.ts.map +1 -0
  115. package/dist/docs/require-example-language/reporting.js +145 -0
  116. package/dist/docs/require-example-language/rule.d.ts +7 -0
  117. package/dist/docs/require-example-language/rule.d.ts.map +1 -0
  118. package/dist/docs/require-example-language/rule.js +34 -0
  119. package/dist/docs/require-example-language/types.d.ts +22 -0
  120. package/dist/docs/require-example-language/types.d.ts.map +1 -0
  121. package/dist/docs/require-example-language/types.js +2 -0
  122. package/dist/docs/single-line-jsdoc/index.d.ts +2 -0
  123. package/dist/docs/single-line-jsdoc/index.d.ts.map +1 -0
  124. package/dist/docs/single-line-jsdoc/index.js +2 -0
  125. package/dist/docs/single-line-jsdoc/rule.d.ts +5 -0
  126. package/dist/docs/single-line-jsdoc/rule.d.ts.map +1 -0
  127. package/dist/docs/single-line-jsdoc/rule.js +196 -0
  128. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts +16 -0
  129. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts.map +1 -0
  130. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.js +95 -0
  131. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts +25 -0
  132. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +1 -0
  133. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +140 -0
  134. package/dist/docs/test-helpers.d.ts +50 -0
  135. package/dist/docs/test-helpers.d.ts.map +1 -0
  136. package/dist/docs/test-helpers.js +107 -0
  137. package/dist/index.d.ts +6 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +6 -0
  140. package/dist/presets.d.ts +10 -0
  141. package/dist/presets.d.ts.map +1 -0
  142. package/dist/presets.js +50 -0
  143. package/dist/rules/index.d.ts +5 -0
  144. package/dist/rules/index.d.ts.map +1 -0
  145. package/dist/rules/index.js +6 -0
  146. package/dist/testing/aaa/analyzer.d.ts +36 -0
  147. package/dist/testing/aaa/analyzer.d.ts.map +1 -0
  148. package/dist/testing/aaa/analyzer.js +490 -0
  149. package/dist/testing/aaa/index.d.ts +3 -0
  150. package/dist/testing/aaa/index.d.ts.map +1 -0
  151. package/dist/testing/aaa/index.js +2 -0
  152. package/dist/testing/aaa/types.d.ts +31 -0
  153. package/dist/testing/aaa/types.d.ts.map +1 -0
  154. package/dist/testing/aaa/types.js +2 -0
  155. package/dist/testing/assert-actual-expected-names/index.d.ts +2 -0
  156. package/dist/testing/assert-actual-expected-names/index.d.ts.map +1 -0
  157. package/dist/testing/assert-actual-expected-names/index.js +2 -0
  158. package/dist/testing/assert-actual-expected-names/rule.d.ts +4 -0
  159. package/dist/testing/assert-actual-expected-names/rule.d.ts.map +1 -0
  160. package/dist/testing/assert-actual-expected-names/rule.js +54 -0
  161. package/dist/testing/enforce-aaa-phase-purity/index.d.ts +2 -0
  162. package/dist/testing/enforce-aaa-phase-purity/index.d.ts.map +1 -0
  163. package/dist/testing/enforce-aaa-phase-purity/index.js +2 -0
  164. package/dist/testing/enforce-aaa-phase-purity/rule.d.ts +4 -0
  165. package/dist/testing/enforce-aaa-phase-purity/rule.d.ts.map +1 -0
  166. package/dist/testing/enforce-aaa-phase-purity/rule.js +110 -0
  167. package/dist/testing/enforce-aaa-structure/index.d.ts +2 -0
  168. package/dist/testing/enforce-aaa-structure/index.d.ts.map +1 -0
  169. package/dist/testing/enforce-aaa-structure/index.js +2 -0
  170. package/dist/testing/enforce-aaa-structure/rule.d.ts +4 -0
  171. package/dist/testing/enforce-aaa-structure/rule.d.ts.map +1 -0
  172. package/dist/testing/enforce-aaa-structure/rule.js +48 -0
  173. package/dist/testing/index.d.ts +9 -0
  174. package/dist/testing/index.d.ts.map +1 -0
  175. package/dist/testing/index.js +9 -0
  176. package/dist/testing/prefer-vi-mocked-import/fix.d.ts +16 -0
  177. package/dist/testing/prefer-vi-mocked-import/fix.d.ts.map +1 -0
  178. package/dist/testing/prefer-vi-mocked-import/fix.js +224 -0
  179. package/dist/testing/prefer-vi-mocked-import/index.d.ts +2 -0
  180. package/dist/testing/prefer-vi-mocked-import/index.d.ts.map +1 -0
  181. package/dist/testing/prefer-vi-mocked-import/index.js +2 -0
  182. package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts +16 -0
  183. package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -0
  184. package/dist/testing/prefer-vi-mocked-import/match-bindings.js +52 -0
  185. package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts +16 -0
  186. package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -0
  187. package/dist/testing/prefer-vi-mocked-import/match-declarations.js +99 -0
  188. package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts +66 -0
  189. package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts.map +1 -0
  190. package/dist/testing/prefer-vi-mocked-import/match-helpers.js +102 -0
  191. package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts +17 -0
  192. package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -0
  193. package/dist/testing/prefer-vi-mocked-import/match-imports.js +156 -0
  194. package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts +42 -0
  195. package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +1 -0
  196. package/dist/testing/prefer-vi-mocked-import/match-rewrites.js +119 -0
  197. package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts +13 -0
  198. package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts.map +1 -0
  199. package/dist/testing/prefer-vi-mocked-import/match-walk.js +62 -0
  200. package/dist/testing/prefer-vi-mocked-import/match.d.ts +15 -0
  201. package/dist/testing/prefer-vi-mocked-import/match.d.ts.map +1 -0
  202. package/dist/testing/prefer-vi-mocked-import/match.js +193 -0
  203. package/dist/testing/prefer-vi-mocked-import/rule.d.ts +5 -0
  204. package/dist/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -0
  205. package/dist/testing/prefer-vi-mocked-import/rule.js +32 -0
  206. package/dist/testing/prefer-vi-mocked-import/types.d.ts +83 -0
  207. package/dist/testing/prefer-vi-mocked-import/types.d.ts.map +1 -0
  208. package/dist/testing/prefer-vi-mocked-import/types.js +2 -0
  209. package/dist/testing/require-aaa-sections/index.d.ts +2 -0
  210. package/dist/testing/require-aaa-sections/index.d.ts.map +1 -0
  211. package/dist/testing/require-aaa-sections/index.js +2 -0
  212. package/dist/testing/require-aaa-sections/rule.d.ts +4 -0
  213. package/dist/testing/require-aaa-sections/rule.d.ts.map +1 -0
  214. package/dist/testing/require-aaa-sections/rule.js +111 -0
  215. package/dist/testing/require-act-result-capture/index.d.ts +2 -0
  216. package/dist/testing/require-act-result-capture/index.d.ts.map +1 -0
  217. package/dist/testing/require-act-result-capture/index.js +2 -0
  218. package/dist/testing/require-act-result-capture/rule.d.ts +4 -0
  219. package/dist/testing/require-act-result-capture/rule.d.ts.map +1 -0
  220. package/dist/testing/require-act-result-capture/rule.js +34 -0
  221. package/dist/testing/require-test-companion/index.d.ts +3 -0
  222. package/dist/testing/require-test-companion/index.d.ts.map +1 -0
  223. package/dist/testing/require-test-companion/index.js +3 -0
  224. package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts +16 -0
  225. package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts.map +1 -0
  226. package/dist/testing/require-test-companion/require-test-companion-listeners.js +145 -0
  227. package/dist/testing/require-test-companion/require-test-companion-options.d.ts +54 -0
  228. package/dist/testing/require-test-companion/require-test-companion-options.d.ts.map +1 -0
  229. package/dist/testing/require-test-companion/require-test-companion-options.js +112 -0
  230. package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts +51 -0
  231. package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts.map +1 -0
  232. package/dist/testing/require-test-companion/require-test-companion-test-helpers.js +183 -0
  233. package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts +28 -0
  234. package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts.map +1 -0
  235. package/dist/testing/require-test-companion/require-test-companion-utilities.js +26 -0
  236. package/dist/testing/require-test-companion/rule.d.ts +5 -0
  237. package/dist/testing/require-test-companion/rule.d.ts.map +1 -0
  238. package/dist/testing/require-test-companion/rule.js +57 -0
  239. package/dist/testing/require-test-companion/types.d.ts +11 -0
  240. package/dist/testing/require-test-companion/types.d.ts.map +1 -0
  241. package/dist/testing/require-test-companion/types.js +2 -0
  242. package/dist/testing/single-act-statement/index.d.ts +2 -0
  243. package/dist/testing/single-act-statement/index.d.ts.map +1 -0
  244. package/dist/testing/single-act-statement/index.js +2 -0
  245. package/dist/testing/single-act-statement/rule.d.ts +4 -0
  246. package/dist/testing/single-act-statement/rule.d.ts.map +1 -0
  247. package/dist/testing/single-act-statement/rule.js +33 -0
  248. package/package.json +106 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CodePerfect
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,128 @@
1
+ # @codeperfect/eslint-plugin
2
+
3
+ Custom ESLint rules for TypeScript repositories.
4
+
5
+ ## What this package provides
6
+
7
+ `@codeperfect/eslint-plugin` ships a single ESLint plugin object, ready-to-use first-party presets, and direct exports for every package-owned rule. It does not compose third-party configs, load optional integrations, or provide a wrapper factory for `eslint.config.ts`.
8
+
9
+ The package scope is intentionally narrow:
10
+
11
+ - root preset exports for package-owned rules only
12
+ - package-owned custom rules
13
+ - rule documentation under `docs/rules/`
14
+ - a small registry used by tests and benchmarks
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install -D @codeperfect/eslint-plugin eslint
20
+ ```
21
+
22
+ If you lint TypeScript files, also install and configure the parser or plugin stack that your repository already uses.
23
+
24
+ ## Usage
25
+
26
+ Import a preset if you want the plugin registration and matching rules together:
27
+
28
+ ```typescript
29
+ import { defineConfig } from "eslint/config";
30
+ import { all } from "@codeperfect/eslint-plugin";
31
+
32
+ export default defineConfig(all);
33
+ ```
34
+
35
+ You can also use a narrower preset such as `architecture`, `core`, `docs`, `testing`, or `aaa`:
36
+
37
+ ```typescript
38
+ import { defineConfig } from "eslint/config";
39
+ import { aaa, testing } from "@codeperfect/eslint-plugin";
40
+
41
+ export default defineConfig(testing, aaa);
42
+ ```
43
+
44
+ Register the plugin directly in your local ESLint config when you want full manual control:
45
+
46
+ ```typescript
47
+ import { defineConfig } from "eslint/config";
48
+ import { parser } from "typescript-eslint";
49
+ import codeperfectPlugin from "@codeperfect/eslint-plugin";
50
+
51
+ export default defineConfig({
52
+ files: ["**/*.ts"],
53
+ languageOptions: {
54
+ parser,
55
+ sourceType: "module",
56
+ },
57
+ plugins: {
58
+ codeperfect: codeperfectPlugin,
59
+ },
60
+ rules: {
61
+ "codeperfect/prefer-interface-types": "error",
62
+ "codeperfect/require-example-language": "error",
63
+ },
64
+ });
65
+ ```
66
+
67
+ ## Exported surface
68
+
69
+ The root package exports:
70
+
71
+ - the default plugin object
72
+ - the named `codeperfectPlugin` export
73
+ - the named preset exports: `all`, `architecture`, `core`, `docs`, `testing`, and `aaa`
74
+ - the `customRules` registry
75
+ - each rule module as a named export
76
+
77
+ Example:
78
+
79
+ ```typescript
80
+ import codeperfectPlugin, {
81
+ all,
82
+ customRules,
83
+ preferInterfaceTypesRule,
84
+ } from "@codeperfect/eslint-plugin";
85
+
86
+ void codeperfectPlugin;
87
+ void all;
88
+ void customRules;
89
+ void preferInterfaceTypesRule;
90
+ ```
91
+
92
+ ## Package-owned rules
93
+
94
+ - `codeperfect/assert-actual-expected-names`
95
+ - `codeperfect/barrel-files-exports-only`
96
+ - `codeperfect/consistent-barrel-files`
97
+ - `codeperfect/enforce-aaa-phase-purity`
98
+ - `codeperfect/enforce-aaa-structure`
99
+ - `codeperfect/no-interface-member-docs`
100
+ - `codeperfect/no-reexports-outside-barrels`
101
+ - `codeperfect/prefer-interface-types`
102
+ - `codeperfect/prefer-vi-mocked-import`
103
+ - `codeperfect/require-aaa-sections`
104
+ - `codeperfect/require-act-result-capture`
105
+ - `codeperfect/require-example-language`
106
+ - `codeperfect/require-test-companion`
107
+ - `codeperfect/single-act-statement`
108
+ - `codeperfect/single-line-jsdoc`
109
+
110
+ Rule documentation lives in `docs/rules/` and each rule metadata entry points at the matching page.
111
+
112
+ ## Internal layout
113
+
114
+ - `src/rules/` is the shared entrypoint for exported rule modules.
115
+ - `src/architecture/`, `src/core/`, `src/docs/`, and `src/testing/` own the concrete rule implementations.
116
+ - `src/custom-rules.ts` is the registry used by tests and benchmarks.
117
+
118
+ ## Validation
119
+
120
+ When changing this package:
121
+
122
+ - run `npm run validate`
123
+ - run `npm run validate` a second time to confirm deterministic results
124
+ - keep the README and rule documentation aligned with the exported surface
125
+
126
+ ## License
127
+
128
+ MIT
@@ -0,0 +1 @@
1
+ {"root":["../src/benchmark-rules.ts","../src/codeperfect-plugin.ts","../src/custom-rule-documentation.ts","../src/custom-rules.ts","../src/index.ts","../src/presets.ts","../src/architecture/index.ts","../src/architecture/consistent-barrel-files/consistent-barrel-files-listeners.ts","../src/architecture/consistent-barrel-files/consistent-barrel-files-options.ts","../src/architecture/consistent-barrel-files/exports-only-rule-test-utilities.ts","../src/architecture/consistent-barrel-files/exports-only-rule.ts","../src/architecture/consistent-barrel-files/index.ts","../src/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.ts","../src/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.ts","../src/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.ts","../src/architecture/consistent-barrel-files/rule.ts","../src/architecture/consistent-barrel-files/test-helpers.ts","../src/architecture/consistent-barrel-files/types.ts","../src/core/index.ts","../src/core/no-multiple-declarators/index.ts","../src/core/no-multiple-declarators/rule.ts","../src/core/prefer-interface-types/index.ts","../src/core/prefer-interface-types/rule.ts","../src/core/prefer-interface-types/test-helpers.ts","../src/docs/index.ts","../src/docs/test-helpers.ts","../src/docs/no-interface-member-docs/comment-utilities-test-helpers.ts","../src/docs/no-interface-member-docs/comment-utilities.ts","../src/docs/no-interface-member-docs/index.ts","../src/docs/no-interface-member-docs/parameter-tags.ts","../src/docs/no-interface-member-docs/parameter-utilities.ts","../src/docs/no-interface-member-docs/rule.ts","../src/docs/no-interface-member-docs/test-helpers.ts","../src/docs/no-interface-member-docs/types.ts","../src/docs/require-example-language/empty-fence-fixes.ts","../src/docs/require-example-language/example-utilities.ts","../src/docs/require-example-language/examples.ts","../src/docs/require-example-language/fixes.ts","../src/docs/require-example-language/index.ts","../src/docs/require-example-language/reporting.ts","../src/docs/require-example-language/rule.ts","../src/docs/require-example-language/types.ts","../src/docs/single-line-jsdoc/index.ts","../src/docs/single-line-jsdoc/rule.ts","../src/docs/single-line-jsdoc/single-line-jsdoc-content.ts","../src/docs/single-line-jsdoc/single-line-jsdoc-utilities.ts","../src/rules/index.ts","../src/testing/index.ts","../src/testing/aaa/analyzer.ts","../src/testing/aaa/index.ts","../src/testing/aaa/types.ts","../src/testing/assert-actual-expected-names/index.ts","../src/testing/assert-actual-expected-names/rule.ts","../src/testing/enforce-aaa-phase-purity/index.ts","../src/testing/enforce-aaa-phase-purity/rule.ts","../src/testing/enforce-aaa-structure/index.ts","../src/testing/enforce-aaa-structure/rule.ts","../src/testing/prefer-vi-mocked-import/fix.ts","../src/testing/prefer-vi-mocked-import/index.ts","../src/testing/prefer-vi-mocked-import/match-bindings.ts","../src/testing/prefer-vi-mocked-import/match-declarations.ts","../src/testing/prefer-vi-mocked-import/match-helpers.ts","../src/testing/prefer-vi-mocked-import/match-imports.ts","../src/testing/prefer-vi-mocked-import/match-rewrites.ts","../src/testing/prefer-vi-mocked-import/match-walk.ts","../src/testing/prefer-vi-mocked-import/match.ts","../src/testing/prefer-vi-mocked-import/rule.ts","../src/testing/prefer-vi-mocked-import/types.ts","../src/testing/require-aaa-sections/index.ts","../src/testing/require-aaa-sections/rule.ts","../src/testing/require-act-result-capture/index.ts","../src/testing/require-act-result-capture/rule.ts","../src/testing/require-test-companion/index.ts","../src/testing/require-test-companion/require-test-companion-listeners.ts","../src/testing/require-test-companion/require-test-companion-options.ts","../src/testing/require-test-companion/require-test-companion-test-helpers.ts","../src/testing/require-test-companion/require-test-companion-utilities.ts","../src/testing/require-test-companion/rule.ts","../src/testing/require-test-companion/types.ts","../src/testing/single-act-statement/index.ts","../src/testing/single-act-statement/rule.ts","../conventional-changelog-conventionalcommits.d.ts","../eslint-plugin-jasmine.d.ts"],"version":"5.9.3"}
@@ -0,0 +1,16 @@
1
+ import type { Rule } from "eslint";
2
+ import type { ConsistentBarrelFilesState } from "./consistent-barrel-files-options";
3
+ /**
4
+ * Builds a listener for a specific file.
5
+ * @param context Rule execution context.
6
+ * @param filename Absolute filename.
7
+ * @param options Normalized rule options.
8
+ * @returns The rule listener for the file.
9
+ * @example
10
+ * ```typescript
11
+ * const listener = buildListenerForFile(context, filename, state);
12
+ * ```
13
+ */
14
+ declare const buildListenerForFile: (context: Rule.RuleContext, filename: string, options: ConsistentBarrelFilesState) => Rule.RuleListener;
15
+ export { buildListenerForFile };
16
+ //# sourceMappingURL=consistent-barrel-files-listeners.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consistent-barrel-files-listeners.d.ts","sourceRoot":"","sources":["../../../src/architecture/consistent-barrel-files/consistent-barrel-files-listeners.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAKnC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AA6IpF;;;;;;;;;;GAUG;AACH,QAAA,MAAM,oBAAoB,GACxB,SAAS,IAAI,CAAC,WAAW,EACzB,UAAU,MAAM,EAChB,SAAS,0BAA0B,KAClC,IAAI,CAAC,YAcP,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,131 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { shouldLintFile } from "./consistent-barrel-files-options";
4
+ /** Cache to avoid repeated directory scans. */
5
+ const directoryCache = new Map();
6
+ /** Tracks cache keys already reported as missing barrels. */
7
+ const reportedMissing = new Set();
8
+ /**
9
+ * Checks hasBarrelFile.
10
+ * @param directory Input directory value.
11
+ * @param names Input names value.
12
+ * @returns Return value output.
13
+ * @example
14
+ * ```typescript
15
+ * hasBarrelFile();
16
+ * ```
17
+ */
18
+ const hasBarrelFile = (directory, names) => names.some((name) => fs.existsSync(path.join(directory, name)));
19
+ /**
20
+ * Gets cached barrel presence or computes it.
21
+ * @param cacheKey Cache key for the lookup.
22
+ * @param directory Directory to scan.
23
+ * @param names Allowed barrel filenames.
24
+ * @returns True when a barrel file exists.
25
+ * @example
26
+ * ```typescript
27
+ * const exists = getCachedBarrelPresence(key, directory, names);
28
+ * ```
29
+ */
30
+ const getCachedBarrelPresence = (cacheKey, directory, names) => {
31
+ const cached = directoryCache.get(cacheKey);
32
+ if (cached !== void 0) {
33
+ return cached;
34
+ }
35
+ const hasBarrel = hasBarrelFile(directory, names);
36
+ directoryCache.set(cacheKey, hasBarrel);
37
+ return hasBarrel;
38
+ };
39
+ /**
40
+ * Builds a listener for a directory when enforcement is enabled.
41
+ * @param context Rule execution context.
42
+ * @param directory Directory to inspect.
43
+ * @param options Normalized rule options.
44
+ * @returns The rule listener for the directory.
45
+ * @example
46
+ * ```typescript
47
+ * const listener = buildListenerForDirectory(context, dir, state);
48
+ * ```
49
+ */
50
+ const buildListenerForDirectory = (context, directory, options) => {
51
+ const cacheKey = `${directory}|${options.namesKey}`;
52
+ if (getCachedBarrelPresence(cacheKey, directory, options.names)) {
53
+ return {};
54
+ }
55
+ return buildMissingListener(context, options.names, cacheKey);
56
+ };
57
+ /**
58
+ * Builds a listener for forbidden barrel files.
59
+ * @param context Rule execution context.
60
+ * @param basename Filename being checked.
61
+ * @param namesSet Allowed barrel names.
62
+ * @returns The rule listener for forbidden barrels.
63
+ * @example
64
+ * ```typescript
65
+ * const listener = buildForbiddenListener(context, basename, names);
66
+ * ```
67
+ */
68
+ const buildForbiddenListener = (context, basename, namesSet) => {
69
+ if (!namesSet.has(basename)) {
70
+ return {};
71
+ }
72
+ return {
73
+ Program(node) {
74
+ context.report({
75
+ data: { name: basename },
76
+ messageId: "forbiddenBarrel",
77
+ node,
78
+ });
79
+ },
80
+ };
81
+ };
82
+ /**
83
+ * Builds a listener that reports missing barrel files.
84
+ * @param context Rule execution context.
85
+ * @param names Allowed barrel names.
86
+ * @param cacheKey Cache key for the directory.
87
+ * @returns The rule listener for missing barrels.
88
+ * @example
89
+ * ```typescript
90
+ * const listener = buildMissingListener(context, names, cacheKey);
91
+ * ```
92
+ */
93
+ const buildMissingListener = (context, names, cacheKey) => {
94
+ if (reportedMissing.has(cacheKey)) {
95
+ return {};
96
+ }
97
+ reportedMissing.add(cacheKey);
98
+ return {
99
+ Program(node) {
100
+ context.report({
101
+ data: { names: names.join(", ") },
102
+ messageId: "missingBarrel",
103
+ node,
104
+ });
105
+ },
106
+ };
107
+ };
108
+ /**
109
+ * Builds a listener for a specific file.
110
+ * @param context Rule execution context.
111
+ * @param filename Absolute filename.
112
+ * @param options Normalized rule options.
113
+ * @returns The rule listener for the file.
114
+ * @example
115
+ * ```typescript
116
+ * const listener = buildListenerForFile(context, filename, state);
117
+ * ```
118
+ */
119
+ const buildListenerForFile = (context, filename, options) => {
120
+ const { enforce, folders, names, namesSet } = options;
121
+ if (!shouldLintFile(filename, folders, names)) {
122
+ return {};
123
+ }
124
+ const basename = path.basename(filename);
125
+ if (!enforce) {
126
+ return buildForbiddenListener(context, basename, namesSet);
127
+ }
128
+ return buildListenerForDirectory(context, path.dirname(filename), options);
129
+ };
130
+ export { buildListenerForFile };
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc2lzdGVudC1iYXJyZWwtZmlsZXMtbGlzdGVuZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FyY2hpdGVjdHVyZS9jb25zaXN0ZW50LWJhcnJlbC1maWxlcy9jb25zaXN0ZW50LWJhcnJlbC1maWxlcy1saXN0ZW5lcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3pCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUk3QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFbkUsK0NBQStDO0FBQy9DLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0FBRWxELDZEQUE2RDtBQUM3RCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0FBRTFDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBaUIsRUFBRSxLQUFlLEVBQVcsRUFBRSxDQUNwRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVsRTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxDQUM5QixRQUFnQixFQUNoQixTQUFpQixFQUNqQixLQUFlLEVBQ04sRUFBRTtJQUNYLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFNUMsSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVsRCxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUV4QyxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxDQUNoQyxPQUF5QixFQUN6QixTQUFpQixFQUNqQixPQUFtQyxFQUNoQixFQUFFO0lBQ3JCLE1BQU0sUUFBUSxHQUFHLEdBQUcsU0FBUyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUVwRCxJQUFJLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEUsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNoRSxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxDQUM3QixPQUF5QixFQUN6QixRQUFnQixFQUNoQixRQUE2QixFQUNWLEVBQUU7SUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxDQUFDLElBQUk7WUFDVixPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUNiLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBQ3hCLFNBQVMsRUFBRSxpQkFBaUI7Z0JBQzVCLElBQUk7YUFDTCxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLG9CQUFvQixHQUFHLENBQzNCLE9BQXlCLEVBQ3pCLEtBQWUsRUFDZixRQUFnQixFQUNHLEVBQUU7SUFDckIsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU5QixPQUFPO1FBQ0wsT0FBTyxDQUFDLElBQUk7WUFDVixPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUNiLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNqQyxTQUFTLEVBQUUsZUFBZTtnQkFDMUIsSUFBSTthQUNMLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsQ0FDM0IsT0FBeUIsRUFDekIsUUFBZ0IsRUFDaEIsT0FBbUMsRUFDaEIsRUFBRTtJQUNyQixNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRXRELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFekMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxPQUFPLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzdFLENBQUMsQ0FBQztBQUVGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSBcImVzbGludFwiO1xuXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IHR5cGUgeyBDb25zaXN0ZW50QmFycmVsRmlsZXNTdGF0ZSB9IGZyb20gXCIuL2NvbnNpc3RlbnQtYmFycmVsLWZpbGVzLW9wdGlvbnNcIjtcblxuaW1wb3J0IHsgc2hvdWxkTGludEZpbGUgfSBmcm9tIFwiLi9jb25zaXN0ZW50LWJhcnJlbC1maWxlcy1vcHRpb25zXCI7XG5cbi8qKiBDYWNoZSB0byBhdm9pZCByZXBlYXRlZCBkaXJlY3Rvcnkgc2NhbnMuICovXG5jb25zdCBkaXJlY3RvcnlDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuXG4vKiogVHJhY2tzIGNhY2hlIGtleXMgYWxyZWFkeSByZXBvcnRlZCBhcyBtaXNzaW5nIGJhcnJlbHMuICovXG5jb25zdCByZXBvcnRlZE1pc3NpbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqXG4gKiBDaGVja3MgaGFzQmFycmVsRmlsZS5cbiAqIEBwYXJhbSBkaXJlY3RvcnkgSW5wdXQgZGlyZWN0b3J5IHZhbHVlLlxuICogQHBhcmFtIG5hbWVzIElucHV0IG5hbWVzIHZhbHVlLlxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBoYXNCYXJyZWxGaWxlKCk7XG4gKiBgYGBcbiAqL1xuY29uc3QgaGFzQmFycmVsRmlsZSA9IChkaXJlY3Rvcnk6IHN0cmluZywgbmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiA9PlxuICBuYW1lcy5zb21lKChuYW1lKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpKSk7XG5cbi8qKlxuICogR2V0cyBjYWNoZWQgYmFycmVsIHByZXNlbmNlIG9yIGNvbXB1dGVzIGl0LlxuICogQHBhcmFtIGNhY2hlS2V5IENhY2hlIGtleSBmb3IgdGhlIGxvb2t1cC5cbiAqIEBwYXJhbSBkaXJlY3RvcnkgRGlyZWN0b3J5IHRvIHNjYW4uXG4gKiBAcGFyYW0gbmFtZXMgQWxsb3dlZCBiYXJyZWwgZmlsZW5hbWVzLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIGEgYmFycmVsIGZpbGUgZXhpc3RzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGV4aXN0cyA9IGdldENhY2hlZEJhcnJlbFByZXNlbmNlKGtleSwgZGlyZWN0b3J5LCBuYW1lcyk7XG4gKiBgYGBcbiAqL1xuY29uc3QgZ2V0Q2FjaGVkQmFycmVsUHJlc2VuY2UgPSAoXG4gIGNhY2hlS2V5OiBzdHJpbmcsXG4gIGRpcmVjdG9yeTogc3RyaW5nLFxuICBuYW1lczogc3RyaW5nW10sXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgY2FjaGVkID0gZGlyZWN0b3J5Q2FjaGUuZ2V0KGNhY2hlS2V5KTtcblxuICBpZiAoY2FjaGVkICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgY29uc3QgaGFzQmFycmVsID0gaGFzQmFycmVsRmlsZShkaXJlY3RvcnksIG5hbWVzKTtcblxuICBkaXJlY3RvcnlDYWNoZS5zZXQoY2FjaGVLZXksIGhhc0JhcnJlbCk7XG5cbiAgcmV0dXJuIGhhc0JhcnJlbDtcbn07XG5cbi8qKlxuICogQnVpbGRzIGEgbGlzdGVuZXIgZm9yIGEgZGlyZWN0b3J5IHdoZW4gZW5mb3JjZW1lbnQgaXMgZW5hYmxlZC5cbiAqIEBwYXJhbSBjb250ZXh0IFJ1bGUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKiBAcGFyYW0gZGlyZWN0b3J5IERpcmVjdG9yeSB0byBpbnNwZWN0LlxuICogQHBhcmFtIG9wdGlvbnMgTm9ybWFsaXplZCBydWxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgcnVsZSBsaXN0ZW5lciBmb3IgdGhlIGRpcmVjdG9yeS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBsaXN0ZW5lciA9IGJ1aWxkTGlzdGVuZXJGb3JEaXJlY3RvcnkoY29udGV4dCwgZGlyLCBzdGF0ZSk7XG4gKiBgYGBcbiAqL1xuY29uc3QgYnVpbGRMaXN0ZW5lckZvckRpcmVjdG9yeSA9IChcbiAgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCxcbiAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gIG9wdGlvbnM6IENvbnNpc3RlbnRCYXJyZWxGaWxlc1N0YXRlLFxuKTogUnVsZS5SdWxlTGlzdGVuZXIgPT4ge1xuICBjb25zdCBjYWNoZUtleSA9IGAke2RpcmVjdG9yeX18JHtvcHRpb25zLm5hbWVzS2V5fWA7XG5cbiAgaWYgKGdldENhY2hlZEJhcnJlbFByZXNlbmNlKGNhY2hlS2V5LCBkaXJlY3RvcnksIG9wdGlvbnMubmFtZXMpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkTWlzc2luZ0xpc3RlbmVyKGNvbnRleHQsIG9wdGlvbnMubmFtZXMsIGNhY2hlS2V5KTtcbn07XG5cbi8qKlxuICogQnVpbGRzIGEgbGlzdGVuZXIgZm9yIGZvcmJpZGRlbiBiYXJyZWwgZmlsZXMuXG4gKiBAcGFyYW0gY29udGV4dCBSdWxlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICogQHBhcmFtIGJhc2VuYW1lIEZpbGVuYW1lIGJlaW5nIGNoZWNrZWQuXG4gKiBAcGFyYW0gbmFtZXNTZXQgQWxsb3dlZCBiYXJyZWwgbmFtZXMuXG4gKiBAcmV0dXJucyBUaGUgcnVsZSBsaXN0ZW5lciBmb3IgZm9yYmlkZGVuIGJhcnJlbHMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbGlzdGVuZXIgPSBidWlsZEZvcmJpZGRlbkxpc3RlbmVyKGNvbnRleHQsIGJhc2VuYW1lLCBuYW1lcyk7XG4gKiBgYGBcbiAqL1xuY29uc3QgYnVpbGRGb3JiaWRkZW5MaXN0ZW5lciA9IChcbiAgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCxcbiAgYmFzZW5hbWU6IHN0cmluZyxcbiAgbmFtZXNTZXQ6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4pOiBSdWxlLlJ1bGVMaXN0ZW5lciA9PiB7XG4gIGlmICghbmFtZXNTZXQuaGFzKGJhc2VuYW1lKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgUHJvZ3JhbShub2RlKTogdm9pZCB7XG4gICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgIGRhdGE6IHsgbmFtZTogYmFzZW5hbWUgfSxcbiAgICAgICAgbWVzc2FnZUlkOiBcImZvcmJpZGRlbkJhcnJlbFwiLFxuICAgICAgICBub2RlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogQnVpbGRzIGEgbGlzdGVuZXIgdGhhdCByZXBvcnRzIG1pc3NpbmcgYmFycmVsIGZpbGVzLlxuICogQHBhcmFtIGNvbnRleHQgUnVsZSBleGVjdXRpb24gY29udGV4dC5cbiAqIEBwYXJhbSBuYW1lcyBBbGxvd2VkIGJhcnJlbCBuYW1lcy5cbiAqIEBwYXJhbSBjYWNoZUtleSBDYWNoZSBrZXkgZm9yIHRoZSBkaXJlY3RvcnkuXG4gKiBAcmV0dXJucyBUaGUgcnVsZSBsaXN0ZW5lciBmb3IgbWlzc2luZyBiYXJyZWxzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGxpc3RlbmVyID0gYnVpbGRNaXNzaW5nTGlzdGVuZXIoY29udGV4dCwgbmFtZXMsIGNhY2hlS2V5KTtcbiAqIGBgYFxuICovXG5jb25zdCBidWlsZE1pc3NpbmdMaXN0ZW5lciA9IChcbiAgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCxcbiAgbmFtZXM6IHN0cmluZ1tdLFxuICBjYWNoZUtleTogc3RyaW5nLFxuKTogUnVsZS5SdWxlTGlzdGVuZXIgPT4ge1xuICBpZiAocmVwb3J0ZWRNaXNzaW5nLmhhcyhjYWNoZUtleSkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXBvcnRlZE1pc3NpbmcuYWRkKGNhY2hlS2V5KTtcblxuICByZXR1cm4ge1xuICAgIFByb2dyYW0obm9kZSk6IHZvaWQge1xuICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICBkYXRhOiB7IG5hbWVzOiBuYW1lcy5qb2luKFwiLCBcIikgfSxcbiAgICAgICAgbWVzc2FnZUlkOiBcIm1pc3NpbmdCYXJyZWxcIixcbiAgICAgICAgbm9kZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59O1xuXG4vKipcbiAqIEJ1aWxkcyBhIGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGZpbGUuXG4gKiBAcGFyYW0gY29udGV4dCBSdWxlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICogQHBhcmFtIGZpbGVuYW1lIEFic29sdXRlIGZpbGVuYW1lLlxuICogQHBhcmFtIG9wdGlvbnMgTm9ybWFsaXplZCBydWxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgcnVsZSBsaXN0ZW5lciBmb3IgdGhlIGZpbGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbGlzdGVuZXIgPSBidWlsZExpc3RlbmVyRm9yRmlsZShjb250ZXh0LCBmaWxlbmFtZSwgc3RhdGUpO1xuICogYGBgXG4gKi9cbmNvbnN0IGJ1aWxkTGlzdGVuZXJGb3JGaWxlID0gKFxuICBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0LFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBvcHRpb25zOiBDb25zaXN0ZW50QmFycmVsRmlsZXNTdGF0ZSxcbik6IFJ1bGUuUnVsZUxpc3RlbmVyID0+IHtcbiAgY29uc3QgeyBlbmZvcmNlLCBmb2xkZXJzLCBuYW1lcywgbmFtZXNTZXQgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKCFzaG91bGRMaW50RmlsZShmaWxlbmFtZSwgZm9sZGVycywgbmFtZXMpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKTtcblxuICBpZiAoIWVuZm9yY2UpIHtcbiAgICByZXR1cm4gYnVpbGRGb3JiaWRkZW5MaXN0ZW5lcihjb250ZXh0LCBiYXNlbmFtZSwgbmFtZXNTZXQpO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkTGlzdGVuZXJGb3JEaXJlY3RvcnkoY29udGV4dCwgcGF0aC5kaXJuYW1lKGZpbGVuYW1lKSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgeyBidWlsZExpc3RlbmVyRm9yRmlsZSB9O1xuIl19
@@ -0,0 +1,48 @@
1
+ /** Type definition for rule data. */
2
+ interface ConsistentBarrelFilesState {
3
+ /** Enforce field value. */
4
+ enforce: boolean;
5
+ /** Folders field value. */
6
+ folders: string[];
7
+ /** Names field value. */
8
+ names: string[];
9
+ /** NamesKey field value. */
10
+ namesKey: string;
11
+ /** NamesSet field value. */
12
+ namesSet: Set<string>;
13
+ }
14
+ /**
15
+ * Builds normalized rule options from raw input.
16
+ * @param options Raw rule options array.
17
+ * @returns Normalized rule options.
18
+ * @example
19
+ * ```typescript
20
+ * const state = getOptions([{}]);
21
+ * ```
22
+ */
23
+ declare const getOptions: (options: readonly unknown[]) => ConsistentBarrelFilesState;
24
+ /**
25
+ * Checks isLintableFilename.
26
+ * @param filename Input filename value.
27
+ * @returns Return value output.
28
+ * @example
29
+ * ```typescript
30
+ * isLintableFilename();
31
+ * ```
32
+ */
33
+ declare const isLintableFilename: (filename: string) => boolean;
34
+ /**
35
+ * Determines whether a file should be checked.
36
+ * @param filename Absolute filename.
37
+ * @param folders Folder glob patterns.
38
+ * @param names Allowed barrel names.
39
+ * @returns True when the file should be linted.
40
+ * @example
41
+ * ```typescript
42
+ * const ok = shouldLintFile(filename, folders, names);
43
+ * ```
44
+ */
45
+ declare const shouldLintFile: (filename: string, folders: string[], names: string[]) => boolean;
46
+ export { getOptions, isLintableFilename, shouldLintFile };
47
+ export type { ConsistentBarrelFilesState };
48
+ //# sourceMappingURL=consistent-barrel-files-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consistent-barrel-files-options.d.ts","sourceRoot":"","sources":["../../../src/architecture/consistent-barrel-files/consistent-barrel-files-options.ts"],"names":[],"mappings":"AAWA,qCAAqC;AACrC,UAAU,0BAA0B;IAClC,2BAA2B;IAC3B,OAAO,EAAE,OAAO,CAAC;IAEjB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,yBAAyB;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,4BAA4B;IAC5B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvB;AAoDD;;;;;;;;GAQG;AACH,QAAA,MAAM,UAAU,GACd,SAAS,SAAS,OAAO,EAAE,KAC1B,0BAQF,CAAC;AAEF;;;;;;;;GAQG;AACH,QAAA,MAAM,kBAAkB,GAAI,UAAU,MAAM,KAAG,OACG,CAAC;AAoCnD;;;;;;;;;;GAUG;AACH,QAAA,MAAM,cAAc,GAClB,UAAU,MAAM,EAChB,SAAS,MAAM,EAAE,EACjB,OAAO,MAAM,EAAE,KACd,OAUF,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC;AAC1D,YAAY,EAAE,0BAA0B,EAAE,CAAC"}
@@ -0,0 +1,126 @@
1
+ import { minimatch } from "minimatch";
2
+ import path from "node:path";
3
+ /** Default value used by this module. */
4
+ const DEFAULT_BARREL_NAMES = ["index.ts", "index.tsx", "index.js", "index.jsx"];
5
+ /** Default folder globs for barrel file checks. */
6
+ const DEFAULT_FOLDER_GLOBS = ["src/**"];
7
+ /**
8
+ * Normalizes normalizeNames.
9
+ * @param names Input names value.
10
+ * @returns Return value output.
11
+ * @example
12
+ * ```typescript
13
+ * normalizeNames();
14
+ * ```
15
+ */
16
+ const normalizeNames = (names) => {
17
+ if (Array.isArray(names)) {
18
+ return names
19
+ .filter((name) => typeof name === "string")
20
+ .map((name) => name.trim())
21
+ .filter((name) => name.length > 0);
22
+ }
23
+ if (typeof names === "string") {
24
+ const trimmed = names.trim();
25
+ return trimmed.length === 0 ? [] : [trimmed];
26
+ }
27
+ return [...DEFAULT_BARREL_NAMES];
28
+ };
29
+ /**
30
+ * Normalizes normalizeFolders.
31
+ * @param folders Input folders value.
32
+ * @returns Return value output.
33
+ * @example
34
+ * ```typescript
35
+ * normalizeFolders();
36
+ * ```
37
+ */
38
+ const normalizeFolders = (folders) => {
39
+ if (Array.isArray(folders)) {
40
+ return folders
41
+ .filter((folder) => typeof folder === "string")
42
+ .map((folder) => folder.trim())
43
+ .filter((folder) => folder.length > 0);
44
+ }
45
+ if (typeof folders === "string") {
46
+ const trimmed = folders.trim();
47
+ return trimmed.length === 0 ? [] : [trimmed];
48
+ }
49
+ return [...DEFAULT_FOLDER_GLOBS];
50
+ };
51
+ /**
52
+ * Builds normalized rule options from raw input.
53
+ * @param options Raw rule options array.
54
+ * @returns Normalized rule options.
55
+ * @example
56
+ * ```typescript
57
+ * const state = getOptions([{}]);
58
+ * ```
59
+ */
60
+ const getOptions = (options) => {
61
+ const rawOptions = options[0];
62
+ const enforce = rawOptions?.enforce ?? true;
63
+ const folders = normalizeFolders(rawOptions?.folders);
64
+ const names = normalizeNames(rawOptions?.names);
65
+ const namesKey = names.toSorted().join("|");
66
+ return { enforce, folders, names, namesKey, namesSet: new Set(names) };
67
+ };
68
+ /**
69
+ * Checks isLintableFilename.
70
+ * @param filename Input filename value.
71
+ * @returns Return value output.
72
+ * @example
73
+ * ```typescript
74
+ * isLintableFilename();
75
+ * ```
76
+ */
77
+ const isLintableFilename = (filename) => filename.length > 0 && path.isAbsolute(filename);
78
+ /**
79
+ * Normalizes normalizeRelativePath.
80
+ * @param filename Input filename value.
81
+ * @returns Return value output.
82
+ * @example
83
+ * ```typescript
84
+ * normalizeRelativePath();
85
+ * ```
86
+ */
87
+ const normalizeRelativePath = (filename) => path.relative(process.cwd(), filename).split(path.sep).join("/");
88
+ /**
89
+ * Checks isPathInFolders.
90
+ * @param filename Input filename value.
91
+ * @param folders Input folders value.
92
+ * @returns Return value output.
93
+ * @example
94
+ * ```typescript
95
+ * isPathInFolders();
96
+ * ```
97
+ */
98
+ const isPathInFolders = (filename, folders) => {
99
+ const relativePath = normalizeRelativePath(filename);
100
+ if (relativePath.startsWith("..") || path.isAbsolute(relativePath)) {
101
+ return false;
102
+ }
103
+ return folders.some((folder) => minimatch(relativePath, folder, { dot: true }));
104
+ };
105
+ /**
106
+ * Determines whether a file should be checked.
107
+ * @param filename Absolute filename.
108
+ * @param folders Folder glob patterns.
109
+ * @param names Allowed barrel names.
110
+ * @returns True when the file should be linted.
111
+ * @example
112
+ * ```typescript
113
+ * const ok = shouldLintFile(filename, folders, names);
114
+ * ```
115
+ */
116
+ const shouldLintFile = (filename, folders, names) => {
117
+ if (folders.length === 0) {
118
+ return false;
119
+ }
120
+ if (!isPathInFolders(filename, folders)) {
121
+ return false;
122
+ }
123
+ return names.length > 0;
124
+ };
125
+ export { getOptions, isLintableFilename, shouldLintFile };
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc2lzdGVudC1iYXJyZWwtZmlsZXMtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcmNoaXRlY3R1cmUvY29uc2lzdGVudC1iYXJyZWwtZmlsZXMvY29uc2lzdGVudC1iYXJyZWwtZmlsZXMtb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUk3Qix5Q0FBeUM7QUFDekMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBRWhGLG1EQUFtRDtBQUNuRCxNQUFNLG9CQUFvQixHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFvQnhDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFjLEVBQVksRUFBRTtJQUNsRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUs7YUFDVCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUM7YUFDMUQsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDMUIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLG9CQUFvQixDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLENBQUMsT0FBZ0IsRUFBWSxFQUFFO0lBQ3RELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzNCLE9BQU8sT0FBTzthQUNYLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBb0IsRUFBRSxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQzthQUNoRSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUM5QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLE9BQU8sT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUcsb0JBQW9CLENBQUMsQ0FBQztBQUNuQyxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxHQUFHLENBQ2pCLE9BQTJCLEVBQ0MsRUFBRTtJQUM5QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUE2QyxDQUFDO0lBQzFFLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDO0lBQzVDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RCxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUN6RSxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxRQUFnQixFQUFXLEVBQUUsQ0FDdkQsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVuRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxRQUFnQixFQUFVLEVBQUUsQ0FDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFbkU7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFnQixFQUFFLE9BQWlCLEVBQVcsRUFBRTtJQUN2RSxNQUFNLFlBQVksR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVyRCxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ25FLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQzdCLFNBQVMsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQy9DLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FDckIsUUFBZ0IsRUFDaEIsT0FBaUIsRUFDakIsS0FBZSxFQUNOLEVBQUU7SUFDWCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLENBQUMsQ0FBQztBQUVGLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtaW5pbWF0Y2ggfSBmcm9tIFwibWluaW1hdGNoXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB0eXBlIHsgQ29uc2lzdGVudEJhcnJlbEZpbGVzT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKiBEZWZhdWx0IHZhbHVlIHVzZWQgYnkgdGhpcyBtb2R1bGUuICovXG5jb25zdCBERUZBVUxUX0JBUlJFTF9OQU1FUyA9IFtcImluZGV4LnRzXCIsIFwiaW5kZXgudHN4XCIsIFwiaW5kZXguanNcIiwgXCJpbmRleC5qc3hcIl07XG5cbi8qKiBEZWZhdWx0IGZvbGRlciBnbG9icyBmb3IgYmFycmVsIGZpbGUgY2hlY2tzLiAqL1xuY29uc3QgREVGQVVMVF9GT0xERVJfR0xPQlMgPSBbXCJzcmMvKipcIl07XG5cbi8qKiBUeXBlIGRlZmluaXRpb24gZm9yIHJ1bGUgZGF0YS4gKi9cbmludGVyZmFjZSBDb25zaXN0ZW50QmFycmVsRmlsZXNTdGF0ZSB7XG4gIC8qKiBFbmZvcmNlIGZpZWxkIHZhbHVlLiAqL1xuICBlbmZvcmNlOiBib29sZWFuO1xuXG4gIC8qKiBGb2xkZXJzIGZpZWxkIHZhbHVlLiAqL1xuICBmb2xkZXJzOiBzdHJpbmdbXTtcblxuICAvKiogTmFtZXMgZmllbGQgdmFsdWUuICovXG4gIG5hbWVzOiBzdHJpbmdbXTtcblxuICAvKiogTmFtZXNLZXkgZmllbGQgdmFsdWUuICovXG4gIG5hbWVzS2V5OiBzdHJpbmc7XG5cbiAgLyoqIE5hbWVzU2V0IGZpZWxkIHZhbHVlLiAqL1xuICBuYW1lc1NldDogU2V0PHN0cmluZz47XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBub3JtYWxpemVOYW1lcy5cbiAqIEBwYXJhbSBuYW1lcyBJbnB1dCBuYW1lcyB2YWx1ZS5cbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogbm9ybWFsaXplTmFtZXMoKTtcbiAqIGBgYFxuICovXG5jb25zdCBub3JtYWxpemVOYW1lcyA9IChuYW1lczogdW5rbm93bik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobmFtZXMpKSB7XG4gICAgcmV0dXJuIG5hbWVzXG4gICAgICAuZmlsdGVyKChuYW1lKTogbmFtZSBpcyBzdHJpbmcgPT4gdHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAubWFwKChuYW1lKSA9PiBuYW1lLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+IG5hbWUubGVuZ3RoID4gMCk7XG4gIH1cblxuICBpZiAodHlwZW9mIG5hbWVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IG5hbWVzLnRyaW0oKTtcbiAgICByZXR1cm4gdHJpbW1lZC5sZW5ndGggPT09IDAgPyBbXSA6IFt0cmltbWVkXTtcbiAgfVxuXG4gIHJldHVybiBbLi4uREVGQVVMVF9CQVJSRUxfTkFNRVNdO1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemVzIG5vcm1hbGl6ZUZvbGRlcnMuXG4gKiBAcGFyYW0gZm9sZGVycyBJbnB1dCBmb2xkZXJzIHZhbHVlLlxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBub3JtYWxpemVGb2xkZXJzKCk7XG4gKiBgYGBcbiAqL1xuY29uc3Qgbm9ybWFsaXplRm9sZGVycyA9IChmb2xkZXJzOiB1bmtub3duKTogc3RyaW5nW10gPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShmb2xkZXJzKSkge1xuICAgIHJldHVybiBmb2xkZXJzXG4gICAgICAuZmlsdGVyKChmb2xkZXIpOiBmb2xkZXIgaXMgc3RyaW5nID0+IHR5cGVvZiBmb2xkZXIgPT09IFwic3RyaW5nXCIpXG4gICAgICAubWFwKChmb2xkZXIpID0+IGZvbGRlci50cmltKCkpXG4gICAgICAuZmlsdGVyKChmb2xkZXIpID0+IGZvbGRlci5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZm9sZGVycyA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBmb2xkZXJzLnRyaW0oKTtcbiAgICByZXR1cm4gdHJpbW1lZC5sZW5ndGggPT09IDAgPyBbXSA6IFt0cmltbWVkXTtcbiAgfVxuXG4gIHJldHVybiBbLi4uREVGQVVMVF9GT0xERVJfR0xPQlNdO1xufTtcblxuLyoqXG4gKiBCdWlsZHMgbm9ybWFsaXplZCBydWxlIG9wdGlvbnMgZnJvbSByYXcgaW5wdXQuXG4gKiBAcGFyYW0gb3B0aW9ucyBSYXcgcnVsZSBvcHRpb25zIGFycmF5LlxuICogQHJldHVybnMgTm9ybWFsaXplZCBydWxlIG9wdGlvbnMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3RhdGUgPSBnZXRPcHRpb25zKFt7fV0pO1xuICogYGBgXG4gKi9cbmNvbnN0IGdldE9wdGlvbnMgPSAoXG4gIG9wdGlvbnM6IHJlYWRvbmx5IHVua25vd25bXSxcbik6IENvbnNpc3RlbnRCYXJyZWxGaWxlc1N0YXRlID0+IHtcbiAgY29uc3QgcmF3T3B0aW9ucyA9IG9wdGlvbnNbMF0gYXMgQ29uc2lzdGVudEJhcnJlbEZpbGVzT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZW5mb3JjZSA9IHJhd09wdGlvbnM/LmVuZm9yY2UgPz8gdHJ1ZTtcbiAgY29uc3QgZm9sZGVycyA9IG5vcm1hbGl6ZUZvbGRlcnMocmF3T3B0aW9ucz8uZm9sZGVycyk7XG4gIGNvbnN0IG5hbWVzID0gbm9ybWFsaXplTmFtZXMocmF3T3B0aW9ucz8ubmFtZXMpO1xuICBjb25zdCBuYW1lc0tleSA9IG5hbWVzLnRvU29ydGVkKCkuam9pbihcInxcIik7XG5cbiAgcmV0dXJuIHsgZW5mb3JjZSwgZm9sZGVycywgbmFtZXMsIG5hbWVzS2V5LCBuYW1lc1NldDogbmV3IFNldChuYW1lcykgfTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlzTGludGFibGVGaWxlbmFtZS5cbiAqIEBwYXJhbSBmaWxlbmFtZSBJbnB1dCBmaWxlbmFtZSB2YWx1ZS5cbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaXNMaW50YWJsZUZpbGVuYW1lKCk7XG4gKiBgYGBcbiAqL1xuY29uc3QgaXNMaW50YWJsZUZpbGVuYW1lID0gKGZpbGVuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+XG4gIGZpbGVuYW1lLmxlbmd0aCA+IDAgJiYgcGF0aC5pc0Fic29sdXRlKGZpbGVuYW1lKTtcblxuLyoqXG4gKiBOb3JtYWxpemVzIG5vcm1hbGl6ZVJlbGF0aXZlUGF0aC5cbiAqIEBwYXJhbSBmaWxlbmFtZSBJbnB1dCBmaWxlbmFtZSB2YWx1ZS5cbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogbm9ybWFsaXplUmVsYXRpdmVQYXRoKCk7XG4gKiBgYGBcbiAqL1xuY29uc3Qgbm9ybWFsaXplUmVsYXRpdmVQYXRoID0gKGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgcGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlbmFtZSkuc3BsaXQocGF0aC5zZXApLmpvaW4oXCIvXCIpO1xuXG4vKipcbiAqIENoZWNrcyBpc1BhdGhJbkZvbGRlcnMuXG4gKiBAcGFyYW0gZmlsZW5hbWUgSW5wdXQgZmlsZW5hbWUgdmFsdWUuXG4gKiBAcGFyYW0gZm9sZGVycyBJbnB1dCBmb2xkZXJzIHZhbHVlLlxuICogQHJldHVybnMgUmV0dXJuIHZhbHVlIG91dHB1dC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpc1BhdGhJbkZvbGRlcnMoKTtcbiAqIGBgYFxuICovXG5jb25zdCBpc1BhdGhJbkZvbGRlcnMgPSAoZmlsZW5hbWU6IHN0cmluZywgZm9sZGVyczogc3RyaW5nW10pOiBib29sZWFuID0+IHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoKGZpbGVuYW1lKTtcblxuICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoXCIuLlwiKSB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmb2xkZXJzLnNvbWUoKGZvbGRlcikgPT5cbiAgICBtaW5pbWF0Y2gocmVsYXRpdmVQYXRoLCBmb2xkZXIsIHsgZG90OiB0cnVlIH0pLFxuICApO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBmaWxlIHNob3VsZCBiZSBjaGVja2VkLlxuICogQHBhcmFtIGZpbGVuYW1lIEFic29sdXRlIGZpbGVuYW1lLlxuICogQHBhcmFtIGZvbGRlcnMgRm9sZGVyIGdsb2IgcGF0dGVybnMuXG4gKiBAcGFyYW0gbmFtZXMgQWxsb3dlZCBiYXJyZWwgbmFtZXMuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIGZpbGUgc2hvdWxkIGJlIGxpbnRlZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBvayA9IHNob3VsZExpbnRGaWxlKGZpbGVuYW1lLCBmb2xkZXJzLCBuYW1lcyk7XG4gKiBgYGBcbiAqL1xuY29uc3Qgc2hvdWxkTGludEZpbGUgPSAoXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4gIGZvbGRlcnM6IHN0cmluZ1tdLFxuICBuYW1lczogc3RyaW5nW10sXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKGZvbGRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpc1BhdGhJbkZvbGRlcnMoZmlsZW5hbWUsIGZvbGRlcnMpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzLmxlbmd0aCA+IDA7XG59O1xuXG5leHBvcnQgeyBnZXRPcHRpb25zLCBpc0xpbnRhYmxlRmlsZW5hbWUsIHNob3VsZExpbnRGaWxlIH07XG5leHBvcnQgdHlwZSB7IENvbnNpc3RlbnRCYXJyZWxGaWxlc1N0YXRlIH07XG4iXX0=
@@ -0,0 +1,40 @@
1
+ import type * as ESTree from "estree";
2
+ import type { BarrelFilesExportsOnlyOptions } from "./types";
3
+ /** Type definition for rule data. */
4
+ interface RuleReport {
5
+ /** MessageId helper value. */
6
+ messageId: string | undefined;
7
+ }
8
+ /** Type definition for rule data. */
9
+ interface TemporaryRunner {
10
+ /** RunDefaultIndex field value. */
11
+ runDefaultIndex: (body: ESTree.Program["body"]) => RuleReport[];
12
+ /** RunTemporaryFeature field value. */
13
+ runTemporaryFeature: (body: ESTree.Program["body"], options?: BarrelFilesExportsOnlyOptions) => RuleReport[];
14
+ /** RunTemporaryIndex field value. */
15
+ runTemporaryIndex: (body: ESTree.Program["body"], options?: BarrelFilesExportsOnlyOptions) => RuleReport[];
16
+ }
17
+ /**
18
+ * Runs the rule against the provided AST body.
19
+ * @param filename Target filename.
20
+ * @param body AST program body.
21
+ * @param options Rule options when provided.
22
+ * @returns The captured rule reports.
23
+ * @example
24
+ * ```typescript
25
+ * const reports = runRule("index.ts", createBody());
26
+ * ```
27
+ */
28
+ declare const runRule: (filename: string, body: ESTree.Program["body"], options?: BarrelFilesExportsOnlyOptions) => RuleReport[];
29
+ /**
30
+ * Creates temporary file runners for the rule.
31
+ * @param temporaryDirectories Directories created during the run.
32
+ * @returns Helpers for running the rule in temp folders.
33
+ * @example
34
+ * ```typescript
35
+ * const runner = createTemporaryRunner([]);
36
+ * ```
37
+ */
38
+ declare const createTemporaryRunner: (temporaryDirectories: string[]) => TemporaryRunner;
39
+ export { createTemporaryRunner, runRule };
40
+ //# sourceMappingURL=exports-only-rule-test-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports-only-rule-test-utilities.d.ts","sourceRoot":"","sources":["../../../src/architecture/consistent-barrel-files/exports-only-rule-test-utilities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AAKtC,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AA0B7D,qCAAqC;AACrC,UAAU,UAAU;IAClB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAiBD,qCAAqC;AACrC,UAAU,eAAe;IACvB,mCAAmC;IACnC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;IAEhE,uCAAuC;IACvC,mBAAmB,EAAE,CACnB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAC5B,OAAO,CAAC,EAAE,6BAA6B,KACpC,UAAU,EAAE,CAAC;IAElB,qCAAqC;IACrC,iBAAiB,EAAE,CACjB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAC5B,OAAO,CAAC,EAAE,6BAA6B,KACpC,UAAU,EAAE,CAAC;CACnB;AAkCD;;;;;;;;;;GAUG;AACH,QAAA,MAAM,OAAO,GACX,UAAU,MAAM,EAChB,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAC5B,UAAU,6BAA6B,KACtC,UAAU,EAeZ,CAAC;AAEF;;;;;;;;GAQG;AACH,QAAA,MAAM,qBAAqB,GACzB,sBAAsB,MAAM,EAAE,KAC7B,eAmCF,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC"}