@mnaoumov/typescript-dev-toolkit 0.0.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -1
  3. package/bundlers/esbuild-impl/change-extension-plugin/package.json +6 -0
  4. package/bundlers/esbuild-impl/custom-esbuild-options-plugin/package.json +6 -0
  5. package/bundlers/esbuild-impl/fix-esm-plugin/package.json +6 -0
  6. package/bundlers/esbuild-impl/index/package.json +6 -0
  7. package/bundlers/esbuild-impl/package.json +6 -0
  8. package/bundlers/esbuild-impl/preprocess-plugin/package.json +6 -0
  9. package/bundlers/esbuild-impl/svelte-wrapper-plugin/package.json +6 -0
  10. package/bundlers/index/package.json +6 -0
  11. package/bundlers/package.json +6 -0
  12. package/dist/lib/cjs/build.cjs +191 -0
  13. package/dist/lib/cjs/build.d.cts +59 -0
  14. package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.cjs +139 -0
  15. package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.d.cts +25 -0
  16. package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +96 -0
  17. package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.cts +14 -0
  18. package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.cjs +106 -0
  19. package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.d.cts +13 -0
  20. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +111 -0
  21. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +6 -0
  22. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +211 -0
  23. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +143 -0
  24. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +129 -0
  25. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +14 -0
  26. package/dist/lib/cjs/bundlers/index.cjs +99 -0
  27. package/dist/lib/cjs/bundlers/index.d.cts +2 -0
  28. package/dist/lib/cjs/check-project-types.cjs +163 -0
  29. package/dist/lib/cjs/check-project-types.d.cts +92 -0
  30. package/dist/lib/cjs/cli-utils.cjs +276 -0
  31. package/dist/lib/cjs/cli-utils.d.cts +123 -0
  32. package/dist/lib/cjs/code-generator.cjs +96 -0
  33. package/dist/lib/cjs/code-generator.d.cts +14 -0
  34. package/dist/lib/cjs/commitlint-config.cjs +110 -0
  35. package/dist/lib/cjs/commitlint-config.d.cts +14 -0
  36. package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +110 -0
  37. package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +37 -0
  38. package/dist/lib/cjs/commitlint-spellcheck-header.cjs +126 -0
  39. package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +40 -0
  40. package/dist/lib/cjs/env-toggle.cjs +133 -0
  41. package/dist/lib/cjs/env-toggle.d.cts +42 -0
  42. package/dist/lib/cjs/exec.cjs +455 -0
  43. package/dist/lib/cjs/exec.d.cts +162 -0
  44. package/dist/lib/cjs/forbidden-patterns.cjs +157 -0
  45. package/dist/lib/cjs/forbidden-patterns.d.cts +57 -0
  46. package/dist/lib/cjs/formatters/dprint.cjs +108 -0
  47. package/dist/lib/cjs/formatters/dprint.d.cts +33 -0
  48. package/dist/lib/cjs/formatters/index.cjs +99 -0
  49. package/dist/lib/cjs/formatters/index.d.cts +2 -0
  50. package/dist/lib/cjs/fs.cjs +123 -0
  51. package/dist/lib/cjs/fs.d.cts +80 -0
  52. package/dist/lib/cjs/gate.cjs +140 -0
  53. package/dist/lib/cjs/gate.d.cts +93 -0
  54. package/dist/lib/cjs/git.cjs +109 -0
  55. package/dist/lib/cjs/git.d.cts +37 -0
  56. package/dist/lib/cjs/index.cjs +186 -0
  57. package/dist/lib/cjs/index.d.cts +35 -0
  58. package/dist/lib/cjs/json.cjs +141 -0
  59. package/dist/lib/cjs/json.d.cts +102 -0
  60. package/dist/lib/cjs/library-build.cjs +475 -0
  61. package/dist/lib/cjs/library-build.d.cts +97 -0
  62. package/dist/lib/cjs/linters/cspell-content.cjs +124 -0
  63. package/dist/lib/cjs/linters/cspell-content.d.cts +46 -0
  64. package/dist/lib/cjs/linters/cspell.cjs +103 -0
  65. package/dist/lib/cjs/linters/cspell.d.cts +36 -0
  66. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.cjs +94 -0
  67. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.d.cts +49 -0
  68. package/dist/lib/cjs/linters/eslint-config.cjs +1068 -0
  69. package/dist/lib/cjs/linters/eslint-config.d.cts +123 -0
  70. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +130 -0
  71. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.d.cts +27 -0
  72. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +116 -0
  73. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +26 -0
  74. package/dist/lib/cjs/linters/eslint-rules/index.cjs +132 -0
  75. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +13 -0
  76. package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +175 -0
  77. package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +10 -0
  78. package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.cjs +290 -0
  79. package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.d.cts +10 -0
  80. package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.cjs +265 -0
  81. package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.d.cts +41 -0
  82. package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.cjs +134 -0
  83. package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.d.cts +20 -0
  84. package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.cjs +217 -0
  85. package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.d.cts +36 -0
  86. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +126 -0
  87. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.d.cts +10 -0
  88. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.cjs +125 -0
  89. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.d.cts +20 -0
  90. package/dist/lib/cjs/linters/eslint-rules/require-method-template.cjs +181 -0
  91. package/dist/lib/cjs/linters/eslint-rules/require-method-template.d.cts +14 -0
  92. package/dist/lib/cjs/linters/eslint-rules/require-super-call.cjs +217 -0
  93. package/dist/lib/cjs/linters/eslint-rules/require-super-call.d.cts +10 -0
  94. package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.cjs +92 -0
  95. package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.d.cts +18 -0
  96. package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.cjs +92 -0
  97. package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.d.cts +23 -0
  98. package/dist/lib/cjs/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.cts +20 -0
  99. package/dist/lib/cjs/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.cts +17 -0
  100. package/dist/lib/cjs/linters/eslint.cjs +122 -0
  101. package/dist/lib/cjs/linters/eslint.d.cts +35 -0
  102. package/dist/lib/cjs/linters/index.cjs +138 -0
  103. package/dist/lib/cjs/linters/index.d.cts +15 -0
  104. package/dist/lib/cjs/linters/lint-ignores.cjs +91 -0
  105. package/dist/lib/cjs/linters/lint-ignores.d.cts +30 -0
  106. package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +169 -0
  107. package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +11 -0
  108. package/dist/lib/cjs/linters/markdownlint-content.cjs +120 -0
  109. package/dist/lib/cjs/linters/markdownlint-content.d.cts +47 -0
  110. package/dist/lib/cjs/linters/markdownlint-ignores.cjs +95 -0
  111. package/dist/lib/cjs/linters/markdownlint-ignores.d.cts +35 -0
  112. package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +99 -0
  113. package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
  114. package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.cjs +152 -0
  115. package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.d.cts +35 -0
  116. package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +1344 -0
  117. package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2.d.cts +67 -0
  118. package/dist/lib/cjs/linters/markdownlint.cjs +151 -0
  119. package/dist/lib/cjs/linters/markdownlint.d.cts +32 -0
  120. package/dist/lib/cjs/linters/over-exposure.cjs +685 -0
  121. package/dist/lib/cjs/linters/over-exposure.d.cts +357 -0
  122. package/dist/lib/cjs/nano-staged-config.cjs +148 -0
  123. package/dist/lib/cjs/nano-staged-config.d.cts +54 -0
  124. package/dist/lib/cjs/npm-publish.cjs +93 -0
  125. package/dist/lib/cjs/npm-publish.d.cts +19 -0
  126. package/dist/lib/cjs/npm-run.cjs +120 -0
  127. package/dist/lib/cjs/npm-run.d.cts +34 -0
  128. package/dist/lib/cjs/npm.cjs +200 -0
  129. package/dist/lib/cjs/npm.d.cts +168 -0
  130. package/dist/lib/cjs/package-lock-integrity.cjs +134 -0
  131. package/dist/lib/cjs/package-lock-integrity.d.cts +38 -0
  132. package/dist/lib/cjs/package-manager.cjs +291 -0
  133. package/dist/lib/cjs/package-manager.d.cts +93 -0
  134. package/dist/lib/cjs/released-issues.cjs +178 -0
  135. package/dist/lib/cjs/released-issues.d.cts +79 -0
  136. package/dist/lib/cjs/repo-paths.cjs +167 -0
  137. package/dist/lib/cjs/repo-paths.d.cts +318 -0
  138. package/dist/lib/cjs/root.cjs +150 -0
  139. package/dist/lib/cjs/root.d.cts +107 -0
  140. package/dist/lib/cjs/test-runners/index.cjs +102 -0
  141. package/dist/lib/cjs/test-runners/index.d.cts +3 -0
  142. package/dist/lib/cjs/test-runners/vitest-config.cjs +126 -0
  143. package/dist/lib/cjs/test-runners/vitest-config.d.cts +90 -0
  144. package/dist/lib/cjs/test-runners/vitest.cjs +115 -0
  145. package/dist/lib/cjs/test-runners/vitest.d.cts +52 -0
  146. package/dist/lib/cjs/validate-declarations.cjs +120 -0
  147. package/dist/lib/cjs/validate-declarations.d.cts +37 -0
  148. package/dist/lib/cjs/version.cjs +758 -0
  149. package/dist/lib/cjs/version.d.cts +418 -0
  150. package/dist/lib/esm/build.d.mts +59 -0
  151. package/dist/lib/esm/build.mjs +165 -0
  152. package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.d.mts +25 -0
  153. package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.mjs +101 -0
  154. package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.mts +14 -0
  155. package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.mjs +59 -0
  156. package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.d.mts +13 -0
  157. package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.mjs +69 -0
  158. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +6 -0
  159. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +60 -0
  160. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +143 -0
  161. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +176 -0
  162. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.d.mts +14 -0
  163. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.mjs +82 -0
  164. package/dist/lib/esm/bundlers/index.d.mts +2 -0
  165. package/dist/lib/esm/bundlers/index.mjs +52 -0
  166. package/dist/lib/esm/check-project-types.d.mts +92 -0
  167. package/dist/lib/esm/check-project-types.mjs +123 -0
  168. package/dist/lib/esm/cli-utils.d.mts +123 -0
  169. package/dist/lib/esm/cli-utils.mjs +225 -0
  170. package/dist/lib/esm/code-generator.d.mts +14 -0
  171. package/dist/lib/esm/code-generator.mjs +59 -0
  172. package/dist/lib/esm/commitlint-config.d.mts +14 -0
  173. package/dist/lib/esm/commitlint-config.mjs +79 -0
  174. package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +37 -0
  175. package/dist/lib/esm/commitlint-forbidden-patterns.mjs +75 -0
  176. package/dist/lib/esm/commitlint-spellcheck-header.d.mts +40 -0
  177. package/dist/lib/esm/commitlint-spellcheck-header.mjs +87 -0
  178. package/dist/lib/esm/env-toggle.d.mts +42 -0
  179. package/dist/lib/esm/env-toggle.mjs +84 -0
  180. package/dist/lib/esm/exec.d.mts +162 -0
  181. package/dist/lib/esm/exec.mjs +410 -0
  182. package/dist/lib/esm/forbidden-patterns.d.mts +57 -0
  183. package/dist/lib/esm/forbidden-patterns.mjs +108 -0
  184. package/dist/lib/esm/formatters/dprint.d.mts +33 -0
  185. package/dist/lib/esm/formatters/dprint.mjs +75 -0
  186. package/dist/lib/esm/formatters/index.d.mts +2 -0
  187. package/dist/lib/esm/formatters/index.mjs +52 -0
  188. package/dist/lib/esm/fs.d.mts +80 -0
  189. package/dist/lib/esm/fs.mjs +89 -0
  190. package/dist/lib/esm/gate.d.mts +93 -0
  191. package/dist/lib/esm/gate.mjs +106 -0
  192. package/dist/lib/esm/git.d.mts +37 -0
  193. package/dist/lib/esm/git.mjs +72 -0
  194. package/dist/lib/esm/index.d.mts +35 -0
  195. package/dist/lib/esm/index.mjs +110 -0
  196. package/dist/lib/esm/json.d.mts +102 -0
  197. package/dist/lib/esm/json.mjs +106 -0
  198. package/dist/lib/esm/library-build.d.mts +97 -0
  199. package/dist/lib/esm/library-build.mjs +435 -0
  200. package/dist/lib/esm/linters/cspell-content.d.mts +46 -0
  201. package/dist/lib/esm/linters/cspell-content.mjs +87 -0
  202. package/dist/lib/esm/linters/cspell.d.mts +36 -0
  203. package/dist/lib/esm/linters/cspell.mjs +69 -0
  204. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.d.mts +49 -0
  205. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.mjs +57 -0
  206. package/dist/lib/esm/linters/eslint-config.d.mts +123 -0
  207. package/dist/lib/esm/linters/eslint-config.mjs +1022 -0
  208. package/dist/lib/esm/linters/eslint-no-restricted-syntax.d.mts +27 -0
  209. package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +93 -0
  210. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +26 -0
  211. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +77 -0
  212. package/dist/lib/esm/linters/eslint-rules/index.d.mts +13 -0
  213. package/dist/lib/esm/linters/eslint-rules/index.mjs +74 -0
  214. package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +10 -0
  215. package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +144 -0
  216. package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.d.mts +10 -0
  217. package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.mjs +277 -0
  218. package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.d.mts +41 -0
  219. package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.mjs +227 -0
  220. package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.d.mts +20 -0
  221. package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.mjs +96 -0
  222. package/dist/lib/esm/linters/eslint-rules/params-options-name-match.d.mts +36 -0
  223. package/dist/lib/esm/linters/eslint-rules/params-options-name-match.mjs +179 -0
  224. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.d.mts +10 -0
  225. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +88 -0
  226. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.d.mts +20 -0
  227. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.mjs +87 -0
  228. package/dist/lib/esm/linters/eslint-rules/require-method-template.d.mts +14 -0
  229. package/dist/lib/esm/linters/eslint-rules/require-method-template.mjs +142 -0
  230. package/dist/lib/esm/linters/eslint-rules/require-super-call.d.mts +10 -0
  231. package/dist/lib/esm/linters/eslint-rules/require-super-call.mjs +183 -0
  232. package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.d.mts +18 -0
  233. package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.mjs +55 -0
  234. package/dist/lib/esm/linters/eslint-rules/ts-estree-node.d.mts +23 -0
  235. package/dist/lib/esm/linters/eslint-rules/ts-estree-node.mjs +55 -0
  236. package/dist/lib/esm/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.mts +20 -0
  237. package/dist/lib/esm/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.mts +17 -0
  238. package/dist/lib/esm/linters/eslint.d.mts +35 -0
  239. package/dist/lib/esm/linters/eslint.mjs +88 -0
  240. package/dist/lib/esm/linters/index.d.mts +15 -0
  241. package/dist/lib/esm/linters/index.mjs +78 -0
  242. package/dist/lib/esm/linters/lint-ignores.d.mts +30 -0
  243. package/dist/lib/esm/linters/lint-ignores.mjs +54 -0
  244. package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +11 -0
  245. package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +122 -0
  246. package/dist/lib/esm/linters/markdownlint-content.d.mts +47 -0
  247. package/dist/lib/esm/linters/markdownlint-content.mjs +83 -0
  248. package/dist/lib/esm/linters/markdownlint-ignores.d.mts +35 -0
  249. package/dist/lib/esm/linters/markdownlint-ignores.mjs +57 -0
  250. package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
  251. package/dist/lib/esm/linters/markdownlint-rules/index.mjs +52 -0
  252. package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.d.mts +35 -0
  253. package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.mjs +114 -0
  254. package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +1344 -0
  255. package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2.d.mts +67 -0
  256. package/dist/lib/esm/linters/markdownlint.d.mts +32 -0
  257. package/dist/lib/esm/linters/markdownlint.mjs +124 -0
  258. package/dist/lib/esm/linters/over-exposure.d.mts +357 -0
  259. package/dist/lib/esm/linters/over-exposure.mjs +672 -0
  260. package/dist/lib/esm/nano-staged-config.d.mts +54 -0
  261. package/dist/lib/esm/nano-staged-config.mjs +103 -0
  262. package/dist/lib/esm/npm-publish.d.mts +19 -0
  263. package/dist/lib/esm/npm-publish.mjs +56 -0
  264. package/dist/lib/esm/npm-run.d.mts +34 -0
  265. package/dist/lib/esm/npm-run.mjs +81 -0
  266. package/dist/lib/esm/npm.d.mts +168 -0
  267. package/dist/lib/esm/npm.mjs +155 -0
  268. package/dist/lib/esm/package-lock-integrity.d.mts +38 -0
  269. package/dist/lib/esm/package-lock-integrity.mjs +99 -0
  270. package/dist/lib/esm/package-manager.d.mts +93 -0
  271. package/dist/lib/esm/package-manager.mjs +245 -0
  272. package/dist/lib/esm/released-issues.d.mts +79 -0
  273. package/dist/lib/esm/released-issues.mjs +143 -0
  274. package/dist/lib/esm/repo-paths.d.mts +318 -0
  275. package/dist/lib/esm/repo-paths.mjs +130 -0
  276. package/dist/lib/esm/root.d.mts +107 -0
  277. package/dist/lib/esm/root.mjs +115 -0
  278. package/dist/lib/esm/test-runners/index.d.mts +3 -0
  279. package/dist/lib/esm/test-runners/index.mjs +54 -0
  280. package/dist/lib/esm/test-runners/vitest-config.d.mts +90 -0
  281. package/dist/lib/esm/test-runners/vitest-config.mjs +86 -0
  282. package/dist/lib/esm/test-runners/vitest.d.mts +52 -0
  283. package/dist/lib/esm/test-runners/vitest.mjs +76 -0
  284. package/dist/lib/esm/validate-declarations.d.mts +37 -0
  285. package/dist/lib/esm/validate-declarations.mjs +87 -0
  286. package/dist/lib/esm/version.d.mts +418 -0
  287. package/dist/lib/esm/version.mjs +723 -0
  288. package/formatters/dprint/package.json +6 -0
  289. package/formatters/index/package.json +6 -0
  290. package/formatters/package.json +6 -0
  291. package/linters/cspell/package.json +6 -0
  292. package/linters/cspell-content/package.json +6 -0
  293. package/linters/eslint/package.json +6 -0
  294. package/linters/eslint-agnostic-core-boundary/package.json +6 -0
  295. package/linters/eslint-config/package.json +6 -0
  296. package/linters/eslint-no-restricted-syntax/package.json +6 -0
  297. package/linters/eslint-rules/in-house-plugin/package.json +6 -0
  298. package/linters/eslint-rules/index/package.json +6 -0
  299. package/linters/eslint-rules/no-async-callback-to-unsafe-return/package.json +6 -0
  300. package/linters/eslint-rules/no-unresolved-jsdoc-link/package.json +6 -0
  301. package/linters/eslint-rules/no-unused-params-members/package.json +6 -0
  302. package/linters/eslint-rules/no-used-underscore-variables/package.json +6 -0
  303. package/linters/eslint-rules/package.json +6 -0
  304. package/linters/eslint-rules/params-options-name-match/package.json +6 -0
  305. package/linters/eslint-rules/prefer-noop-async/package.json +6 -0
  306. package/linters/eslint-rules/readonly-params-options-result-members/package.json +6 -0
  307. package/linters/eslint-rules/require-method-template/package.json +6 -0
  308. package/linters/eslint-rules/require-super-call/package.json +6 -0
  309. package/linters/eslint-rules/rule-tester-helper/package.json +6 -0
  310. package/linters/eslint-rules/ts-estree-node/package.json +6 -0
  311. package/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs/package.json +4 -0
  312. package/linters/eslint-types/@types/eslint-plugin-verify-tsdoc/package.json +4 -0
  313. package/linters/index/package.json +6 -0
  314. package/linters/lint-ignores/package.json +6 -0
  315. package/linters/markdownlint/package.json +6 -0
  316. package/linters/markdownlint-cli2-config/package.json +6 -0
  317. package/linters/markdownlint-content/package.json +6 -0
  318. package/linters/markdownlint-ignores/package.json +6 -0
  319. package/linters/markdownlint-rules/index/package.json +6 -0
  320. package/linters/markdownlint-rules/no-soft-break-in-paragraph/package.json +6 -0
  321. package/linters/markdownlint-rules/package.json +6 -0
  322. package/linters/markdownlint-types/@types/markdownlint-cli2/package.json +4 -0
  323. package/linters/markdownlint-types/@types/markdownlint-cli2-config-schema/package.json +4 -0
  324. package/linters/over-exposure/package.json +6 -0
  325. package/linters/package.json +6 -0
  326. package/package.json +329 -13
  327. package/test-runners/index/package.json +6 -0
  328. package/test-runners/package.json +6 -0
  329. package/test-runners/vitest/package.json +6 -0
  330. package/test-runners/vitest-config/package.json +6 -0
