eslint-plugin-jsdoc 52.0.3 → 52.0.4

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 (357) hide show
  1. package/dist/WarnSettings.cjs +35 -18
  2. package/dist/WarnSettings.cjs.map +1 -1
  3. package/dist/alignTransform.cjs +305 -224
  4. package/dist/alignTransform.cjs.map +1 -1
  5. package/dist/defaultTagOrder.cjs +43 -132
  6. package/dist/defaultTagOrder.cjs.map +1 -1
  7. package/dist/exportParser.cjs +696 -478
  8. package/dist/exportParser.cjs.map +1 -1
  9. package/dist/generateRule.cjs +242 -0
  10. package/dist/generateRule.cjs.map +1 -0
  11. package/dist/getDefaultTagStructureForMode.cjs +288 -184
  12. package/dist/getDefaultTagStructureForMode.cjs.map +1 -1
  13. package/dist/getJsdocProcessorPlugin.cjs +550 -364
  14. package/dist/getJsdocProcessorPlugin.cjs.map +1 -1
  15. package/dist/getJsdocProcessorPlugin.d.ts +65 -68
  16. package/dist/getJsdocProcessorPlugin.d.ts.map +1 -1
  17. package/dist/index.cjs +383 -398
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.ts +6 -11
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/iterateJsdoc.cjs +1988 -1528
  22. package/dist/iterateJsdoc.cjs.map +1 -1
  23. package/dist/iterateJsdoc.d.ts +349 -358
  24. package/dist/iterateJsdoc.d.ts.map +1 -1
  25. package/dist/jsdocUtils.cjs +1376 -1009
  26. package/dist/jsdocUtils.cjs.map +1 -1
  27. package/dist/rules/checkAccess.cjs +36 -29
  28. package/dist/rules/checkAccess.cjs.map +1 -1
  29. package/dist/rules/checkAlignment.cjs +54 -41
  30. package/dist/rules/checkAlignment.cjs.map +1 -1
  31. package/dist/rules/checkExamples.cjs +484 -327
  32. package/dist/rules/checkExamples.cjs.map +1 -1
  33. package/dist/rules/checkIndentation.cjs +65 -50
  34. package/dist/rules/checkIndentation.cjs.map +1 -1
  35. package/dist/rules/checkLineAlignment.cjs +311 -220
  36. package/dist/rules/checkLineAlignment.cjs.map +1 -1
  37. package/dist/rules/checkParamNames.cjs +335 -227
  38. package/dist/rules/checkParamNames.cjs.map +1 -1
  39. package/dist/rules/checkPropertyNames.cjs +106 -78
  40. package/dist/rules/checkPropertyNames.cjs.map +1 -1
  41. package/dist/rules/checkSyntax.cjs +34 -21
  42. package/dist/rules/checkSyntax.cjs.map +1 -1
  43. package/dist/rules/checkTagNames.cjs +210 -188
  44. package/dist/rules/checkTagNames.cjs.map +1 -1
  45. package/dist/rules/checkTemplateNames.cjs +178 -121
  46. package/dist/rules/checkTemplateNames.cjs.map +1 -1
  47. package/dist/rules/checkTypes.cjs +385 -291
  48. package/dist/rules/checkTypes.cjs.map +1 -1
  49. package/dist/rules/checkValues.cjs +146 -100
  50. package/dist/rules/checkValues.cjs.map +1 -1
  51. package/dist/rules/convertToJsdocComments.cjs +306 -228
  52. package/dist/rules/convertToJsdocComments.cjs.map +1 -1
  53. package/dist/rules/emptyTags.cjs +72 -62
  54. package/dist/rules/emptyTags.cjs.map +1 -1
  55. package/dist/rules/implementsOnClasses.cjs +56 -36
  56. package/dist/rules/implementsOnClasses.cjs.map +1 -1
  57. package/dist/rules/importsAsDependencies.cjs +99 -62
  58. package/dist/rules/importsAsDependencies.cjs.map +1 -1
  59. package/dist/rules/informativeDocs.cjs +142 -105
  60. package/dist/rules/informativeDocs.cjs.map +1 -1
  61. package/dist/rules/linesBeforeBlock.cjs +105 -70
  62. package/dist/rules/linesBeforeBlock.cjs.map +1 -1
  63. package/dist/rules/matchDescription.cjs +222 -160
  64. package/dist/rules/matchDescription.cjs.map +1 -1
  65. package/dist/rules/matchName.cjs +128 -73
  66. package/dist/rules/matchName.cjs.map +1 -1
  67. package/dist/rules/multilineBlocks.cjs +352 -235
  68. package/dist/rules/multilineBlocks.cjs.map +1 -1
  69. package/dist/rules/noBadBlocks.cjs +86 -63
  70. package/dist/rules/noBadBlocks.cjs.map +1 -1
  71. package/dist/rules/noBlankBlockDescriptions.cjs +57 -35
  72. package/dist/rules/noBlankBlockDescriptions.cjs.map +1 -1
  73. package/dist/rules/noBlankBlocks.cjs +48 -26
  74. package/dist/rules/noBlankBlocks.cjs.map +1 -1
  75. package/dist/rules/noDefaults.cjs +79 -52
  76. package/dist/rules/noDefaults.cjs.map +1 -1
  77. package/dist/rules/noMissingSyntax.cjs +165 -115
  78. package/dist/rules/noMissingSyntax.cjs.map +1 -1
  79. package/dist/rules/noMultiAsterisks.cjs +89 -48
  80. package/dist/rules/noMultiAsterisks.cjs.map +1 -1
  81. package/dist/rules/noRestrictedSyntax.cjs +79 -45
  82. package/dist/rules/noRestrictedSyntax.cjs.map +1 -1
  83. package/dist/rules/noTypes.cjs +80 -59
  84. package/dist/rules/noTypes.cjs.map +1 -1
  85. package/dist/rules/noUndefinedTypes.cjs +388 -297
  86. package/dist/rules/noUndefinedTypes.cjs.map +1 -1
  87. package/dist/rules/requireAsteriskPrefix.cjs +159 -108
  88. package/dist/rules/requireAsteriskPrefix.cjs.map +1 -1
  89. package/dist/rules/requireDescription.cjs +129 -89
  90. package/dist/rules/requireDescription.cjs.map +1 -1
  91. package/dist/rules/requireDescriptionCompleteSentence.cjs +262 -201
  92. package/dist/rules/requireDescriptionCompleteSentence.cjs.map +1 -1
  93. package/dist/rules/requireExample.cjs +104 -73
  94. package/dist/rules/requireExample.cjs.map +1 -1
  95. package/dist/rules/requireFileOverview.cjs +129 -75
  96. package/dist/rules/requireFileOverview.cjs.map +1 -1
  97. package/dist/rules/requireHyphenBeforeParamDescription.cjs +133 -85
  98. package/dist/rules/requireHyphenBeforeParamDescription.cjs.map +1 -1
  99. package/dist/rules/requireJsdoc.cjs +557 -384
  100. package/dist/rules/requireJsdoc.cjs.map +1 -1
  101. package/dist/rules/requireParam.cjs +526 -336
  102. package/dist/rules/requireParam.cjs.map +1 -1
  103. package/dist/rules/requireParamDescription.cjs +80 -55
  104. package/dist/rules/requireParamDescription.cjs.map +1 -1
  105. package/dist/rules/requireParamName.cjs +50 -32
  106. package/dist/rules/requireParamName.cjs.map +1 -1
  107. package/dist/rules/requireParamType.cjs +80 -55
  108. package/dist/rules/requireParamType.cjs.map +1 -1
  109. package/dist/rules/requireProperty.cjs +42 -31
  110. package/dist/rules/requireProperty.cjs.map +1 -1
  111. package/dist/rules/requirePropertyDescription.cjs +25 -17
  112. package/dist/rules/requirePropertyDescription.cjs.map +1 -1
  113. package/dist/rules/requirePropertyName.cjs +25 -17
  114. package/dist/rules/requirePropertyName.cjs.map +1 -1
  115. package/dist/rules/requirePropertyType.cjs +25 -17
  116. package/dist/rules/requirePropertyType.cjs.map +1 -1
  117. package/dist/rules/requireReturns.cjs +203 -125
  118. package/dist/rules/requireReturns.cjs.map +1 -1
  119. package/dist/rules/requireReturnsCheck.cjs +103 -60
  120. package/dist/rules/requireReturnsCheck.cjs.map +1 -1
  121. package/dist/rules/requireReturnsDescription.cjs +54 -39
  122. package/dist/rules/requireReturnsDescription.cjs.map +1 -1
  123. package/dist/rules/requireReturnsType.cjs +50 -32
  124. package/dist/rules/requireReturnsType.cjs.map +1 -1
  125. package/dist/rules/requireTemplate.cjs +178 -119
  126. package/dist/rules/requireTemplate.cjs.map +1 -1
  127. package/dist/rules/requireThrows.cjs +95 -61
  128. package/dist/rules/requireThrows.cjs.map +1 -1
  129. package/dist/rules/requireYields.cjs +166 -106
  130. package/dist/rules/requireYields.cjs.map +1 -1
  131. package/dist/rules/requireYieldsCheck.cjs +152 -96
  132. package/dist/rules/requireYieldsCheck.cjs.map +1 -1
  133. package/dist/rules/sortTags.cjs +444 -258
  134. package/dist/rules/sortTags.cjs.map +1 -1
  135. package/dist/rules/tagLines.cjs +266 -179
  136. package/dist/rules/tagLines.cjs.map +1 -1
  137. package/dist/rules/textEscaping.cjs +127 -92
  138. package/dist/rules/textEscaping.cjs.map +1 -1
  139. package/dist/rules/validTypes.cjs +265 -252
  140. package/dist/rules/validTypes.cjs.map +1 -1
  141. package/dist/tagNames.cjs +170 -134
  142. package/dist/tagNames.cjs.map +1 -1
  143. package/dist/utils/hasReturnValue.cjs +474 -246
  144. package/dist/utils/hasReturnValue.cjs.map +1 -1
  145. package/package.json +24 -40
  146. package/src/WarnSettings.js +34 -0
  147. package/src/alignTransform.js +358 -0
  148. package/src/defaultTagOrder.js +169 -0
  149. package/src/exportParser.js +978 -0
  150. package/src/getDefaultTagStructureForMode.js +969 -0
  151. package/src/getJsdocProcessorPlugin.js +672 -0
  152. package/src/index.js +530 -0
  153. package/src/iterateJsdoc.js +2518 -0
  154. package/src/jsdocUtils.js +1896 -0
  155. package/src/rules/checkAccess.js +45 -0
  156. package/src/rules/checkAlignment.js +63 -0
  157. package/src/rules/checkExamples.js +589 -0
  158. package/src/rules/checkIndentation.js +75 -0
  159. package/src/rules/checkLineAlignment.js +372 -0
  160. package/src/rules/checkParamNames.js +474 -0
  161. package/src/rules/checkPropertyNames.js +152 -0
  162. package/src/rules/checkSyntax.js +30 -0
  163. package/src/rules/checkTagNames.js +314 -0
  164. package/src/rules/checkTemplateNames.js +204 -0
  165. package/src/rules/checkTypes.js +535 -0
  166. package/src/rules/checkValues.js +248 -0
  167. package/src/rules/convertToJsdocComments.js +398 -0
  168. package/src/rules/emptyTags.js +98 -0
  169. package/src/rules/implementsOnClasses.js +64 -0
  170. package/src/rules/importsAsDependencies.js +133 -0
  171. package/src/rules/informativeDocs.js +189 -0
  172. package/src/rules/linesBeforeBlock.js +134 -0
  173. package/src/rules/matchDescription.js +286 -0
  174. package/src/rules/matchName.js +151 -0
  175. package/src/rules/multilineBlocks.js +493 -0
  176. package/src/rules/noBadBlocks.js +119 -0
  177. package/src/rules/noBlankBlockDescriptions.js +69 -0
  178. package/src/rules/noBlankBlocks.js +53 -0
  179. package/src/rules/noDefaults.js +85 -0
  180. package/src/rules/noMissingSyntax.js +195 -0
  181. package/src/rules/noMultiAsterisks.js +134 -0
  182. package/src/rules/noRestrictedSyntax.js +91 -0
  183. package/src/rules/noTypes.js +93 -0
  184. package/src/rules/noUndefinedTypes.js +543 -0
  185. package/src/rules/requireAsteriskPrefix.js +190 -0
  186. package/src/rules/requireDescription.js +161 -0
  187. package/src/rules/requireDescriptionCompleteSentence.js +335 -0
  188. package/src/rules/requireExample.js +118 -0
  189. package/src/rules/requireFileOverview.js +154 -0
  190. package/src/rules/requireHyphenBeforeParamDescription.js +176 -0
  191. package/src/rules/requireJsdoc.js +743 -0
  192. package/src/rules/requireParam.js +602 -0
  193. package/src/rules/requireParamDescription.js +89 -0
  194. package/src/rules/requireParamName.js +55 -0
  195. package/src/rules/requireParamType.js +89 -0
  196. package/src/rules/requireProperty.js +48 -0
  197. package/src/rules/requirePropertyDescription.js +25 -0
  198. package/src/rules/requirePropertyName.js +25 -0
  199. package/src/rules/requirePropertyType.js +25 -0
  200. package/src/rules/requireReturns.js +238 -0
  201. package/src/rules/requireReturnsCheck.js +145 -0
  202. package/src/rules/requireReturnsDescription.js +59 -0
  203. package/src/rules/requireReturnsType.js +51 -0
  204. package/src/rules/requireTemplate.js +201 -0
  205. package/src/rules/requireThrows.js +111 -0
  206. package/src/rules/requireYields.js +216 -0
  207. package/src/rules/requireYieldsCheck.js +208 -0
  208. package/src/rules/sortTags.js +558 -0
  209. package/src/rules/tagLines.js +359 -0
  210. package/src/rules/textEscaping.js +154 -0
  211. package/src/rules/validTypes.js +401 -0
  212. package/src/tagNames.js +238 -0
  213. package/src/utils/hasReturnValue.js +572 -0
  214. package/dist/WarnSettings.js +0 -20
  215. package/dist/WarnSettings.js.map +0 -1
  216. package/dist/_virtual/rolldown_runtime.cjs +0 -32
  217. package/dist/_virtual/rolldown_runtime.js +0 -11
  218. package/dist/alignTransform.js +0 -241
  219. package/dist/alignTransform.js.map +0 -1
  220. package/dist/defaultTagOrder.js +0 -134
  221. package/dist/defaultTagOrder.js.map +0 -1
  222. package/dist/exportParser.js +0 -518
  223. package/dist/exportParser.js.map +0 -1
  224. package/dist/getDefaultTagStructureForMode.js +0 -188
  225. package/dist/getDefaultTagStructureForMode.js.map +0 -1
  226. package/dist/getJsdocProcessorPlugin.d.cts +0 -70
  227. package/dist/getJsdocProcessorPlugin.d.cts.map +0 -1
  228. package/dist/getJsdocProcessorPlugin.js +0 -383
  229. package/dist/getJsdocProcessorPlugin.js.map +0 -1
  230. package/dist/index.d.cts +0 -22
  231. package/dist/index.d.cts.map +0 -1
  232. package/dist/index.js +0 -425
  233. package/dist/index.js.map +0 -1
  234. package/dist/iterateJsdoc.d.cts +0 -471
  235. package/dist/iterateJsdoc.d.cts.map +0 -1
  236. package/dist/iterateJsdoc.js +0 -1617
  237. package/dist/iterateJsdoc.js.map +0 -1
  238. package/dist/jsdocUtils.js +0 -1123
  239. package/dist/jsdocUtils.js.map +0 -1
  240. package/dist/rules/checkAccess.js +0 -33
  241. package/dist/rules/checkAccess.js.map +0 -1
  242. package/dist/rules/checkAlignment.js +0 -47
  243. package/dist/rules/checkAlignment.js.map +0 -1
  244. package/dist/rules/checkExamples.js +0 -348
  245. package/dist/rules/checkExamples.js.map +0 -1
  246. package/dist/rules/checkIndentation.js +0 -59
  247. package/dist/rules/checkIndentation.js.map +0 -1
  248. package/dist/rules/checkLineAlignment.js +0 -229
  249. package/dist/rules/checkLineAlignment.js.map +0 -1
  250. package/dist/rules/checkParamNames.js +0 -237
  251. package/dist/rules/checkParamNames.js.map +0 -1
  252. package/dist/rules/checkPropertyNames.js +0 -88
  253. package/dist/rules/checkPropertyNames.js.map +0 -1
  254. package/dist/rules/checkSyntax.js +0 -25
  255. package/dist/rules/checkSyntax.js.map +0 -1
  256. package/dist/rules/checkTagNames.js +0 -191
  257. package/dist/rules/checkTagNames.js.map +0 -1
  258. package/dist/rules/checkTemplateNames.js +0 -124
  259. package/dist/rules/checkTemplateNames.js.map +0 -1
  260. package/dist/rules/checkTypes.js +0 -299
  261. package/dist/rules/checkTypes.js.map +0 -1
  262. package/dist/rules/checkValues.js +0 -103
  263. package/dist/rules/checkValues.js.map +0 -1
  264. package/dist/rules/convertToJsdocComments.js +0 -231
  265. package/dist/rules/convertToJsdocComments.js.map +0 -1
  266. package/dist/rules/emptyTags.js +0 -67
  267. package/dist/rules/emptyTags.js.map +0 -1
  268. package/dist/rules/implementsOnClasses.js +0 -40
  269. package/dist/rules/implementsOnClasses.js.map +0 -1
  270. package/dist/rules/importsAsDependencies.js +0 -68
  271. package/dist/rules/importsAsDependencies.js.map +0 -1
  272. package/dist/rules/informativeDocs.js +0 -110
  273. package/dist/rules/informativeDocs.js.map +0 -1
  274. package/dist/rules/linesBeforeBlock.js +0 -75
  275. package/dist/rules/linesBeforeBlock.js.map +0 -1
  276. package/dist/rules/matchDescription.js +0 -167
  277. package/dist/rules/matchDescription.js.map +0 -1
  278. package/dist/rules/matchName.js +0 -77
  279. package/dist/rules/matchName.js.map +0 -1
  280. package/dist/rules/multilineBlocks.js +0 -245
  281. package/dist/rules/multilineBlocks.js.map +0 -1
  282. package/dist/rules/noBadBlocks.js +0 -68
  283. package/dist/rules/noBadBlocks.js.map +0 -1
  284. package/dist/rules/noBlankBlockDescriptions.js +0 -41
  285. package/dist/rules/noBlankBlockDescriptions.js.map +0 -1
  286. package/dist/rules/noBlankBlocks.js +0 -30
  287. package/dist/rules/noBlankBlocks.js.map +0 -1
  288. package/dist/rules/noDefaults.js +0 -56
  289. package/dist/rules/noDefaults.js.map +0 -1
  290. package/dist/rules/noMissingSyntax.js +0 -126
  291. package/dist/rules/noMissingSyntax.js.map +0 -1
  292. package/dist/rules/noMultiAsterisks.js +0 -58
  293. package/dist/rules/noMultiAsterisks.js.map +0 -1
  294. package/dist/rules/noRestrictedSyntax.js +0 -49
  295. package/dist/rules/noRestrictedSyntax.js.map +0 -1
  296. package/dist/rules/noTypes.js +0 -65
  297. package/dist/rules/noTypes.js.map +0 -1
  298. package/dist/rules/noUndefinedTypes.js +0 -303
  299. package/dist/rules/noUndefinedTypes.js.map +0 -1
  300. package/dist/rules/requireAsteriskPrefix.js +0 -112
  301. package/dist/rules/requireAsteriskPrefix.js.map +0 -1
  302. package/dist/rules/requireDescription.js +0 -95
  303. package/dist/rules/requireDescription.js.map +0 -1
  304. package/dist/rules/requireDescriptionCompleteSentence.js +0 -220
  305. package/dist/rules/requireDescriptionCompleteSentence.js.map +0 -1
  306. package/dist/rules/requireExample.js +0 -77
  307. package/dist/rules/requireExample.js.map +0 -1
  308. package/dist/rules/requireFileOverview.js +0 -81
  309. package/dist/rules/requireFileOverview.js.map +0 -1
  310. package/dist/rules/requireHyphenBeforeParamDescription.js +0 -89
  311. package/dist/rules/requireHyphenBeforeParamDescription.js.map +0 -1
  312. package/dist/rules/requireJsdoc.js +0 -404
  313. package/dist/rules/requireJsdoc.js.map +0 -1
  314. package/dist/rules/requireParam.js +0 -344
  315. package/dist/rules/requireParam.js.map +0 -1
  316. package/dist/rules/requireParamDescription.js +0 -59
  317. package/dist/rules/requireParamDescription.js.map +0 -1
  318. package/dist/rules/requireParamName.js +0 -36
  319. package/dist/rules/requireParamName.js.map +0 -1
  320. package/dist/rules/requireParamType.js +0 -59
  321. package/dist/rules/requireParamType.js.map +0 -1
  322. package/dist/rules/requireProperty.js +0 -35
  323. package/dist/rules/requireProperty.js.map +0 -1
  324. package/dist/rules/requirePropertyDescription.js +0 -21
  325. package/dist/rules/requirePropertyDescription.js.map +0 -1
  326. package/dist/rules/requirePropertyName.js +0 -21
  327. package/dist/rules/requirePropertyName.js.map +0 -1
  328. package/dist/rules/requirePropertyType.js +0 -21
  329. package/dist/rules/requirePropertyType.js.map +0 -1
  330. package/dist/rules/requireReturns.js +0 -131
  331. package/dist/rules/requireReturns.js.map +0 -1
  332. package/dist/rules/requireReturnsCheck.js +0 -66
  333. package/dist/rules/requireReturnsCheck.js.map +0 -1
  334. package/dist/rules/requireReturnsDescription.js +0 -43
  335. package/dist/rules/requireReturnsDescription.js.map +0 -1
  336. package/dist/rules/requireReturnsType.js +0 -36
  337. package/dist/rules/requireReturnsType.js.map +0 -1
  338. package/dist/rules/requireTemplate.js +0 -122
  339. package/dist/rules/requireTemplate.js.map +0 -1
  340. package/dist/rules/requireThrows.js +0 -67
  341. package/dist/rules/requireThrows.js.map +0 -1
  342. package/dist/rules/requireYields.js +0 -115
  343. package/dist/rules/requireYields.js.map +0 -1
  344. package/dist/rules/requireYieldsCheck.js +0 -105
  345. package/dist/rules/requireYieldsCheck.js.map +0 -1
  346. package/dist/rules/sortTags.js +0 -262
  347. package/dist/rules/sortTags.js.map +0 -1
  348. package/dist/rules/tagLines.js +0 -183
  349. package/dist/rules/tagLines.js.map +0 -1
  350. package/dist/rules/textEscaping.js +0 -102
  351. package/dist/rules/textEscaping.js.map +0 -1
  352. package/dist/rules/validTypes.js +0 -259
  353. package/dist/rules/validTypes.js.map +0 -1
  354. package/dist/tagNames.js +0 -144
  355. package/dist/tagNames.js.map +0 -1
  356. package/dist/utils/hasReturnValue.js +0 -265
  357. package/dist/utils/hasReturnValue.js.map +0 -1
