@less-unsound/eslint-plugin 0.0.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 (338) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/dist/cjs/index.js +355 -0
  4. package/dist/cjs/package.json +3 -0
  5. package/dist/cjs/rules/no-accidental-mutation.js +100 -0
  6. package/dist/cjs/rules/no-ambient-dom-globals.js +181 -0
  7. package/dist/cjs/rules/no-any.js +27 -0
  8. package/dist/cjs/rules/no-arguments-object.js +122 -0
  9. package/dist/cjs/rules/no-as-type-assertion.js +44 -0
  10. package/dist/cjs/rules/no-bigint.js +74 -0
  11. package/dist/cjs/rules/no-boolean-literal-compare.js +37 -0
  12. package/dist/cjs/rules/no-broad-types.js +50 -0
  13. package/dist/cjs/rules/no-buffer.js +146 -0
  14. package/dist/cjs/rules/no-class.js +39 -0
  15. package/dist/cjs/rules/no-comma-operator.js +27 -0
  16. package/dist/cjs/rules/no-conditional-type.js +27 -0
  17. package/dist/cjs/rules/no-default-parameter.js +71 -0
  18. package/dist/cjs/rules/no-enum.js +27 -0
  19. package/dist/cjs/rules/no-eval.js +33 -0
  20. package/dist/cjs/rules/no-export-default.js +45 -0
  21. package/dist/cjs/rules/no-for-in.js +27 -0
  22. package/dist/cjs/rules/no-for-let.js +39 -0
  23. package/dist/cjs/rules/no-function-constructor.js +84 -0
  24. package/dist/cjs/rules/no-function-keyword.js +48 -0
  25. package/dist/cjs/rules/no-generic-parameter-bounds.js +34 -0
  26. package/dist/cjs/rules/no-getter-setter.js +48 -0
  27. package/dist/cjs/rules/no-global-context.js +134 -0
  28. package/dist/cjs/rules/no-import-code-extension.js +70 -0
  29. package/dist/cjs/rules/no-import-rename.js +45 -0
  30. package/dist/cjs/rules/no-import-type.js +27 -0
  31. package/dist/cjs/rules/no-in-operator.js +27 -0
  32. package/dist/cjs/rules/no-indexed-access-type.js +27 -0
  33. package/dist/cjs/rules/no-indexed-object-type.js +53 -0
  34. package/dist/cjs/rules/no-inheritance.js +65 -0
  35. package/dist/cjs/rules/no-inline-tagged-object.js +95 -0
  36. package/dist/cjs/rules/no-intersection-type.js +27 -0
  37. package/dist/cjs/rules/no-json-static-method.js +158 -0
  38. package/dist/cjs/rules/no-keyof.js +27 -0
  39. package/dist/cjs/rules/no-let.js +45 -0
  40. package/dist/cjs/rules/no-mapped-object-type.js +27 -0
  41. package/dist/cjs/rules/no-never.js +27 -0
  42. package/dist/cjs/rules/no-non-null-assertion.js +27 -0
  43. package/dist/cjs/rules/no-null.js +36 -0
  44. package/dist/cjs/rules/no-object-as-map.js +138 -0
  45. package/dist/cjs/rules/no-object-spread.js +27 -0
  46. package/dist/cjs/rules/no-object-stringification-hook.js +101 -0
  47. package/dist/cjs/rules/no-optional-parameter.js +104 -0
  48. package/dist/cjs/rules/no-optional-property.js +30 -0
  49. package/dist/cjs/rules/no-overload.js +110 -0
  50. package/dist/cjs/rules/no-param-assign.js +94 -0
  51. package/dist/cjs/rules/no-prototype-access.js +79 -0
  52. package/dist/cjs/rules/no-proxy-reflect.js +112 -0
  53. package/dist/cjs/rules/no-reexport-outside-entrypoint.js +46 -0
  54. package/dist/cjs/rules/no-regular-expression.js +93 -0
  55. package/dist/cjs/rules/no-require.js +162 -0
  56. package/dist/cjs/rules/no-rest-parameter.js +38 -0
  57. package/dist/cjs/rules/no-switch.js +27 -0
  58. package/dist/cjs/rules/no-symbol.js +33 -0
  59. package/dist/cjs/rules/no-try-catch.js +30 -0
  60. package/dist/cjs/rules/no-ts-comment-directive.js +39 -0
  61. package/dist/cjs/rules/no-tuple.js +27 -0
  62. package/dist/cjs/rules/no-type-guard.js +27 -0
  63. package/dist/cjs/rules/no-typeof-operator.js +27 -0
  64. package/dist/cjs/rules/no-typeof-type.js +27 -0
  65. package/dist/cjs/rules/no-undefined-type.js +27 -0
  66. package/dist/cjs/rules/no-unknown.js +27 -0
  67. package/dist/cjs/rules/no-untagged-object-union.js +150 -0
  68. package/dist/cjs/rules/no-utility-type.js +57 -0
  69. package/dist/cjs/rules/no-var.js +27 -0
  70. package/dist/cjs/rules/no-void-operator.js +27 -0
  71. package/dist/cjs/rules/no-while.js +33 -0
  72. package/dist/cjs/rules/require-boolean-prefix.js +179 -0
  73. package/dist/cjs/rules/require-disjoint-union.js +228 -0
  74. package/dist/cjs/rules/require-function-verb.js +293 -0
  75. package/dist/cjs/rules/require-identifier-case.js +197 -0
  76. package/dist/cjs/rules/require-kebab-case-filename.js +45 -0
  77. package/dist/cjs/rules/require-named-union-branch.js +34 -0
  78. package/dist/cjs/rules/require-readonly-array.js +49 -0
  79. package/dist/cjs/rules/require-readonly-collections.js +37 -0
  80. package/dist/cjs/rules/require-readonly-object-fields.js +32 -0
  81. package/dist/cjs/rules/require-readonly-tuple.js +33 -0
  82. package/dist/cjs/rules/require-return-type.js +85 -0
  83. package/dist/cjs/rules/require-string-template-expression.js +55 -0
  84. package/dist/cjs/utils/create-rule.js +6 -0
  85. package/dist/cjs/utils/package-entrypoint.js +69 -0
  86. package/dist/cjs/utils/readonly.js +18 -0
  87. package/dist/cjs/utils/string-case.js +12 -0
  88. package/dist/cjs/utils/type-reference.js +35 -0
  89. package/dist/esm/index.d.ts +3568 -0
  90. package/dist/esm/index.js +352 -0
  91. package/dist/esm/rules/no-accidental-mutation.d.ts +3 -0
  92. package/dist/esm/rules/no-accidental-mutation.js +97 -0
  93. package/dist/esm/rules/no-ambient-dom-globals.d.ts +3 -0
  94. package/dist/esm/rules/no-ambient-dom-globals.js +178 -0
  95. package/dist/esm/rules/no-any.d.ts +3 -0
  96. package/dist/esm/rules/no-any.js +24 -0
  97. package/dist/esm/rules/no-arguments-object.d.ts +3 -0
  98. package/dist/esm/rules/no-arguments-object.js +119 -0
  99. package/dist/esm/rules/no-as-type-assertion.d.ts +3 -0
  100. package/dist/esm/rules/no-as-type-assertion.js +41 -0
  101. package/dist/esm/rules/no-bigint.d.ts +3 -0
  102. package/dist/esm/rules/no-bigint.js +71 -0
  103. package/dist/esm/rules/no-boolean-literal-compare.d.ts +3 -0
  104. package/dist/esm/rules/no-boolean-literal-compare.js +34 -0
  105. package/dist/esm/rules/no-broad-types.d.ts +3 -0
  106. package/dist/esm/rules/no-broad-types.js +47 -0
  107. package/dist/esm/rules/no-buffer.d.ts +3 -0
  108. package/dist/esm/rules/no-buffer.js +143 -0
  109. package/dist/esm/rules/no-class.d.ts +3 -0
  110. package/dist/esm/rules/no-class.js +36 -0
  111. package/dist/esm/rules/no-comma-operator.d.ts +3 -0
  112. package/dist/esm/rules/no-comma-operator.js +24 -0
  113. package/dist/esm/rules/no-conditional-type.d.ts +3 -0
  114. package/dist/esm/rules/no-conditional-type.js +24 -0
  115. package/dist/esm/rules/no-default-parameter.d.ts +3 -0
  116. package/dist/esm/rules/no-default-parameter.js +68 -0
  117. package/dist/esm/rules/no-enum.d.ts +3 -0
  118. package/dist/esm/rules/no-enum.js +24 -0
  119. package/dist/esm/rules/no-eval.d.ts +3 -0
  120. package/dist/esm/rules/no-eval.js +30 -0
  121. package/dist/esm/rules/no-export-default.d.ts +3 -0
  122. package/dist/esm/rules/no-export-default.js +42 -0
  123. package/dist/esm/rules/no-for-in.d.ts +3 -0
  124. package/dist/esm/rules/no-for-in.js +24 -0
  125. package/dist/esm/rules/no-for-let.d.ts +3 -0
  126. package/dist/esm/rules/no-for-let.js +36 -0
  127. package/dist/esm/rules/no-function-constructor.d.ts +3 -0
  128. package/dist/esm/rules/no-function-constructor.js +81 -0
  129. package/dist/esm/rules/no-function-keyword.d.ts +3 -0
  130. package/dist/esm/rules/no-function-keyword.js +45 -0
  131. package/dist/esm/rules/no-generic-parameter-bounds.d.ts +3 -0
  132. package/dist/esm/rules/no-generic-parameter-bounds.js +31 -0
  133. package/dist/esm/rules/no-getter-setter.d.ts +3 -0
  134. package/dist/esm/rules/no-getter-setter.js +45 -0
  135. package/dist/esm/rules/no-global-context.d.ts +3 -0
  136. package/dist/esm/rules/no-global-context.js +131 -0
  137. package/dist/esm/rules/no-import-code-extension.d.ts +4 -0
  138. package/dist/esm/rules/no-import-code-extension.js +67 -0
  139. package/dist/esm/rules/no-import-rename.d.ts +3 -0
  140. package/dist/esm/rules/no-import-rename.js +42 -0
  141. package/dist/esm/rules/no-import-type.d.ts +3 -0
  142. package/dist/esm/rules/no-import-type.js +24 -0
  143. package/dist/esm/rules/no-in-operator.d.ts +3 -0
  144. package/dist/esm/rules/no-in-operator.js +24 -0
  145. package/dist/esm/rules/no-indexed-access-type.d.ts +3 -0
  146. package/dist/esm/rules/no-indexed-access-type.js +24 -0
  147. package/dist/esm/rules/no-indexed-object-type.d.ts +3 -0
  148. package/dist/esm/rules/no-indexed-object-type.js +50 -0
  149. package/dist/esm/rules/no-inheritance.d.ts +3 -0
  150. package/dist/esm/rules/no-inheritance.js +62 -0
  151. package/dist/esm/rules/no-inline-tagged-object.d.ts +5 -0
  152. package/dist/esm/rules/no-inline-tagged-object.js +92 -0
  153. package/dist/esm/rules/no-intersection-type.d.ts +3 -0
  154. package/dist/esm/rules/no-intersection-type.js +24 -0
  155. package/dist/esm/rules/no-json-static-method.d.ts +3 -0
  156. package/dist/esm/rules/no-json-static-method.js +155 -0
  157. package/dist/esm/rules/no-keyof.d.ts +3 -0
  158. package/dist/esm/rules/no-keyof.js +24 -0
  159. package/dist/esm/rules/no-let.d.ts +3 -0
  160. package/dist/esm/rules/no-let.js +42 -0
  161. package/dist/esm/rules/no-mapped-object-type.d.ts +3 -0
  162. package/dist/esm/rules/no-mapped-object-type.js +24 -0
  163. package/dist/esm/rules/no-never.d.ts +3 -0
  164. package/dist/esm/rules/no-never.js +24 -0
  165. package/dist/esm/rules/no-non-null-assertion.d.ts +3 -0
  166. package/dist/esm/rules/no-non-null-assertion.js +24 -0
  167. package/dist/esm/rules/no-null.d.ts +3 -0
  168. package/dist/esm/rules/no-null.js +33 -0
  169. package/dist/esm/rules/no-object-as-map.d.ts +3 -0
  170. package/dist/esm/rules/no-object-as-map.js +135 -0
  171. package/dist/esm/rules/no-object-spread.d.ts +3 -0
  172. package/dist/esm/rules/no-object-spread.js +24 -0
  173. package/dist/esm/rules/no-object-stringification-hook.d.ts +3 -0
  174. package/dist/esm/rules/no-object-stringification-hook.js +98 -0
  175. package/dist/esm/rules/no-optional-parameter.d.ts +3 -0
  176. package/dist/esm/rules/no-optional-parameter.js +101 -0
  177. package/dist/esm/rules/no-optional-property.d.ts +3 -0
  178. package/dist/esm/rules/no-optional-property.js +27 -0
  179. package/dist/esm/rules/no-overload.d.ts +3 -0
  180. package/dist/esm/rules/no-overload.js +107 -0
  181. package/dist/esm/rules/no-param-assign.d.ts +3 -0
  182. package/dist/esm/rules/no-param-assign.js +91 -0
  183. package/dist/esm/rules/no-prototype-access.d.ts +3 -0
  184. package/dist/esm/rules/no-prototype-access.js +76 -0
  185. package/dist/esm/rules/no-proxy-reflect.d.ts +3 -0
  186. package/dist/esm/rules/no-proxy-reflect.js +109 -0
  187. package/dist/esm/rules/no-reexport-outside-entrypoint.d.ts +3 -0
  188. package/dist/esm/rules/no-reexport-outside-entrypoint.js +43 -0
  189. package/dist/esm/rules/no-regular-expression.d.ts +3 -0
  190. package/dist/esm/rules/no-regular-expression.js +90 -0
  191. package/dist/esm/rules/no-require.d.ts +3 -0
  192. package/dist/esm/rules/no-require.js +159 -0
  193. package/dist/esm/rules/no-rest-parameter.d.ts +3 -0
  194. package/dist/esm/rules/no-rest-parameter.js +35 -0
  195. package/dist/esm/rules/no-switch.d.ts +3 -0
  196. package/dist/esm/rules/no-switch.js +24 -0
  197. package/dist/esm/rules/no-symbol.d.ts +3 -0
  198. package/dist/esm/rules/no-symbol.js +30 -0
  199. package/dist/esm/rules/no-try-catch.d.ts +3 -0
  200. package/dist/esm/rules/no-try-catch.js +27 -0
  201. package/dist/esm/rules/no-ts-comment-directive.d.ts +3 -0
  202. package/dist/esm/rules/no-ts-comment-directive.js +36 -0
  203. package/dist/esm/rules/no-tuple.d.ts +3 -0
  204. package/dist/esm/rules/no-tuple.js +24 -0
  205. package/dist/esm/rules/no-type-guard.d.ts +3 -0
  206. package/dist/esm/rules/no-type-guard.js +24 -0
  207. package/dist/esm/rules/no-typeof-operator.d.ts +3 -0
  208. package/dist/esm/rules/no-typeof-operator.js +24 -0
  209. package/dist/esm/rules/no-typeof-type.d.ts +3 -0
  210. package/dist/esm/rules/no-typeof-type.js +24 -0
  211. package/dist/esm/rules/no-undefined-type.d.ts +3 -0
  212. package/dist/esm/rules/no-undefined-type.js +24 -0
  213. package/dist/esm/rules/no-unknown.d.ts +3 -0
  214. package/dist/esm/rules/no-unknown.js +24 -0
  215. package/dist/esm/rules/no-untagged-object-union.d.ts +3 -0
  216. package/dist/esm/rules/no-untagged-object-union.js +147 -0
  217. package/dist/esm/rules/no-utility-type.d.ts +3 -0
  218. package/dist/esm/rules/no-utility-type.js +54 -0
  219. package/dist/esm/rules/no-var.d.ts +3 -0
  220. package/dist/esm/rules/no-var.js +24 -0
  221. package/dist/esm/rules/no-void-operator.d.ts +3 -0
  222. package/dist/esm/rules/no-void-operator.js +24 -0
  223. package/dist/esm/rules/no-while.d.ts +3 -0
  224. package/dist/esm/rules/no-while.js +30 -0
  225. package/dist/esm/rules/require-boolean-prefix.d.ts +4 -0
  226. package/dist/esm/rules/require-boolean-prefix.js +176 -0
  227. package/dist/esm/rules/require-disjoint-union.d.ts +5 -0
  228. package/dist/esm/rules/require-disjoint-union.js +225 -0
  229. package/dist/esm/rules/require-function-verb.d.ts +4 -0
  230. package/dist/esm/rules/require-function-verb.js +290 -0
  231. package/dist/esm/rules/require-identifier-case.d.ts +4 -0
  232. package/dist/esm/rules/require-identifier-case.js +194 -0
  233. package/dist/esm/rules/require-kebab-case-filename.d.ts +4 -0
  234. package/dist/esm/rules/require-kebab-case-filename.js +42 -0
  235. package/dist/esm/rules/require-named-union-branch.d.ts +3 -0
  236. package/dist/esm/rules/require-named-union-branch.js +31 -0
  237. package/dist/esm/rules/require-readonly-array.d.ts +3 -0
  238. package/dist/esm/rules/require-readonly-array.js +46 -0
  239. package/dist/esm/rules/require-readonly-collections.d.ts +3 -0
  240. package/dist/esm/rules/require-readonly-collections.js +34 -0
  241. package/dist/esm/rules/require-readonly-object-fields.d.ts +3 -0
  242. package/dist/esm/rules/require-readonly-object-fields.js +29 -0
  243. package/dist/esm/rules/require-readonly-tuple.d.ts +3 -0
  244. package/dist/esm/rules/require-readonly-tuple.js +30 -0
  245. package/dist/esm/rules/require-return-type.d.ts +4 -0
  246. package/dist/esm/rules/require-return-type.js +79 -0
  247. package/dist/esm/rules/require-string-template-expression.d.ts +4 -0
  248. package/dist/esm/rules/require-string-template-expression.js +52 -0
  249. package/dist/esm/utils/create-rule.d.ts +4 -0
  250. package/dist/esm/utils/create-rule.js +3 -0
  251. package/dist/esm/utils/package-entrypoint.d.ts +2 -0
  252. package/dist/esm/utils/package-entrypoint.js +64 -0
  253. package/dist/esm/utils/readonly.d.ts +2 -0
  254. package/dist/esm/utils/readonly.js +14 -0
  255. package/dist/esm/utils/string-case.d.ts +3 -0
  256. package/dist/esm/utils/string-case.js +6 -0
  257. package/dist/esm/utils/type-reference.d.ts +2 -0
  258. package/dist/esm/utils/type-reference.js +31 -0
  259. package/docs/rules/no-accidental-mutation.md +39 -0
  260. package/docs/rules/no-ambient-dom-globals.md +37 -0
  261. package/docs/rules/no-any.md +23 -0
  262. package/docs/rules/no-arguments-object.md +35 -0
  263. package/docs/rules/no-as-type-assertion.md +26 -0
  264. package/docs/rules/no-bigint.md +31 -0
  265. package/docs/rules/no-boolean-literal-compare.md +31 -0
  266. package/docs/rules/no-broad-types.md +27 -0
  267. package/docs/rules/no-buffer.md +31 -0
  268. package/docs/rules/no-class.md +56 -0
  269. package/docs/rules/no-comma-operator.md +31 -0
  270. package/docs/rules/no-conditional-type.md +23 -0
  271. package/docs/rules/no-default-parameter.md +43 -0
  272. package/docs/rules/no-enum.md +31 -0
  273. package/docs/rules/no-eval.md +27 -0
  274. package/docs/rules/no-export-default.md +28 -0
  275. package/docs/rules/no-for-in.md +23 -0
  276. package/docs/rules/no-for-let.md +31 -0
  277. package/docs/rules/no-function-constructor.md +27 -0
  278. package/docs/rules/no-function-keyword.md +37 -0
  279. package/docs/rules/no-generic-parameter-bounds.md +25 -0
  280. package/docs/rules/no-getter-setter.md +55 -0
  281. package/docs/rules/no-global-context.md +50 -0
  282. package/docs/rules/no-import-code-extension.md +39 -0
  283. package/docs/rules/no-import-rename.md +31 -0
  284. package/docs/rules/no-import-type.md +25 -0
  285. package/docs/rules/no-in-operator.md +23 -0
  286. package/docs/rules/no-indexed-access-type.md +33 -0
  287. package/docs/rules/no-indexed-object-type.md +23 -0
  288. package/docs/rules/no-inheritance.md +31 -0
  289. package/docs/rules/no-inline-tagged-object.md +41 -0
  290. package/docs/rules/no-intersection-type.md +23 -0
  291. package/docs/rules/no-json-static-method.md +46 -0
  292. package/docs/rules/no-keyof.md +35 -0
  293. package/docs/rules/no-let.md +31 -0
  294. package/docs/rules/no-mapped-object-type.md +23 -0
  295. package/docs/rules/no-never.md +35 -0
  296. package/docs/rules/no-non-null-assertion.md +23 -0
  297. package/docs/rules/no-null.md +31 -0
  298. package/docs/rules/no-object-as-map.md +49 -0
  299. package/docs/rules/no-object-spread.md +31 -0
  300. package/docs/rules/no-object-stringification-hook.md +49 -0
  301. package/docs/rules/no-optional-parameter.md +39 -0
  302. package/docs/rules/no-optional-property.md +33 -0
  303. package/docs/rules/no-overload.md +29 -0
  304. package/docs/rules/no-param-assign.md +30 -0
  305. package/docs/rules/no-prototype-access.md +43 -0
  306. package/docs/rules/no-proxy-reflect.md +39 -0
  307. package/docs/rules/no-reexport-outside-entrypoint.md +35 -0
  308. package/docs/rules/no-regular-expression.md +36 -0
  309. package/docs/rules/no-require.md +29 -0
  310. package/docs/rules/no-rest-parameter.md +23 -0
  311. package/docs/rules/no-switch.md +32 -0
  312. package/docs/rules/no-symbol.md +31 -0
  313. package/docs/rules/no-try-catch.md +37 -0
  314. package/docs/rules/no-ts-comment-directive.md +25 -0
  315. package/docs/rules/no-tuple.md +29 -0
  316. package/docs/rules/no-type-guard.md +23 -0
  317. package/docs/rules/no-typeof-operator.md +23 -0
  318. package/docs/rules/no-typeof-type.md +23 -0
  319. package/docs/rules/no-undefined-type.md +30 -0
  320. package/docs/rules/no-unknown.md +23 -0
  321. package/docs/rules/no-untagged-object-union.md +25 -0
  322. package/docs/rules/no-utility-type.md +35 -0
  323. package/docs/rules/no-var.md +27 -0
  324. package/docs/rules/no-void-operator.md +27 -0
  325. package/docs/rules/no-while.md +33 -0
  326. package/docs/rules/require-boolean-prefix.md +31 -0
  327. package/docs/rules/require-disjoint-union.md +58 -0
  328. package/docs/rules/require-function-verb.md +83 -0
  329. package/docs/rules/require-identifier-case.md +54 -0
  330. package/docs/rules/require-kebab-case-filename.md +37 -0
  331. package/docs/rules/require-named-union-branch.md +35 -0
  332. package/docs/rules/require-readonly-array.md +35 -0
  333. package/docs/rules/require-readonly-collections.md +35 -0
  334. package/docs/rules/require-readonly-object-fields.md +46 -0
  335. package/docs/rules/require-readonly-tuple.md +27 -0
  336. package/docs/rules/require-return-type.md +37 -0
  337. package/docs/rules/require-string-template-expression.md +38 -0
  338. package/package.json +70 -0