@@ -0,0 +1,277 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ const existingProcess = globalThis.process;
23
+
24
+ if (!existingProcess) {
25
+ globalThis.process = browserProcess;
26
+ return;
27
+ }
28
+
29
+ if (existingProcess.versions?.node) {
30
+ return;
31
+ }
32
+
33
+ const existingProcessRecord = existingProcess;
34
+
35
+ for (const [key, value] of Object.entries(browserProcess)) {
36
+ existingProcessRecord[key] ??= value;
37
+ }
38
+
39
+ existingProcessRecord['browser'] = true;
40
+ }
41
+
42
+ (function initEsm() {
43
+ ensureDisposeSymbols();
44
+ ensureBrowserProcess();
45
+ })();
46
+ })();
47
+
48
+ import {
49
+ escapeLeadingUnderscores,
50
+ forEachChild,
51
+ getJSDocCommentsAndTags,
52
+ isClassDeclaration,
53
+ isEnumDeclaration,
54
+ isFunctionDeclaration,
55
+ isGetAccessorDeclaration,
56
+ isIdentifier,
57
+ isInterfaceDeclaration,
58
+ isJSDocLink,
59
+ isJSDocLinkCode,
60
+ isJSDocLinkPlain,
61
+ isJSDocMemberName,
62
+ isMethodDeclaration,
63
+ isMethodSignature,
64
+ isModuleDeclaration,
65
+ isPropertyDeclaration,
66
+ isPropertySignature,
67
+ isSetAccessorDeclaration,
68
+ isTypeAliasDeclaration,
69
+ isVariableDeclaration,
70
+ resolveModuleName,
71
+ SymbolFlags,
72
+ sys
73
+ } from "typescript";
74
+ import { toTSESTreeNode } from "./ts-estree-node.mjs";
75
+ const MESSAGE_ID = "noUnresolvedJsdocLink";
76
+ const MODULE_PATH_REG_EXP = /^(?<modulePath>[^\s!|}]*)!(?<memberPath>[\w$.#]+)/;
77
+ const IMPORT_TYPE_REG_EXP = /^import\(\s*(?<quote>['"])(?<modulePath>[^'"]+)\k<quote>\s*\)\.(?<memberPath>[\w$.#]+)/;
78
+ const RELATIVE_PATH_PREFIX_REG_EXP = /^(?:\.\.?\/)+/;
79
+ const MEMBER_SEPARATOR_REG_EXP = /[.#]/;
80
+ const SOURCE_FILE_EXTENSION_REG_EXP = /(?:\.d)?\.[cm]?tsx?$/;
81
+ const INDEX_SUFFIX = "/index";
82
+ const programIndexCache = /* @__PURE__ */ new WeakMap();
83
+ const noUnresolvedJsdocLink = {
84
+ create(context) {
85
+ const services = context.sourceCode.parserServices;
86
+ return {
87
+ Program(node) {
88
+ const program = services.program;
89
+ const checker = program.getTypeChecker();
90
+ const tsSourceFile = services.esTreeNodeToTSNodeMap.get(toTSESTreeNode(node));
91
+ const links = /* @__PURE__ */ new Set();
92
+ const localDeclarationNamesByName = /* @__PURE__ */ new Map();
93
+ function visitJsDocNode(jsDocNode) {
94
+ if (isJSDocLinkLike(jsDocNode)) {
95
+ links.add(jsDocNode);
96
+ return;
97
+ }
98
+ forEachChild(jsDocNode, visitJsDocNode);
99
+ }
100
+ function visitNode(tsNode) {
101
+ collectLocalDeclarationName(tsNode, localDeclarationNamesByName);
102
+ for (const jsDocNode of getJSDocCommentsAndTags(tsNode)) {
103
+ visitJsDocNode(jsDocNode);
104
+ }
105
+ forEachChild(tsNode, visitNode);
106
+ }
107
+ function reportIfUnresolved(link) {
108
+ if (!link.name || link.text.startsWith(":")) {
109
+ return;
110
+ }
111
+ const nameText = link.name.getText();
112
+ const fullTarget = nameText + link.text;
113
+ const moduleMatch = IMPORT_TYPE_REG_EXP.exec(fullTarget) ?? MODULE_PATH_REG_EXP.exec(fullTarget);
114
+ let reportedName = nameText;
115
+ let isResolved;
116
+ if (moduleMatch?.groups) {
117
+ const { memberPath, modulePath } = moduleMatch.groups;
118
+ reportedName = moduleMatch[0];
119
+ const moduleSymbol = findModule(program, checker, modulePath, tsSourceFile.fileName);
120
+ isResolved = !!resolveMemberPath(checker, moduleSymbol, memberPath.split(MEMBER_SEPARATOR_REG_EXP));
121
+ } else {
122
+ isResolved = isResolvedName({
123
+ checker,
124
+ containingFileName: tsSourceFile.fileName,
125
+ localDeclarationNamesByName,
126
+ name: link.name,
127
+ program
128
+ });
129
+ }
130
+ if (isResolved) {
131
+ return;
132
+ }
133
+ context.report({
134
+ data: {
135
+ name: reportedName
136
+ },
137
+ loc: {
138
+ end: context.sourceCode.getLocFromIndex(link.name.getEnd()),
139
+ start: context.sourceCode.getLocFromIndex(link.name.getStart())
140
+ },
141
+ messageId: MESSAGE_ID
142
+ });
143
+ }
144
+ visitNode(tsSourceFile);
145
+ for (const link of links) {
146
+ reportIfUnresolved(link);
147
+ }
148
+ }
149
+ };
150
+ },
151
+ meta: {
152
+ docs: {
153
+ description: "Disallow JSDoc link tags whose target does not resolve to a symbol"
154
+ },
155
+ messages: {
156
+ [MESSAGE_ID]: "JSDoc link target `{{name}}` does not resolve. Was it renamed or removed?"
157
+ },
158
+ schema: [],
159
+ type: "problem"
160
+ }
161
+ };
162
+ function collectLocalDeclarationName(node, localDeclarationNamesByName) {
163
+ if (!isLocalDeclaration(node) || !node.name || !isIdentifier(node.name)) {
164
+ return;
165
+ }
166
+ const names = localDeclarationNamesByName.get(node.name.text) ?? [];
167
+ names.push(node.name);
168
+ localDeclarationNamesByName.set(node.name.text, names);
169
+ }
170
+ function findModule(program, checker, specifier, containingFileName) {
171
+ const ambientModule = getProgramIndex(program, checker).modulesByPath.get(specifier);
172
+ if (ambientModule) {
173
+ return ambientModule;
174
+ }
175
+ const resolvedFileName = resolveModuleName(specifier, containingFileName, program.getCompilerOptions(), sys).resolvedModule?.resolvedFileName;
176
+ const resolvedSourceFile = resolvedFileName === void 0 ? void 0 : program.getSourceFile(resolvedFileName);
177
+ const resolvedModule = resolvedSourceFile && checker.getSymbolAtLocation(resolvedSourceFile);
178
+ return resolvedModule ?? findModuleByPathSuffix(program, checker, specifier);
179
+ }
180
+ function findModuleByPathSuffix(program, checker, modulePath) {
181
+ const normalizedPath = modulePath.replace(RELATIVE_PATH_PREFIX_REG_EXP, "").replace(SOURCE_FILE_EXTENSION_REG_EXP, "");
182
+ const suffixes = [`/${normalizedPath}`, `/${normalizedPath}${INDEX_SUFFIX}`];
183
+ for (const sourceFile of program.getSourceFiles()) {
184
+ const pathWithoutExtension = sourceFile.fileName.replace(SOURCE_FILE_EXTENSION_REG_EXP, "");
185
+ if (suffixes.every((suffix) => !pathWithoutExtension.endsWith(suffix))) {
186
+ continue;
187
+ }
188
+ const moduleSymbol = checker.getSymbolAtLocation(sourceFile);
189
+ if (moduleSymbol) {
190
+ return moduleSymbol;
191
+ }
192
+ }
193
+ return void 0;
194
+ }
195
+ function flattenName(name) {
196
+ return isIdentifier(name) ? [name.text] : [...flattenName(name.left), name.right.text];
197
+ }
198
+ function getMember(checker, symbol, memberName) {
199
+ const escapedName = escapeLeadingUnderscores(memberName);
200
+ const target = resolveAlias(checker, symbol);
201
+ const moduleExport = (target.flags & SymbolFlags.Module) === 0 ? void 0 : checker.tryGetMemberInModuleExports(memberName, target);
202
+ return moduleExport ?? target.exports?.get(escapedName) ?? target.members?.get(escapedName) ?? checker.getPropertyOfType(checker.getDeclaredTypeOfSymbol(target), memberName) ?? checker.getPropertyOfType(checker.getTypeOfSymbol(target), memberName);
203
+ }
204
+ function getProgramIndex(program, checker) {
205
+ let index = programIndexCache.get(program);
206
+ if (index) {
207
+ return index;
208
+ }
209
+ index = {
210
+ exportsByName: /* @__PURE__ */ new Map(),
211
+ modulesByPath: /* @__PURE__ */ new Map()
212
+ };
213
+ const moduleSymbols = [];
214
+ for (const ambientModule of checker.getAmbientModules()) {
215
+ index.modulesByPath.set(ambientModule.name.replaceAll('"', ""), ambientModule);
216
+ moduleSymbols.push(ambientModule);
217
+ }
218
+ for (const sourceFile of program.getSourceFiles()) {
219
+ const moduleSymbol = checker.getSymbolAtLocation(sourceFile);
220
+ if (moduleSymbol) {
221
+ moduleSymbols.push(moduleSymbol);
222
+ }
223
+ }
224
+ for (const moduleSymbol of moduleSymbols) {
225
+ for (const exportSymbol of checker.getExportsOfModule(moduleSymbol)) {
226
+ const symbols = index.exportsByName.get(exportSymbol.name) ?? [];
227
+ symbols.push(exportSymbol);
228
+ index.exportsByName.set(exportSymbol.name, symbols);
229
+ }
230
+ }
231
+ programIndexCache.set(program, index);
232
+ return index;
233
+ }
234
+ function isJSDocLinkLike(node) {
235
+ return isJSDocLink(node) || isJSDocLinkCode(node) || isJSDocLinkPlain(node);
236
+ }
237
+ function isLocalDeclaration(node) {
238
+ return isClassDeclaration(node) || isEnumDeclaration(node) || isFunctionDeclaration(node) || isGetAccessorDeclaration(node) || isInterfaceDeclaration(node) || isMethodDeclaration(node) || isMethodSignature(node) || isModuleDeclaration(node) || isPropertyDeclaration(node) || isPropertySignature(node) || isSetAccessorDeclaration(node) || isTypeAliasDeclaration(node) || isVariableDeclaration(node);
239
+ }
240
+ function isResolvedName(params) {
241
+ const {
242
+ checker,
243
+ containingFileName,
244
+ localDeclarationNamesByName,
245
+ name,
246
+ program
247
+ } = params;
248
+ if (checker.getSymbolAtLocation(name)) {
249
+ return true;
250
+ }
251
+ if (isJSDocMemberName(name) && checker.getSymbolAtLocation(name.right)) {
252
+ return true;
253
+ }
254
+ const [rootName = "", ...memberNames] = flattenName(name);
255
+ const index = getProgramIndex(program, checker);
256
+ const localRoots = (localDeclarationNamesByName.get(rootName) ?? []).map((declarationName) => checker.getSymbolAtLocation(declarationName));
257
+ const roots = [...localRoots, ...index.exportsByName.get(rootName) ?? [], findModule(program, checker, rootName, containingFileName)];
258
+ return roots.some((root) => !!resolveMemberPath(checker, root, memberNames));
259
+ }
260
+ function resolveAlias(checker, symbol) {
261
+ return (symbol.flags & SymbolFlags.Alias) === 0 ? symbol : checker.getAliasedSymbol(symbol);
262
+ }
263
+ function resolveMemberPath(checker, root, memberNames) {
264
+ let current = root;
265
+ for (const memberName of memberNames) {
266
+ if (!current) {
267
+ return void 0;
268
+ }
269
+ current = getMember(checker, current, memberName);
270
+ }
271
+ return current;
272
+ }
273
+ export {
274
+ MESSAGE_ID,
275
+ noUnresolvedJsdocLink
276
+ };
277
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvZXNsaW50LXJ1bGVzL25vLXVucmVzb2x2ZWQtanNkb2MtbGluay50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEVTTGludCBydWxlOiBuby11bnJlc29sdmVkLWpzZG9jLWxpbmtcbiAqXG4gKiBSZXBvcnRzIGEgSlNEb2MgYGxpbmtgLCBgbGlua2NvZGVgIG9yIGBsaW5rcGxhaW5gIGlubGluZSB0YWcgd2hvc2UgdGFyZ2V0IG5vIGxvbmdlciByZXNvbHZlcyB0byBhIHN5bWJvbC5cbiAqXG4gKiBBIHJlbmFtZSBsZWF2ZXMgYHtAbGluayBPbGROYW1lfWAgYmVoaW5kIGFuZCBub3RoaW5nIGVsc2UgcmVwb3J0cyBpdDogYGpzZG9jL25vLXVuZGVmaW5lZC10eXBlc2AgZG9lcyBub3QgcmVzb2x2ZVxuICogbGluayB0YXJnZXRzLCBUU0RvYyBjaGVja3Mgb25seSB0aGUgdGFnIHN5bnRheCwgYW5kIGB0c2NgIHBhcnNlcyBKU0RvYyBsaW5rcyB3aXRob3V0IGV2ZXIgZGlhZ25vc2luZyB0aGVtLiBTbyBhIGRlYWRcbiAqIGxpbmsgc3Vydml2ZXMgdW50aWwgc29tZWJvZHkgaGFwcGVucyB0byBjbGljayBpdC5cbiAqXG4gKiBBIHRhcmdldCByZXNvbHZlcyB3aGVuIGFueSBvZiB0aGVzZSBmaW5kcyBpdCwgdHJpZWQgaW4gb3JkZXI6XG4gKlxuICogMS4gVGhlIHR5cGUgY2hlY2tlciwgYXQgdGhlIGNvbW1lbnQncyBvd24gbG9jYXRpb24sIGV4YWN0bHkgYXMgZWRpdG9yIGdvLXRvLWRlZmluaXRpb24gZG9lcyBcdTIwMTQgc28gZXZlcnl0aGluZyBpblxuICogICAgc2NvcGUgdGhlcmUgcmVzb2x2ZXM6IHR5cGUgcGFyYW1ldGVycywgcGFyYW1ldGVycywgaW1wb3J0cywgYW5kIHRoZSBET00gLyBFUyBnbG9iYWxzLlxuICogMi4gQSBkZWNsYXJhdGlvbiBhbnl3aGVyZSBpbiB0aGUgc2FtZSBmaWxlIFx1MjAxNCBhIGZ1bmN0aW9uIG5lc3RlZCBpbiBhbm90aGVyLCBhIHByaXZhdGUgbWV0aG9kIFx1MjAxNCB3aGljaCBpcyBvdXQgb2ZcbiAqICAgIHNjb3BlIGF0IGEgYCpQYXJhbXNgIGludGVyZmFjZSBuYW1pbmcgaXQsIHlldCBpcyBleGFjdGx5IHdoYXQgYSByZW5hbWUgb2YgaXQgd291bGQgYnJlYWsuXG4gKiAzLiBUaGUgZXhwb3J0cyBvZiBhbnkgbW9kdWxlIGluIHRoZSBwcm9ncmFtLCBieSBuYW1lLiBBIGNvbW1lbnQgcm91dGluZWx5IG5hbWVzIGEgdHlwZSBpdHMgZmlsZSBuZXZlciBpbXBvcnRzIChhblxuICogICAgaW50ZWdyYXRpb24gdGVzdCBuYW1pbmcgdGhlIGNsYXNzIGl0IGRyaXZlcyB0aHJvdWdoIGBldmFsSW5PYnNpZGlhbmAsIGEgcmVtYXJrIG5hbWluZyBhbiBPYnNpZGlhbiBBUEkpLCBhbmQgdGhlXG4gKiAgICBBUEkgZG9jcyBnZW5lcmF0b3IgcmVzb2x2ZXMgc3VjaCBhIG5hbWUgbGlicmFyeS13aWRlIHRvby4gVGhpcyBrZWVwcyB0aGUgcnVsZSBhYm91dCBERUFEIGxpbmtzIHJhdGhlciB0aGFuXG4gKiAgICBhYm91dCBpbXBvcnRzOiBhIHJlbmFtZWQgb3IgcmVtb3ZlZCBkZWNsYXJhdGlvbiBpcyBleHBvcnRlZCBieSBubyBtb2R1bGUsIHNvIGl0IGlzIHN0aWxsIHJlcG9ydGVkLlxuICogNC4gQSBtb2R1bGUgbmFtZWQgYnkgaXRzIHNwZWNpZmllciBvciBpdHMgcGF0aCwgaW4gYm90aCBUU0RvYyBmb3JtczogYG9ic2lkaWFuI0V2ZW50cyNvbmAgKHRoZSBwYWNrYWdlIGFzIHRoZSBmaXJzdFxuICogICAgc2VnbWVudCkgYW5kIGBlcnJvciFlcnJvclRvU3RyaW5nYCAvIGBvYnNpZGlhbi9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudCFQbHVnaW5Db25mbGljdFNldmVyaXR5Lldhcm5gXG4gKiAgICAoYSBtb2R1bGUgcGF0aCwgZW5kaW5nIHdpdGggYCFgKSBcdTIwMTQgcGx1cyBUeXBlU2NyaXB0J3Mgb3duIGBpbXBvcnQoJy4vbW9kdWxlLnRzJykuTWVtYmVyYC4gQSBwYXRoIG1hdGNoZXMgYW55XG4gKiAgICBzb3VyY2UgZmlsZSBpbiB0aGUgcHJvZ3JhbSB3aG9zZSBwYXRoIGVuZHMgd2l0aCBpdC5cbiAqXG4gKiBBZnRlciB0aGUgZmlyc3Qgc2VnbWVudCwgZWFjaCBmdXJ0aGVyIGAuYCAvIGAjYCBzZWdtZW50IGlzIGxvb2tlZCB1cCBhcyBhIG1lbWJlcjogYSBuYW1lc3BhY2Ugb3IgbW9kdWxlIGV4cG9ydCwgYVxuICogc3RhdGljIG9yIGluc3RhbmNlIG1lbWJlciwgb3IgYSBwcm9wZXJ0eSBvZiB0aGUgcHJldmlvdXMgbWVtYmVyJ3MgdHlwZSBcdTIwMTQgc28gYEFwcC52YXVsdC5hZGFwdGVyYCByZXNvbHZlcy5cbiAqXG4gKiBBIGxpbmsgdGhhdCBpcyBub3QgYSBjb2RlIHJlZmVyZW5jZSBpcyBza2lwcGVkOiBhIFVSTCAoYHtAbGluayBodHRwczovL2V4YW1wbGUuY29tfWApIGFuZCBhIEpTRG9jIG5hbWVwYXRoXG4gKiAoYHtAbGluayBtb2R1bGU6Zm9vfWApIGJvdGggcGFyc2UgYXMgYSBuYW1lIGZvbGxvd2VkIGJ5IHRleHQgc3RhcnRpbmcgd2l0aCBgOmAsIGFuZCBhIGxpbmsgd2l0aCBubyBuYW1lIGhhc1xuICogbm90aGluZyB0byByZXNvbHZlLlxuICovXG5pbXBvcnQgdHlwZSB7XG4gIFBhcnNlclNlcnZpY2VzV2l0aFR5cGVJbmZvcm1hdGlvbixcbiAgVFNFU1RyZWVcbn0gZnJvbSAnQHR5cGVzY3JpcHQtZXNsaW50L3V0aWxzJztcbmltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gJ2VzbGludCc7XG5pbXBvcnQgdHlwZSB7XG4gIENsYXNzRGVjbGFyYXRpb24sXG4gIEVudGl0eU5hbWUsXG4gIEVudW1EZWNsYXJhdGlvbixcbiAgRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbixcbiAgSWRlbnRpZmllcixcbiAgSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIEpTRG9jTGluayxcbiAgSlNEb2NMaW5rQ29kZSxcbiAgSlNEb2NMaW5rUGxhaW4sXG4gIEpTRG9jTWVtYmVyTmFtZSxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE1ldGhvZFNpZ25hdHVyZSxcbiAgTW9kdWxlRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFByb3BlcnR5U2lnbmF0dXJlLFxuICBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBTeW1ib2wgYXMgVHNTeW1ib2wsXG4gIFR5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBUeXBlQ2hlY2tlcixcbiAgVmFyaWFibGVEZWNsYXJhdGlvblxufSBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtcbiAgZXNjYXBlTGVhZGluZ1VuZGVyc2NvcmVzLFxuICBmb3JFYWNoQ2hpbGQsXG4gIGdldEpTRG9jQ29tbWVudHNBbmRUYWdzLFxuICBpc0NsYXNzRGVjbGFyYXRpb24sXG4gIGlzRW51bURlY2xhcmF0aW9uLFxuICBpc0Z1bmN0aW9uRGVjbGFyYXRpb24sXG4gIGlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbixcbiAgaXNJZGVudGlmaWVyLFxuICBpc0ludGVyZmFjZURlY2xhcmF0aW9uLFxuICBpc0pTRG9jTGluayxcbiAgaXNKU0RvY0xpbmtDb2RlLFxuICBpc0pTRG9jTGlua1BsYWluLFxuICBpc0pTRG9jTWVtYmVyTmFtZSxcbiAgaXNNZXRob2REZWNsYXJhdGlvbixcbiAgaXNNZXRob2RTaWduYXR1cmUsXG4gIGlzTW9kdWxlRGVjbGFyYXRpb24sXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNQcm9wZXJ0eVNpZ25hdHVyZSxcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1R5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBpc1ZhcmlhYmxlRGVjbGFyYXRpb24sXG4gIHJlc29sdmVNb2R1bGVOYW1lLFxuICBTeW1ib2xGbGFncyxcbiAgc3lzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyB0b1RTRVNUcmVlTm9kZSB9IGZyb20gJy4vdHMtZXN0cmVlLW5vZGUudHMnO1xuXG4vKipcbiAqIE1lc3NhZ2UgSUQgcmVwb3J0ZWQgd2hlbiBhIEpTRG9jIGxpbmsgdGFyZ2V0IGRvZXMgbm90IHJlc29sdmUgdG8gYSBzeW1ib2wuXG4gKi9cbmV4cG9ydCBjb25zdCBNRVNTQUdFX0lEID0gJ25vVW5yZXNvbHZlZEpzZG9jTGluayc7XG5cbmludGVyZmFjZSBJc1Jlc29sdmVkTmFtZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuICByZWFkb25seSBjb250YWluaW5nRmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9jYWxEZWNsYXJhdGlvbk5hbWVzQnlOYW1lOiBSZWFkb25seU1hcDxzdHJpbmcsIHJlYWRvbmx5IElkZW50aWZpZXJbXT47XG4gIHJlYWRvbmx5IG5hbWU6IEVudGl0eU5hbWUgfCBKU0RvY01lbWJlck5hbWU7XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG59XG5cbnR5cGUgSlNEb2NMaW5rTGlrZSA9IEpTRG9jTGluayB8IEpTRG9jTGlua0NvZGUgfCBKU0RvY0xpbmtQbGFpbjtcblxudHlwZSBMb2NhbERlY2xhcmF0aW9uID1cbiAgfCBDbGFzc0RlY2xhcmF0aW9uXG4gIHwgRW51bURlY2xhcmF0aW9uXG4gIHwgRnVuY3Rpb25EZWNsYXJhdGlvblxuICB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb25cbiAgfCBJbnRlcmZhY2VEZWNsYXJhdGlvblxuICB8IE1ldGhvZERlY2xhcmF0aW9uXG4gIHwgTWV0aG9kU2lnbmF0dXJlXG4gIHwgTW9kdWxlRGVjbGFyYXRpb25cbiAgfCBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gIHwgUHJvcGVydHlTaWduYXR1cmVcbiAgfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uXG4gIHwgVHlwZUFsaWFzRGVjbGFyYXRpb25cbiAgfCBWYXJpYWJsZURlY2xhcmF0aW9uO1xuXG50eXBlIE1vZHVsZVBhdGhNYXRjaEdyb3VwcyA9IFJlYWRvbmx5PFJlY29yZDwnbWVtYmVyUGF0aCcgfCAnbW9kdWxlUGF0aCcsIHN0cmluZz4+O1xuXG5pbnRlcmZhY2UgUHJvZ3JhbUluZGV4IHtcbiAgcmVhZG9ubHkgZXhwb3J0c0J5TmFtZTogTWFwPHN0cmluZywgVHNTeW1ib2xbXT47XG4gIHJlYWRvbmx5IG1vZHVsZXNCeVBhdGg6IE1hcDxzdHJpbmcsIFRzU3ltYm9sPjtcbn1cblxuY29uc3QgTU9EVUxFX1BBVEhfUkVHX0VYUCA9IC9eKD88bW9kdWxlUGF0aD5bXlxccyF8fV0qKSEoPzxtZW1iZXJQYXRoPltcXHckLiNdKykvO1xuY29uc3QgSU1QT1JUX1RZUEVfUkVHX0VYUCA9IC9eaW1wb3J0XFwoXFxzKig/PHF1b3RlPlsnXCJdKSg/PG1vZHVsZVBhdGg+W14nXCJdKylcXGs8cXVvdGU+XFxzKlxcKVxcLig/PG1lbWJlclBhdGg+W1xcdyQuI10rKS87XG5jb25zdCBSRUxBVElWRV9QQVRIX1BSRUZJWF9SRUdfRVhQID0gL14oPzpcXC5cXC4/XFwvKSsvO1xuY29uc3QgTUVNQkVSX1NFUEFSQVRPUl9SRUdfRVhQID0gL1suI10vO1xuY29uc3QgU09VUkNFX0ZJTEVfRVhURU5TSU9OX1JFR19FWFAgPSAvKD86XFwuZCk/XFwuW2NtXT90c3g/JC87XG5jb25zdCBJTkRFWF9TVUZGSVggPSAnL2luZGV4JztcblxuY29uc3QgcHJvZ3JhbUluZGV4Q2FjaGUgPSBuZXcgV2Vha01hcDxQcm9ncmFtLCBQcm9ncmFtSW5kZXg+KCk7XG5cbi8qKlxuICogVGhlIEVTTGludCBydWxlIHRoYXQgcmVwb3J0cyBKU0RvYyBsaW5rcyB3aG9zZSB0YXJnZXQgZG9lcyBub3QgcmVzb2x2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vVW5yZXNvbHZlZEpzZG9jTGluazogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IHNlcnZpY2VzID0gY29udGV4dC5zb3VyY2VDb2RlLnBhcnNlclNlcnZpY2VzIGFzIFBhcnNlclNlcnZpY2VzV2l0aFR5cGVJbmZvcm1hdGlvbjtcblxuICAgIHJldHVybiB7XG4gICAgICBQcm9ncmFtKG5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHNlcnZpY2VzLnByb2dyYW07XG4gICAgICAgIGNvbnN0IGNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gICAgICAgIGNvbnN0IHRzU291cmNlRmlsZSA9IHNlcnZpY2VzLmVzVHJlZU5vZGVUb1RTTm9kZU1hcC5nZXQodG9UU0VTVHJlZU5vZGUobm9kZSkgYXMgVFNFU1RyZWUuUHJvZ3JhbSk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIHNhbWUgbGluayBpcyByZWFjaGFibGUgbW9yZSB0aGFuIG9uY2U6IGEgcGFyYW1ldGVyIHJldHVybnMgaXRzIG93biBgQHBhcmFtYCB0YWcsIHdoaWNoIGl0cyBmdW5jdGlvbidzXG4gICAgICAgICAqIEpTRG9jIGJsb2NrIGFsc28gY29udGFpbnMuIFNvIGRlZHVwbGljYXRlIG9uIHRoZSBsaW5rIGl0c2VsZiByYXRoZXIgdGhhbiBvbiB0aGUgSlNEb2Mgbm9kZS5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGxpbmtzID0gbmV3IFNldDxKU0RvY0xpbmtMaWtlPigpO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIEEgbGluayBtYXkgbmFtZSBhIGRlY2xhcmF0aW9uIGZ1cnRoZXIgZG93biB0aGUgZmlsZSwgc28gdGhlIHdob2xlIGZpbGUgaXMgd2Fsa2VkIGJlZm9yZSBhbnkgbGluayBpc1xuICAgICAgICAgKiByZXNvbHZlZC5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGxvY2FsRGVjbGFyYXRpb25OYW1lc0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBJZGVudGlmaWVyW10+KCk7XG5cbiAgICAgICAgZnVuY3Rpb24gdmlzaXRKc0RvY05vZGUoanNEb2NOb2RlOiBOb2RlKTogdm9pZCB7XG4gICAgICAgICAgaWYgKGlzSlNEb2NMaW5rTGlrZShqc0RvY05vZGUpKSB7XG4gICAgICAgICAgICBsaW5rcy5hZGQoanNEb2NOb2RlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaENoaWxkKGpzRG9jTm9kZSwgdmlzaXRKc0RvY05vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdmlzaXROb2RlKHRzTm9kZTogTm9kZSk6IHZvaWQge1xuICAgICAgICAgIGNvbGxlY3RMb2NhbERlY2xhcmF0aW9uTmFtZSh0c05vZGUsIGxvY2FsRGVjbGFyYXRpb25OYW1lc0J5TmFtZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBqc0RvY05vZGUgb2YgZ2V0SlNEb2NDb21tZW50c0FuZFRhZ3ModHNOb2RlKSkge1xuICAgICAgICAgICAgdmlzaXRKc0RvY05vZGUoanNEb2NOb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaENoaWxkKHRzTm9kZSwgdmlzaXROb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlcG9ydElmVW5yZXNvbHZlZChsaW5rOiBKU0RvY0xpbmtMaWtlKTogdm9pZCB7XG4gICAgICAgICAgaWYgKCFsaW5rLm5hbWUgfHwgbGluay50ZXh0LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG5hbWVUZXh0ID0gbGluay5uYW1lLmdldFRleHQoKTtcbiAgICAgICAgICBjb25zdCBmdWxsVGFyZ2V0ID0gbmFtZVRleHQgKyBsaW5rLnRleHQ7XG4gICAgICAgICAgY29uc3QgbW9kdWxlTWF0Y2ggPSBJTVBPUlRfVFlQRV9SRUdfRVhQLmV4ZWMoZnVsbFRhcmdldCkgPz8gTU9EVUxFX1BBVEhfUkVHX0VYUC5leGVjKGZ1bGxUYXJnZXQpO1xuICAgICAgICAgIGxldCByZXBvcnRlZE5hbWUgPSBuYW1lVGV4dDtcbiAgICAgICAgICBsZXQgaXNSZXNvbHZlZDogYm9vbGVhbjtcblxuICAgICAgICAgIGlmIChtb2R1bGVNYXRjaD8uZ3JvdXBzKSB7XG4gICAgICAgICAgICBjb25zdCB7IG1lbWJlclBhdGgsIG1vZHVsZVBhdGggfSA9IG1vZHVsZU1hdGNoLmdyb3VwcyBhcyBNb2R1bGVQYXRoTWF0Y2hHcm91cHM7XG4gICAgICAgICAgICByZXBvcnRlZE5hbWUgPSBtb2R1bGVNYXRjaFswXTtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZVN5bWJvbCA9IGZpbmRNb2R1bGUocHJvZ3JhbSwgY2hlY2tlciwgbW9kdWxlUGF0aCwgdHNTb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICAgICAgICAgIGlzUmVzb2x2ZWQgPSAhIXJlc29sdmVNZW1iZXJQYXRoKGNoZWNrZXIsIG1vZHVsZVN5bWJvbCwgbWVtYmVyUGF0aC5zcGxpdChNRU1CRVJfU0VQQVJBVE9SX1JFR19FWFApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXNSZXNvbHZlZCA9IGlzUmVzb2x2ZWROYW1lKHtcbiAgICAgICAgICAgICAgY2hlY2tlcixcbiAgICAgICAgICAgICAgY29udGFpbmluZ0ZpbGVOYW1lOiB0c1NvdXJjZUZpbGUuZmlsZU5hbWUsXG4gICAgICAgICAgICAgIGxvY2FsRGVjbGFyYXRpb25OYW1lc0J5TmFtZSxcbiAgICAgICAgICAgICAgbmFtZTogbGluay5uYW1lLFxuICAgICAgICAgICAgICBwcm9ncmFtXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNSZXNvbHZlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogcmVwb3J0ZWROYW1lXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG9jOiB7XG4gICAgICAgICAgICAgIGVuZDogY29udGV4dC5zb3VyY2VDb2RlLmdldExvY0Zyb21JbmRleChsaW5rLm5hbWUuZ2V0RW5kKCkpLFxuICAgICAgICAgICAgICBzdGFydDogY29udGV4dC5zb3VyY2VDb2RlLmdldExvY0Zyb21JbmRleChsaW5rLm5hbWUuZ2V0U3RhcnQoKSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSURcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZpc2l0Tm9kZSh0c1NvdXJjZUZpbGUpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgICAgICByZXBvcnRJZlVucmVzb2x2ZWQobGluayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBtZXRhOiB7XG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246ICdEaXNhbGxvdyBKU0RvYyBsaW5rIHRhZ3Mgd2hvc2UgdGFyZ2V0IGRvZXMgbm90IHJlc29sdmUgdG8gYSBzeW1ib2wnXG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgW01FU1NBR0VfSURdOiAnSlNEb2MgbGluayB0YXJnZXQgYHt7bmFtZX19YCBkb2VzIG5vdCByZXNvbHZlLiBXYXMgaXQgcmVuYW1lZCBvciByZW1vdmVkPydcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gICAgdHlwZTogJ3Byb2JsZW0nXG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNvbGxlY3RMb2NhbERlY2xhcmF0aW9uTmFtZShub2RlOiBOb2RlLCBsb2NhbERlY2xhcmF0aW9uTmFtZXNCeU5hbWU6IE1hcDxzdHJpbmcsIElkZW50aWZpZXJbXT4pOiB2b2lkIHtcbiAgaWYgKCFpc0xvY2FsRGVjbGFyYXRpb24obm9kZSkgfHwgIW5vZGUubmFtZSB8fCAhaXNJZGVudGlmaWVyKG5vZGUubmFtZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmFtZXMgPSBsb2NhbERlY2xhcmF0aW9uTmFtZXNCeU5hbWUuZ2V0KG5vZGUubmFtZS50ZXh0KSA/PyBbXTtcbiAgbmFtZXMucHVzaChub2RlLm5hbWUpO1xuICBsb2NhbERlY2xhcmF0aW9uTmFtZXNCeU5hbWUuc2V0KG5vZGUubmFtZS50ZXh0LCBuYW1lcyk7XG59XG5cbmZ1bmN0aW9uIGZpbmRNb2R1bGUocHJvZ3JhbTogUHJvZ3JhbSwgY2hlY2tlcjogVHlwZUNoZWNrZXIsIHNwZWNpZmllcjogc3RyaW5nLCBjb250YWluaW5nRmlsZU5hbWU6IHN0cmluZyk6IFRzU3ltYm9sIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYW1iaWVudE1vZHVsZSA9IGdldFByb2dyYW1JbmRleChwcm9ncmFtLCBjaGVja2VyKS5tb2R1bGVzQnlQYXRoLmdldChzcGVjaWZpZXIpO1xuICBpZiAoYW1iaWVudE1vZHVsZSkge1xuICAgIHJldHVybiBhbWJpZW50TW9kdWxlO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRGaWxlTmFtZSA9IHJlc29sdmVNb2R1bGVOYW1lKHNwZWNpZmllciwgY29udGFpbmluZ0ZpbGVOYW1lLCBwcm9ncmFtLmdldENvbXBpbGVyT3B0aW9ucygpLCBzeXMpLnJlc29sdmVkTW9kdWxlPy5yZXNvbHZlZEZpbGVOYW1lO1xuICBjb25zdCByZXNvbHZlZFNvdXJjZUZpbGUgPSByZXNvbHZlZEZpbGVOYW1lID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZWRGaWxlTmFtZSk7XG4gIGNvbnN0IHJlc29sdmVkTW9kdWxlID0gcmVzb2x2ZWRTb3VyY2VGaWxlICYmIGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihyZXNvbHZlZFNvdXJjZUZpbGUpO1xuICByZXR1cm4gcmVzb2x2ZWRNb2R1bGUgPz8gZmluZE1vZHVsZUJ5UGF0aFN1ZmZpeChwcm9ncmFtLCBjaGVja2VyLCBzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBmaW5kTW9kdWxlQnlQYXRoU3VmZml4KHByb2dyYW06IFByb2dyYW0sIGNoZWNrZXI6IFR5cGVDaGVja2VyLCBtb2R1bGVQYXRoOiBzdHJpbmcpOiBUc1N5bWJvbCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbW9kdWxlUGF0aC5yZXBsYWNlKFJFTEFUSVZFX1BBVEhfUFJFRklYX1JFR19FWFAsICcnKS5yZXBsYWNlKFNPVVJDRV9GSUxFX0VYVEVOU0lPTl9SRUdfRVhQLCAnJyk7XG4gIGNvbnN0IHN1ZmZpeGVzID0gW2AvJHtub3JtYWxpemVkUGF0aH1gLCBgLyR7bm9ybWFsaXplZFBhdGh9JHtJTkRFWF9TVUZGSVh9YF07XG4gIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICBjb25zdCBwYXRoV2l0aG91dEV4dGVuc2lvbiA9IHNvdXJjZUZpbGUuZmlsZU5hbWUucmVwbGFjZShTT1VSQ0VfRklMRV9FWFRFTlNJT05fUkVHX0VYUCwgJycpO1xuICAgIGlmIChzdWZmaXhlcy5ldmVyeSgoc3VmZml4KSA9PiAhcGF0aFdpdGhvdXRFeHRlbnNpb24uZW5kc1dpdGgoc3VmZml4KSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBtb2R1bGVTeW1ib2wgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oc291cmNlRmlsZSk7XG4gICAgaWYgKG1vZHVsZVN5bWJvbCkge1xuICAgICAgcmV0dXJuIG1vZHVsZVN5bWJvbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZmxhdHRlbk5hbWUobmFtZTogRW50aXR5TmFtZSB8IEpTRG9jTWVtYmVyTmFtZSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGlzSWRlbnRpZmllcihuYW1lKSA/IFtuYW1lLnRleHRdIDogWy4uLmZsYXR0ZW5OYW1lKG5hbWUubGVmdCksIG5hbWUucmlnaHQudGV4dF07XG59XG5cbmZ1bmN0aW9uIGdldE1lbWJlcihjaGVja2VyOiBUeXBlQ2hlY2tlciwgc3ltYm9sOiBUc1N5bWJvbCwgbWVtYmVyTmFtZTogc3RyaW5nKTogVHNTeW1ib2wgfCB1bmRlZmluZWQge1xuICBjb25zdCBlc2NhcGVkTmFtZSA9IGVzY2FwZUxlYWRpbmdVbmRlcnNjb3JlcyhtZW1iZXJOYW1lKTtcbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZUFsaWFzKGNoZWNrZXIsIHN5bWJvbCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlIC0tIEJpdHdpc2UgZmxhZyB0ZXN0IGlzIGlkaW9tYXRpYyBmb3IgdGhlIFR5cGVTY3JpcHQgY29tcGlsZXIgQVBJLlxuICBjb25zdCBtb2R1bGVFeHBvcnQgPSAodGFyZ2V0LmZsYWdzICYgU3ltYm9sRmxhZ3MuTW9kdWxlKSA9PT0gMCA/IHVuZGVmaW5lZCA6IGNoZWNrZXIudHJ5R2V0TWVtYmVySW5Nb2R1bGVFeHBvcnRzKG1lbWJlck5hbWUsIHRhcmdldCk7XG4gIHJldHVybiBtb2R1bGVFeHBvcnRcbiAgICA/PyB0YXJnZXQuZXhwb3J0cz8uZ2V0KGVzY2FwZWROYW1lKVxuICAgID8/IHRhcmdldC5tZW1iZXJzPy5nZXQoZXNjYXBlZE5hbWUpXG4gICAgPz8gY2hlY2tlci5nZXRQcm9wZXJ0eU9mVHlwZShjaGVja2VyLmdldERlY2xhcmVkVHlwZU9mU3ltYm9sKHRhcmdldCksIG1lbWJlck5hbWUpXG4gICAgPz8gY2hlY2tlci5nZXRQcm9wZXJ0eU9mVHlwZShjaGVja2VyLmdldFR5cGVPZlN5bWJvbCh0YXJnZXQpLCBtZW1iZXJOYW1lKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvZ3JhbUluZGV4KHByb2dyYW06IFByb2dyYW0sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogUHJvZ3JhbUluZGV4IHtcbiAgbGV0IGluZGV4ID0gcHJvZ3JhbUluZGV4Q2FjaGUuZ2V0KHByb2dyYW0pO1xuICBpZiAoaW5kZXgpIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBpbmRleCA9IHtcbiAgICBleHBvcnRzQnlOYW1lOiBuZXcgTWFwPHN0cmluZywgVHNTeW1ib2xbXT4oKSxcbiAgICBtb2R1bGVzQnlQYXRoOiBuZXcgTWFwPHN0cmluZywgVHNTeW1ib2w+KClcbiAgfTtcblxuICBjb25zdCBtb2R1bGVTeW1ib2xzOiBUc1N5bWJvbFtdID0gW107XG4gIGZvciAoY29uc3QgYW1iaWVudE1vZHVsZSBvZiBjaGVja2VyLmdldEFtYmllbnRNb2R1bGVzKCkpIHtcbiAgICBpbmRleC5tb2R1bGVzQnlQYXRoLnNldChhbWJpZW50TW9kdWxlLm5hbWUucmVwbGFjZUFsbCgnXCInLCAnJyksIGFtYmllbnRNb2R1bGUpO1xuICAgIG1vZHVsZVN5bWJvbHMucHVzaChhbWJpZW50TW9kdWxlKTtcbiAgfVxuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgY29uc3QgbW9kdWxlU3ltYm9sID0gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKHNvdXJjZUZpbGUpO1xuICAgIGlmIChtb2R1bGVTeW1ib2wpIHtcbiAgICAgIG1vZHVsZVN5bWJvbHMucHVzaChtb2R1bGVTeW1ib2wpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgbW9kdWxlU3ltYm9sIG9mIG1vZHVsZVN5bWJvbHMpIHtcbiAgICBmb3IgKGNvbnN0IGV4cG9ydFN5bWJvbCBvZiBjaGVja2VyLmdldEV4cG9ydHNPZk1vZHVsZShtb2R1bGVTeW1ib2wpKSB7XG4gICAgICBjb25zdCBzeW1ib2xzID0gaW5kZXguZXhwb3J0c0J5TmFtZS5nZXQoZXhwb3J0U3ltYm9sLm5hbWUpID8/IFtdO1xuICAgICAgc3ltYm9scy5wdXNoKGV4cG9ydFN5bWJvbCk7XG4gICAgICBpbmRleC5leHBvcnRzQnlOYW1lLnNldChleHBvcnRTeW1ib2wubmFtZSwgc3ltYm9scyk7XG4gICAgfVxuICB9XG5cbiAgcHJvZ3JhbUluZGV4Q2FjaGUuc2V0KHByb2dyYW0sIGluZGV4KTtcbiAgcmV0dXJuIGluZGV4O1xufVxuXG5mdW5jdGlvbiBpc0pTRG9jTGlua0xpa2Uobm9kZTogTm9kZSk6IG5vZGUgaXMgSlNEb2NMaW5rTGlrZSB7XG4gIHJldHVybiBpc0pTRG9jTGluayhub2RlKSB8fCBpc0pTRG9jTGlua0NvZGUobm9kZSkgfHwgaXNKU0RvY0xpbmtQbGFpbihub2RlKTtcbn1cblxuZnVuY3Rpb24gaXNMb2NhbERlY2xhcmF0aW9uKG5vZGU6IE5vZGUpOiBub2RlIGlzIExvY2FsRGVjbGFyYXRpb24ge1xuICByZXR1cm4gaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNFbnVtRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0ludGVyZmFjZURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNNZXRob2REZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzTWV0aG9kU2lnbmF0dXJlKG5vZGUpXG4gICAgfHwgaXNNb2R1bGVEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzUHJvcGVydHlEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzUHJvcGVydHlTaWduYXR1cmUobm9kZSlcbiAgICB8fCBpc1NldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc1R5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBpc1Jlc29sdmVkTmFtZShwYXJhbXM6IElzUmVzb2x2ZWROYW1lUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICBjaGVja2VyLFxuICAgIGNvbnRhaW5pbmdGaWxlTmFtZSxcbiAgICBsb2NhbERlY2xhcmF0aW9uTmFtZXNCeU5hbWUsXG4gICAgbmFtZSxcbiAgICBwcm9ncmFtXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihuYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gYEZvbyNiYXJgIGlzIGEgYEpTRG9jTWVtYmVyTmFtZWAsIHdoaWNoIHRoZSBjaGVja2VyIHJlc29sdmVzIG9ubHkgdGhyb3VnaCBpdHMgcmlnaHQtaGFuZCBtZW1iZXIuXG4gIGlmIChpc0pTRG9jTWVtYmVyTmFtZShuYW1lKSAmJiBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obmFtZS5yaWdodCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtyb290TmFtZSA9ICcnLCAuLi5tZW1iZXJOYW1lc10gPSBmbGF0dGVuTmFtZShuYW1lKTtcbiAgY29uc3QgaW5kZXggPSBnZXRQcm9ncmFtSW5kZXgocHJvZ3JhbSwgY2hlY2tlcik7XG4gIGNvbnN0IGxvY2FsUm9vdHMgPSAobG9jYWxEZWNsYXJhdGlvbk5hbWVzQnlOYW1lLmdldChyb290TmFtZSkgPz8gW10pLm1hcCgoZGVjbGFyYXRpb25OYW1lKSA9PiBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oZGVjbGFyYXRpb25OYW1lKSk7XG4gIGNvbnN0IHJvb3RzID0gWy4uLmxvY2FsUm9vdHMsIC4uLmluZGV4LmV4cG9ydHNCeU5hbWUuZ2V0KHJvb3ROYW1lKSA/PyBbXSwgZmluZE1vZHVsZShwcm9ncmFtLCBjaGVja2VyLCByb290TmFtZSwgY29udGFpbmluZ0ZpbGVOYW1lKV07XG5cbiAgcmV0dXJuIHJvb3RzLnNvbWUoKHJvb3QpID0+ICEhcmVzb2x2ZU1lbWJlclBhdGgoY2hlY2tlciwgcm9vdCwgbWVtYmVyTmFtZXMpKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzKGNoZWNrZXI6IFR5cGVDaGVja2VyLCBzeW1ib2w6IFRzU3ltYm9sKTogVHNTeW1ib2wge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSAtLSBCaXR3aXNlIGZsYWcgdGVzdCBpcyBpZGlvbWF0aWMgZm9yIHRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIEFQSS5cbiAgcmV0dXJuIChzeW1ib2wuZmxhZ3MgJiBTeW1ib2xGbGFncy5BbGlhcykgPT09IDAgPyBzeW1ib2wgOiBjaGVja2VyLmdldEFsaWFzZWRTeW1ib2woc3ltYm9sKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU1lbWJlclBhdGgoY2hlY2tlcjogVHlwZUNoZWNrZXIsIHJvb3Q6IFRzU3ltYm9sIHwgdW5kZWZpbmVkLCBtZW1iZXJOYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiBUc1N5bWJvbCB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50OiBUc1N5bWJvbCB8IHVuZGVmaW5lZCA9IHJvb3Q7XG4gIGZvciAoY29uc3QgbWVtYmVyTmFtZSBvZiBtZW1iZXJOYW1lcykge1xuICAgIGlmICghY3VycmVudCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IGdldE1lbWJlcihjaGVja2VyLCBjdXJyZW50LCBtZW1iZXJOYW1lKTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0VBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsc0JBQXNCO0FBS3hCLE1BQU0sYUFBYTtBQWtDMUIsTUFB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
@@ -0,0 +1,41 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * ESLint rule: no-unused-params-members
6
+ *
7
+ * Flags members of a `*Params` / `*Options` parameter-bag interface that are
8
+ * never accessed within the function/method/constructor that receives the
9
+ * interface as a parameter.
10
+ *
11
+ * Detection is per-function, using scope analysis to find the real references
12
+ * to the parameter (not unrelated same-named identifiers). A member counts as
13
+ * used when it is referenced by name — `params.member`, `params['member']`, or
14
+ * `const { member } = params` (plus a destructured signature
15
+ * `fn({ member }: FooParams)`).
16
+ *
17
+ * Crucially, if the object ever ESCAPES whole — spread (`{ ...params }`), rest
18
+ * (`const { ...rest } = params`), passed as an argument (`f(params)`), returned,
19
+ * or stored (`this.params = params`) — every member is treated as used and
20
+ * nothing is reported for that interface. Such an escape either reads every
21
+ * member (spread/rest) or hands the object to code this rule cannot see, so
22
+ * member deadness cannot be decided locally.
23
+ *
24
+ * A member is therefore flagged only when it is never referenced by name AND
25
+ * the object never escapes — i.e. the "a `params.x` usage was deleted but `x`
26
+ * was left on the interface" case. A member that is actually still needed (read
27
+ * via an escape) is never wrongly flagged; a member that is escaped but dead
28
+ * downstream is a tolerated false negative (its deadness is not local).
29
+ *
30
+ * Only interfaces declared in the same file are checked; an imported parameter
31
+ * type is skipped. Only identifier-named members are tracked.
32
+ */
33
+ import type { Rule } from 'eslint';
34
+ /**
35
+ Message ID reported when a `*Params`/`*Options` interface member is never accessed by the function that receives it.
36
+ */
37
+ export declare const MESSAGE_ID = "unusedParamsMember";
38
+ /**
39
+ * ESLint rule flagging `*Params`/`*Options` interface members that the function receiving them never accesses.
40
+ */
41
+ export declare const noUnusedParamsMembers: Rule.RuleModule;
@@ -0,0 +1,227 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ const existingProcess = globalThis.process;
23
+
24
+ if (!existingProcess) {
25
+ globalThis.process = browserProcess;
26
+ return;
27
+ }
28
+
29
+ if (existingProcess.versions?.node) {
30
+ return;
31
+ }
32
+
33
+ const existingProcessRecord = existingProcess;
34
+
35
+ for (const [key, value] of Object.entries(browserProcess)) {
36
+ existingProcessRecord[key] ??= value;
37
+ }
38
+
39
+ existingProcessRecord['browser'] = true;
40
+ }
41
+
42
+ (function initEsm() {
43
+ ensureDisposeSymbols();
44
+ ensureBrowserProcess();
45
+ })();
46
+ })();
47
+
48
+ import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
49
+ const PARAMS_OPTIONS_SUFFIX_PATTERN = /(?:Params|Options)$/;
50
+ const MESSAGE_ID = "unusedParamsMember";
51
+ const noUnusedParamsMembers = {
52
+ create(context) {
53
+ const interfaceKeyNodes = /* @__PURE__ */ new Map();
54
+ const usageByInterface = /* @__PURE__ */ new Map();
55
+ return {
56
+ ":function"(node) {
57
+ for (const parameter of record(node)["params"]) {
58
+ const info = getParameterInfo(parameter);
59
+ if (!info) {
60
+ continue;
61
+ }
62
+ const usage = getOrCreateUsage(info.typeName);
63
+ if (info.binding.type === "pattern") {
64
+ collectPatternMembers(info.binding.pattern, usage);
65
+ } else {
66
+ collectReferenceMembers({
67
+ parameterName: info.binding.name,
68
+ scope: context.sourceCode.getScope(node),
69
+ usage
70
+ });
71
+ }
72
+ }
73
+ },
74
+ "Program:exit"() {
75
+ for (const [typeName, keyNodes] of interfaceKeyNodes) {
76
+ const usage = usageByInterface.get(typeName);
77
+ if (!usage || usage.usesAll) {
78
+ continue;
79
+ }
80
+ for (const [memberName, keyNode] of keyNodes) {
81
+ if (!usage.used.has(memberName)) {
82
+ context.report({
83
+ data: {
84
+ interfaceName: typeName,
85
+ member: memberName
86
+ },
87
+ messageId: MESSAGE_ID,
88
+ node: keyNode
89
+ });
90
+ }
91
+ }
92
+ }
93
+ },
94
+ TSInterfaceDeclaration(node) {
95
+ const name = getInterfaceName(node);
96
+ if (!PARAMS_OPTIONS_SUFFIX_PATTERN.test(name)) {
97
+ return;
98
+ }
99
+ interfaceKeyNodes.set(name, getInterfaceMembers(node));
100
+ }
101
+ };
102
+ function getOrCreateUsage(typeName) {
103
+ let usage = usageByInterface.get(typeName);
104
+ if (!usage) {
105
+ usage = { used: /* @__PURE__ */ new Set(), usesAll: false };
106
+ usageByInterface.set(typeName, usage);
107
+ }
108
+ return usage;
109
+ }
110
+ },
111
+ meta: {
112
+ docs: {
113
+ description: "Flag `*Params`/`*Options` interface members never accessed by the function that receives them"
114
+ },
115
+ messages: {
116
+ [MESSAGE_ID]: 'Member "{{ member }}" of "{{ interfaceName }}" is never accessed by the function that receives it. Remove it (the compiler will catch it if it is still needed elsewhere).'
117
+ },
118
+ schema: [],
119
+ type: "suggestion"
120
+ }
121
+ };
122
+ function classifyReference(reference, usage) {
123
+ const parent = record(reference)["parent"];
124
+ if (parent.type === "MemberExpression" && record(parent)["object"] === reference) {
125
+ collectMemberAccess(parent, usage);
126
+ return;
127
+ }
128
+ if (parent.type === "VariableDeclarator" && record(parent)["init"] === reference && record(parent)["id"].type === "ObjectPattern") {
129
+ collectPatternMembers(record(parent)["id"], usage);
130
+ return;
131
+ }
132
+ usage.usesAll = true;
133
+ }
134
+ function collectMemberAccess(node, usage) {
135
+ const isComputed = record(node)["computed"] === true;
136
+ const property = record(node)["property"];
137
+ if (property.type === "Identifier") {
138
+ if (!isComputed) {
139
+ usage.used.add(record(property)["name"]);
140
+ }
141
+ return;
142
+ }
143
+ if (property.type !== "Literal") {
144
+ return;
145
+ }
146
+ const value = record(property)["value"];
147
+ if (typeof value === "string") {
148
+ usage.used.add(value);
149
+ }
150
+ }
151
+ function collectPatternMembers(pattern, usage) {
152
+ for (const property of record(pattern)["properties"]) {
153
+ if (property.type !== "Property") {
154
+ usage.usesAll = true;
155
+ continue;
156
+ }
157
+ if (record(property)["computed"] === true) {
158
+ continue;
159
+ }
160
+ const key = record(property)["key"];
161
+ if (key.type === "Identifier") {
162
+ usage.used.add(record(key)["name"]);
163
+ }
164
+ }
165
+ }
166
+ function collectReferenceMembers(params) {
167
+ const { parameterName, scope, usage } = params;
168
+ const variable = ensureNonNullable(scope.set.get(parameterName));
169
+ for (const reference of variable.references) {
170
+ classifyReference(reference.identifier, usage);
171
+ }
172
+ }
173
+ function getInterfaceMembers(node) {
174
+ const members = /* @__PURE__ */ new Map();
175
+ const interfaceBody = record(node)["body"];
176
+ for (const signature of record(interfaceBody)["body"]) {
177
+ if (nodeType(signature) !== "TSPropertySignature" && nodeType(signature) !== "TSMethodSignature" || record(signature)["computed"] === true) {
178
+ continue;
179
+ }
180
+ const key = record(signature)["key"];
181
+ if (key.type === "Identifier") {
182
+ members.set(record(key)["name"], key);
183
+ }
184
+ }
185
+ return members;
186
+ }
187
+ function getInterfaceName(node) {
188
+ const id = record(node)["id"];
189
+ return record(id)["name"];
190
+ }
191
+ function getParameterInfo(parameter) {
192
+ const actualParameter = nodeType(parameter) === "TSParameterProperty" ? record(parameter)["parameter"] : parameter;
193
+ const typeName = getTypeReferenceName(actualParameter);
194
+ if (!typeName || !PARAMS_OPTIONS_SUFFIX_PATTERN.test(typeName)) {
195
+ return void 0;
196
+ }
197
+ if (actualParameter.type === "Identifier") {
198
+ return { binding: { name: record(actualParameter)["name"], type: "identifier" }, typeName };
199
+ }
200
+ return actualParameter.type === "ObjectPattern" ? { binding: { pattern: actualParameter, type: "pattern" }, typeName } : void 0;
201
+ }
202
+ function getTypeReferenceName(parameter) {
203
+ const annotation = record(parameter)["typeAnnotation"];
204
+ if (!isNode(annotation)) {
205
+ return void 0;
206
+ }
207
+ const typeNode = record(annotation)["typeAnnotation"];
208
+ if (nodeType(typeNode) !== "TSTypeReference") {
209
+ return void 0;
210
+ }
211
+ const typeName = record(typeNode)["typeName"];
212
+ return typeName.type === "Identifier" ? record(typeName)["name"] : void 0;
213
+ }
214
+ function isNode(value) {
215
+ return typeof value === "object" && value !== null && typeof value.type === "string";
216
+ }
217
+ function nodeType(node) {
218
+ return record(node)["type"];
219
+ }
220
+ function record(node) {
221
+ return node;
222
+ }
223
+ export {
224
+ MESSAGE_ID,
225
+ noUnusedParamsMembers
226
+ };
227
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvZXNsaW50LXJ1bGVzL25vLXVudXNlZC1wYXJhbXMtbWVtYmVycy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEVTTGludCBydWxlOiBuby11bnVzZWQtcGFyYW1zLW1lbWJlcnNcbiAqXG4gKiBGbGFncyBtZW1iZXJzIG9mIGEgYCpQYXJhbXNgIC8gYCpPcHRpb25zYCBwYXJhbWV0ZXItYmFnIGludGVyZmFjZSB0aGF0IGFyZVxuICogbmV2ZXIgYWNjZXNzZWQgd2l0aGluIHRoZSBmdW5jdGlvbi9tZXRob2QvY29uc3RydWN0b3IgdGhhdCByZWNlaXZlcyB0aGVcbiAqIGludGVyZmFjZSBhcyBhIHBhcmFtZXRlci5cbiAqXG4gKiBEZXRlY3Rpb24gaXMgcGVyLWZ1bmN0aW9uLCB1c2luZyBzY29wZSBhbmFseXNpcyB0byBmaW5kIHRoZSByZWFsIHJlZmVyZW5jZXNcbiAqIHRvIHRoZSBwYXJhbWV0ZXIgKG5vdCB1bnJlbGF0ZWQgc2FtZS1uYW1lZCBpZGVudGlmaWVycykuIEEgbWVtYmVyIGNvdW50cyBhc1xuICogdXNlZCB3aGVuIGl0IGlzIHJlZmVyZW5jZWQgYnkgbmFtZSBcdTIwMTQgYHBhcmFtcy5tZW1iZXJgLCBgcGFyYW1zWydtZW1iZXInXWAsIG9yXG4gKiBgY29uc3QgeyBtZW1iZXIgfSA9IHBhcmFtc2AgKHBsdXMgYSBkZXN0cnVjdHVyZWQgc2lnbmF0dXJlXG4gKiBgZm4oeyBtZW1iZXIgfTogRm9vUGFyYW1zKWApLlxuICpcbiAqIENydWNpYWxseSwgaWYgdGhlIG9iamVjdCBldmVyIEVTQ0FQRVMgd2hvbGUgXHUyMDE0IHNwcmVhZCAoYHsgLi4ucGFyYW1zIH1gKSwgcmVzdFxuICogKGBjb25zdCB7IC4uLnJlc3QgfSA9IHBhcmFtc2ApLCBwYXNzZWQgYXMgYW4gYXJndW1lbnQgKGBmKHBhcmFtcylgKSwgcmV0dXJuZWQsXG4gKiBvciBzdG9yZWQgKGB0aGlzLnBhcmFtcyA9IHBhcmFtc2ApIFx1MjAxNCBldmVyeSBtZW1iZXIgaXMgdHJlYXRlZCBhcyB1c2VkIGFuZFxuICogbm90aGluZyBpcyByZXBvcnRlZCBmb3IgdGhhdCBpbnRlcmZhY2UuIFN1Y2ggYW4gZXNjYXBlIGVpdGhlciByZWFkcyBldmVyeVxuICogbWVtYmVyIChzcHJlYWQvcmVzdCkgb3IgaGFuZHMgdGhlIG9iamVjdCB0byBjb2RlIHRoaXMgcnVsZSBjYW5ub3Qgc2VlLCBzb1xuICogbWVtYmVyIGRlYWRuZXNzIGNhbm5vdCBiZSBkZWNpZGVkIGxvY2FsbHkuXG4gKlxuICogQSBtZW1iZXIgaXMgdGhlcmVmb3JlIGZsYWdnZWQgb25seSB3aGVuIGl0IGlzIG5ldmVyIHJlZmVyZW5jZWQgYnkgbmFtZSBBTkRcbiAqIHRoZSBvYmplY3QgbmV2ZXIgZXNjYXBlcyBcdTIwMTQgaS5lLiB0aGUgXCJhIGBwYXJhbXMueGAgdXNhZ2Ugd2FzIGRlbGV0ZWQgYnV0IGB4YFxuICogd2FzIGxlZnQgb24gdGhlIGludGVyZmFjZVwiIGNhc2UuIEEgbWVtYmVyIHRoYXQgaXMgYWN0dWFsbHkgc3RpbGwgbmVlZGVkIChyZWFkXG4gKiB2aWEgYW4gZXNjYXBlKSBpcyBuZXZlciB3cm9uZ2x5IGZsYWdnZWQ7IGEgbWVtYmVyIHRoYXQgaXMgZXNjYXBlZCBidXQgZGVhZFxuICogZG93bnN0cmVhbSBpcyBhIHRvbGVyYXRlZCBmYWxzZSBuZWdhdGl2ZSAoaXRzIGRlYWRuZXNzIGlzIG5vdCBsb2NhbCkuXG4gKlxuICogT25seSBpbnRlcmZhY2VzIGRlY2xhcmVkIGluIHRoZSBzYW1lIGZpbGUgYXJlIGNoZWNrZWQ7IGFuIGltcG9ydGVkIHBhcmFtZXRlclxuICogdHlwZSBpcyBza2lwcGVkLiBPbmx5IGlkZW50aWZpZXItbmFtZWQgbWVtYmVycyBhcmUgdHJhY2tlZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFJ1bGUsXG4gIFNjb3BlXG59IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcblxuY29uc3QgUEFSQU1TX09QVElPTlNfU1VGRklYX1BBVFRFUk4gPSAvKD86UGFyYW1zfE9wdGlvbnMpJC87XG5cbi8qKlxuTWVzc2FnZSBJRCByZXBvcnRlZCB3aGVuIGEgYCpQYXJhbXNgL2AqT3B0aW9uc2AgaW50ZXJmYWNlIG1lbWJlciBpcyBuZXZlciBhY2Nlc3NlZCBieSB0aGUgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSUQgPSAndW51c2VkUGFyYW1zTWVtYmVyJztcblxuaW50ZXJmYWNlIElkZW50aWZpZXJCaW5kaW5nIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiAnaWRlbnRpZmllcic7XG59XG5cbmludGVyZmFjZSBJbnRlcmZhY2VVc2FnZSB7XG4gIHJlYWRvbmx5IHVzZWQ6IFNldDxzdHJpbmc+O1xuICB1c2VzQWxsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTWF5YmVUeXBlZE5vZGUge1xuICB0eXBlPzogdW5rbm93bjtcbn1cblxudHlwZSBQYXJhbWV0ZXJCaW5kaW5nID0gSWRlbnRpZmllckJpbmRpbmcgfCBQYXR0ZXJuQmluZGluZztcblxuaW50ZXJmYWNlIFBhcmFtZXRlckluZm8ge1xuICByZWFkb25seSBiaW5kaW5nOiBQYXJhbWV0ZXJCaW5kaW5nO1xuICByZWFkb25seSB0eXBlTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGF0dGVybkJpbmRpbmcge1xuICBwYXR0ZXJuOiBSdWxlLk5vZGU7XG4gIHR5cGU6ICdwYXR0ZXJuJztcbn1cblxuLyoqXG4gKiBFU0xpbnQgcnVsZSBmbGFnZ2luZyBgKlBhcmFtc2AvYCpPcHRpb25zYCBpbnRlcmZhY2UgbWVtYmVycyB0aGF0IHRoZSBmdW5jdGlvbiByZWNlaXZpbmcgdGhlbSBuZXZlciBhY2Nlc3Nlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vVW51c2VkUGFyYW1zTWVtYmVyczogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IGludGVyZmFjZUtleU5vZGVzID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFJ1bGUuTm9kZT4+KCk7XG4gICAgY29uc3QgdXNhZ2VCeUludGVyZmFjZSA9IG5ldyBNYXA8c3RyaW5nLCBJbnRlcmZhY2VVc2FnZT4oKTtcblxuICAgIHJldHVybiB7XG4gICAgICAnOmZ1bmN0aW9uJyhub2RlOiBSdWxlLk5vZGUpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgcmVjb3JkKG5vZGUpWydwYXJhbXMnXSBhcyBSdWxlLk5vZGVbXSkge1xuICAgICAgICAgIGNvbnN0IGluZm8gPSBnZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlcik7XG4gICAgICAgICAgaWYgKCFpbmZvKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB1c2FnZSA9IGdldE9yQ3JlYXRlVXNhZ2UoaW5mby50eXBlTmFtZSk7XG4gICAgICAgICAgaWYgKGluZm8uYmluZGluZy50eXBlID09PSAncGF0dGVybicpIHtcbiAgICAgICAgICAgIGNvbGxlY3RQYXR0ZXJuTWVtYmVycyhpbmZvLmJpbmRpbmcucGF0dGVybiwgdXNhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb2xsZWN0UmVmZXJlbmNlTWVtYmVycyh7XG4gICAgICAgICAgICAgIHBhcmFtZXRlck5hbWU6IGluZm8uYmluZGluZy5uYW1lLFxuICAgICAgICAgICAgICBzY29wZTogY29udGV4dC5zb3VyY2VDb2RlLmdldFNjb3BlKG5vZGUpLFxuICAgICAgICAgICAgICB1c2FnZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJ1Byb2dyYW06ZXhpdCcoKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW3R5cGVOYW1lLCBrZXlOb2Rlc10gb2YgaW50ZXJmYWNlS2V5Tm9kZXMpIHtcbiAgICAgICAgICBjb25zdCB1c2FnZSA9IHVzYWdlQnlJbnRlcmZhY2UuZ2V0KHR5cGVOYW1lKTtcbiAgICAgICAgICBpZiAoIXVzYWdlIHx8IHVzYWdlLnVzZXNBbGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgW21lbWJlck5hbWUsIGtleU5vZGVdIG9mIGtleU5vZGVzKSB7XG4gICAgICAgICAgICBpZiAoIXVzYWdlLnVzZWQuaGFzKG1lbWJlck5hbWUpKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lOiB0eXBlTmFtZSxcbiAgICAgICAgICAgICAgICAgIG1lbWJlcjogbWVtYmVyTmFtZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkOiBNRVNTQUdFX0lELFxuICAgICAgICAgICAgICAgIG5vZGU6IGtleU5vZGVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgVFNJbnRlcmZhY2VEZWNsYXJhdGlvbihub2RlOiBSdWxlLk5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGdldEludGVyZmFjZU5hbWUobm9kZSk7XG4gICAgICAgIGlmICghUEFSQU1TX09QVElPTlNfU1VGRklYX1BBVFRFUk4udGVzdChuYW1lKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcmZhY2VLZXlOb2Rlcy5zZXQobmFtZSwgZ2V0SW50ZXJmYWNlTWVtYmVycyhub2RlKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVXNhZ2UodHlwZU5hbWU6IHN0cmluZyk6IEludGVyZmFjZVVzYWdlIHtcbiAgICAgIGxldCB1c2FnZSA9IHVzYWdlQnlJbnRlcmZhY2UuZ2V0KHR5cGVOYW1lKTtcbiAgICAgIGlmICghdXNhZ2UpIHtcbiAgICAgICAgdXNhZ2UgPSB7IHVzZWQ6IG5ldyBTZXQ8c3RyaW5nPigpLCB1c2VzQWxsOiBmYWxzZSB9O1xuICAgICAgICB1c2FnZUJ5SW50ZXJmYWNlLnNldCh0eXBlTmFtZSwgdXNhZ2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVzYWdlO1xuICAgIH1cbiAgfSxcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRmxhZyBgKlBhcmFtc2AvYCpPcHRpb25zYCBpbnRlcmZhY2UgbWVtYmVycyBuZXZlciBhY2Nlc3NlZCBieSB0aGUgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyB0aGVtJ1xuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtNRVNTQUdFX0lEXTogJ01lbWJlciBcInt7IG1lbWJlciB9fVwiIG9mIFwie3sgaW50ZXJmYWNlTmFtZSB9fVwiIGlzIG5ldmVyIGFjY2Vzc2VkIGJ5IHRoZSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGl0LiBSZW1vdmUgaXQgKHRoZSBjb21waWxlciB3aWxsIGNhdGNoIGl0IGlmIGl0IGlzIHN0aWxsIG5lZWRlZCBlbHNld2hlcmUpLidcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nXG4gIH1cbn07XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvbGxlY3RSZWZlcmVuY2VNZW1iZXJzfS5cbiAqL1xuaW50ZXJmYWNlIENvbGxlY3RSZWZlcmVuY2VNZW1iZXJzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgd2hvc2UgcmVmZXJlbmNlcyBhcmUgaW5zcGVjdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NvcGUgaW4gd2hpY2ggdGhlIHBhcmFtZXRlciBpcyBib3VuZC5cbiAgICovXG4gIHJlYWRvbmx5IHNjb3BlOiBTY29wZS5TY29wZTtcblxuICAvKipcbiAgICogVGhlIHVzYWdlIGFjY3VtdWxhdG9yIHRvIHJlY29yZCBhY2Nlc3NlZCBtZW1iZXJzIGludG8uXG4gICAqL1xuICByZWFkb25seSB1c2FnZTogSW50ZXJmYWNlVXNhZ2U7XG59XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5UmVmZXJlbmNlKHJlZmVyZW5jZTogb2JqZWN0LCB1c2FnZTogSW50ZXJmYWNlVXNhZ2UpOiB2b2lkIHtcbiAgY29uc3QgcGFyZW50ID0gcmVjb3JkKHJlZmVyZW5jZSlbJ3BhcmVudCddIGFzIFJ1bGUuTm9kZTtcbiAgaWYgKHBhcmVudC50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicgJiYgcmVjb3JkKHBhcmVudClbJ29iamVjdCddID09PSByZWZlcmVuY2UpIHtcbiAgICBjb2xsZWN0TWVtYmVyQWNjZXNzKHBhcmVudCwgdXNhZ2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwYXJlbnQudHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRvcicgJiYgcmVjb3JkKHBhcmVudClbJ2luaXQnXSA9PT0gcmVmZXJlbmNlICYmIChyZWNvcmQocGFyZW50KVsnaWQnXSBhcyBSdWxlLk5vZGUpLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJykge1xuICAgIGNvbGxlY3RQYXR0ZXJuTWVtYmVycyhyZWNvcmQocGFyZW50KVsnaWQnXSBhcyBSdWxlLk5vZGUsIHVzYWdlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgb2JqZWN0IGVzY2FwZXMgd2hvbGUgKHBhc3NlZCBhcyBhbiBhcmd1bWVudCwgcmV0dXJuZWQsIHN0b3JlZCwgc3ByZWFkLCAuLi4pOiBldmVyeSBtZW1iZXIgbWF5IGJlIHJlYWQgZWxzZXdoZXJlLlxuICB1c2FnZS51c2VzQWxsID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdE1lbWJlckFjY2Vzcyhub2RlOiBSdWxlLk5vZGUsIHVzYWdlOiBJbnRlcmZhY2VVc2FnZSk6IHZvaWQge1xuICBjb25zdCBpc0NvbXB1dGVkID0gcmVjb3JkKG5vZGUpWydjb21wdXRlZCddID09PSB0cnVlO1xuICBjb25zdCBwcm9wZXJ0eSA9IHJlY29yZChub2RlKVsncHJvcGVydHknXSBhcyBSdWxlLk5vZGU7XG4gIGlmIChwcm9wZXJ0eS50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICBpZiAoIWlzQ29tcHV0ZWQpIHtcbiAgICAgIHVzYWdlLnVzZWQuYWRkKHJlY29yZChwcm9wZXJ0eSlbJ25hbWUnXSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJvcGVydHkudHlwZSAhPT0gJ0xpdGVyYWwnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSByZWNvcmQocHJvcGVydHkpWyd2YWx1ZSddO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHVzYWdlLnVzZWQuYWRkKHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0UGF0dGVybk1lbWJlcnMocGF0dGVybjogUnVsZS5Ob2RlLCB1c2FnZTogSW50ZXJmYWNlVXNhZ2UpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiByZWNvcmQocGF0dGVybilbJ3Byb3BlcnRpZXMnXSBhcyBSdWxlLk5vZGVbXSkge1xuICAgIGlmIChwcm9wZXJ0eS50eXBlICE9PSAnUHJvcGVydHknKSB7XG4gICAgICAvLyBgY29uc3QgeyAuLi5yZXN0IH0gPSBwYXJhbXNgIHJlYWRzIGV2ZXJ5IHJlbWFpbmluZyBtZW1iZXIuXG4gICAgICB1c2FnZS51c2VzQWxsID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocmVjb3JkKHByb3BlcnR5KVsnY29tcHV0ZWQnXSA9PT0gdHJ1ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHJlY29yZChwcm9wZXJ0eSlbJ2tleSddIGFzIFJ1bGUuTm9kZTtcbiAgICBpZiAoa2V5LnR5cGUgPT09ICdJZGVudGlmaWVyJykge1xuICAgICAgdXNhZ2UudXNlZC5hZGQocmVjb3JkKGtleSlbJ25hbWUnXSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0UmVmZXJlbmNlTWVtYmVycyhwYXJhbXM6IENvbGxlY3RSZWZlcmVuY2VNZW1iZXJzUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHsgcGFyYW1ldGVyTmFtZSwgc2NvcGUsIHVzYWdlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHZhcmlhYmxlID0gZW5zdXJlTm9uTnVsbGFibGUoc2NvcGUuc2V0LmdldChwYXJhbWV0ZXJOYW1lKSk7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHZhcmlhYmxlLnJlZmVyZW5jZXMpIHtcbiAgICBjbGFzc2lmeVJlZmVyZW5jZShyZWZlcmVuY2UuaWRlbnRpZmllciwgdXNhZ2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEludGVyZmFjZU1lbWJlcnMobm9kZTogUnVsZS5Ob2RlKTogTWFwPHN0cmluZywgUnVsZS5Ob2RlPiB7XG4gIGNvbnN0IG1lbWJlcnMgPSBuZXcgTWFwPHN0cmluZywgUnVsZS5Ob2RlPigpO1xuICBjb25zdCBpbnRlcmZhY2VCb2R5ID0gcmVjb3JkKG5vZGUpWydib2R5J10gYXMgUnVsZS5Ob2RlO1xuICBmb3IgKGNvbnN0IHNpZ25hdHVyZSBvZiByZWNvcmQoaW50ZXJmYWNlQm9keSlbJ2JvZHknXSBhcyBSdWxlLk5vZGVbXSkge1xuICAgIGlmICgobm9kZVR5cGUoc2lnbmF0dXJlKSAhPT0gJ1RTUHJvcGVydHlTaWduYXR1cmUnICYmIG5vZGVUeXBlKHNpZ25hdHVyZSkgIT09ICdUU01ldGhvZFNpZ25hdHVyZScpIHx8IChyZWNvcmQoc2lnbmF0dXJlKVsnY29tcHV0ZWQnXSA9PT0gdHJ1ZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSByZWNvcmQoc2lnbmF0dXJlKVsna2V5J10gYXMgUnVsZS5Ob2RlO1xuICAgIGlmIChrZXkudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICBtZW1iZXJzLnNldChyZWNvcmQoa2V5KVsnbmFtZSddIGFzIHN0cmluZywga2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lbWJlcnM7XG59XG5cbmZ1bmN0aW9uIGdldEludGVyZmFjZU5hbWUobm9kZTogUnVsZS5Ob2RlKTogc3RyaW5nIHtcbiAgY29uc3QgaWQgPSByZWNvcmQobm9kZSlbJ2lkJ10gYXMgUnVsZS5Ob2RlO1xuICByZXR1cm4gcmVjb3JkKGlkKVsnbmFtZSddIGFzIHN0cmluZztcbn1cblxuZnVuY3Rpb24gZ2V0UGFyYW1ldGVySW5mbyhwYXJhbWV0ZXI6IFJ1bGUuTm9kZSk6IFBhcmFtZXRlckluZm8gfCB1bmRlZmluZWQge1xuICBjb25zdCBhY3R1YWxQYXJhbWV0ZXIgPSBub2RlVHlwZShwYXJhbWV0ZXIpID09PSAnVFNQYXJhbWV0ZXJQcm9wZXJ0eScgPyByZWNvcmQocGFyYW1ldGVyKVsncGFyYW1ldGVyJ10gYXMgUnVsZS5Ob2RlIDogcGFyYW1ldGVyO1xuXG4gIGNvbnN0IHR5cGVOYW1lID0gZ2V0VHlwZVJlZmVyZW5jZU5hbWUoYWN0dWFsUGFyYW1ldGVyKTtcbiAgaWYgKCF0eXBlTmFtZSB8fCAhUEFSQU1TX09QVElPTlNfU1VGRklYX1BBVFRFUk4udGVzdCh0eXBlTmFtZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKGFjdHVhbFBhcmFtZXRlci50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICByZXR1cm4geyBiaW5kaW5nOiB7IG5hbWU6IHJlY29yZChhY3R1YWxQYXJhbWV0ZXIpWyduYW1lJ10gYXMgc3RyaW5nLCB0eXBlOiAnaWRlbnRpZmllcicgfSwgdHlwZU5hbWUgfTtcbiAgfVxuXG4gIHJldHVybiBhY3R1YWxQYXJhbWV0ZXIudHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nID8geyBiaW5kaW5nOiB7IHBhdHRlcm46IGFjdHVhbFBhcmFtZXRlciwgdHlwZTogJ3BhdHRlcm4nIH0sIHR5cGVOYW1lIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFR5cGVSZWZlcmVuY2VOYW1lKHBhcmFtZXRlcjogUnVsZS5Ob2RlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYW5ub3RhdGlvbiA9IHJlY29yZChwYXJhbWV0ZXIpWyd0eXBlQW5ub3RhdGlvbiddO1xuICBpZiAoIWlzTm9kZShhbm5vdGF0aW9uKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCB0eXBlTm9kZSA9IHJlY29yZChhbm5vdGF0aW9uKVsndHlwZUFubm90YXRpb24nXSBhcyBSdWxlLk5vZGU7XG4gIGlmIChub2RlVHlwZSh0eXBlTm9kZSkgIT09ICdUU1R5cGVSZWZlcmVuY2UnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHR5cGVOYW1lID0gcmVjb3JkKHR5cGVOb2RlKVsndHlwZU5hbWUnXSBhcyBSdWxlLk5vZGU7XG4gIHJldHVybiB0eXBlTmFtZS50eXBlID09PSAnSWRlbnRpZmllcicgPyAocmVjb3JkKHR5cGVOYW1lKVsnbmFtZSddIGFzIHN0cmluZykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzTm9kZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJ1bGUuTm9kZSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiAodmFsdWUgYXMgTWF5YmVUeXBlZE5vZGUpLnR5cGUgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBub2RlVHlwZShub2RlOiBSdWxlLk5vZGUpOiBzdHJpbmcge1xuICByZXR1cm4gcmVjb3JkKG5vZGUpWyd0eXBlJ10gYXMgc3RyaW5nO1xufVxuXG5mdW5jdGlvbiByZWNvcmQobm9kZTogb2JqZWN0KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gbm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUNBLFNBQVMseUJBQXlCO0FBRWxDLE1BQU0sZ0NBQWdDO0FBSy9CLE1BQU0sYUFBYTtBQStCbkIsTUFBTSx3QkFBeUM7QUFBQSxFQUNwRCxPQUFPLFNBQVM7QUFDZCxVQUFNLG9CQUFvQixvQkFBSSxJQUFvQztBQUNsRSxVQUFNLG1CQUFtQixvQkFBSSxJQUE0QjtBQUV6RCxXQUFPO0FBQUEsTUFDTCxZQUFZLE1BQXVCO0FBQ2pDLG1CQUFXLGFBQWEsT0FBTyxJQUFJLEVBQUUsUUFBUSxHQUFrQjtBQUM3RCxnQkFBTSxPQUFPLGlCQUFpQixTQUFTO0FBQ3ZDLGNBQUksQ0FBQyxNQUFNO0FBQ1Q7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sUUFBUSxpQkFBaUIsS0FBSyxRQUFRO0FBQzVDLGNBQUksS0FBSyxRQUFRLFNBQVMsV0FBVztBQUNuQyxrQ0FBc0IsS0FBSyxRQUFRLFNBQVMsS0FBSztBQUFBLFVBQ25ELE9BQU87QUFDTCxvQ0FBd0I7QUFBQSxjQUN0QixlQUFlLEtBQUssUUFBUTtBQUFBLGNBQzVCLE9BQU8sUUFBUSxXQUFXLFNBQVMsSUFBSTtBQUFBLGNBQ3ZDO0FBQUEsWUFDRixDQUFDO0FBQUEsVUFDSDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFDQSxpQkFBdUI7QUFDckIsbUJBQVcsQ0FBQyxVQUFVLFFBQVEsS0FBSyxtQkFBbUI7QUFDcEQsZ0JBQU0sUUFBUSxpQkFBaUIsSUFBSSxRQUFRO0FBQzNDLGNBQUksQ0FBQyxTQUFTLE1BQU0sU0FBUztBQUMzQjtBQUFBLFVBQ0Y7QUFFQSxxQkFBVyxDQUFDLFlBQVksT0FBTyxLQUFLLFVBQVU7QUFDNUMsZ0JBQUksQ0FBQyxN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
@@ -0,0 +1,20 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * ESLint rule: no-used-underscore-variables
6
+ *
7
+ * Reports an error when a parameter or local variable with a `_` prefix is
8
+ * actually referenced in the function body. The `_` prefix convention signals
9
+ * "this identifier is intentionally unused" — if it IS used, the prefix is
10
+ * misleading and should be removed.
11
+ */
12
+ import type { Rule } from 'eslint';
13
+ /**
14
+ Message ID reported when a variable carries a `_` prefix (signalling unused) but is actually used.
15
+ */
16
+ export declare const MESSAGE_ID = "noUsedUnderscoreVariables";
17
+ /**
18
+ * ESLint rule disallowing `_`-prefixed parameters and local variables that are actually used, since the prefix advertises them as unused.
19
+ */
20
+ export declare const noUsedUnderscoreVariables: Rule.RuleModule;