@@ -1,519 +1,737 @@
1
- const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
- const __es_joy_jsdoccomment = require_rolldown_runtime.__toESM(require("@es-joy/jsdoccomment"));
3
- const debug = require_rolldown_runtime.__toESM(require("debug"));
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _jsdoccomment = require("@es-joy/jsdoccomment");
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ const debug = (0, _debug.default)('requireExportJsdoc');
4
11
 
5
- //#region src/exportParser.js
6
- const debug$1 = (0, debug.default)("requireExportJsdoc");
7
12
  /**
8
- * @typedef {{
9
- * value: string
10
- * }} ValueObject
11
- */
13
+ * @typedef {{
14
+ * value: string
15
+ * }} ValueObject
16
+ */
17
+
12
18
  /**
13
- * @typedef {{
14
- * type?: string,
15
- * value?: ValueObject|import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node,
16
- * props: {
17
- * [key: string]: CreatedNode|null,
18
- * },
19
- * special?: true,
20
- * globalVars?: CreatedNode,
21
- * exported?: boolean,
22
- * ANONYMOUS_DEFAULT?: import('eslint').Rule.Node
23
- * }} CreatedNode
24
- */
19
+ * @typedef {{
20
+ * type?: string,
21
+ * value?: ValueObject|import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node,
22
+ * props: {
23
+ * [key: string]: CreatedNode|null,
24
+ * },
25
+ * special?: true,
26
+ * globalVars?: CreatedNode,
27
+ * exported?: boolean,
28
+ * ANONYMOUS_DEFAULT?: import('eslint').Rule.Node
29
+ * }} CreatedNode
30
+ */
31
+
25
32
  /**
26
- * @returns {CreatedNode}
27
- */
28
- const createNode = function() {
29
- return { props: {} };
33
+ * @returns {CreatedNode}
34
+ */
35
+ const createNode = function () {
36
+ return {
37
+ props: {}
38
+ };
30
39
  };
40
+
31
41
  /**
32
- * @param {CreatedNode|null} symbol
33
- * @returns {string|null}
34
- */
35
- const getSymbolValue = function(symbol) {
36
- /* c8 ignore next 3 */
37
- if (!symbol) return null;
38
- /* c8 ignore else */
39
- if (symbol.type === "literal") return symbol.value.value;
40
- /* c8 ignore next 2 */
41
- return null;
42
+ * @param {CreatedNode|null} symbol
43
+ * @returns {string|null}
44
+ */
45
+ const getSymbolValue = function (symbol) {
46
+ /* c8 ignore next 3 */
47
+ if (!symbol) {
48
+ return null;
49
+ }
50
+
51
+ /* c8 ignore else */
52
+ if (symbol.type === 'literal') {
53
+ return /** @type {ValueObject} */symbol.value.value;
54
+ }
55
+ /* c8 ignore next 2 */
56
+ // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
57
+ return null;
42
58
  };
59
+
43
60
  /**
44
- *
45
- * @param {import('estree').Identifier} node
46
- * @param {CreatedNode} globals
47
- * @param {CreatedNode} scope
48
- * @param {SymbolOptions} opts
49
- * @returns {CreatedNode|null}
50
- */
51
- const getIdentifier = function(node, globals, scope, opts) {
52
- if (opts.simpleIdentifier) {
53
- const identifierLiteral = createNode();
54
- identifierLiteral.type = "literal";
55
- identifierLiteral.value = { value: node.name };
56
- return identifierLiteral;
57
- }
58
- /* c8 ignore next */
59
- const block = scope || globals;
60
- if (block.props[node.name]) return block.props[node.name];
61
- /* c8 ignore next 3 */
62
- if (globals.props[node.name]) return globals.props[node.name];
63
- return null;
61
+ *
62
+ * @param {import('estree').Identifier} node
63
+ * @param {CreatedNode} globals
64
+ * @param {CreatedNode} scope
65
+ * @param {SymbolOptions} opts
66
+ * @returns {CreatedNode|null}
67
+ */
68
+ const getIdentifier = function (node, globals, scope, opts) {
69
+ if (opts.simpleIdentifier) {
70
+ // Type is Identier for noncomputed properties
71
+ const identifierLiteral = createNode();
72
+ identifierLiteral.type = 'literal';
73
+ identifierLiteral.value = {
74
+ value: node.name
75
+ };
76
+ return identifierLiteral;
77
+ }
78
+
79
+ /* c8 ignore next */
80
+ const block = scope || globals;
81
+
82
+ // As scopes are not currently supported, they are not traversed upwards recursively
83
+ if (block.props[node.name]) {
84
+ return block.props[node.name];
85
+ }
86
+
87
+ // Seems this will only be entered once scopes added and entered
88
+ /* c8 ignore next 3 */
89
+ if (globals.props[node.name]) {
90
+ return globals.props[node.name];
91
+ }
92
+ return null;
64
93
  };
94
+
65
95
  /**
66
- * @callback CreateSymbol
67
- * @param {import('eslint').Rule.Node|null} node
68
- * @param {CreatedNode} globals
69
- * @param {import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node|null} value
70
- * @param {CreatedNode} [scope]
71
- * @param {boolean|SymbolOptions} [isGlobal]
72
- * @returns {CreatedNode|null}
73
- */
96
+ * @callback CreateSymbol
97
+ * @param {import('eslint').Rule.Node|null} node
98
+ * @param {CreatedNode} globals
99
+ * @param {import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node|null} value
100
+ * @param {CreatedNode} [scope]
101
+ * @param {boolean|SymbolOptions} [isGlobal]
102
+ * @returns {CreatedNode|null}
103
+ */
104
+
74
105
  /** @type {CreateSymbol} */
75
- let createSymbol;
106
+ let createSymbol; // eslint-disable-line prefer-const
107
+
108
+ /* eslint-disable complexity -- Temporary */
109
+
76
110
  /**
77
- * @typedef {{
78
- * simpleIdentifier?: boolean
79
- * }} SymbolOptions
80
- */
111
+ * @typedef {{
112
+ * simpleIdentifier?: boolean
113
+ * }} SymbolOptions
114
+ */
115
+
81
116
  /**
82
- *
83
- * @param {import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node} node
84
- * @param {CreatedNode} globals
85
- * @param {CreatedNode} scope
86
- * @param {SymbolOptions} [opt]
87
- * @returns {CreatedNode|null}
88
- */
89
- const getSymbol = function(node, globals, scope, opt) {
90
- const opts = opt || {};
91
- /* c8 ignore next */
92
- switch (node.type) {
93
- case "ArrowFunctionExpression":
94
- case "ClassDeclaration":
95
- case "FunctionDeclaration":
96
- case "FunctionExpression":
97
- case "TSEnumDeclaration":
98
- case "TSInterfaceDeclaration":
99
- case "TSTypeAliasDeclaration": {
100
- const val = createNode();
101
- val.props.prototype = createNode();
102
- val.props.prototype.type = "object";
103
- val.type = "object";
104
- val.value = node;
105
- return val;
106
- }
107
- case "AssignmentExpression": return createSymbol(node.left, globals, node.right, scope, opts);
108
- case "ClassBody": {
109
- const val = createNode();
110
- for (const method of node.body) {
111
- if (!("key" in method)) continue;
112
- val.props[method.key.name] = createNode();
113
- /** @type {{[key: string]: CreatedNode}} */ val.props[method.key.name].type = "object";
114
- /** @type {{[key: string]: CreatedNode}} */ val.props[method.key.name].value = method.value;
115
- }
116
- val.type = "object";
117
- val.value = node.parent;
118
- return val;
119
- }
120
- case "ClassExpression": return getSymbol(node.body, globals, scope, opts);
121
- case "Identifier": return getIdentifier(node, globals, scope, opts);
122
- case "Literal": {
123
- const val = createNode();
124
- val.type = "literal";
125
- val.value = node;
126
- return val;
127
- }
128
- case "MemberExpression": {
129
- const obj = getSymbol(node.object, globals, scope, opts);
130
- const propertySymbol = getSymbol(node.property, globals, scope, { simpleIdentifier: !node.computed });
131
- const propertyValue = getSymbolValue(propertySymbol);
132
- /* c8 ignore else */
133
- if (obj && propertyValue && obj.props[propertyValue]) {
134
- const block = obj.props[propertyValue];
135
- return block;
136
- }
137
- /* c8 ignore next 11 */
138
- debug$1(`MemberExpression: Missing property ${node.property.name}`);
139
- /* c8 ignore next 2 */
140
- return null;
141
- }
142
- case "ObjectExpression": {
143
- const val = createNode();
144
- val.type = "object";
145
- for (const prop of node.properties) {
146
- if (["ExperimentalSpreadProperty", "SpreadElement"].includes(prop.type)) continue;
147
- const propVal = getSymbol(
148
- /** @type {import('estree').Property} */
149
- prop.value,
150
- globals,
151
- scope,
152
- opts
153
- );
154
- /* c8 ignore next 8 */
155
- if (propVal) val.props[prop.key.name] = propVal;
156
- }
157
- return val;
158
- }
159
- }
160
- /* c8 ignore next 2 */
161
- return null;
117
+ *
118
+ * @param {import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node} node
119
+ * @param {CreatedNode} globals
120
+ * @param {CreatedNode} scope
121
+ * @param {SymbolOptions} [opt]
122
+ * @returns {CreatedNode|null}
123
+ */
124
+ const getSymbol = function (node, globals, scope, opt) {
125
+ /* eslint-enable complexity -- Temporary */
126
+ const opts = opt || {};
127
+ /* c8 ignore next */
128
+ switch (node.type) {
129
+ /* c8 ignore next 4 -- No longer needed? */
130
+ case 'ArrowFunctionExpression':
131
+
132
+ // Fallthrough
133
+ case 'ClassDeclaration':
134
+ case 'FunctionDeclaration':
135
+ case 'FunctionExpression':
136
+ case 'TSEnumDeclaration':
137
+ case 'TSInterfaceDeclaration':
138
+ case 'TSTypeAliasDeclaration':
139
+ {
140
+ const val = createNode();
141
+ val.props.prototype = createNode();
142
+ val.props.prototype.type = 'object';
143
+ val.type = 'object';
144
+ val.value = node;
145
+ return val;
146
+ }
147
+ case 'AssignmentExpression':
148
+ {
149
+ return createSymbol(/** @type {import('eslint').Rule.Node} */
150
+ node.left, globals, /** @type {import('eslint').Rule.Node} */
151
+ node.right, scope, opts);
152
+ }
153
+ case 'ClassBody':
154
+ {
155
+ const val = createNode();
156
+ for (const method of node.body) {
157
+ // StaticBlock
158
+ if (!('key' in method)) {
159
+ continue;
160
+ }
161
+ val.props[/** @type {import('estree').Identifier} */(/** @type {import('estree').MethodDefinition} */method.key).name] = createNode();
162
+ /** @type {{[key: string]: CreatedNode}} */
163
+ val.props[/** @type {import('estree').Identifier} */(/** @type {import('estree').MethodDefinition} */method.key).name].type = 'object';
164
+ /** @type {{[key: string]: CreatedNode}} */
165
+ val.props[/** @type {import('estree').Identifier} */(/** @type {import('estree').MethodDefinition} */method.key).name].value = /** @type {import('eslint').Rule.Node} */
166
+ /** @type {import('estree').MethodDefinition} */method.value;
167
+ }
168
+ val.type = 'object';
169
+ val.value = node.parent;
170
+ return val;
171
+ }
172
+ case 'ClassExpression':
173
+ {
174
+ return getSymbol(/** @type {import('eslint').Rule.Node} */
175
+ node.body, globals, scope, opts);
176
+ }
177
+ case 'Identifier':
178
+ {
179
+ return getIdentifier(node, globals, scope, opts);
180
+ }
181
+ case 'Literal':
182
+ {
183
+ const val = createNode();
184
+ val.type = 'literal';
185
+ val.value = node;
186
+ return val;
187
+ }
188
+ case 'MemberExpression':
189
+ {
190
+ const obj = getSymbol(/** @type {import('eslint').Rule.Node} */
191
+ node.object, globals, scope, opts);
192
+ const propertySymbol = getSymbol(/** @type {import('eslint').Rule.Node} */
193
+ node.property, globals, scope, {
194
+ simpleIdentifier: !node.computed
195
+ });
196
+ const propertyValue = getSymbolValue(propertySymbol);
197
+
198
+ /* c8 ignore else */
199
+ if (obj && propertyValue && obj.props[propertyValue]) {
200
+ const block = obj.props[propertyValue];
201
+ return block;
202
+ }
203
+ /* c8 ignore next 11 */
204
+ /*
205
+ if (opts.createMissingProps && propertyValue) {
206
+ obj.props[propertyValue] = createNode();
207
+ return obj.props[propertyValue];
208
+ }
209
+ */
210
+ // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
211
+ debug(`MemberExpression: Missing property ${/** @type {import('estree').PrivateIdentifier} */node.property.name}`);
212
+ /* c8 ignore next 2 */
213
+ return null;
214
+ }
215
+ case 'ObjectExpression':
216
+ {
217
+ const val = createNode();
218
+ val.type = 'object';
219
+ for (const prop of node.properties) {
220
+ if ([
221
+ // @babel/eslint-parser
222
+ 'ExperimentalSpreadProperty',
223
+ // typescript-eslint, espree, acorn, etc.
224
+ 'SpreadElement'].includes(prop.type)) {
225
+ continue;
226
+ }
227
+ const propVal = getSymbol(/** @type {import('eslint').Rule.Node} */
228
+ /** @type {import('estree').Property} */
229
+ prop.value, globals, scope, opts);
230
+ /* c8 ignore next 8 */
231
+ if (propVal) {
232
+ val.props[/** @type {import('estree').PrivateIdentifier} */
233
+ (/** @type {import('estree').Property} */prop.key).name] = propVal;
234
+ }
235
+ }
236
+ return val;
237
+ }
238
+ }
239
+ /* c8 ignore next 2 */
240
+ // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
241
+ return null;
162
242
  };
243
+
163
244
  /**
164
- *
165
- * @param {CreatedNode} block
166
- * @param {string} name
167
- * @param {CreatedNode|null} value
168
- * @param {CreatedNode} globals
169
- * @param {boolean|SymbolOptions|undefined} isGlobal
170
- * @returns {void}
171
- */
172
- const createBlockSymbol = function(block, name, value, globals, isGlobal) {
173
- block.props[name] = value;
174
- if (isGlobal && globals.props.window && globals.props.window.special) globals.props.window.props[name] = value;
245
+ *
246
+ * @param {CreatedNode} block
247
+ * @param {string} name
248
+ * @param {CreatedNode|null} value
249
+ * @param {CreatedNode} globals
250
+ * @param {boolean|SymbolOptions|undefined} isGlobal
251
+ * @returns {void}
252
+ */
253
+ const createBlockSymbol = function (block, name, value, globals, isGlobal) {
254
+ block.props[name] = value;
255
+ if (isGlobal && globals.props.window && globals.props.window.special) {
256
+ globals.props.window.props[name] = value;
257
+ }
175
258
  };
176
- createSymbol = function(node, globals, value, scope, isGlobal) {
177
- const block = scope || globals;
178
- /* c8 ignore next 3 */
179
- if (!node) return null;
180
- let symbol;
181
- switch (node.type) {
182
- case "ClassDeclaration":
183
- case "FunctionDeclaration":
184
- case "TSEnumDeclaration":
185
- case "TSInterfaceDeclaration":
186
- case "TSTypeAliasDeclaration": {
187
- const nde = node;
188
- /* c8 ignore else */
189
- if (nde.id && nde.id.type === "Identifier") return createSymbol(nde.id, globals, node, globals);
190
- /* c8 ignore next 3 */
191
- break;
192
- }
193
- case "Identifier": {
194
- const nde = node;
195
- if (value) {
196
- const valueSymbol = getSymbol(value, globals, block);
197
- /* c8 ignore else */
198
- if (valueSymbol) {
199
- createBlockSymbol(block, nde.name, valueSymbol, globals, isGlobal);
200
- return block.props[nde.name];
201
- }
202
- /* c8 ignore next 2 */
203
- debug$1("Identifier: Missing value symbol for %s", nde.name);
204
- } else {
205
- createBlockSymbol(block, nde.name, createNode(), globals, isGlobal);
206
- return block.props[nde.name];
207
- }
208
- /* c8 ignore next 3 */
209
- break;
210
- }
211
- case "MemberExpression": {
212
- const nde = node;
213
- symbol = getSymbol(nde.object, globals, block);
214
- const propertySymbol = getSymbol(nde.property, globals, block, { simpleIdentifier: !nde.computed });
215
- const propertyValue = getSymbolValue(propertySymbol);
216
- if (symbol && propertyValue) {
217
- createBlockSymbol(symbol, propertyValue, getSymbol(value, globals, block), globals, isGlobal);
218
- return symbol.props[propertyValue];
219
- }
220
- debug$1(
221
- "MemberExpression: Missing symbol: %s",
222
- /** @type {import('estree').Identifier} */
223
- nde.property.name
224
- );
225
- break;
226
- }
227
- }
228
- return null;
259
+ createSymbol = function (node, globals, value, scope, isGlobal) {
260
+ const block = scope || globals;
261
+ /* c8 ignore next 3 */
262
+ if (!node) {
263
+ return null;
264
+ }
265
+ let symbol;
266
+ switch (node.type) {
267
+ case 'ClassDeclaration':
268
+ /* c8 ignore next */
269
+ // @ts-expect-error TS OK
270
+ // Fall through
271
+ case 'FunctionDeclaration':
272
+ case 'TSEnumDeclaration':
273
+ /* c8 ignore next */
274
+ // @ts-expect-error TS OK
275
+ // Fall through
276
+ case 'TSInterfaceDeclaration':
277
+ case 'TSTypeAliasDeclaration':
278
+ {
279
+ const nde = /** @type {import('estree').ClassDeclaration} */node;
280
+ /* c8 ignore else */
281
+ if (nde.id && nde.id.type === 'Identifier') {
282
+ return createSymbol(/** @type {import('eslint').Rule.Node} */nde.id, globals, node, globals);
283
+ }
284
+ /* c8 ignore next 3 */
285
+ // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
286
+ break;
287
+ }
288
+ case 'Identifier':
289
+ {
290
+ const nde = /** @type {import('estree').Identifier} */node;
291
+ if (value) {
292
+ const valueSymbol = getSymbol(value, globals, block);
293
+ /* c8 ignore else */
294
+ if (valueSymbol) {
295
+ createBlockSymbol(block, nde.name, valueSymbol, globals, isGlobal);
296
+ return block.props[nde.name];
297
+ }
298
+ /* c8 ignore next 2 */
299
+ // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
300
+ debug('Identifier: Missing value symbol for %s', nde.name);
301
+ } else {
302
+ createBlockSymbol(block, nde.name, createNode(), globals, isGlobal);
303
+ return block.props[nde.name];
304
+ }
305
+ /* c8 ignore next 3 */
306
+ // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
307
+ break;
308
+ }
309
+ case 'MemberExpression':
310
+ {
311
+ const nde = /** @type {import('estree').MemberExpression} */node;
312
+ symbol = getSymbol(/** @type {import('eslint').Rule.Node} */nde.object, globals, block);
313
+ const propertySymbol = getSymbol(/** @type {import('eslint').Rule.Node} */nde.property, globals, block, {
314
+ simpleIdentifier: !nde.computed
315
+ });
316
+ const propertyValue = getSymbolValue(propertySymbol);
317
+ if (symbol && propertyValue) {
318
+ createBlockSymbol(symbol, propertyValue, getSymbol(/** @type {import('eslint').Rule.Node} */
319
+ value, globals, block), globals, isGlobal);
320
+ return symbol.props[propertyValue];
321
+ }
322
+ debug('MemberExpression: Missing symbol: %s', /** @type {import('estree').Identifier} */nde.property.name);
323
+ break;
324
+ }
325
+ }
326
+ return null;
229
327
  };
328
+
230
329
  /**
231
- * Creates variables from variable definitions
232
- * @param {import('eslint').Rule.Node} node
233
- * @param {CreatedNode} globals
234
- * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opts
235
- * @returns {void}
236
- */
237
- const initVariables = function(node, globals, opts) {
238
- switch (node.type) {
239
- case "ExportNamedDeclaration":
240
- if (node.declaration) initVariables(node.declaration, globals, opts);
241
- break;
242
- case "ExpressionStatement":
243
- initVariables(node.expression, globals, opts);
244
- break;
245
- case "Program":
246
- for (const childNode of node.body) initVariables(childNode, globals, opts);
247
- break;
248
- case "VariableDeclaration":
249
- for (const declaration of node.declarations) {
250
- const symbol = createSymbol(declaration.id, globals, null, globals);
251
- if (opts.initWindow && node.kind === "var" && globals.props.window) globals.props.window.props[declaration.id.name] = symbol;
252
- }
253
- break;
254
- }
330
+ * Creates variables from variable definitions
331
+ * @param {import('eslint').Rule.Node} node
332
+ * @param {CreatedNode} globals
333
+ * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opts
334
+ * @returns {void}
335
+ */
336
+ const initVariables = function (node, globals, opts) {
337
+ switch (node.type) {
338
+ case 'ExportNamedDeclaration':
339
+ {
340
+ if (node.declaration) {
341
+ initVariables(/** @type {import('eslint').Rule.Node} */
342
+ node.declaration, globals, opts);
343
+ }
344
+ break;
345
+ }
346
+ case 'ExpressionStatement':
347
+ {
348
+ initVariables(/** @type {import('eslint').Rule.Node} */
349
+ node.expression, globals, opts);
350
+ break;
351
+ }
352
+ case 'Program':
353
+ {
354
+ for (const childNode of node.body) {
355
+ initVariables(/** @type {import('eslint').Rule.Node} */
356
+ childNode, globals, opts);
357
+ }
358
+ break;
359
+ }
360
+ case 'VariableDeclaration':
361
+ {
362
+ for (const declaration of node.declarations) {
363
+ // let and const
364
+ const symbol = createSymbol(/** @type {import('eslint').Rule.Node} */
365
+ declaration.id, globals, null, globals);
366
+ if (opts.initWindow && node.kind === 'var' && globals.props.window) {
367
+ // If var, also add to window
368
+ globals.props.window.props[/** @type {import('estree').Identifier} */
369
+ declaration.id.name] = symbol;
370
+ }
371
+ }
372
+ break;
373
+ }
374
+ }
255
375
  };
376
+
377
+ /* eslint-disable complexity -- Temporary */
378
+
256
379
  /**
257
- * Populates variable maps using AST
258
- * @param {import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node} node
259
- * @param {CreatedNode} globals
260
- * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opt
261
- * @param {true} [isExport]
262
- * @returns {boolean}
263
- */
264
- const mapVariables = function(node, globals, opt, isExport) {
265
- /* c8 ignore next */
266
- const opts = opt || {};
267
- /* c8 ignore next */
268
- switch (node.type) {
269
- case "AssignmentExpression":
270
- createSymbol(node.left, globals, node.right);
271
- break;
272
- case "ClassDeclaration":
273
- createSymbol(node.id, globals, node.body, globals);
274
- break;
275
- case "ExportDefaultDeclaration": {
276
- const symbol = createSymbol(node.declaration, globals, node.declaration);
277
- if (symbol) symbol.exported = true;
278
- else globals.ANONYMOUS_DEFAULT = node.declaration;
279
- break;
280
- }
281
- case "ExportNamedDeclaration":
282
- if (node.declaration) if (node.declaration.type === "VariableDeclaration") mapVariables(node.declaration, globals, opts, true);
283
- else {
284
- const symbol = createSymbol(node.declaration, globals, node.declaration);
285
- /* c8 ignore next 3 */
286
- if (symbol) symbol.exported = true;
287
- }
288
- for (const specifier of node.specifiers) mapVariables(specifier, globals, opts);
289
- break;
290
- case "ExportSpecifier": {
291
- const symbol = getSymbol(node.local, globals, globals);
292
- /* c8 ignore next 3 */
293
- if (symbol) symbol.exported = true;
294
- break;
295
- }
296
- case "ExpressionStatement":
297
- mapVariables(node.expression, globals, opts);
298
- break;
299
- case "FunctionDeclaration":
300
- case "TSTypeAliasDeclaration":
301
- /* c8 ignore next 10 */
302
- if (node.id.type === "Identifier") createSymbol(node.id, globals, node, globals, true);
303
- break;
304
- case "Program":
305
- if (opts.ancestorsOnly) return false;
306
- for (const childNode of node.body) mapVariables(childNode, globals, opts);
307
- break;
308
- case "VariableDeclaration":
309
- for (const declaration of node.declarations) {
310
- const isGlobal = Boolean(opts.initWindow && node.kind === "var" && globals.props.window);
311
- const symbol = createSymbol(declaration.id, globals, declaration.init, globals, isGlobal);
312
- if (symbol && isExport) symbol.exported = true;
313
- }
314
- break;
315
- default:
316
- /* c8 ignore next */
317
- return false;
318
- }
319
- return true;
380
+ * Populates variable maps using AST
381
+ * @param {import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node} node
382
+ * @param {CreatedNode} globals
383
+ * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opt
384
+ * @param {true} [isExport]
385
+ * @returns {boolean}
386
+ */
387
+ const mapVariables = function (node, globals, opt, isExport) {
388
+ /* eslint-enable complexity -- Temporary */
389
+ /* c8 ignore next */
390
+ const opts = opt || {};
391
+ /* c8 ignore next */
392
+ switch (node.type) {
393
+ case 'AssignmentExpression':
394
+ {
395
+ createSymbol(/** @type {import('eslint').Rule.Node} */
396
+ node.left, globals, /** @type {import('eslint').Rule.Node} */
397
+ node.right);
398
+ break;
399
+ }
400
+ case 'ClassDeclaration':
401
+ {
402
+ createSymbol(/** @type {import('eslint').Rule.Node|null} */node.id, globals, /** @type {import('eslint').Rule.Node} */node.body, globals);
403
+ break;
404
+ }
405
+ case 'ExportDefaultDeclaration':
406
+ {
407
+ const symbol = createSymbol(/** @type {import('eslint').Rule.Node} */
408
+ node.declaration, globals, /** @type {import('eslint').Rule.Node} */
409
+ node.declaration);
410
+ if (symbol) {
411
+ symbol.exported = true;
412
+ /* c8 ignore next 6 */
413
+ } else {
414
+ // if (!node.id) {
415
+ globals.ANONYMOUS_DEFAULT = /** @type {import('eslint').Rule.Node} */
416
+ node.declaration;
417
+ }
418
+ break;
419
+ }
420
+ case 'ExportNamedDeclaration':
421
+ {
422
+ if (node.declaration) {
423
+ if (node.declaration.type === 'VariableDeclaration') {
424
+ mapVariables(/** @type {import('eslint').Rule.Node} */
425
+ node.declaration, globals, opts, true);
426
+ } else {
427
+ const symbol = createSymbol(/** @type {import('eslint').Rule.Node} */
428
+ node.declaration, globals, /** @type {import('eslint').Rule.Node} */
429
+ node.declaration);
430
+ /* c8 ignore next 3 */
431
+ if (symbol) {
432
+ symbol.exported = true;
433
+ }
434
+ }
435
+ }
436
+ for (const specifier of node.specifiers) {
437
+ mapVariables(/** @type {import('eslint').Rule.Node} */
438
+ specifier, globals, opts);
439
+ }
440
+ break;
441
+ }
442
+ case 'ExportSpecifier':
443
+ {
444
+ const symbol = getSymbol(/** @type {import('eslint').Rule.Node} */
445
+ node.local, globals, globals);
446
+ /* c8 ignore next 3 */
447
+ if (symbol) {
448
+ symbol.exported = true;
449
+ }
450
+ break;
451
+ }
452
+ case 'ExpressionStatement':
453
+ {
454
+ mapVariables(/** @type {import('eslint').Rule.Node} */
455
+ node.expression, globals, opts);
456
+ break;
457
+ }
458
+ case 'FunctionDeclaration':
459
+ case 'TSTypeAliasDeclaration':
460
+ {
461
+ /* c8 ignore next 10 */
462
+ if (/** @type {import('estree').Identifier} */node.id.type === 'Identifier') {
463
+ createSymbol(/** @type {import('eslint').Rule.Node} */
464
+ node.id, globals, node, globals, true);
465
+ }
466
+ break;
467
+ }
468
+ case 'Program':
469
+ {
470
+ if (opts.ancestorsOnly) {
471
+ return false;
472
+ }
473
+ for (const childNode of node.body) {
474
+ mapVariables(/** @type {import('eslint').Rule.Node} */
475
+ childNode, globals, opts);
476
+ }
477
+ break;
478
+ }
479
+ case 'VariableDeclaration':
480
+ {
481
+ for (const declaration of node.declarations) {
482
+ const isGlobal = Boolean(opts.initWindow && node.kind === 'var' && globals.props.window);
483
+ const symbol = createSymbol(/** @type {import('eslint').Rule.Node} */
484
+ declaration.id, globals, /** @type {import('eslint').Rule.Node} */
485
+ declaration.init, globals, isGlobal);
486
+ if (symbol && isExport) {
487
+ symbol.exported = true;
488
+ }
489
+ }
490
+ break;
491
+ }
492
+ default:
493
+ {
494
+ /* c8 ignore next */
495
+ return false;
496
+ }
497
+ }
498
+ return true;
320
499
  };
500
+
321
501
  /**
322
- *
323
- * @param {import('eslint').Rule.Node} node
324
- * @param {CreatedNode|ValueObject|string|undefined|
325
- * import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node} block
326
- * @param {(CreatedNode|ValueObject|string|
327
- * import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node)[]} [cache]
328
- * @returns {boolean}
329
- */
330
- const findNode = function(node, block, cache) {
331
- let blockCache = cache || [];
332
- if (!block || blockCache.includes(block)) return false;
333
- blockCache = blockCache.slice();
334
- blockCache.push(block);
335
- if (typeof block === "object" && "type" in block && (block.type === "object" || block.type === "MethodDefinition") && block.value === node) return true;
336
- if (typeof block !== "object") return false;
337
- const props = "props" in block && block.props || "body" in block && block.body;
338
- for (const propval of Object.values(props || {})) if (Array.isArray(propval)) {
339
- /* c8 ignore next 5 */
340
- if (propval.some((val) => {
341
- return findNode(node, val, blockCache);
342
- })) return true;
343
- } else if (findNode(node, propval, blockCache)) return true;
344
- return false;
502
+ *
503
+ * @param {import('eslint').Rule.Node} node
504
+ * @param {CreatedNode|ValueObject|string|undefined|
505
+ * import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node} block
506
+ * @param {(CreatedNode|ValueObject|string|
507
+ * import('eslint').Rule.Node|import('@typescript-eslint/types').TSESTree.Node)[]} [cache]
508
+ * @returns {boolean}
509
+ */
510
+ const findNode = function (node, block, cache) {
511
+ let blockCache = cache || [];
512
+ if (!block || blockCache.includes(block)) {
513
+ return false;
514
+ }
515
+ blockCache = blockCache.slice();
516
+ blockCache.push(block);
517
+ if (typeof block === 'object' && 'type' in block && (block.type === 'object' || block.type === 'MethodDefinition') && block.value === node) {
518
+ return true;
519
+ }
520
+ if (typeof block !== 'object') {
521
+ return false;
522
+ }
523
+ const props = 'props' in block && block.props || 'body' in block && block.body;
524
+ for (const propval of Object.values(props || {})) {
525
+ if (Array.isArray(propval)) {
526
+ /* c8 ignore next 5 */
527
+ if (propval.some(val => {
528
+ return findNode(node, val, blockCache);
529
+ })) {
530
+ return true;
531
+ }
532
+ } else if (findNode(node, propval, blockCache)) {
533
+ return true;
534
+ }
535
+ }
536
+ return false;
345
537
  };
346
- const exportTypes = new Set(["ExportDefaultDeclaration", "ExportNamedDeclaration"]);
347
- const ignorableNestedTypes = new Set([
348
- "ArrowFunctionExpression",
349
- "FunctionDeclaration",
350
- "FunctionExpression"
351
- ]);
538
+ const exportTypes = new Set(['ExportDefaultDeclaration', 'ExportNamedDeclaration']);
539
+ const ignorableNestedTypes = new Set(['ArrowFunctionExpression', 'FunctionDeclaration', 'FunctionExpression']);
540
+
352
541
  /**
353
- * @param {import('eslint').Rule.Node} nde
354
- * @returns {import('eslint').Rule.Node|false}
355
- */
356
- const getExportAncestor = function(nde) {
357
- let node = nde;
358
- let idx = 0;
359
- const ignorableIfDeep = ignorableNestedTypes.has(nde?.type);
360
- while (node) {
361
- if (idx >= 2 && ignorableIfDeep) break;
362
- if (exportTypes.has(node.type)) return node;
363
- node = node.parent;
364
- idx++;
365
- }
366
- return false;
542
+ * @param {import('eslint').Rule.Node} nde
543
+ * @returns {import('eslint').Rule.Node|false}
544
+ */
545
+ const getExportAncestor = function (nde) {
546
+ let node = nde;
547
+ let idx = 0;
548
+ const ignorableIfDeep = ignorableNestedTypes.has(nde?.type);
549
+ while (node) {
550
+ // Ignore functions nested more deeply than say `export default function () {}`
551
+ if (idx >= 2 && ignorableIfDeep) {
552
+ break;
553
+ }
554
+ if (exportTypes.has(node.type)) {
555
+ return node;
556
+ }
557
+ node = node.parent;
558
+ idx++;
559
+ }
560
+ return false;
367
561
  };
368
- const canBeExportedByAncestorType = new Set([
369
- "ClassProperty",
370
- "Method",
371
- "PropertyDefinition",
372
- "TSMethodSignature",
373
- "TSPropertySignature"
374
- ]);
375
- const canExportChildrenType = new Set([
376
- "ClassBody",
377
- "ClassDeclaration",
378
- "ClassDefinition",
379
- "ClassExpression",
380
- "Program",
381
- "TSInterfaceBody",
382
- "TSInterfaceDeclaration",
383
- "TSTypeAliasDeclaration",
384
- "TSTypeLiteral",
385
- "TSTypeParameterInstantiation",
386
- "TSTypeReference"
387
- ]);
562
+ const canBeExportedByAncestorType = new Set(['ClassProperty', 'Method', 'PropertyDefinition', 'TSMethodSignature', 'TSPropertySignature']);
563
+ const canExportChildrenType = new Set(['ClassBody', 'ClassDeclaration', 'ClassDefinition', 'ClassExpression', 'Program', 'TSInterfaceBody', 'TSInterfaceDeclaration', 'TSTypeAliasDeclaration', 'TSTypeLiteral', 'TSTypeParameterInstantiation', 'TSTypeReference']);
564
+
388
565
  /**
389
- * @param {import('eslint').Rule.Node} nde
390
- * @returns {false|import('eslint').Rule.Node}
391
- */
392
- const isExportByAncestor = function(nde) {
393
- if (!canBeExportedByAncestorType.has(nde.type)) return false;
394
- let node = nde.parent;
395
- while (node) {
396
- if (exportTypes.has(node.type)) return node;
397
- if (!canExportChildrenType.has(node.type)) return false;
398
- node = node.parent;
399
- }
400
- return false;
566
+ * @param {import('eslint').Rule.Node} nde
567
+ * @returns {false|import('eslint').Rule.Node}
568
+ */
569
+ const isExportByAncestor = function (nde) {
570
+ if (!canBeExportedByAncestorType.has(nde.type)) {
571
+ return false;
572
+ }
573
+ let node = nde.parent;
574
+ while (node) {
575
+ if (exportTypes.has(node.type)) {
576
+ return node;
577
+ }
578
+ if (!canExportChildrenType.has(node.type)) {
579
+ return false;
580
+ }
581
+ node = node.parent;
582
+ }
583
+ return false;
401
584
  };
585
+
402
586
  /**
403
- *
404
- * @param {CreatedNode} block
405
- * @param {import('eslint').Rule.Node} node
406
- * @param {CreatedNode[]} [cache] Currently unused
407
- * @returns {boolean}
408
- */
409
- const findExportedNode = function(block, node, cache) {
410
- /* c8 ignore next 3 */
411
- if (block === null) return false;
412
- const blockCache = cache || [];
413
- const { props } = block;
414
- for (const propval of Object.values(props)) {
415
- const pval = propval;
416
- blockCache.push(pval);
417
- if (pval.exported && (node === pval.value || findNode(node, pval.value))) return true;
418
- }
419
- return false;
587
+ *
588
+ * @param {CreatedNode} block
589
+ * @param {import('eslint').Rule.Node} node
590
+ * @param {CreatedNode[]} [cache] Currently unused
591
+ * @returns {boolean}
592
+ */
593
+ const findExportedNode = function (block, node, cache) {
594
+ /* c8 ignore next 3 */
595
+ if (block === null) {
596
+ return false;
597
+ }
598
+ const blockCache = cache || [];
599
+ const {
600
+ props
601
+ } = block;
602
+ for (const propval of Object.values(props)) {
603
+ const pval = /** @type {CreatedNode} */propval;
604
+ blockCache.push(pval);
605
+ if (pval.exported && (node === pval.value || findNode(node, pval.value))) {
606
+ return true;
607
+ }
608
+
609
+ // No need to check `propval` for exported nodes as ESM
610
+ // exports are only global
611
+ }
612
+ return false;
420
613
  };
614
+
421
615
  /**
422
- *
423
- * @param {import('eslint').Rule.Node} node
424
- * @param {CreatedNode} globals
425
- * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opt
426
- * @returns {boolean}
427
- */
428
- const isNodeExported = function(node, globals, opt) {
429
- const moduleExports = globals.props.module?.props?.exports;
430
- if (opt.initModuleExports && moduleExports && findNode(node, moduleExports)) return true;
431
- if (opt.initWindow && globals.props.window && findNode(node, globals.props.window)) return true;
432
- if (opt.esm && findExportedNode(globals, node)) return true;
433
- return false;
616
+ *
617
+ * @param {import('eslint').Rule.Node} node
618
+ * @param {CreatedNode} globals
619
+ * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opt
620
+ * @returns {boolean}
621
+ */
622
+ const isNodeExported = function (node, globals, opt) {
623
+ const moduleExports = globals.props.module?.props?.exports;
624
+ if (opt.initModuleExports && moduleExports && findNode(node, moduleExports)) {
625
+ return true;
626
+ }
627
+ if (opt.initWindow && globals.props.window && findNode(node, globals.props.window)) {
628
+ return true;
629
+ }
630
+ if (opt.esm && findExportedNode(globals, node)) {
631
+ return true;
632
+ }
633
+ return false;
434
634
  };
635
+
435
636
  /**
436
- *
437
- * @param {import('eslint').Rule.Node} node
438
- * @param {CreatedNode} globalVars
439
- * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opts
440
- * @returns {boolean}
441
- */
442
- const parseRecursive = function(node, globalVars, opts) {
443
- if (node.parent && parseRecursive(node.parent, globalVars, opts)) return true;
444
- return mapVariables(node, globalVars, opts);
637
+ *
638
+ * @param {import('eslint').Rule.Node} node
639
+ * @param {CreatedNode} globalVars
640
+ * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opts
641
+ * @returns {boolean}
642
+ */
643
+ const parseRecursive = function (node, globalVars, opts) {
644
+ // Iterate from top using recursion - stop at first processed node from top
645
+ if (node.parent && parseRecursive(node.parent, globalVars, opts)) {
646
+ return true;
647
+ }
648
+ return mapVariables(node, globalVars, opts);
445
649
  };
650
+
446
651
  /**
447
- *
448
- * @param {import('eslint').Rule.Node} ast
449
- * @param {import('eslint').Rule.Node} node
450
- * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opt
451
- * @returns {CreatedNode}
452
- */
453
- const parse = function(ast, node, opt) {
454
- /* c8 ignore next 6 */
455
- const opts = opt || {
456
- ancestorsOnly: false,
457
- esm: true,
458
- initModuleExports: true,
459
- initWindow: true
460
- };
461
- const globalVars = createNode();
462
- if (opts.initModuleExports) {
463
- globalVars.props.module = createNode();
464
- globalVars.props.module.props.exports = createNode();
465
- globalVars.props.exports = globalVars.props.module.props.exports;
466
- }
467
- if (opts.initWindow) {
468
- globalVars.props.window = createNode();
469
- globalVars.props.window.special = true;
470
- }
471
- if (opts.ancestorsOnly) parseRecursive(node, globalVars, opts);
472
- else {
473
- initVariables(ast, globalVars, opts);
474
- mapVariables(ast, globalVars, opts);
475
- }
476
- return {
477
- globalVars,
478
- props: {}
479
- };
652
+ *
653
+ * @param {import('eslint').Rule.Node} ast
654
+ * @param {import('eslint').Rule.Node} node
655
+ * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opt
656
+ * @returns {CreatedNode}
657
+ */
658
+ const parse = function (ast, node, opt) {
659
+ /* c8 ignore next 6 */
660
+ const opts = opt || {
661
+ ancestorsOnly: false,
662
+ esm: true,
663
+ initModuleExports: true,
664
+ initWindow: true
665
+ };
666
+ const globalVars = createNode();
667
+ if (opts.initModuleExports) {
668
+ globalVars.props.module = createNode();
669
+ globalVars.props.module.props.exports = createNode();
670
+ globalVars.props.exports = globalVars.props.module.props.exports;
671
+ }
672
+ if (opts.initWindow) {
673
+ globalVars.props.window = createNode();
674
+ globalVars.props.window.special = true;
675
+ }
676
+ if (opts.ancestorsOnly) {
677
+ parseRecursive(node, globalVars, opts);
678
+ } else {
679
+ initVariables(ast, globalVars, opts);
680
+ mapVariables(ast, globalVars, opts);
681
+ }
682
+ return {
683
+ globalVars,
684
+ props: {}
685
+ };
480
686
  };
481
- const accessibilityNodes = new Set(["MethodDefinition", "PropertyDefinition"]);
687
+ const accessibilityNodes = new Set(['MethodDefinition', 'PropertyDefinition']);
688
+
482
689
  /**
483
- *
484
- * @param {import('eslint').Rule.Node} node
485
- * @returns {boolean}
486
- */
487
- const isPrivate = (node) => {
488
- return accessibilityNodes.has(node.type) && "accessibility" in node && node.accessibility !== "public" && node.accessibility !== void 0 || "key" in node && node.key.type === "PrivateIdentifier";
690
+ *
691
+ * @param {import('eslint').Rule.Node} node
692
+ * @returns {boolean}
693
+ */
694
+ const isPrivate = node => {
695
+ return accessibilityNodes.has(node.type) && 'accessibility' in node && node.accessibility !== 'public' && node.accessibility !== undefined || 'key' in node && node.key.type === 'PrivateIdentifier';
489
696
  };
697
+
490
698
  /**
491
- *
492
- * @param {import('eslint').Rule.Node} node
493
- * @param {import('eslint').SourceCode} sourceCode
494
- * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opt
495
- * @param {import('./iterateJsdoc.js').Settings} settings
496
- * @returns {boolean}
497
- */
498
- const isUncommentedExport = function(node, sourceCode, opt, settings) {
499
- if (opt.esm) {
500
- if (isPrivate(node) || node.parent && isPrivate(node.parent)) return false;
501
- const exportNode = getExportAncestor(node);
502
- if (exportNode && !(0, __es_joy_jsdoccomment.findJSDocComment)(exportNode, sourceCode, settings)) return true;
503
- /**
504
- * Some typescript types are not in variable map, but inherit exported (interface property and method)
505
- */
506
- if (isExportByAncestor(node) && !(0, __es_joy_jsdoccomment.findJSDocComment)(node, sourceCode, settings)) return true;
507
- }
508
- const ast = sourceCode.ast;
509
- const parseResult = parse(ast, node, opt);
510
- return isNodeExported(node, parseResult.globalVars, opt);
699
+ *
700
+ * @param {import('eslint').Rule.Node} node
701
+ * @param {import('eslint').SourceCode} sourceCode
702
+ * @param {import('./rules/requireJsdoc.js').RequireJsdocOpts} opt
703
+ * @param {import('./iterateJsdoc.js').Settings} settings
704
+ * @returns {boolean}
705
+ */
706
+ const isUncommentedExport = function (node, sourceCode, opt, settings) {
707
+ // console.log({node});
708
+ // Optimize with ancestor check for esm
709
+ if (opt.esm) {
710
+ if (isPrivate(node) || node.parent && isPrivate(node.parent)) {
711
+ return false;
712
+ }
713
+ const exportNode = getExportAncestor(node);
714
+
715
+ // Is export node comment
716
+ if (exportNode && !(0, _jsdoccomment.findJSDocComment)(exportNode, sourceCode, settings)) {
717
+ return true;
718
+ }
719
+
720
+ /**
721
+ * Some typescript types are not in variable map, but inherit exported (interface property and method)
722
+ */
723
+ if (isExportByAncestor(node) && !(0, _jsdoccomment.findJSDocComment)(node, sourceCode, settings)) {
724
+ return true;
725
+ }
726
+ }
727
+ const ast = /** @type {unknown} */sourceCode.ast;
728
+ const parseResult = parse(/** @type {import('eslint').Rule.Node} */
729
+ ast, node, opt);
730
+ return isNodeExported(node, /** @type {CreatedNode} */parseResult.globalVars, opt);
511
731
  };
512
- var exportParser_default = {
513
- isUncommentedExport,
514
- parse
732
+ var _default = exports.default = {
733
+ isUncommentedExport,
734
+ parse
515
735
  };
516
-
517
- //#endregion
518
- exports.default = exportParser_default;
736
+ module.exports = exports.default;
519
737
  //# sourceMappingURL=exportParser.cjs.map