@@ -0,0 +1,194 @@
1
+ import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
+ import { createRule } from "../utils/create-rule.js";
3
+ import { isCamelCase, isPascalCase } from "../utils/string-case.js";
4
+ const messageIds = Object.freeze({
5
+ invalidIdentifierCase: "Identifiers must be in camelCase, PascalCase, `_camelCase`, or `$` followed by up to 2 letters. `{{name}}` is not allowed."
6
+ });
7
+ const isShortDollarName = (name) => /^\$[A-Za-z]{0,2}$/u.test(name);
8
+ const isUnderscoreCamelCase = (name) => name.startsWith("_") && isCamelCase(name.slice(1));
9
+ const isAllowedName = (name) => isCamelCase(name) ||
10
+ isPascalCase(name) ||
11
+ isUnderscoreCamelCase(name) ||
12
+ isShortDollarName(name);
13
+ const reportIfNeeded = (context, node, name) => {
14
+ if (isAllowedName(name)) {
15
+ return;
16
+ }
17
+ context.report({
18
+ node,
19
+ messageId: "invalidIdentifierCase",
20
+ data: {
21
+ name
22
+ }
23
+ });
24
+ };
25
+ const reportNameNode = (context, node) => reportIfNeeded(context, node, node.name);
26
+ const reportPattern = (context, node) => {
27
+ if (node.type === AST_NODE_TYPES.Identifier) {
28
+ reportNameNode(context, node);
29
+ return;
30
+ }
31
+ if (node.type === AST_NODE_TYPES.RestElement) {
32
+ reportPattern(context, node.argument);
33
+ return;
34
+ }
35
+ if (node.type === AST_NODE_TYPES.AssignmentPattern) {
36
+ reportPattern(context, node.left);
37
+ return;
38
+ }
39
+ if (node.type === AST_NODE_TYPES.ArrayPattern) {
40
+ for (const element of node.elements) {
41
+ if (element === null) {
42
+ continue;
43
+ }
44
+ reportPattern(context, element);
45
+ }
46
+ return;
47
+ }
48
+ if (node.type !== AST_NODE_TYPES.ObjectPattern) {
49
+ return;
50
+ }
51
+ for (const property of node.properties) {
52
+ if (property.type === AST_NODE_TYPES.RestElement) {
53
+ reportPattern(context, property.argument);
54
+ continue;
55
+ }
56
+ reportPattern(context, property.value);
57
+ }
58
+ };
59
+ const reportPropertyKey = (context, node) => {
60
+ if (node.type !== AST_NODE_TYPES.Identifier &&
61
+ node.type !== AST_NODE_TYPES.PrivateIdentifier) {
62
+ return;
63
+ }
64
+ reportNameNode(context, node);
65
+ };
66
+ export const requireIdentifierCaseRule = createRule({
67
+ name: "require-identifier-case",
68
+ meta: {
69
+ type: "problem",
70
+ docs: {
71
+ description: "Require identifiers to use camelCase, PascalCase, `_camelCase`, or short `$` names."
72
+ },
73
+ schema: [],
74
+ messages: messageIds
75
+ },
76
+ defaultOptions: [],
77
+ create: (context) => ({
78
+ ArrowFunctionExpression: (node) => {
79
+ for (const param of node.params) {
80
+ reportPattern(context, param);
81
+ }
82
+ },
83
+ CatchClause: (node) => {
84
+ if (node.param === null) {
85
+ return;
86
+ }
87
+ reportPattern(context, node.param);
88
+ },
89
+ ClassDeclaration: (node) => {
90
+ if (node.id !== null) {
91
+ reportNameNode(context, node.id);
92
+ }
93
+ },
94
+ ClassExpression: (node) => {
95
+ if (node.id !== null) {
96
+ reportNameNode(context, node.id);
97
+ }
98
+ },
99
+ FunctionDeclaration: (node) => {
100
+ if (node.id !== null) {
101
+ reportNameNode(context, node.id);
102
+ }
103
+ for (const param of node.params) {
104
+ reportPattern(context, param);
105
+ }
106
+ },
107
+ FunctionExpression: (node) => {
108
+ if (node.id !== null) {
109
+ reportNameNode(context, node.id);
110
+ }
111
+ for (const param of node.params) {
112
+ reportPattern(context, param);
113
+ }
114
+ },
115
+ ImportDefaultSpecifier: (node) => {
116
+ reportNameNode(context, node.local);
117
+ },
118
+ ImportNamespaceSpecifier: (node) => {
119
+ reportNameNode(context, node.local);
120
+ },
121
+ ImportSpecifier: (node) => {
122
+ reportNameNode(context, node.local);
123
+ },
124
+ MethodDefinition: (node) => {
125
+ if (node.computed) {
126
+ return;
127
+ }
128
+ reportPropertyKey(context, node.key);
129
+ },
130
+ Property: (node) => {
131
+ if (node.parent.type !== AST_NODE_TYPES.ObjectExpression) {
132
+ return;
133
+ }
134
+ if (node.computed || node.shorthand) {
135
+ return;
136
+ }
137
+ reportPropertyKey(context, node.key);
138
+ },
139
+ PropertyDefinition: (node) => {
140
+ if (node.computed) {
141
+ return;
142
+ }
143
+ reportPropertyKey(context, node.key);
144
+ },
145
+ TSEnumDeclaration: (node) => {
146
+ reportNameNode(context, node.id);
147
+ },
148
+ TSEnumMember: (node) => {
149
+ if (node.id.type !== AST_NODE_TYPES.Identifier) {
150
+ return;
151
+ }
152
+ reportNameNode(context, node.id);
153
+ },
154
+ TSInterfaceDeclaration: (node) => {
155
+ reportNameNode(context, node.id);
156
+ },
157
+ TSMethodSignature: (node) => {
158
+ if (node.computed) {
159
+ return;
160
+ }
161
+ reportPropertyKey(context, node.key);
162
+ },
163
+ TSModuleDeclaration: (node) => {
164
+ if (node.id.type !== AST_NODE_TYPES.Identifier) {
165
+ return;
166
+ }
167
+ reportNameNode(context, node.id);
168
+ },
169
+ TSParameterProperty: (node) => {
170
+ if (node.parameter.type === AST_NODE_TYPES.Identifier) {
171
+ reportNameNode(context, node.parameter);
172
+ return;
173
+ }
174
+ if (node.parameter.type === AST_NODE_TYPES.AssignmentPattern) {
175
+ reportPattern(context, node.parameter);
176
+ }
177
+ },
178
+ TSPropertySignature: (node) => {
179
+ if (node.computed) {
180
+ return;
181
+ }
182
+ reportPropertyKey(context, node.key);
183
+ },
184
+ TSTypeAliasDeclaration: (node) => {
185
+ reportNameNode(context, node.id);
186
+ },
187
+ TSTypeParameter: (node) => {
188
+ reportNameNode(context, node.name);
189
+ },
190
+ VariableDeclarator: (node) => {
191
+ reportPattern(context, node.id);
192
+ }
193
+ })
194
+ });
@@ -0,0 +1,4 @@
1
+ import type { TSESLint } from "@typescript-eslint/utils";
2
+ export declare const requireKebabCaseFilenameRule: TSESLint.RuleModule<"nonKebabCaseFilename", [], unknown, TSESLint.RuleListener> & {
3
+ name: string;
4
+ };
@@ -0,0 +1,42 @@
1
+ import { createRule } from "../utils/create-rule.js";
2
+ import { isKebabCase } from "../utils/string-case.js";
3
+ const messageIds = Object.freeze({
4
+ nonKebabCaseFilename: "Filenames must be in kebab-case. `{{filename}}` is not allowed."
5
+ });
6
+ const getFilename = (context) => context.filename;
7
+ const getBaseFilename = (filename) => {
8
+ const parts = filename.split(/[/\\]/);
9
+ return parts.at(-1) ?? filename;
10
+ };
11
+ const isLintVirtualFilename = (filename) => filename.startsWith("<") && filename.endsWith(">");
12
+ export const requireKebabCaseFilenameRule = createRule({
13
+ name: "require-kebab-case-filename",
14
+ meta: {
15
+ type: "problem",
16
+ docs: {
17
+ description: "Require filenames to be in kebab-case."
18
+ },
19
+ schema: [],
20
+ messages: messageIds
21
+ },
22
+ defaultOptions: [],
23
+ create: (context) => ({
24
+ Program: (node) => {
25
+ const filename = getFilename(context);
26
+ if (isLintVirtualFilename(filename)) {
27
+ return;
28
+ }
29
+ const baseFilename = getBaseFilename(filename);
30
+ if (isKebabCase(baseFilename)) {
31
+ return;
32
+ }
33
+ context.report({
34
+ node,
35
+ messageId: "nonKebabCaseFilename",
36
+ data: {
37
+ filename: baseFilename
38
+ }
39
+ });
40
+ }
41
+ })
42
+ });
@@ -0,0 +1,3 @@
1
+ export declare const requireNamedUnionBranchRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"requireNamedUnionBranch", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
2
+ name: string;
3
+ };
@@ -0,0 +1,31 @@
1
+ import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
+ import { createRule } from "../utils/create-rule.js";
3
+ const messageIds = Object.freeze({
4
+ requireNamedUnionBranch: "Object union branches must be named."
5
+ });
6
+ const isInlineObjectType = (node) => node.type === AST_NODE_TYPES.TSTypeLiteral;
7
+ export const requireNamedUnionBranchRule = createRule({
8
+ name: "require-named-union-branch",
9
+ meta: {
10
+ type: "problem",
11
+ docs: {
12
+ description: "Require every object-shaped union branch to be defined through its own name."
13
+ },
14
+ schema: [],
15
+ messages: messageIds
16
+ },
17
+ defaultOptions: [],
18
+ create: (context) => ({
19
+ TSUnionType: (node) => {
20
+ for (const branch of node.types) {
21
+ if (!isInlineObjectType(branch)) {
22
+ continue;
23
+ }
24
+ context.report({
25
+ node: branch,
26
+ messageId: "requireNamedUnionBranch"
27
+ });
28
+ }
29
+ }
30
+ })
31
+ });
@@ -0,0 +1,3 @@
1
+ export declare const requireReadonlyArrayRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingReadonlyArray", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
2
+ name: string;
3
+ };
@@ -0,0 +1,46 @@
1
+ import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
+ import { createRule } from "../utils/create-rule.js";
3
+ import { isReadonlyType } from "../utils/readonly.js";
4
+ const messageIds = Object.freeze({
5
+ missingReadonlyArray: "Array types must use `readonly T[]`."
6
+ });
7
+ const isArrayReference = (node) => {
8
+ if (node.typeName.type !== AST_NODE_TYPES.Identifier) {
9
+ return false;
10
+ }
11
+ return node.typeName.name === "Array" || node.typeName.name === "ReadonlyArray";
12
+ };
13
+ export const requireReadonlyArrayRule = createRule({
14
+ name: "require-readonly-array",
15
+ meta: {
16
+ type: "problem",
17
+ docs: {
18
+ description: "Require array types to use `readonly T[]` unless mutability is required for performance."
19
+ },
20
+ fixable: "code",
21
+ schema: [],
22
+ messages: messageIds
23
+ },
24
+ defaultOptions: [],
25
+ create: (context) => ({
26
+ TSArrayType: (node) => {
27
+ if (isReadonlyType(node)) {
28
+ return;
29
+ }
30
+ context.report({
31
+ node,
32
+ messageId: "missingReadonlyArray",
33
+ fix: (fixer) => fixer.insertTextBefore(node, "readonly ")
34
+ });
35
+ },
36
+ TSTypeReference: (node) => {
37
+ if (!isArrayReference(node)) {
38
+ return;
39
+ }
40
+ context.report({
41
+ node,
42
+ messageId: "missingReadonlyArray"
43
+ });
44
+ }
45
+ })
46
+ });
@@ -0,0 +1,3 @@
1
+ export declare const requireReadonlyCollectionsRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingReadonlyCollections", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
2
+ name: string;
3
+ };
@@ -0,0 +1,34 @@
1
+ import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
+ import { createRule } from "../utils/create-rule.js";
3
+ const messageIds = Object.freeze({
4
+ missingReadonlyCollections: "Collection types must use `ReadonlySet` and `ReadonlyMap` unless mutability is required for performance."
5
+ });
6
+ const isMutableCollection = (node) => {
7
+ if (node.typeName.type !== AST_NODE_TYPES.Identifier) {
8
+ return false;
9
+ }
10
+ return node.typeName.name === "Set" || node.typeName.name === "Map";
11
+ };
12
+ export const requireReadonlyCollectionsRule = createRule({
13
+ name: "require-readonly-collections",
14
+ meta: {
15
+ type: "problem",
16
+ docs: {
17
+ description: "Require `ReadonlySet` and `ReadonlyMap` in types unless mutability is required for performance."
18
+ },
19
+ schema: [],
20
+ messages: messageIds
21
+ },
22
+ defaultOptions: [],
23
+ create: (context) => ({
24
+ TSTypeReference: (node) => {
25
+ if (!isMutableCollection(node)) {
26
+ return;
27
+ }
28
+ context.report({
29
+ node,
30
+ messageId: "missingReadonlyCollections"
31
+ });
32
+ }
33
+ })
34
+ });
@@ -0,0 +1,3 @@
1
+ export declare const requireReadonlyObjectFieldsRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingReadonlyObjectField", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
2
+ name: string;
3
+ };
@@ -0,0 +1,29 @@
1
+ import { createRule } from "../utils/create-rule.js";
2
+ const messageIds = Object.freeze({
3
+ missingReadonlyObjectField: "Object type fields must be marked `readonly`."
4
+ });
5
+ export const requireReadonlyObjectFieldsRule = createRule({
6
+ name: "require-readonly-object-fields",
7
+ meta: {
8
+ type: "problem",
9
+ docs: {
10
+ description: "Require `readonly` on all object type fields unless mutability is required for performance."
11
+ },
12
+ fixable: "code",
13
+ schema: [],
14
+ messages: messageIds
15
+ },
16
+ defaultOptions: [],
17
+ create: (context) => ({
18
+ TSPropertySignature: (node) => {
19
+ if (node.readonly) {
20
+ return;
21
+ }
22
+ context.report({
23
+ node,
24
+ messageId: "missingReadonlyObjectField",
25
+ fix: (fixer) => fixer.insertTextBefore(node, "readonly ")
26
+ });
27
+ }
28
+ })
29
+ });
@@ -0,0 +1,3 @@
1
+ export declare const requireReadonlyTupleRule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingReadonlyTuple", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
2
+ name: string;
3
+ };
@@ -0,0 +1,30 @@
1
+ import { createRule } from "../utils/create-rule.js";
2
+ import { isReadonlyType } from "../utils/readonly.js";
3
+ const messageIds = Object.freeze({
4
+ missingReadonlyTuple: "Tuple types must use `readonly [...]`."
5
+ });
6
+ export const requireReadonlyTupleRule = createRule({
7
+ name: "require-readonly-tuple",
8
+ meta: {
9
+ type: "problem",
10
+ docs: {
11
+ description: "Require tuple types to use `readonly [...]` unless mutability is required for performance."
12
+ },
13
+ fixable: "code",
14
+ schema: [],
15
+ messages: messageIds
16
+ },
17
+ defaultOptions: [],
18
+ create: (context) => ({
19
+ TSTupleType: (node) => {
20
+ if (isReadonlyType(node)) {
21
+ return;
22
+ }
23
+ context.report({
24
+ node,
25
+ messageId: "missingReadonlyTuple",
26
+ fix: (fixer) => fixer.insertTextBefore(node, "readonly ")
27
+ });
28
+ }
29
+ })
30
+ });
@@ -0,0 +1,4 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const requireReturnTypeRule: ESLintUtils.RuleModule<"forbiddenHigherOrderReturnType" | "missingReturnType", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
@@ -0,0 +1,79 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ import { AST_NODE_TYPES } from "@typescript-eslint/utils";
3
+ import ts from "typescript";
4
+ import { createRule } from "../utils/create-rule.js";
5
+ const messageIds = Object.freeze({
6
+ forbiddenHigherOrderReturnType: "Functions that return functions must not declare an outer return type.",
7
+ missingReturnType: "Functions must declare a return type unless they return a function."
8
+ });
9
+ const isCallableType = (checker, type) => {
10
+ const constrainedType = checker.getBaseConstraintOfType(type) ?? type;
11
+ if (constrainedType.isUnion()) {
12
+ return constrainedType.types.every((member) => isCallableType(checker, member));
13
+ }
14
+ return (checker.getSignaturesOfType(constrainedType, ts.SignatureKind.Call).length > 0 ||
15
+ checker.getSignaturesOfType(constrainedType, ts.SignatureKind.Construct).length > 0);
16
+ };
17
+ const hasNamedBinding = (node) => {
18
+ if (node.type === AST_NODE_TYPES.FunctionDeclaration) {
19
+ return node.id !== null;
20
+ }
21
+ if (node.type === AST_NODE_TYPES.TSDeclareFunction) {
22
+ return node.id !== null;
23
+ }
24
+ const parent = node.parent;
25
+ return parent !== undefined
26
+ && parent.type === AST_NODE_TYPES.VariableDeclarator
27
+ && parent.id.type === AST_NODE_TYPES.Identifier;
28
+ };
29
+ export const requireReturnTypeRule = createRule({
30
+ name: "require-return-type",
31
+ meta: {
32
+ type: "problem",
33
+ docs: {
34
+ description: "Require functions to declare a return type unless they return a function."
35
+ },
36
+ schema: [],
37
+ messages: messageIds
38
+ },
39
+ defaultOptions: [],
40
+ create: (context) => {
41
+ const services = ESLintUtils.getParserServices(context);
42
+ const checker = services.program.getTypeChecker();
43
+ const checkFunction = (node) => {
44
+ if (!hasNamedBinding(node)) {
45
+ return;
46
+ }
47
+ const tsNode = services.esTreeNodeToTSNodeMap.get(node);
48
+ const signature = checker.getSignatureFromDeclaration(tsNode);
49
+ if (signature === undefined) {
50
+ return;
51
+ }
52
+ const returnType = checker.getReturnTypeOfSignature(signature);
53
+ const isHigherOrder = isCallableType(checker, returnType);
54
+ if (node.returnType === undefined) {
55
+ if (isHigherOrder) {
56
+ return;
57
+ }
58
+ context.report({
59
+ node,
60
+ messageId: "missingReturnType"
61
+ });
62
+ return;
63
+ }
64
+ if (!isHigherOrder) {
65
+ return;
66
+ }
67
+ context.report({
68
+ node: node.returnType,
69
+ messageId: "forbiddenHigherOrderReturnType"
70
+ });
71
+ };
72
+ return {
73
+ ArrowFunctionExpression: checkFunction,
74
+ FunctionDeclaration: checkFunction,
75
+ FunctionExpression: checkFunction,
76
+ TSDeclareFunction: checkFunction
77
+ };
78
+ }
79
+ });
@@ -0,0 +1,4 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const requireStringTemplateExpressionRule: ESLintUtils.RuleModule<"nonStringTemplateExpression", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
@@ -0,0 +1,52 @@
1
+ import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
2
+ import { createRule } from "../utils/create-rule.js";
3
+ const messageIds = Object.freeze({
4
+ nonStringTemplateExpression: "Template literal expressions must have string type. Got `{{type}}`."
5
+ });
6
+ const isStringType = (checker, type) => {
7
+ const constrainedType = checker.getBaseConstraintOfType(type) ?? type;
8
+ if (constrainedType.isUnion()) {
9
+ return constrainedType.types.every((member) => isStringType(checker, member));
10
+ }
11
+ if (constrainedType.isIntersection()) {
12
+ return constrainedType.types.some((member) => isStringType(checker, member));
13
+ }
14
+ const baseType = checker.getBaseTypeOfLiteralType(constrainedType);
15
+ return checker.typeToString(baseType) === "string";
16
+ };
17
+ export const requireStringTemplateExpressionRule = createRule({
18
+ name: "require-string-template-expression",
19
+ meta: {
20
+ type: "problem",
21
+ docs: {
22
+ description: "Require untagged template literal interpolations to have `string` type."
23
+ },
24
+ schema: [],
25
+ messages: messageIds
26
+ },
27
+ defaultOptions: [],
28
+ create: (context) => {
29
+ const services = ESLintUtils.getParserServices(context);
30
+ const checker = services.program.getTypeChecker();
31
+ return {
32
+ TemplateLiteral: (node) => {
33
+ if (node.parent.type === AST_NODE_TYPES.TaggedTemplateExpression) {
34
+ return;
35
+ }
36
+ for (const expression of node.expressions) {
37
+ const expressionType = services.getTypeAtLocation(expression);
38
+ if (isStringType(checker, expressionType)) {
39
+ continue;
40
+ }
41
+ context.report({
42
+ node: expression,
43
+ messageId: "nonStringTemplateExpression",
44
+ data: {
45
+ type: checker.typeToString(expressionType)
46
+ }
47
+ });
48
+ }
49
+ }
50
+ };
51
+ }
52
+ });
@@ -0,0 +1,4 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const createRule: <Options extends readonly unknown[], MessageIds extends string>({ meta, name, ...rule }: Readonly<ESLintUtils.RuleWithMetaAndName<Options, MessageIds, unknown>>) => ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
@@ -0,0 +1,3 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ const buildRuleUrl = (name) => "docs/rules/" + name + ".md";
3
+ export const createRule = ESLintUtils.RuleCreator(buildRuleUrl);
@@ -0,0 +1,2 @@
1
+ export declare const findNearestPackageJsonPath: (filename: string) => string | undefined;
2
+ export declare const isExplicitPackageEntrypoint: (filename: string) => boolean;
@@ -0,0 +1,64 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { dirname, parse, resolve } from "node:path";
3
+ const packageEntrypointsCache = new Map();
4
+ const isJsonObject = (value) => {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6
+ };
7
+ const collectStringValues = (value) => {
8
+ if (typeof value === "string") {
9
+ return [value];
10
+ }
11
+ if (Array.isArray(value)) {
12
+ return value.flatMap(collectStringValues);
13
+ }
14
+ if (!isJsonObject(value)) {
15
+ return [];
16
+ }
17
+ return Object.values(value).flatMap(collectStringValues);
18
+ };
19
+ const getExplicitEntrypointValues = (packageJson) => {
20
+ return [
21
+ ...collectStringValues(packageJson.bin ?? []),
22
+ ...collectStringValues(packageJson.browser ?? []),
23
+ ...collectStringValues(packageJson.exports ?? []),
24
+ ...collectStringValues(packageJson.main ?? []),
25
+ ...collectStringValues(packageJson.module ?? []),
26
+ ...collectStringValues(packageJson.types ?? []),
27
+ ...collectStringValues(packageJson.typings ?? [])
28
+ ];
29
+ };
30
+ const readPackageEntrypoints = (packageJsonPath) => {
31
+ const cached = packageEntrypointsCache.get(packageJsonPath);
32
+ if (cached !== undefined) {
33
+ return cached;
34
+ }
35
+ const packageDir = dirname(packageJsonPath);
36
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
37
+ const entrypoints = new Set(getExplicitEntrypointValues(packageJson).map((value) => resolve(packageDir, value)));
38
+ packageEntrypointsCache.set(packageJsonPath, entrypoints);
39
+ return entrypoints;
40
+ };
41
+ export const findNearestPackageJsonPath = (filename) => {
42
+ if (filename === "<input>" || filename === "<text>") {
43
+ return undefined;
44
+ }
45
+ let currentDir = dirname(filename);
46
+ const filesystemRoot = parse(currentDir).root;
47
+ while (true) {
48
+ const packageJsonPath = resolve(currentDir, "package.json");
49
+ if (existsSync(packageJsonPath)) {
50
+ return packageJsonPath;
51
+ }
52
+ if (currentDir === filesystemRoot) {
53
+ return undefined;
54
+ }
55
+ currentDir = dirname(currentDir);
56
+ }
57
+ };
58
+ export const isExplicitPackageEntrypoint = (filename) => {
59
+ const packageJsonPath = findNearestPackageJsonPath(filename);
60
+ if (packageJsonPath === undefined) {
61
+ return false;
62
+ }
63
+ return readPackageEntrypoints(packageJsonPath).has(resolve(filename));
64
+ };
@@ -0,0 +1,2 @@
1
+ import { type TSESTree } from "@typescript-eslint/utils";
2
+ export declare const isReadonlyType: (node: TSESTree.TypeNode) => boolean;