eslint-plugin-github-actions-2 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 (410) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +164 -0
  4. package/dist/_internal/case-police-dictionary.d.ts +10 -0
  5. package/dist/_internal/case-police-dictionary.d.ts.map +1 -0
  6. package/dist/_internal/case-police-dictionary.js +486 -0
  7. package/dist/_internal/case-police-dictionary.js.map +1 -0
  8. package/dist/_internal/casing.d.ts +17 -0
  9. package/dist/_internal/casing.d.ts.map +1 -0
  10. package/dist/_internal/casing.js +197 -0
  11. package/dist/_internal/casing.js.map +1 -0
  12. package/dist/_internal/github-actions-config-references.d.ts +16 -0
  13. package/dist/_internal/github-actions-config-references.d.ts.map +1 -0
  14. package/dist/_internal/github-actions-config-references.js +76 -0
  15. package/dist/_internal/github-actions-config-references.js.map +1 -0
  16. package/dist/_internal/github-actions-trigger-events.d.ts +13 -0
  17. package/dist/_internal/github-actions-trigger-events.d.ts.map +1 -0
  18. package/dist/_internal/github-actions-trigger-events.js +47 -0
  19. package/dist/_internal/github-actions-trigger-events.js.map +1 -0
  20. package/dist/_internal/github-expressions.d.ts +9 -0
  21. package/dist/_internal/github-expressions.d.ts.map +1 -0
  22. package/dist/_internal/github-expressions.js +87 -0
  23. package/dist/_internal/github-expressions.js.map +1 -0
  24. package/dist/_internal/lint-targets.d.ts +21 -0
  25. package/dist/_internal/lint-targets.d.ts.map +1 -0
  26. package/dist/_internal/lint-targets.js +60 -0
  27. package/dist/_internal/lint-targets.js.map +1 -0
  28. package/dist/_internal/rule-docs.d.ts +16 -0
  29. package/dist/_internal/rule-docs.d.ts.map +1 -0
  30. package/dist/_internal/rule-docs.js +2 -0
  31. package/dist/_internal/rule-docs.js.map +1 -0
  32. package/dist/_internal/rules-registry.d.ts +145 -0
  33. package/dist/_internal/rules-registry.d.ts.map +1 -0
  34. package/dist/_internal/rules-registry.js +144 -0
  35. package/dist/_internal/rules-registry.js.map +1 -0
  36. package/dist/_internal/workflow-template-properties.d.ts +20 -0
  37. package/dist/_internal/workflow-template-properties.d.ts.map +1 -0
  38. package/dist/_internal/workflow-template-properties.js +44 -0
  39. package/dist/_internal/workflow-template-properties.js.map +1 -0
  40. package/dist/_internal/workflow-yaml.d.ts +47 -0
  41. package/dist/_internal/workflow-yaml.d.ts.map +1 -0
  42. package/dist/_internal/workflow-yaml.js +140 -0
  43. package/dist/_internal/workflow-yaml.js.map +1 -0
  44. package/dist/_internal/yaml-traversal.d.ts +10 -0
  45. package/dist/_internal/yaml-traversal.d.ts.map +1 -0
  46. package/dist/_internal/yaml-traversal.js +38 -0
  47. package/dist/_internal/yaml-traversal.js.map +1 -0
  48. package/dist/plugin.cjs +7107 -0
  49. package/dist/plugin.cjs.map +7 -0
  50. package/dist/plugin.d.cts +34 -0
  51. package/dist/plugin.d.ts +34 -0
  52. package/dist/plugin.d.ts.map +1 -0
  53. package/dist/plugin.js +122 -0
  54. package/dist/plugin.js.map +1 -0
  55. package/dist/rules/action-name-casing.d.ts +9 -0
  56. package/dist/rules/action-name-casing.d.ts.map +1 -0
  57. package/dist/rules/action-name-casing.js +141 -0
  58. package/dist/rules/action-name-casing.js.map +1 -0
  59. package/dist/rules/job-id-casing.d.ts +9 -0
  60. package/dist/rules/job-id-casing.d.ts.map +1 -0
  61. package/dist/rules/job-id-casing.js +123 -0
  62. package/dist/rules/job-id-casing.js.map +1 -0
  63. package/dist/rules/max-jobs-per-action.d.ts +9 -0
  64. package/dist/rules/max-jobs-per-action.d.ts.map +1 -0
  65. package/dist/rules/max-jobs-per-action.js +61 -0
  66. package/dist/rules/max-jobs-per-action.js.map +1 -0
  67. package/dist/rules/no-case-insensitive-input-id-collision.d.ts +9 -0
  68. package/dist/rules/no-case-insensitive-input-id-collision.d.ts.map +1 -0
  69. package/dist/rules/no-case-insensitive-input-id-collision.js +66 -0
  70. package/dist/rules/no-case-insensitive-input-id-collision.js.map +1 -0
  71. package/dist/rules/no-composite-input-env-access.d.ts +9 -0
  72. package/dist/rules/no-composite-input-env-access.d.ts.map +1 -0
  73. package/dist/rules/no-composite-input-env-access.js +62 -0
  74. package/dist/rules/no-composite-input-env-access.js.map +1 -0
  75. package/dist/rules/no-deprecated-node-runtime.d.ts +9 -0
  76. package/dist/rules/no-deprecated-node-runtime.d.ts.map +1 -0
  77. package/dist/rules/no-deprecated-node-runtime.js +59 -0
  78. package/dist/rules/no-deprecated-node-runtime.js.map +1 -0
  79. package/dist/rules/no-duplicate-composite-step-id.d.ts +9 -0
  80. package/dist/rules/no-duplicate-composite-step-id.d.ts.map +1 -0
  81. package/dist/rules/no-duplicate-composite-step-id.js +74 -0
  82. package/dist/rules/no-duplicate-composite-step-id.js.map +1 -0
  83. package/dist/rules/no-empty-template-file-pattern.d.ts +9 -0
  84. package/dist/rules/no-empty-template-file-pattern.d.ts.map +1 -0
  85. package/dist/rules/no-empty-template-file-pattern.js +49 -0
  86. package/dist/rules/no-empty-template-file-pattern.js.map +1 -0
  87. package/dist/rules/no-external-job.d.ts +9 -0
  88. package/dist/rules/no-external-job.d.ts.map +1 -0
  89. package/dist/rules/no-external-job.js +49 -0
  90. package/dist/rules/no-external-job.js.map +1 -0
  91. package/dist/rules/no-hardcoded-default-branch-in-template.d.ts +9 -0
  92. package/dist/rules/no-hardcoded-default-branch-in-template.d.ts.map +1 -0
  93. package/dist/rules/no-hardcoded-default-branch-in-template.js +54 -0
  94. package/dist/rules/no-hardcoded-default-branch-in-template.js.map +1 -0
  95. package/dist/rules/no-icon-file-extension-in-template-icon-name.d.ts +9 -0
  96. package/dist/rules/no-icon-file-extension-in-template-icon-name.d.ts.map +1 -0
  97. package/dist/rules/no-icon-file-extension-in-template-icon-name.js +54 -0
  98. package/dist/rules/no-icon-file-extension-in-template-icon-name.js.map +1 -0
  99. package/dist/rules/no-inherit-secrets.d.ts +9 -0
  100. package/dist/rules/no-inherit-secrets.d.ts.map +1 -0
  101. package/dist/rules/no-inherit-secrets.js +57 -0
  102. package/dist/rules/no-inherit-secrets.js.map +1 -0
  103. package/dist/rules/no-invalid-concurrency-context.d.ts +9 -0
  104. package/dist/rules/no-invalid-concurrency-context.d.ts.map +1 -0
  105. package/dist/rules/no-invalid-concurrency-context.js +141 -0
  106. package/dist/rules/no-invalid-concurrency-context.js.map +1 -0
  107. package/dist/rules/no-invalid-key.d.ts +9 -0
  108. package/dist/rules/no-invalid-key.d.ts.map +1 -0
  109. package/dist/rules/no-invalid-key.js +152 -0
  110. package/dist/rules/no-invalid-key.js.map +1 -0
  111. package/dist/rules/no-invalid-reusable-workflow-job-key.d.ts +9 -0
  112. package/dist/rules/no-invalid-reusable-workflow-job-key.d.ts.map +1 -0
  113. package/dist/rules/no-invalid-reusable-workflow-job-key.js +73 -0
  114. package/dist/rules/no-invalid-reusable-workflow-job-key.js.map +1 -0
  115. package/dist/rules/no-invalid-template-file-pattern-regex.d.ts +9 -0
  116. package/dist/rules/no-invalid-template-file-pattern-regex.d.ts.map +1 -0
  117. package/dist/rules/no-invalid-template-file-pattern-regex.js +58 -0
  118. package/dist/rules/no-invalid-template-file-pattern-regex.js.map +1 -0
  119. package/dist/rules/no-invalid-workflow-call-output-value.d.ts +9 -0
  120. package/dist/rules/no-invalid-workflow-call-output-value.d.ts.map +1 -0
  121. package/dist/rules/no-invalid-workflow-call-output-value.js +99 -0
  122. package/dist/rules/no-invalid-workflow-call-output-value.js.map +1 -0
  123. package/dist/rules/no-path-separators-in-template-icon-name.d.ts +9 -0
  124. package/dist/rules/no-path-separators-in-template-icon-name.d.ts.map +1 -0
  125. package/dist/rules/no-path-separators-in-template-icon-name.js +52 -0
  126. package/dist/rules/no-path-separators-in-template-icon-name.js.map +1 -0
  127. package/dist/rules/no-post-if-without-post.d.ts +9 -0
  128. package/dist/rules/no-post-if-without-post.d.ts.map +1 -0
  129. package/dist/rules/no-post-if-without-post.js +52 -0
  130. package/dist/rules/no-post-if-without-post.js.map +1 -0
  131. package/dist/rules/no-pr-head-checkout-in-pull-request-target.d.ts +12 -0
  132. package/dist/rules/no-pr-head-checkout-in-pull-request-target.d.ts.map +1 -0
  133. package/dist/rules/no-pr-head-checkout-in-pull-request-target.js +89 -0
  134. package/dist/rules/no-pr-head-checkout-in-pull-request-target.js.map +1 -0
  135. package/dist/rules/no-pre-if-without-pre.d.ts +9 -0
  136. package/dist/rules/no-pre-if-without-pre.d.ts.map +1 -0
  137. package/dist/rules/no-pre-if-without-pre.js +51 -0
  138. package/dist/rules/no-pre-if-without-pre.js.map +1 -0
  139. package/dist/rules/no-required-input-with-default.d.ts +9 -0
  140. package/dist/rules/no-required-input-with-default.d.ts.map +1 -0
  141. package/dist/rules/no-required-input-with-default.js +68 -0
  142. package/dist/rules/no-required-input-with-default.js.map +1 -0
  143. package/dist/rules/no-secrets-in-if.d.ts +9 -0
  144. package/dist/rules/no-secrets-in-if.d.ts.map +1 -0
  145. package/dist/rules/no-secrets-in-if.js +84 -0
  146. package/dist/rules/no-secrets-in-if.js.map +1 -0
  147. package/dist/rules/no-self-hosted-runner-on-fork-pr-events.d.ts +9 -0
  148. package/dist/rules/no-self-hosted-runner-on-fork-pr-events.d.ts.map +1 -0
  149. package/dist/rules/no-self-hosted-runner-on-fork-pr-events.js +93 -0
  150. package/dist/rules/no-self-hosted-runner-on-fork-pr-events.js.map +1 -0
  151. package/dist/rules/no-subdirectory-template-file-pattern.d.ts +9 -0
  152. package/dist/rules/no-subdirectory-template-file-pattern.d.ts.map +1 -0
  153. package/dist/rules/no-subdirectory-template-file-pattern.js +52 -0
  154. package/dist/rules/no-subdirectory-template-file-pattern.js.map +1 -0
  155. package/dist/rules/no-template-placeholder-in-non-template-workflow.d.ts +9 -0
  156. package/dist/rules/no-template-placeholder-in-non-template-workflow.d.ts.map +1 -0
  157. package/dist/rules/no-template-placeholder-in-non-template-workflow.js +55 -0
  158. package/dist/rules/no-template-placeholder-in-non-template-workflow.js.map +1 -0
  159. package/dist/rules/no-top-level-env.d.ts +9 -0
  160. package/dist/rules/no-top-level-env.d.ts.map +1 -0
  161. package/dist/rules/no-top-level-env.js +42 -0
  162. package/dist/rules/no-top-level-env.js.map +1 -0
  163. package/dist/rules/no-top-level-permissions.d.ts +9 -0
  164. package/dist/rules/no-top-level-permissions.d.ts.map +1 -0
  165. package/dist/rules/no-top-level-permissions.js +39 -0
  166. package/dist/rules/no-top-level-permissions.js.map +1 -0
  167. package/dist/rules/no-universal-template-file-pattern.d.ts +9 -0
  168. package/dist/rules/no-universal-template-file-pattern.d.ts.map +1 -0
  169. package/dist/rules/no-universal-template-file-pattern.js +60 -0
  170. package/dist/rules/no-universal-template-file-pattern.js.map +1 -0
  171. package/dist/rules/no-unknown-input-reference-in-composite.d.ts +9 -0
  172. package/dist/rules/no-unknown-input-reference-in-composite.d.ts.map +1 -0
  173. package/dist/rules/no-unknown-input-reference-in-composite.js +80 -0
  174. package/dist/rules/no-unknown-input-reference-in-composite.js.map +1 -0
  175. package/dist/rules/no-unknown-job-output-reference.d.ts +9 -0
  176. package/dist/rules/no-unknown-job-output-reference.d.ts.map +1 -0
  177. package/dist/rules/no-unknown-job-output-reference.js +229 -0
  178. package/dist/rules/no-unknown-job-output-reference.js.map +1 -0
  179. package/dist/rules/no-unknown-step-reference.d.ts +9 -0
  180. package/dist/rules/no-unknown-step-reference.d.ts.map +1 -0
  181. package/dist/rules/no-unknown-step-reference.js +133 -0
  182. package/dist/rules/no-unknown-step-reference.js.map +1 -0
  183. package/dist/rules/no-untrusted-input-in-run.d.ts +9 -0
  184. package/dist/rules/no-untrusted-input-in-run.d.ts.map +1 -0
  185. package/dist/rules/no-untrusted-input-in-run.js +115 -0
  186. package/dist/rules/no-untrusted-input-in-run.js.map +1 -0
  187. package/dist/rules/no-unused-input-in-composite.d.ts +9 -0
  188. package/dist/rules/no-unused-input-in-composite.d.ts.map +1 -0
  189. package/dist/rules/no-unused-input-in-composite.js +78 -0
  190. package/dist/rules/no-unused-input-in-composite.js.map +1 -0
  191. package/dist/rules/no-write-all-permissions.d.ts +9 -0
  192. package/dist/rules/no-write-all-permissions.d.ts.map +1 -0
  193. package/dist/rules/no-write-all-permissions.js +61 -0
  194. package/dist/rules/no-write-all-permissions.js.map +1 -0
  195. package/dist/rules/pin-action-shas.d.ts +12 -0
  196. package/dist/rules/pin-action-shas.d.ts.map +1 -0
  197. package/dist/rules/pin-action-shas.js +100 -0
  198. package/dist/rules/pin-action-shas.js.map +1 -0
  199. package/dist/rules/prefer-action-yml.d.ts +9 -0
  200. package/dist/rules/prefer-action-yml.d.ts.map +1 -0
  201. package/dist/rules/prefer-action-yml.js +37 -0
  202. package/dist/rules/prefer-action-yml.js.map +1 -0
  203. package/dist/rules/prefer-fail-fast.d.ts +9 -0
  204. package/dist/rules/prefer-fail-fast.d.ts.map +1 -0
  205. package/dist/rules/prefer-fail-fast.js +61 -0
  206. package/dist/rules/prefer-fail-fast.js.map +1 -0
  207. package/dist/rules/prefer-file-extension.d.ts +9 -0
  208. package/dist/rules/prefer-file-extension.d.ts.map +1 -0
  209. package/dist/rules/prefer-file-extension.js +104 -0
  210. package/dist/rules/prefer-file-extension.js.map +1 -0
  211. package/dist/rules/prefer-inputs-context.d.ts +9 -0
  212. package/dist/rules/prefer-inputs-context.d.ts.map +1 -0
  213. package/dist/rules/prefer-inputs-context.js +91 -0
  214. package/dist/rules/prefer-inputs-context.js.map +1 -0
  215. package/dist/rules/prefer-step-uses-style.d.ts +9 -0
  216. package/dist/rules/prefer-step-uses-style.d.ts.map +1 -0
  217. package/dist/rules/prefer-step-uses-style.js +209 -0
  218. package/dist/rules/prefer-step-uses-style.js.map +1 -0
  219. package/dist/rules/prefer-template-yml-extension.d.ts +9 -0
  220. package/dist/rules/prefer-template-yml-extension.d.ts.map +1 -0
  221. package/dist/rules/prefer-template-yml-extension.js +41 -0
  222. package/dist/rules/prefer-template-yml-extension.js.map +1 -0
  223. package/dist/rules/require-action-name.d.ts +9 -0
  224. package/dist/rules/require-action-name.d.ts.map +1 -0
  225. package/dist/rules/require-action-name.js +57 -0
  226. package/dist/rules/require-action-name.js.map +1 -0
  227. package/dist/rules/require-action-run-name.d.ts +9 -0
  228. package/dist/rules/require-action-run-name.d.ts.map +1 -0
  229. package/dist/rules/require-action-run-name.js +56 -0
  230. package/dist/rules/require-action-run-name.js.map +1 -0
  231. package/dist/rules/require-checkout-before-local-action.d.ts +9 -0
  232. package/dist/rules/require-checkout-before-local-action.d.ts.map +1 -0
  233. package/dist/rules/require-checkout-before-local-action.js +74 -0
  234. package/dist/rules/require-checkout-before-local-action.js.map +1 -0
  235. package/dist/rules/require-composite-step-name.d.ts +9 -0
  236. package/dist/rules/require-composite-step-name.d.ts.map +1 -0
  237. package/dist/rules/require-composite-step-name.js +67 -0
  238. package/dist/rules/require-composite-step-name.js.map +1 -0
  239. package/dist/rules/require-job-name.d.ts +9 -0
  240. package/dist/rules/require-job-name.d.ts.map +1 -0
  241. package/dist/rules/require-job-name.js +70 -0
  242. package/dist/rules/require-job-name.js.map +1 -0
  243. package/dist/rules/require-job-step-name.d.ts +9 -0
  244. package/dist/rules/require-job-step-name.d.ts.map +1 -0
  245. package/dist/rules/require-job-step-name.js +71 -0
  246. package/dist/rules/require-job-step-name.js.map +1 -0
  247. package/dist/rules/require-job-timeout-minutes.d.ts +9 -0
  248. package/dist/rules/require-job-timeout-minutes.d.ts.map +1 -0
  249. package/dist/rules/require-job-timeout-minutes.js +99 -0
  250. package/dist/rules/require-job-timeout-minutes.js.map +1 -0
  251. package/dist/rules/require-merge-group-trigger.d.ts +9 -0
  252. package/dist/rules/require-merge-group-trigger.d.ts.map +1 -0
  253. package/dist/rules/require-merge-group-trigger.js +65 -0
  254. package/dist/rules/require-merge-group-trigger.js.map +1 -0
  255. package/dist/rules/require-pull-request-target-branches.d.ts +9 -0
  256. package/dist/rules/require-pull-request-target-branches.d.ts.map +1 -0
  257. package/dist/rules/require-pull-request-target-branches.js +102 -0
  258. package/dist/rules/require-pull-request-target-branches.js.map +1 -0
  259. package/dist/rules/require-run-step-shell.d.ts +9 -0
  260. package/dist/rules/require-run-step-shell.d.ts.map +1 -0
  261. package/dist/rules/require-run-step-shell.js +114 -0
  262. package/dist/rules/require-run-step-shell.js.map +1 -0
  263. package/dist/rules/require-template-categories.d.ts +9 -0
  264. package/dist/rules/require-template-categories.d.ts.map +1 -0
  265. package/dist/rules/require-template-categories.js +55 -0
  266. package/dist/rules/require-template-categories.js.map +1 -0
  267. package/dist/rules/require-template-file-patterns.d.ts +9 -0
  268. package/dist/rules/require-template-file-patterns.d.ts.map +1 -0
  269. package/dist/rules/require-template-file-patterns.js +55 -0
  270. package/dist/rules/require-template-file-patterns.js.map +1 -0
  271. package/dist/rules/require-template-icon-file-exists.d.ts +9 -0
  272. package/dist/rules/require-template-icon-file-exists.d.ts.map +1 -0
  273. package/dist/rules/require-template-icon-file-exists.js +61 -0
  274. package/dist/rules/require-template-icon-file-exists.js.map +1 -0
  275. package/dist/rules/require-template-icon-name.d.ts +9 -0
  276. package/dist/rules/require-template-icon-name.d.ts.map +1 -0
  277. package/dist/rules/require-template-icon-name.js +48 -0
  278. package/dist/rules/require-template-icon-name.js.map +1 -0
  279. package/dist/rules/require-template-workflow-name.d.ts +9 -0
  280. package/dist/rules/require-template-workflow-name.d.ts.map +1 -0
  281. package/dist/rules/require-template-workflow-name.js +48 -0
  282. package/dist/rules/require-template-workflow-name.js.map +1 -0
  283. package/dist/rules/require-trigger-types.d.ts +9 -0
  284. package/dist/rules/require-trigger-types.d.ts.map +1 -0
  285. package/dist/rules/require-trigger-types.js +126 -0
  286. package/dist/rules/require-trigger-types.js.map +1 -0
  287. package/dist/rules/require-workflow-call-input-type.d.ts +9 -0
  288. package/dist/rules/require-workflow-call-input-type.d.ts.map +1 -0
  289. package/dist/rules/require-workflow-call-input-type.js +89 -0
  290. package/dist/rules/require-workflow-call-input-type.js.map +1 -0
  291. package/dist/rules/require-workflow-call-output-value.d.ts +9 -0
  292. package/dist/rules/require-workflow-call-output-value.d.ts.map +1 -0
  293. package/dist/rules/require-workflow-call-output-value.js +79 -0
  294. package/dist/rules/require-workflow-call-output-value.js.map +1 -0
  295. package/dist/rules/require-workflow-concurrency.d.ts +9 -0
  296. package/dist/rules/require-workflow-concurrency.d.ts.map +1 -0
  297. package/dist/rules/require-workflow-concurrency.js +157 -0
  298. package/dist/rules/require-workflow-concurrency.js.map +1 -0
  299. package/dist/rules/require-workflow-dispatch-input-type.d.ts +9 -0
  300. package/dist/rules/require-workflow-dispatch-input-type.d.ts.map +1 -0
  301. package/dist/rules/require-workflow-dispatch-input-type.js +80 -0
  302. package/dist/rules/require-workflow-dispatch-input-type.js.map +1 -0
  303. package/dist/rules/require-workflow-interface-description.d.ts +9 -0
  304. package/dist/rules/require-workflow-interface-description.d.ts.map +1 -0
  305. package/dist/rules/require-workflow-interface-description.js +98 -0
  306. package/dist/rules/require-workflow-interface-description.js.map +1 -0
  307. package/dist/rules/require-workflow-permissions.d.ts +9 -0
  308. package/dist/rules/require-workflow-permissions.d.ts.map +1 -0
  309. package/dist/rules/require-workflow-permissions.js +83 -0
  310. package/dist/rules/require-workflow-permissions.js.map +1 -0
  311. package/dist/rules/require-workflow-run-branches.d.ts +9 -0
  312. package/dist/rules/require-workflow-run-branches.d.ts.map +1 -0
  313. package/dist/rules/require-workflow-run-branches.js +84 -0
  314. package/dist/rules/require-workflow-run-branches.js.map +1 -0
  315. package/dist/rules/require-workflow-template-pair.d.ts +9 -0
  316. package/dist/rules/require-workflow-template-pair.d.ts.map +1 -0
  317. package/dist/rules/require-workflow-template-pair.js +47 -0
  318. package/dist/rules/require-workflow-template-pair.js.map +1 -0
  319. package/dist/rules/require-workflow-template-properties-pair.d.ts +9 -0
  320. package/dist/rules/require-workflow-template-properties-pair.d.ts.map +1 -0
  321. package/dist/rules/require-workflow-template-properties-pair.js +49 -0
  322. package/dist/rules/require-workflow-template-properties-pair.js.map +1 -0
  323. package/dist/rules/valid-timeout-minutes.d.ts +9 -0
  324. package/dist/rules/valid-timeout-minutes.d.ts.map +1 -0
  325. package/dist/rules/valid-timeout-minutes.js +255 -0
  326. package/dist/rules/valid-timeout-minutes.js.map +1 -0
  327. package/dist/rules/valid-trigger-events.d.ts +9 -0
  328. package/dist/rules/valid-trigger-events.d.ts.map +1 -0
  329. package/dist/rules/valid-trigger-events.js +100 -0
  330. package/dist/rules/valid-trigger-events.js.map +1 -0
  331. package/docs/rules/action-name-casing.md +64 -0
  332. package/docs/rules/getting-started.md +46 -0
  333. package/docs/rules/job-id-casing.md +73 -0
  334. package/docs/rules/max-jobs-per-action.md +79 -0
  335. package/docs/rules/no-case-insensitive-input-id-collision.md +63 -0
  336. package/docs/rules/no-composite-input-env-access.md +66 -0
  337. package/docs/rules/no-deprecated-node-runtime.md +61 -0
  338. package/docs/rules/no-duplicate-composite-step-id.md +73 -0
  339. package/docs/rules/no-empty-template-file-pattern.md +57 -0
  340. package/docs/rules/no-external-job.md +66 -0
  341. package/docs/rules/no-hardcoded-default-branch-in-template.md +63 -0
  342. package/docs/rules/no-icon-file-extension-in-template-icon-name.md +57 -0
  343. package/docs/rules/no-inherit-secrets.md +65 -0
  344. package/docs/rules/no-invalid-concurrency-context.md +101 -0
  345. package/docs/rules/no-invalid-key.md +86 -0
  346. package/docs/rules/no-invalid-reusable-workflow-job-key.md +74 -0
  347. package/docs/rules/no-invalid-template-file-pattern-regex.md +57 -0
  348. package/docs/rules/no-invalid-workflow-call-output-value.md +80 -0
  349. package/docs/rules/no-path-separators-in-template-icon-name.md +57 -0
  350. package/docs/rules/no-post-if-without-post.md +64 -0
  351. package/docs/rules/no-pr-head-checkout-in-pull-request-target.md +83 -0
  352. package/docs/rules/no-pre-if-without-pre.md +64 -0
  353. package/docs/rules/no-required-input-with-default.md +64 -0
  354. package/docs/rules/no-secrets-in-if.md +70 -0
  355. package/docs/rules/no-self-hosted-runner-on-fork-pr-events.md +75 -0
  356. package/docs/rules/no-subdirectory-template-file-pattern.md +57 -0
  357. package/docs/rules/no-template-placeholder-in-non-template-workflow.md +63 -0
  358. package/docs/rules/no-top-level-env.md +64 -0
  359. package/docs/rules/no-top-level-permissions.md +64 -0
  360. package/docs/rules/no-universal-template-file-pattern.md +57 -0
  361. package/docs/rules/no-unknown-input-reference-in-composite.md +71 -0
  362. package/docs/rules/no-unknown-job-output-reference.md +88 -0
  363. package/docs/rules/no-unknown-step-reference.md +73 -0
  364. package/docs/rules/no-untrusted-input-in-run.md +74 -0
  365. package/docs/rules/no-unused-input-in-composite.md +71 -0
  366. package/docs/rules/no-write-all-permissions.md +60 -0
  367. package/docs/rules/overview.md +91 -0
  368. package/docs/rules/pin-action-shas.md +65 -0
  369. package/docs/rules/prefer-action-yml.md +57 -0
  370. package/docs/rules/prefer-fail-fast.md +72 -0
  371. package/docs/rules/prefer-file-extension.md +77 -0
  372. package/docs/rules/prefer-inputs-context.md +84 -0
  373. package/docs/rules/prefer-step-uses-style.md +70 -0
  374. package/docs/rules/prefer-template-yml-extension.md +57 -0
  375. package/docs/rules/presets/action-metadata.md +18 -0
  376. package/docs/rules/presets/all.md +76 -0
  377. package/docs/rules/presets/index.md +100 -0
  378. package/docs/rules/presets/recommended.md +26 -0
  379. package/docs/rules/presets/security.md +16 -0
  380. package/docs/rules/presets/strict.md +48 -0
  381. package/docs/rules/presets/workflow-template-properties.md +18 -0
  382. package/docs/rules/presets/workflow-templates.md +22 -0
  383. package/docs/rules/require-action-name.md +61 -0
  384. package/docs/rules/require-action-run-name.md +63 -0
  385. package/docs/rules/require-checkout-before-local-action.md +66 -0
  386. package/docs/rules/require-composite-step-name.md +66 -0
  387. package/docs/rules/require-job-name.md +63 -0
  388. package/docs/rules/require-job-step-name.md +69 -0
  389. package/docs/rules/require-job-timeout-minutes.md +76 -0
  390. package/docs/rules/require-merge-group-trigger.md +67 -0
  391. package/docs/rules/require-pull-request-target-branches.md +79 -0
  392. package/docs/rules/require-run-step-shell.md +85 -0
  393. package/docs/rules/require-template-categories.md +62 -0
  394. package/docs/rules/require-template-file-patterns.md +63 -0
  395. package/docs/rules/require-template-icon-file-exists.md +61 -0
  396. package/docs/rules/require-template-icon-name.md +57 -0
  397. package/docs/rules/require-template-workflow-name.md +60 -0
  398. package/docs/rules/require-trigger-types.md +76 -0
  399. package/docs/rules/require-workflow-call-input-type.md +70 -0
  400. package/docs/rules/require-workflow-call-output-value.md +67 -0
  401. package/docs/rules/require-workflow-concurrency.md +73 -0
  402. package/docs/rules/require-workflow-dispatch-input-type.md +70 -0
  403. package/docs/rules/require-workflow-interface-description.md +96 -0
  404. package/docs/rules/require-workflow-permissions.md +75 -0
  405. package/docs/rules/require-workflow-run-branches.md +66 -0
  406. package/docs/rules/require-workflow-template-pair.md +58 -0
  407. package/docs/rules/require-workflow-template-properties-pair.md +58 -0
  408. package/docs/rules/valid-timeout-minutes.md +74 -0
  409. package/docs/rules/valid-trigger-events.md +62 -0
  410. package/package.json +497 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/plugin.ts", "../package.json", "../src/_internal/lint-targets.ts", "../src/_internal/workflow-yaml.ts", "../src/_internal/github-actions-config-references.ts", "../src/_internal/case-police-dictionary.ts", "../src/_internal/casing.ts", "../src/rules/action-name-casing.ts", "../src/rules/job-id-casing.ts", "../src/rules/max-jobs-per-action.ts", "../src/rules/no-case-insensitive-input-id-collision.ts", "../src/_internal/yaml-traversal.ts", "../src/rules/no-composite-input-env-access.ts", "../src/rules/no-deprecated-node-runtime.ts", "../src/rules/no-duplicate-composite-step-id.ts", "../src/_internal/workflow-template-properties.ts", "../src/rules/no-empty-template-file-pattern.ts", "../src/rules/no-external-job.ts", "../src/rules/no-hardcoded-default-branch-in-template.ts", "../src/rules/no-icon-file-extension-in-template-icon-name.ts", "../src/rules/no-inherit-secrets.ts", "../src/_internal/github-expressions.ts", "../src/rules/no-invalid-concurrency-context.ts", "../src/rules/no-invalid-key.ts", "../src/rules/no-invalid-reusable-workflow-job-key.ts", "../src/rules/no-invalid-template-file-pattern-regex.ts", "../src/rules/no-invalid-workflow-call-output-value.ts", "../src/rules/no-path-separators-in-template-icon-name.ts", "../src/rules/no-post-if-without-post.ts", "../src/rules/no-pr-head-checkout-in-pull-request-target.ts", "../src/rules/no-pre-if-without-pre.ts", "../src/rules/no-required-input-with-default.ts", "../src/rules/no-secrets-in-if.ts", "../src/rules/no-self-hosted-runner-on-fork-pr-events.ts", "../src/rules/no-subdirectory-template-file-pattern.ts", "../src/rules/no-template-placeholder-in-non-template-workflow.ts", "../src/rules/no-top-level-env.ts", "../src/rules/no-top-level-permissions.ts", "../src/rules/no-universal-template-file-pattern.ts", "../src/rules/no-unknown-input-reference-in-composite.ts", "../src/rules/no-unknown-job-output-reference.ts", "../src/rules/no-unknown-step-reference.ts", "../src/rules/no-untrusted-input-in-run.ts", "../src/rules/no-unused-input-in-composite.ts", "../src/rules/no-write-all-permissions.ts", "../src/rules/pin-action-shas.ts", "../src/rules/prefer-action-yml.ts", "../src/rules/prefer-fail-fast.ts", "../src/rules/prefer-file-extension.ts", "../src/rules/prefer-inputs-context.ts", "../src/rules/prefer-step-uses-style.ts", "../src/rules/prefer-template-yml-extension.ts", "../src/rules/require-action-name.ts", "../src/rules/require-action-run-name.ts", "../src/rules/require-checkout-before-local-action.ts", "../src/rules/require-composite-step-name.ts", "../src/rules/require-job-name.ts", "../src/rules/require-job-step-name.ts", "../src/rules/require-job-timeout-minutes.ts", "../src/rules/require-merge-group-trigger.ts", "../src/rules/require-pull-request-target-branches.ts", "../src/rules/require-run-step-shell.ts", "../src/rules/require-template-categories.ts", "../src/rules/require-template-file-patterns.ts", "../src/rules/require-template-icon-file-exists.ts", "../src/rules/require-template-icon-name.ts", "../src/rules/require-template-workflow-name.ts", "../src/rules/require-trigger-types.ts", "../src/rules/require-workflow-call-input-type.ts", "../src/rules/require-workflow-call-output-value.ts", "../src/rules/require-workflow-concurrency.ts", "../src/rules/require-workflow-dispatch-input-type.ts", "../src/rules/require-workflow-interface-description.ts", "../src/rules/require-workflow-permissions.ts", "../src/rules/require-workflow-run-branches.ts", "../src/rules/require-workflow-template-pair.ts", "../src/rules/require-workflow-template-properties-pair.ts", "../src/rules/valid-timeout-minutes.ts", "../src/_internal/github-actions-trigger-events.ts", "../src/rules/valid-trigger-events.ts", "../src/_internal/rules-registry.ts"],
4
+ "sourcesContent": ["/**\n * @packageDocumentation\n * Public plugin entrypoint for eslint-plugin-github-actions-2.\n */\nimport type { ESLint, Linter, Rule } from \"eslint\";\n\nimport * as yamlParser from \"yaml-eslint-parser\";\n\nimport type { GithubActionsRuleDocs } from \"./_internal/rule-docs.js\";\n\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport {\n githubActionsConfigMetadataByName,\n type GithubActionsConfigName,\n githubActionsConfigNames,\n type GithubActionsConfigReference,\n githubActionsConfigReferenceToName,\n} from \"./_internal/github-actions-config-references.js\";\nimport { githubActionsRules } from \"./_internal/rules-registry.js\";\n\n/** ESLint severity used by generated preset rule maps. */\nconst ERROR_SEVERITY = \"error\" as const;\n\n/** Runtime type for the plugin's generated config presets. */\nexport type GithubActionsConfigs = Record<\n GithubActionsConfigName,\n GithubActionsPresetConfig\n>;\n\n/** Flat config shape produced by this plugin. */\nexport type GithubActionsPresetConfig = Linter.Config & {\n rules: NonNullable<Linter.Config[\"rules\"]>;\n};\n\n/** Fully-qualified ESLint rule ids exposed by this plugin. */\nexport type GithubActionsRuleId = `github-actions/${GithubActionsRuleName}`;\n\n/** Unqualified rule names supported by eslint-plugin-github-actions-2. */\nexport type GithubActionsRuleName = keyof typeof githubActionsRules;\n\n/** Fully assembled plugin contract used by the runtime default export. */\ntype GithubActionsPluginContract = Omit<\n ESLint.Plugin,\n \"configs\" | \"meta\" | \"rules\"\n> & {\n configs: GithubActionsConfigs;\n meta: {\n name: string;\n namespace: string;\n version: string;\n };\n rules: NonNullable<ESLint.Plugin[\"rules\"]>;\n};\n\n/** Rule-map type used when expanding preset memberships. */\ntype RulesConfig = GithubActionsPresetConfig[\"rules\"];\n\n/** Resolve package version from package.json data. */\nfunction getPackageVersion(pkg: unknown): string {\n if (typeof pkg !== \"object\" || pkg === null) {\n return \"0.0.0\";\n }\n\n const version = Reflect.get(pkg, \"version\");\n\n return typeof version === \"string\" ? version : \"0.0.0\";\n}\n\n/** Determine whether a string is a valid config-reference token. */\nconst isGithubActionsConfigReference = (\n value: string\n): value is GithubActionsConfigReference =>\n Object.hasOwn(githubActionsConfigReferenceToName, value);\n\n/** Normalize stored rule docs config references to a validated string array. */\nconst getRuleConfigReferences = (\n ruleName: GithubActionsRuleName,\n rule: Readonly<Rule.RuleModule>\n): readonly GithubActionsConfigReference[] => {\n const docs = rule.meta?.docs as GithubActionsRuleDocs | undefined;\n const references = docs?.configs;\n const referenceList = Array.isArray(references) ? references : [references];\n\n if (referenceList.length === 0 || referenceList[0] === undefined) {\n throw new TypeError(\n `Rule '${ruleName}' is missing docs.configs preset metadata.`\n );\n }\n\n for (const reference of referenceList) {\n if (\n typeof reference !== \"string\" ||\n !isGithubActionsConfigReference(reference)\n ) {\n throw new TypeError(\n `Rule '${ruleName}' has an invalid config reference '${String(reference)}'.`\n );\n }\n }\n\n return referenceList;\n};\n\n/** Strongly typed ESLint rule view of the internal registry. */\nconst githubActionsEslintRules: NonNullable<ESLint.Plugin[\"rules\"]> &\n typeof githubActionsRules = githubActionsRules as NonNullable<\n ESLint.Plugin[\"rules\"]\n> &\n typeof githubActionsRules;\n\n/** Stable rule-entry list used by config derivation and docs tests. */\nconst githubActionsRuleEntries: readonly (readonly [\n GithubActionsRuleName,\n Rule.RuleModule,\n])[] = Object.entries(githubActionsRules) as readonly (readonly [\n GithubActionsRuleName,\n Rule.RuleModule,\n])[];\n\n/** Build a config-to-rule-name map from rule docs metadata. */\nconst createPresetRuleNamesByConfig = (): Record<\n GithubActionsConfigName,\n GithubActionsRuleName[]\n> => {\n const presetRuleNamesByConfig: Record<\n GithubActionsConfigName,\n GithubActionsRuleName[]\n > = {\n actionMetadata: [],\n all: [],\n recommended: [],\n security: [],\n strict: [],\n workflowTemplateProperties: [],\n workflowTemplates: [],\n };\n\n for (const [ruleName, rule] of githubActionsRuleEntries) {\n for (const reference of getRuleConfigReferences(ruleName, rule)) {\n const configName = githubActionsConfigReferenceToName[reference];\n\n if (configName === undefined) {\n continue;\n }\n\n presetRuleNamesByConfig[configName].push(ruleName);\n }\n }\n\n return presetRuleNamesByConfig;\n};\n\n/** Effective rule membership for every exported config preset. */\nconst presetRuleNamesByConfig: Readonly<\n Record<GithubActionsConfigName, readonly GithubActionsRuleName[]>\n> = createPresetRuleNamesByConfig();\n\n/** Build an ESLint rules map that enables each provided rule at error level. */\nfunction errorRulesFor(\n ruleNames: readonly GithubActionsRuleName[]\n): RulesConfig {\n const rules: RulesConfig = {};\n\n for (const ruleName of ruleNames) {\n rules[`github-actions/${ruleName}`] = ERROR_SEVERITY;\n }\n\n return rules;\n}\n\n/** Apply YAML parser and plugin registration to a preset config fragment. */\nfunction withGithubActionsPlugin(\n config: Readonly<GithubActionsPresetConfig>,\n plugin: Readonly<ESLint.Plugin>\n): GithubActionsPresetConfig {\n const existingLanguageOptions = config.languageOptions ?? {};\n const existingParserOptions = existingLanguageOptions[\"parserOptions\"];\n\n return {\n ...config,\n languageOptions: {\n ...existingLanguageOptions,\n parser: existingLanguageOptions[\"parser\"] ?? yamlParser,\n parserOptions:\n existingParserOptions !== null &&\n typeof existingParserOptions === \"object\" &&\n !Array.isArray(existingParserOptions)\n ? { ...existingParserOptions }\n : {},\n },\n plugins: {\n ...config.plugins,\n \"github-actions\": plugin,\n },\n };\n}\n\n/** Minimal plugin view used while assembling exported presets. */\nconst pluginForConfigs: ESLint.Plugin = {\n rules: githubActionsEslintRules,\n};\n\n/** Create every exported flat-config preset from static metadata. */\nconst createGithubActionsConfigsDefinition = (): GithubActionsConfigs => {\n const configs = {} as GithubActionsConfigs;\n\n for (const configName of githubActionsConfigNames) {\n const metadata = githubActionsConfigMetadataByName[configName];\n\n configs[configName] = withGithubActionsPlugin(\n {\n files: [...metadata.files],\n name: metadata.presetName,\n rules: errorRulesFor(presetRuleNamesByConfig[configName]),\n },\n pluginForConfigs\n );\n }\n\n return configs;\n};\n\n/** Finalized typed view of all exported flat-config presets. */\nconst githubActionsConfigs: GithubActionsConfigs =\n createGithubActionsConfigsDefinition();\n\n/** Main plugin object exported for ESLint consumption. */\nconst githubActionsPlugin: GithubActionsPluginContract = {\n configs: githubActionsConfigs,\n meta: {\n name: \"eslint-plugin-github-actions-2\",\n namespace: \"github-actions\",\n version: getPackageVersion(packageJson),\n },\n processors: {},\n rules: githubActionsEslintRules,\n};\n\n/** Runtime type for the plugin object exported as default. */\nexport type GithubActionsPlugin = typeof githubActionsPlugin;\n\n/** Default plugin export consumed by ESLint flat config. */\nexport default githubActionsPlugin;\n", "{\n \"$schema\": \"https://www.schemastore.org/package.json\",\n \"name\": \"eslint-plugin-github-actions-2\",\n \"version\": \"1.0.0\",\n \"private\": false,\n \"description\": \"ESLint plugin for GitHub Actions workflow quality, reliability, and security rules.\",\n \"keywords\": [\n \"eslint\",\n \"eslint-plugin\",\n \"eslintplugin\",\n \"github\",\n \"github-actions\",\n \"workflow\",\n \"yaml\"\n ],\n \"homepage\": \"https://github.com/Nick2bad4u/eslint-plugin-github-actions-2\",\n \"bugs\": {\n \"url\": \"https://github.com/Nick2bad4u/eslint-plugin-github-actions-2/issues\",\n \"email\": \"20943337+Nick2bad4u@users.noreply.github.com\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/Nick2bad4u/eslint-plugin-github-actions-2.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Nick2bad4u <20943337+Nick2bad4u@users.noreply.github.com> (https://github.com/Nick2bad4u)\",\n \"contributors\": [\n {\n \"name\": \"Nick2bad4u\",\n \"email\": \"20943337+Nick2bad4u@users.noreply.github.com\",\n \"url\": \"https://github.com/Nick2bad4u\"\n }\n ],\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/plugin.d.ts\",\n \"default\": \"./dist/plugin.js\"\n },\n \"require\": {\n \"types\": \"./dist/plugin.d.cts\",\n \"default\": \"./dist/plugin.cjs\"\n },\n \"default\": \"./dist/plugin.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"main\": \"./dist/plugin.cjs\",\n \"types\": \"./dist/plugin.d.ts\",\n \"files\": [\n \"dist\",\n \"docs/rules/**\",\n \"CHANGELOG.md\"\n ],\n \"workspaces\": [\n \"docs/docusaurus\"\n ],\n \"scripts\": {\n \"build\": \"tsc -p tsconfig.build.json && npm run build:types:cjs && npm run build:cjs\",\n \"build:cjs\": \"esbuild dist/plugin.js --bundle --format=cjs --platform=node --packages=external --sourcemap --outfile=dist/plugin.cjs --footer:js=\\\"module.exports = module.exports.default;\\\"\",\n \"build:clean\": \"node -e \\\"require('node:fs').rmSync('dist',{recursive:true,force:true})\\\"\",\n \"build:eslint-inspector\": \"npx -y @eslint/config-inspector@1.4.2 build --outDir \\\"docs/docusaurus/static/eslint-inspector\\\" --base \\\"/eslint-plugin-github-actions-2/eslint-inspector/\\\"\",\n \"build:eslint-inspector:local\": \"npx @eslint/config-inspector\",\n \"build:stylelint-inspector\": \"npx -y stylelint-config-inspector@latest build --outDir \\\"docs/docusaurus/static/stylelint-inspector\\\" --base \\\"/eslint-plugin-github-actions-2/stylelint-inspector/\\\"\",\n \"build:stylelint-inspector:local\": \"npx stylelint-config-inspector@latest\",\n \"build:types:cjs\": \"node -e \\\"require('node:fs').copyFileSync('dist/plugin.d.ts','dist/plugin.d.cts')\\\"\",\n \"changelog:release-notes\": \"git-cliff --config cliff.toml --latest --strip header\",\n \"clean:cache\": \"rimraf dist coverage cache .cache .vite .turbo\",\n \"clean:cache:coverage\": \"rimraf coverage .coverage\",\n \"clean:cache:dist\": \"rimraf dist release\",\n \"clean:cache:eslint\": \"rimraf .cache/.eslintcache\",\n \"clean:cache:prettier\": \"rimraf .cache/.prettier-cache .prettier-cache .prettiercache\",\n \"clean:cache:stylelint\": \"rimraf .cache/stylelintcache stylelintcache .stylelintcache\",\n \"clean:cache:typescript\": \"rimraf .cache/**.tsbuildinfo .cache/builds\",\n \"clean:cache:vite\": \"rimraf .cache/vite .cache/vitest .cache/vitest-zero-coverage .cache/vite-zero-coverage\",\n \"clean:docs\": \"rimraf docs/docusaurus/.docusaurus/** docs/docusaurus/build/**\",\n \"clean:docusaurus\": \"npm run clean:docs && npm run --workspace docs/docusaurus clear\",\n \"docs:api\": \"npm run --workspace docs/docusaurus docs:api\",\n \"docs:api:local\": \"npm run --workspace docs/docusaurus docs:api:local\",\n \"docs:build\": \"npm run --workspace docs/docusaurus build\",\n \"docs:build:local\": \"npm run --workspace docs/docusaurus build:local\",\n \"docs:serve\": \"npm run --workspace docs/docusaurus serve\",\n \"docs:start\": \"npm run --workspace docs/docusaurus start\",\n \"docs:start:devtools\": \"npm run docs:api:local && npm run --workspace docs/docusaurus start:devtools\",\n \"docs:typecheck\": \"npm run --workspace docs/docusaurus typecheck\",\n \"lint\": \"cross-env NODE_OPTIONS=--max_old_space_size=16384 eslint --cache --cache-strategy content --cache-location .cache/.eslintcache\",\n \"lint:action\": \"npm run lint:actions\",\n \"lint:actions\": \"node scripts/lint-actionlint.mjs\",\n \"lint:all\": \"npm run lint && npm run lint:css && npm run lint:prettier && npm run lint:remark && npm run lint:package && npm run lint:secretlint && npm run lint:yaml && npm run lint:actions && npm run lint:circular\",\n \"lint:all:fix\": \"npm run lint:fix && npm run lint:css:fix && npm run lint:prettier:fix && npm run lint:remark && npm run lint:package && npm run lint:secretlint && npm run lint:yaml:fix && npm run lint:actions && npm run lint:circular\",\n \"lint:all:fix:quiet\": \"npm run lint:fix:quiet && npm run lint:css:fix && npm run lint:prettier:fix && npm run lint:remark && npm run lint:package && npm run lint:secretlint && npm run lint:yaml:fix && npm run lint:actions && npm run lint:circular\",\n \"lint:circular\": \"npm run madge:circular\",\n \"lint:compat\": \"npm run lint:compat:eslint9 --\",\n \"lint:compat:eslint9\": \"node scripts/lint-compat-eslint9.mjs\",\n \"lint:config:build\": \"npm run build:eslint-inspector\",\n \"lint:config:inspect\": \"npx eslint --inspect-config\",\n \"lint:css\": \"stylelint --cache --config stylelint.config.mjs --cache-strategy content --cache-location .cache/stylelintcache src/ docs/ --custom-formatter stylelint-formatter-pretty && echo \\\"Stylelint done!\\\"\",\n \"lint:css:fix\": \"stylelint --cache --config stylelint.config.mjs --cache-strategy content --cache-location .cache/stylelintcache src/ docs/ --custom-formatter stylelint-formatter-pretty --fix && echo \\\"Stylelint done!\\\"\",\n \"lint:fix\": \"cross-env NODE_OPTIONS=--max_old_space_size=16384 eslint --cache --cache-strategy content --cache-location .cache/.eslintcache --fix\",\n \"lint:fix:quiet\": \"cross-env ESLINT_PROGRESS=off NODE_OPTIONS=--max_old_space_size=16384 eslint --cache --cache-strategy content --cache-location .cache/.eslintcache --fix && echo \\\"Eslint fix done!\\\"\",\n \"lint:grype\": \"grype . -c .grype.yaml --name eslint-plugin-github-actions-2\",\n \"lint:package\": \"npm run lint:package-sort && npm run lint:packagelintrc && echo \\\"Package.json lint done!\\\"\",\n \"lint:package-check\": \"publint && attw --pack .\",\n \"lint:package-sort\": \"sort-package-json \\\"./package.json\\\" \\\"./docs/docusaurus/package.json\\\"\",\n \"lint:package-sort-check\": \"sort-package-json --check \\\"./package.json\\\" \\\"./docs/docusaurus/package.json\\\"\",\n \"lint:packagelintrc\": \"npmPkgJsonLint . --config .npmpackagejsonlintrc.json\",\n \"lint:prettier\": \"prettier . --log-level warn --cache --cache-location=.cache/.prettier-cache --cache-strategy=content --check\",\n \"lint:prettier:fix\": \"prettier . --log-level warn --cache --cache-location=.cache/.prettier-cache --cache-strategy=content --write\",\n \"lint:quiet\": \"cross-env ESLINT_PROGRESS=nofile NODE_OPTIONS=--max_old_space_size=16384 eslint --cache --cache-strategy content --cache-location .cache/.eslintcache && echo \\\"Eslint done!\\\"\",\n \"lint:remark\": \"remark --rc-path .remarkrc.mjs --silently-ignore --ignore-path .remarkignore --frail \\\"*.{md,mdx}\\\" \\\"docs/**/*.{md,mdx}\\\" --quiet\",\n \"lint:remark:fix\": \"prettier --log-level warn --ignore-path prettierignore.remark --cache --cache-location=.cache/.prettier-cache --cache-strategy=content --no-error-on-unmatched-pattern --write \\\"*.{md,mdx}\\\" \\\"docs/**/*.{md,mdx}\\\" && npm run remark:fix\",\n \"lint:secretlint\": \"secretlint --secretlintrc .secretlintrc.json --secretlintignore .secretlintignore \\\"./*\\\" \\\".vscode/**\\\" \\\"assets/**\\\" \\\"src/**\\\" \\\"electron/**\\\" \\\"shared/**\\\" \\\"config/**\\\" \\\"scripts/**\\\" \\\"playwright/**\\\" \\\"storybook/**\\\" \\\".storybook\\\" \\\"tests/**\\\" \\\"benchmarks/**\\\" \\\".devin/**\\\" \\\"public/**\\\" \\\".github/**\\\" \\\"docs/Architecture/**\\\" \\\"docs/*\\\" \\\"docs/assets/**\\\" \\\"docs/Guides/**\\\" \\\"docs/Testing/**\\\" \\\"docs/TSDoc/**\\\" \\\"docs/docusaurus/src/**\\\" \\\"docs/docusaurus/static/**\\\" \\\"docs/docusaurus/blog/**\\\" \\\"docs/docusaurus/docs/**\\\" \\\"docs/docusaurus/docs/*\\\"\",\n \"lint:yaml\": \"cross-env NODE_OPTIONS=--max_old_space_size=16384 eslint --cache --cache-strategy content --cache-location .cache/.eslintcache \\\"**/*.{yml,yaml}\\\" && echo \\\"YAML lint done!\\\"\",\n \"lint:yaml:fix\": \"cross-env NODE_OPTIONS=--max_old_space_size=16384 eslint --cache --cache-strategy content --cache-location .cache/.eslintcache --fix \\\"**/*.{yml,yaml}\\\" && echo \\\"YAML lint (fix) done!\\\"\",\n \"madge:circular\": \"madge --circular --no-spinner --ts-config tsconfig.json --extensions ts,tsx,js,jsx,mjs,cjs,cts,mts ./src --exclude \\\"(^|[\\\\/])(test|dist|node_modules|cache|.cache|coverage|build|eslint-inspector|temp|.docusaurus)($|[\\\\/])|\\\\.css$\\\"\",\n \"prepublishOnly\": \"npm run release:verify\",\n \"release:check\": \"npm run release:verify\",\n \"release:verify\": \"npm run build && npm run lint && npm run typecheck && npm run test && npm run docs:build && npm pack --dry-run\",\n \"remark:fix\": \"remark --rc-path .remarkrc.mjs --silently-ignore --ignore-path .remarkignore --frail --quiet --output -- \\\"*.{md,mdx}\\\" \\\"docs/**/*.{md,mdx}\\\"\",\n \"sync:peer-eslint-range\": \"node scripts/sync-peer-eslint-range.mjs\",\n \"sync:readme-rules-table\": \"node scripts/sync-readme-rules-table.mjs\",\n \"sync:readme-rules-table:write\": \"node scripts/sync-readme-rules-table.mjs --write\",\n \"pretest\": \"npm run build\",\n \"test\": \"vitest run\",\n \"test:ci\": \"cross-env CI=true vitest run --reporter=default\",\n \"test:coverage\": \"vitest run --coverage --reporter=default\",\n \"test:quiet\": \"vitest run --reporter=default --silent\",\n \"test:serial\": \"cross-env MAX_THREADS=1 vitest run\",\n \"test:verbose\": \"vitest run --reporter=verbose\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.build.json --noEmit && tsc -p tsconfig.eslint.json --noEmit && tsc -p tsconfig.js.json --noEmit && npm run --workspace docs/docusaurus typecheck\",\n \"update-deps\": \"npx ncu -i --install never && npm run sync:peer-eslint-range && npm install --force\",\n \"verify:readme-rules-table\": \"npm run build && npm run sync:readme-rules-table\"\n },\n \"overrides\": {\n \"jsonc-eslint-parser\": \"$jsonc-eslint-parser\"\n },\n \"dependencies\": {\n \"yaml-eslint-parser\": \"^2.0.0\"\n },\n \"devDependencies\": {\n \"@arethetypeswrong/cli\": \"^0.18.2\",\n \"@csstools/stylelint-formatter-github\": \"^2.0.0\",\n \"@docusaurus/eslint-plugin\": \"^3.9.2\",\n \"@double-great/remark-lint-alt-text\": \"^1.1.1\",\n \"@double-great/stylelint-a11y\": \"^3.4.6\",\n \"@eslint-community/eslint-plugin-eslint-comments\": \"^4.7.1\",\n \"@eslint-react/eslint-plugin\": \"^3.0.0\",\n \"@eslint/compat\": \"^2.0.3\",\n \"@eslint/config-helpers\": \"^0.5.3\",\n \"@eslint/config-inspector\": \"^1.5.0\",\n \"@eslint/css\": \"^1.0.0\",\n \"@eslint/js\": \"^10.0.1\",\n \"@eslint/json\": \"^1.2.0\",\n \"@eslint/markdown\": \"^7.5.1\",\n \"@html-eslint/eslint-plugin\": \"^0.58.1\",\n \"@html-eslint/parser\": \"^0.58.1\",\n \"@microsoft/eslint-plugin-sdl\": \"^1.1.0\",\n \"@microsoft/tsdoc-config\": \"^0.18.1\",\n \"@secretlint/secretlint-rule-anthropic\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-aws\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-database-connection-string\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-gcp\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-github\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-no-dotenv\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-no-homedir\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-npm\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-openai\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-pattern\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-preset-recommend\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-privatekey\": \"^11.4.0\",\n \"@secretlint/secretlint-rule-secp256k1-privatekey\": \"^11.4.0\",\n \"@secretlint/types\": \"^11.4.0\",\n \"@softonus/prettier-plugin-duplicate-remover\": \"^1.1.2\",\n \"@stryker-ignorer/console-all\": \"^0.3.2\",\n \"@stryker-mutator/core\": \"^9.6.0\",\n \"@stryker-mutator/typescript-checker\": \"^9.6.0\",\n \"@stryker-mutator/vitest-runner\": \"^9.6.0\",\n \"@stylelint-types/stylelint-order\": \"^7.0.1\",\n \"@stylelint-types/stylelint-stylistic\": \"^5.0.0\",\n \"@stylistic/eslint-plugin\": \"^5.10.0\",\n \"@stylistic/stylelint-plugin\": \"^5.0.1\",\n \"@types/eslint-plugin-jsx-a11y\": \"^6.10.1\",\n \"@types/eslint-plugin-security\": \"^3.0.1\",\n \"@types/htmlhint\": \"^1.1.5\",\n \"@types/madge\": \"^5.0.3\",\n \"@types/node\": \"^25.5.0\",\n \"@types/postcss-clamp\": \"^4.1.3\",\n \"@types/postcss-flexbugs-fixes\": \"^5.0.3\",\n \"@types/postcss-html\": \"^1.5.3\",\n \"@types/postcss-import\": \"^14.0.3\",\n \"@types/postcss-inline-svg\": \"^5.0.4\",\n \"@types/postcss-normalize\": \"^9.0.4\",\n \"@types/postcss-reporter\": \"^7.0.5\",\n \"@types/sloc\": \"^0.2.3\",\n \"@typescript-eslint/eslint-plugin\": \"^8.57.1\",\n \"@typescript-eslint/parser\": \"^8.57.1\",\n \"@typescript-eslint/rule-tester\": \"^8.57.1\",\n \"@vitest/coverage-v8\": \"^4.1.0\",\n \"@vitest/eslint-plugin\": \"^1.6.12\",\n \"@vitest/ui\": \"^4.1.0\",\n \"actionlint\": \"^2.0.6\",\n \"all-contributors-cli\": \"^6.26.1\",\n \"cognitive-complexity-ts\": \"^0.8.1\",\n \"commitlint\": \"^20.5.0\",\n \"commitlint-config-gitmoji\": \"^2.3.1\",\n \"cross-env\": \"^10.1.0\",\n \"depcheck\": \"^1.4.7\",\n \"detect-secrets\": \"^1.0.6\",\n \"eslint\": \"^10.1.0\",\n \"eslint-config-flat-gitignore\": \"^2.2.1\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-formatter-unix\": \"^9.0.1\",\n \"eslint-import-resolver-typescript\": \"^4.4.4\",\n \"eslint-plugin-array-func\": \"^5.1.1\",\n \"eslint-plugin-canonical\": \"^5.1.3\",\n \"eslint-plugin-case-police\": \"^2.2.0\",\n \"eslint-plugin-comment-length\": \"^2.3.0\",\n \"eslint-plugin-css-modules\": \"^2.12.0\",\n \"eslint-plugin-de-morgan\": \"^2.1.1\",\n \"eslint-plugin-depend\": \"^1.5.0\",\n \"eslint-plugin-eslint-plugin\": \"^7.3.2\",\n \"eslint-plugin-etc\": \"^2.0.3\",\n \"eslint-plugin-etc-misc\": \"^1.0.4\",\n \"eslint-plugin-file-progress-2\": \"^3.4.3\",\n \"eslint-plugin-html\": \"^8.1.4\",\n \"eslint-plugin-import-x\": \"^4.16.2\",\n \"eslint-plugin-jsdoc\": \"^62.8.0\",\n \"eslint-plugin-jsonc\": \"^3.1.2\",\n \"eslint-plugin-jsx-a11y\": \"^6.10.2\",\n \"eslint-plugin-listeners\": \"^1.5.1\",\n \"eslint-plugin-loadable-imports\": \"^1.0.1\",\n \"eslint-plugin-math\": \"^0.13.1\",\n \"eslint-plugin-module-interop\": \"^0.3.1\",\n \"eslint-plugin-n\": \"^17.24.0\",\n \"eslint-plugin-nitpick\": \"^0.12.0\",\n \"eslint-plugin-no-barrel-files\": \"^1.2.2\",\n \"eslint-plugin-no-explicit-type-exports\": \"^0.12.1\",\n \"eslint-plugin-no-function-declare-after-return\": \"^1.1.0\",\n \"eslint-plugin-no-lookahead-lookbehind-regexp\": \"^0.4.0\",\n \"eslint-plugin-no-only-tests\": \"^3.3.0\",\n \"eslint-plugin-no-secrets\": \"^2.3.3\",\n \"eslint-plugin-no-unsanitized\": \"^4.1.5\",\n \"eslint-plugin-no-use-extend-native\": \"^0.7.2\",\n \"eslint-plugin-node-dependencies\": \"^2.2.0\",\n \"eslint-plugin-package-json\": \"^0.91.0\",\n \"eslint-plugin-perfectionist\": \"^5.7.0\",\n \"eslint-plugin-prefer-arrow\": \"^1.2.3\",\n \"eslint-plugin-prettier\": \"^5.5.5\",\n \"eslint-plugin-promise\": \"^7.2.1\",\n \"eslint-plugin-redos\": \"^4.5.0\",\n \"eslint-plugin-regexp\": \"^3.1.0\",\n \"eslint-plugin-require-jsdoc\": \"^1.0.4\",\n \"eslint-plugin-security\": \"^4.0.0\",\n \"eslint-plugin-sonarjs\": \"^4.0.2\",\n \"eslint-plugin-sort-class-members\": \"^1.21.0\",\n \"eslint-plugin-testing-library\": \"^7.16.1\",\n \"eslint-plugin-toml\": \"^1.3.1\",\n \"eslint-plugin-total-functions\": \"^7.1.0\",\n \"eslint-plugin-tsdoc\": \"^0.5.2\",\n \"eslint-plugin-tsdoc-require-2\": \"^1.0.6\",\n \"eslint-plugin-undefined-css-classes\": \"^0.1.5\",\n \"eslint-plugin-unicorn\": \"^63.0.0\",\n \"eslint-plugin-unused-imports\": \"^4.4.1\",\n \"eslint-plugin-write-good-comments\": \"^0.2.0\",\n \"eslint-plugin-yml\": \"^3.3.1\",\n \"fast-check\": \"^4.6.0\",\n \"git-cliff\": \"^2.12.0\",\n \"gitleaks-secret-scanner\": \"^2.1.1\",\n \"globals\": \"^17.4.0\",\n \"htmlhint\": \"^1.9.2\",\n \"jscpd\": \"^4.0.8\",\n \"jsonc-eslint-parser\": \"^3.1.0\",\n \"knip\": \"^6.0.1\",\n \"leasot\": \"^14.4.0\",\n \"madge\": \"^8.0.0\",\n \"markdown-link-check\": \"^3.14.2\",\n \"npm-check-updates\": \"^19.6.5\",\n \"npm-package-json-lint\": \"^9.1.0\",\n \"picocolors\": \"^1.1.1\",\n \"postcss\": \"^8.5.8\",\n \"postcss-assets\": \"^6.0.0\",\n \"postcss-clamp\": \"^4.1.0\",\n \"postcss-combine-duplicated-selectors\": \"^10.0.3\",\n \"postcss-flexbugs-fixes\": \"^5.0.2\",\n \"postcss-html\": \"^1.8.1\",\n \"postcss-import\": \"^16.1.1\",\n \"postcss-inline-svg\": \"^6.0.0\",\n \"postcss-logical\": \"^9.0.0\",\n \"postcss-normalize\": \"^13.0.1\",\n \"postcss-reporter\": \"^7.1.0\",\n \"postcss-round-subpixels\": \"^2.0.0\",\n \"postcss-scss\": \"^4.0.9\",\n \"postcss-sort-media-queries\": \"^6.3.2\",\n \"postcss-styled-jsx\": \"^1.0.1\",\n \"postcss-styled-syntax\": \"^0.7.1\",\n \"postcss-viewport-height-correction\": \"^1.1.1\",\n \"prettier\": \"^3.8.1\",\n \"prettier-plugin-ini\": \"^1.3.0\",\n \"prettier-plugin-interpolated-html-tags\": \"^2.0.1\",\n \"prettier-plugin-jsdoc\": \"^1.8.0\",\n \"prettier-plugin-jsdoc-type\": \"^0.2.0\",\n \"prettier-plugin-merge\": \"^0.10.0\",\n \"prettier-plugin-multiline-arrays\": \"^4.1.5\",\n \"prettier-plugin-packagejson\": \"^3.0.2\",\n \"prettier-plugin-properties\": \"^0.3.1\",\n \"prettier-plugin-sort-json\": \"^4.2.0\",\n \"prettier-plugin-toml\": \"^2.0.6\",\n \"publint\": \"^0.3.18\",\n \"recheck-jar\": \"^4.5.0\",\n \"rehype-katex\": \"^7.0.1\",\n \"remark\": \"^15.0.1\",\n \"remark-cli\": \"^12.0.1\",\n \"remark-directive\": \"^4.0.0\",\n \"remark-frontmatter\": \"^5.0.0\",\n \"remark-gfm\": \"^4.0.1\",\n \"remark-ignore\": \"^3.0.0\",\n \"remark-inline-links\": \"^7.0.0\",\n \"remark-lint\": \"^10.0.1\",\n \"remark-lint-blockquote-indentation\": \"^4.0.1\",\n \"remark-lint-check-toc\": \"^1.0.0\",\n \"remark-lint-checkbox-character-style\": \"^5.0.1\",\n \"remark-lint-checkbox-content-indent\": \"^5.0.1\",\n \"remark-lint-code-block-split-list\": \"^1.0.0\",\n \"remark-lint-code-block-style\": \"^4.0.1\",\n \"remark-lint-correct-media-syntax\": \"^1.0.1\",\n \"remark-lint-definition-case\": \"^4.0.1\",\n \"remark-lint-definition-sort\": \"^1.0.1\",\n \"remark-lint-definition-spacing\": \"^4.0.1\",\n \"remark-lint-directive-attribute-sort\": \"^1.0.1\",\n \"remark-lint-directive-collapsed-attribute\": \"^1.0.1\",\n \"remark-lint-directive-quote-style\": \"^1.0.1\",\n \"remark-lint-directive-shortcut-attribute\": \"^1.0.1\",\n \"remark-lint-directive-unique-attribute-name\": \"^1.0.1\",\n \"remark-lint-emphasis-marker\": \"^4.0.1\",\n \"remark-lint-fenced-code-flag\": \"^4.2.0\",\n \"remark-lint-fenced-code-flag-case\": \"^3.0.0\",\n \"remark-lint-fenced-code-marker\": \"^4.0.1\",\n \"remark-lint-file-extension\": \"^3.0.1\",\n \"remark-lint-final-definition\": \"^4.0.2\",\n \"remark-lint-final-newline\": \"^3.0.1\",\n \"remark-lint-first-heading-level\": \"^4.0.1\",\n \"remark-lint-frontmatter-schema\": \"^3.15.4\",\n \"remark-lint-hard-break-spaces\": \"^4.1.1\",\n \"remark-lint-heading-capitalization\": \"^1.3.0\",\n \"remark-lint-heading-increment\": \"^4.0.1\",\n \"remark-lint-heading-style\": \"^4.0.1\",\n \"remark-lint-heading-whitespace\": \"^1.0.0\",\n \"remark-lint-linebreak-style\": \"^4.0.1\",\n \"remark-lint-link-title-style\": \"^4.0.1\",\n \"remark-lint-list-item-bullet-indent\": \"^5.0.1\",\n \"remark-lint-list-item-content-indent\": \"^4.0.1\",\n \"remark-lint-list-item-indent\": \"^4.0.1\",\n \"remark-lint-list-item-spacing\": \"^5.0.1\",\n \"remark-lint-maximum-heading-length\": \"^4.1.1\",\n \"remark-lint-maximum-line-length\": \"^4.1.1\",\n \"remark-lint-mdx-jsx-attribute-sort\": \"^1.0.1\",\n \"remark-lint-mdx-jsx-no-void-children\": \"^1.0.1\",\n \"remark-lint-mdx-jsx-quote-style\": \"^1.0.1\",\n \"remark-lint-mdx-jsx-self-close\": \"^1.0.1\",\n \"remark-lint-mdx-jsx-shorthand-attribute\": \"^1.0.1\",\n \"remark-lint-mdx-jsx-unique-attribute-name\": \"^1.0.1\",\n \"remark-lint-media-style\": \"^1.0.1\",\n \"remark-lint-no-blockquote-without-marker\": \"^6.0.1\",\n \"remark-lint-no-consecutive-blank-lines\": \"^5.0.1\",\n \"remark-lint-no-dead-urls\": \"^2.0.1\",\n \"remark-lint-no-duplicate-defined-urls\": \"^3.0.1\",\n \"remark-lint-no-duplicate-definitions\": \"^4.0.1\",\n \"remark-lint-no-duplicate-headings\": \"^4.0.1\",\n \"remark-lint-no-duplicate-headings-in-section\": \"^4.0.1\",\n \"remark-lint-no-emphasis-as-heading\": \"^4.0.1\",\n \"remark-lint-no-empty-sections\": \"^4.0.0\",\n \"remark-lint-no-empty-url\": \"^4.0.1\",\n \"remark-lint-no-file-name-articles\": \"^3.0.1\",\n \"remark-lint-no-file-name-consecutive-dashes\": \"^3.0.1\",\n \"remark-lint-no-file-name-irregular-characters\": \"^3.0.1\",\n \"remark-lint-no-file-name-mixed-case\": \"^3.0.1\",\n \"remark-lint-no-file-name-outer-dashes\": \"^3.0.1\",\n \"remark-lint-no-heading-content-indent\": \"^5.0.1\",\n \"remark-lint-no-heading-indent\": \"^5.0.1\",\n \"remark-lint-no-heading-like-paragraph\": \"^4.0.1\",\n \"remark-lint-no-heading-punctuation\": \"^4.0.1\",\n \"remark-lint-no-hidden-table-cell\": \"^1.0.1\",\n \"remark-lint-no-html\": \"^4.0.1\",\n \"remark-lint-no-literal-urls\": \"^4.0.1\",\n \"remark-lint-no-missing-blank-lines\": \"^4.0.1\",\n \"remark-lint-no-multiple-toplevel-headings\": \"^4.0.1\",\n \"remark-lint-no-paragraph-content-indent\": \"^5.0.1\",\n \"remark-lint-no-reference-like-url\": \"^4.0.1\",\n \"remark-lint-no-shell-dollars\": \"^4.0.1\",\n \"remark-lint-no-shortcut-reference-image\": \"^4.0.1\",\n \"remark-lint-no-shortcut-reference-link\": \"^4.0.1\",\n \"remark-lint-no-table-indentation\": \"^5.0.1\",\n \"remark-lint-no-tabs\": \"^4.0.1\",\n \"remark-lint-no-undefined-references\": \"^5.0.2\",\n \"remark-lint-no-unneeded-full-reference-image\": \"^4.0.1\",\n \"remark-lint-no-unneeded-full-reference-link\": \"^4.0.1\",\n \"remark-lint-no-unused-definitions\": \"^4.0.2\",\n \"remark-lint-ordered-list-marker-style\": \"^4.0.1\",\n \"remark-lint-ordered-list-marker-value\": \"^4.0.1\",\n \"remark-lint-rule-style\": \"^4.0.1\",\n \"remark-lint-strikethrough-marker\": \"^3.0.1\",\n \"remark-lint-strong-marker\": \"^4.0.1\",\n \"remark-lint-table-cell-padding\": \"^5.1.1\",\n \"remark-lint-table-pipe-alignment\": \"^4.1.1\",\n \"remark-lint-table-pipes\": \"^5.0.1\",\n \"remark-lint-unordered-list-marker-style\": \"^4.0.1\",\n \"remark-lint-write-good\": \"^1.2.0\",\n \"remark-math\": \"^6.0.0\",\n \"remark-preset-lint-consistent\": \"^6.0.1\",\n \"remark-preset-lint-markdown-style-guide\": \"^6.0.1\",\n \"remark-preset-lint-recommended\": \"^7.0.1\",\n \"remark-preset-prettier\": \"^2.0.2\",\n \"remark-toc\": \"^9.0.0\",\n \"remark-validate-links\": \"^13.1.0\",\n \"remark-wiki-link\": \"^2.0.1\",\n \"rimraf\": \"^6.1.3\",\n \"secretlint\": \"^11.4.0\",\n \"sloc\": \"^0.3.2\",\n \"sort-package-json\": \"^3.6.1\",\n \"stylelint\": \"^17.5.0\",\n \"stylelint-actions-formatters\": \"^16.3.1\",\n \"stylelint-checkstyle-formatter\": \"^0.1.2\",\n \"stylelint-codeframe-formatter\": \"^1.2.0\",\n \"stylelint-config-alphabetical-order\": \"^2.0.0\",\n \"stylelint-config-idiomatic-order\": \"^10.0.0\",\n \"stylelint-config-inspector\": \"^2.0.2\",\n \"stylelint-config-recess-order\": \"^7.7.0\",\n \"stylelint-config-recommended\": \"^18.0.0\",\n \"stylelint-config-sass-guidelines\": \"^13.0.0\",\n \"stylelint-config-standard\": \"^40.0.0\",\n \"stylelint-config-standard-scss\": \"^17.0.0\",\n \"stylelint-config-tailwindcss\": \"^1.0.1\",\n \"stylelint-declaration-block-no-ignored-properties\": \"^3.0.0\",\n \"stylelint-declaration-strict-value\": \"^1.11.1\",\n \"stylelint-define-config\": \"^17.5.0\",\n \"stylelint-find-new-rules\": \"^6.0.0\",\n \"stylelint-formatter-gitlab-code-quality-report\": \"^1.1.0\",\n \"stylelint-formatter-pretty\": \"^4.0.1\",\n \"stylelint-gamut\": \"^2.0.0\",\n \"stylelint-group-selectors\": \"^1.0.10\",\n \"stylelint-high-performance-animation\": \"^2.0.0\",\n \"stylelint-media-use-custom-media\": \"^4.1.0\",\n \"stylelint-no-browser-hacks\": \"^2.0.0\",\n \"stylelint-no-indistinguishable-colors\": \"^2.3.1\",\n \"stylelint-no-restricted-syntax\": \"^2.2.1\",\n \"stylelint-no-unresolved-module\": \"^2.5.2\",\n \"stylelint-no-unsupported-browser-features\": \"^8.1.1\",\n \"stylelint-order\": \"^8.1.1\",\n \"stylelint-plugin-defensive-css\": \"^2.8.0\",\n \"stylelint-plugin-logical-css\": \"^2.0.2\",\n \"stylelint-plugin-use-baseline\": \"^1.4.0\",\n \"stylelint-prettier\": \"^5.0.3\",\n \"stylelint-react-native\": \"^2.7.0\",\n \"stylelint-scales\": \"^5.0.0\",\n \"stylelint-selector-bem-pattern\": \"^4.0.1\",\n \"stylelint-use-nesting\": \"^6.0.2\",\n \"stylelint-value-no-unknown-custom-properties\": \"^6.1.1\",\n \"toml-eslint-parser\": \"^1.0.3\",\n \"ts-unused-exports\": \"^11.0.1\",\n \"typedoc\": \"^0.28.17\",\n \"typescript\": \"^5.9.3\",\n \"typescript-eslint\": \"^8.57.1\",\n \"typesync\": \"^0.14.3\",\n \"vfile\": \"^6.0.3\",\n \"vite\": \"^8.0.1\",\n \"vite-tsconfig-paths\": \"^6.1.1\",\n \"vitest\": \"^4.1.0\",\n \"yamllint-js\": \"^0.2.4\"\n },\n \"peerDependencies\": {\n \"eslint\": \"^9.0.0 || ^10.1.0\"\n },\n \"packageManager\": \"npm@11.12.0\",\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"devEngines\": {\n \"runtime\": {\n \"name\": \"node\",\n \"version\": \">=22.0.0\",\n \"onFail\": \"error\"\n },\n \"packageManager\": {\n \"name\": \"npm\",\n \"version\": \">=11.0.0\",\n \"onFail\": \"error\"\n }\n },\n \"publishConfig\": {\n \"provenance\": true,\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"readme\": \"README.md\"\n}\n", "/**\n * @packageDocumentation\n * Shared filename target helpers for action metadata and workflow templates.\n */\nimport { basename, extname } from \"node:path\";\n\n/** Action metadata file globs. */\nexport const ACTION_METADATA_FILE_GLOBS: readonly string[] = [\n \"**/action.{yml,yaml}\",\n];\n\n/** Workflow template metadata (`.properties.json`) file globs. */\nexport const WORKFLOW_TEMPLATE_PROPERTIES_FILE_GLOBS: readonly string[] = [\n \"**/workflow-templates/*.properties.json\",\n];\n\n/** Workflow template YAML file globs. */\nexport const WORKFLOW_TEMPLATE_YAML_FILE_GLOBS: readonly string[] = [\n \"**/workflow-templates/*.{yml,yaml}\",\n];\n\n/** Combined workflow template globs used by dedicated template presets. */\nexport const WORKFLOW_TEMPLATE_FILE_GLOBS: readonly string[] = [\n ...WORKFLOW_TEMPLATE_YAML_FILE_GLOBS,\n ...WORKFLOW_TEMPLATE_PROPERTIES_FILE_GLOBS,\n];\n\n/** Normalize file paths for stable cross-platform path checks. */\nconst normalizePathForMatching = (filePath: string): string =>\n filePath.replaceAll(\"\\\\\", \"/\").toLowerCase();\n\n/** Determine whether a filename is an action metadata file. */\nexport const isActionMetadataFile = (filePath: string): boolean => {\n const normalizedFilePath = normalizePathForMatching(filePath);\n\n return (\n normalizedFilePath.endsWith(\"/action.yml\") ||\n normalizedFilePath.endsWith(\"/action.yaml\")\n );\n};\n\n/** Determine whether a filename is a workflow template metadata file. */\nexport const isWorkflowTemplatePropertiesFile = (filePath: string): boolean =>\n normalizePathForMatching(filePath).includes(\"/workflow-templates/\") &&\n normalizePathForMatching(filePath).endsWith(\".properties.json\");\n\n/** Determine whether a filename is a workflow template YAML file. */\nexport const isWorkflowTemplateYamlFile = (filePath: string): boolean => {\n const normalizedFilePath = normalizePathForMatching(filePath);\n\n return (\n normalizedFilePath.includes(\"/workflow-templates/\") &&\n (normalizedFilePath.endsWith(\".yml\") ||\n normalizedFilePath.endsWith(\".yaml\"))\n );\n};\n\n/** Determine whether a filename belongs to any workflow template surface. */\nexport const isWorkflowTemplateFile = (filePath: string): boolean =>\n isWorkflowTemplatePropertiesFile(filePath) ||\n isWorkflowTemplateYamlFile(filePath);\n\n/** Determine whether the path uses `.yaml` (rather than `.yml`). */\nexport const usesYamlExtension = (filePath: string): boolean =>\n extname(filePath).toLowerCase() === \".yaml\";\n\n/** Return the template basename without extension suffixes. */\nexport const getTemplateStem = (filePath: string): string => {\n const fileName = basename(filePath);\n\n if (fileName.endsWith(\".properties.json\")) {\n return fileName.slice(0, -\".properties.json\".length);\n }\n\n if (fileName.endsWith(\".yaml\")) {\n return fileName.slice(0, -\".yaml\".length);\n }\n\n if (fileName.endsWith(\".yml\")) {\n return fileName.slice(0, -\".yml\".length);\n }\n\n return fileName;\n};\n", "/**\n * @packageDocumentation\n * Shared YAML AST helpers for GitHub Actions workflow rules.\n */\n/* eslint-disable @typescript-eslint/prefer-readonly-parameter-types -- YAML AST nodes come from parser-owned mutable types shared across helper boundaries. */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\n/** Default workflow globs used by the exported flat configs. */\nexport const WORKFLOW_FILE_GLOBS: readonly string[] = [\n \".github/workflows/*.{yml,yaml}\",\n];\n\n/** Workflow job mapping paired with its stable identifier key. */\nexport type WorkflowJobEntry = {\n readonly id: string;\n readonly idNode: WorkflowYamlValueNode;\n readonly mapping: AST.YAMLMapping;\n readonly pair: AST.YAMLPair;\n};\n\n/** YAML value node type used by workflow helper APIs. */\ntype WorkflowYamlValueNode = AST.YAMLContent | AST.YAMLWithMeta;\n\n/** Narrow a YAML node to `YAMLWithMeta`. */\nexport const isYamlWithMeta = (\n node: AST.YAMLContent | AST.YAMLNode | AST.YAMLWithMeta | null | undefined\n): node is AST.YAMLWithMeta => node?.type === \"YAMLWithMeta\";\n\n/** Unwrap `YAMLWithMeta` wrappers until the underlying YAML value is reached. */\nexport const unwrapYamlValue = (\n node: null | undefined | WorkflowYamlValueNode\n): AST.YAMLContent | null => {\n if (node === null || node === undefined) {\n return null;\n }\n\n if (isYamlWithMeta(node)) {\n return unwrapYamlValue(node.value);\n }\n\n return node;\n};\n\n/** Narrow a YAML node to a mapping. */\nexport const isYamlMapping = (\n node: null | undefined | WorkflowYamlValueNode\n): node is AST.YAMLMapping => unwrapYamlValue(node)?.type === \"YAMLMapping\";\n\n/** Narrow a YAML node to a sequence. */\nexport const isYamlSequence = (\n node: null | undefined | WorkflowYamlValueNode\n): node is AST.YAMLSequence => unwrapYamlValue(node)?.type === \"YAMLSequence\";\n\n/** Narrow a YAML node to a scalar. */\nexport const isYamlScalar = (\n node: null | undefined | WorkflowYamlValueNode\n): node is AST.YAMLScalar => unwrapYamlValue(node)?.type === \"YAMLScalar\";\n\n/** Resolve the first document's root mapping when linting a workflow file. */\nexport const getWorkflowRoot = (\n context: Rule.RuleContext\n): AST.YAMLMapping | null => {\n const program = context.sourceCode.ast as unknown as AST.YAMLProgram;\n const [document] = program.body;\n const rootNode = unwrapYamlValue(document?.content ?? null);\n\n return rootNode?.type === \"YAMLMapping\" ? rootNode : null;\n};\n\n/** Read a scalar node as a string when possible. */\nexport const getScalarStringValue = (\n node: null | undefined | WorkflowYamlValueNode\n): null | string => {\n const unwrappedNode = unwrapYamlValue(node);\n\n if (unwrappedNode?.type !== \"YAMLScalar\") {\n return null;\n }\n\n if (typeof unwrappedNode.value === \"string\") {\n return unwrappedNode.value;\n }\n\n return \"strValue\" in unwrappedNode &&\n typeof unwrappedNode.strValue === \"string\"\n ? unwrappedNode.strValue\n : null;\n};\n\n/** Read a scalar node as a number when possible. */\nexport const getScalarNumberValue = (\n node: null | undefined | WorkflowYamlValueNode\n): null | number => {\n const unwrappedNode = unwrapYamlValue(node);\n\n if (unwrappedNode?.type !== \"YAMLScalar\") {\n return null;\n }\n\n return typeof unwrappedNode.value === \"number\" ? unwrappedNode.value : null;\n};\n\n/** Determine whether a scalar is a GitHub expression string like `${{ ... }}`. */\nexport const isGithubExpressionScalar = (\n node: null | undefined | WorkflowYamlValueNode\n): boolean => {\n const scalarValue = getScalarStringValue(node);\n\n return (\n scalarValue !== null &&\n scalarValue.trimStart().startsWith(\"${{\") &&\n scalarValue.trimEnd().endsWith(\"}}\")\n );\n};\n\n/** Find a mapping pair by its exact scalar key. */\nexport const getMappingPair = (\n mapping: AST.YAMLMapping,\n key: string\n): AST.YAMLPair | null => {\n for (const pair of mapping.pairs) {\n if (getScalarStringValue(pair.key) === key) {\n return pair;\n }\n }\n\n return null;\n};\n\n/** Resolve a mapping child by key, ensuring the value is a mapping. */\nexport const getMappingValueAsMapping = (\n mapping: AST.YAMLMapping,\n key: string\n): AST.YAMLMapping | null => {\n const pair = getMappingPair(mapping, key);\n const valueNode = unwrapYamlValue(pair?.value ?? null);\n\n return valueNode?.type === \"YAMLMapping\" ? valueNode : null;\n};\n\n/** Resolve a mapping child by key, ensuring the value is a sequence. */\nexport const getMappingValueAsSequence = (\n mapping: AST.YAMLMapping,\n key: string\n): AST.YAMLSequence | null => {\n const pair = getMappingPair(mapping, key);\n const valueNode = unwrapYamlValue(pair?.value ?? null);\n\n return valueNode?.type === \"YAMLSequence\" ? valueNode : null;\n};\n\n/** Enumerate workflow jobs under `jobs`. */\nexport const getWorkflowJobs = (\n root: AST.YAMLMapping\n): readonly WorkflowJobEntry[] => {\n const jobsMapping = getMappingValueAsMapping(root, \"jobs\");\n\n if (jobsMapping === null) {\n return [];\n }\n\n const jobs: WorkflowJobEntry[] = [];\n\n for (const pair of jobsMapping.pairs) {\n const jobId = getScalarStringValue(pair.key);\n const jobMapping = unwrapYamlValue(pair.value);\n\n if (jobId === null || jobMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n if (pair.key === null || pair.key === undefined) {\n continue;\n }\n\n jobs.push({\n id: jobId,\n idNode: pair.key,\n mapping: jobMapping,\n pair,\n });\n }\n\n return jobs;\n};\n\n/** Collect the workflow event names declared under `on`. */\nexport const getWorkflowEventNames = (\n root: AST.YAMLMapping\n): ReadonlySet<string> => {\n const onPair = getMappingPair(root, \"on\");\n const onValue = unwrapYamlValue(onPair?.value ?? null);\n const eventNames = new Set<string>();\n\n if (onValue === null) {\n return eventNames;\n }\n\n if (onValue.type === \"YAMLScalar\") {\n const eventName = getScalarStringValue(onValue);\n\n if (eventName !== null) {\n eventNames.add(eventName);\n }\n\n return eventNames;\n }\n\n if (onValue.type === \"YAMLSequence\") {\n for (const entry of onValue.entries) {\n const eventName = getScalarStringValue(entry);\n\n if (eventName !== null) {\n eventNames.add(eventName);\n }\n }\n\n return eventNames;\n }\n\n if (onValue.type === \"YAMLMapping\") {\n for (const pair of onValue.pairs) {\n const eventName = getScalarStringValue(pair.key);\n\n if (eventName !== null) {\n eventNames.add(eventName);\n }\n }\n }\n\n return eventNames;\n};\n\n/* eslint-enable @typescript-eslint/prefer-readonly-parameter-types -- Re-enable readonly-parameter checks after YAML AST helper declarations. */\n", "/**\n * @packageDocumentation\n * Canonical preset names and docs references used by eslint-plugin-github-actions-2.\n */\nimport {\n ACTION_METADATA_FILE_GLOBS,\n WORKFLOW_TEMPLATE_FILE_GLOBS,\n WORKFLOW_TEMPLATE_PROPERTIES_FILE_GLOBS,\n} from \"./lint-targets.js\";\nimport { WORKFLOW_FILE_GLOBS } from \"./workflow-yaml.js\";\n\n/** Ordered preset names exposed through `plugin.configs`. */\nexport const githubActionsConfigNames = [\n \"actionMetadata\",\n \"workflowTemplateProperties\",\n \"workflowTemplates\",\n \"recommended\",\n \"security\",\n \"strict\",\n \"all\",\n] as const;\n\n/** Supported flat-config preset names exported by the plugin. */\nexport type GithubActionsConfigName = (typeof githubActionsConfigNames)[number];\n\n/** String references used in rule docs metadata and generated docs tables. */\nexport const githubActionsConfigReferenceToName: Readonly<\n Record<string, GithubActionsConfigName>\n> = {\n \"github-actions.configs.actionMetadata\": \"actionMetadata\",\n \"github-actions.configs.all\": \"all\",\n \"github-actions.configs.recommended\": \"recommended\",\n \"github-actions.configs.security\": \"security\",\n \"github-actions.configs.strict\": \"strict\",\n \"github-actions.configs.workflowTemplateProperties\":\n \"workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\": \"workflowTemplates\",\n} as const satisfies Record<string, GithubActionsConfigName>;\n\n/** Valid config reference strings accepted in rule metadata. */\nexport type GithubActionsConfigReference =\n keyof typeof githubActionsConfigReferenceToName;\n\n/** Display metadata for each preset used in README and docs surfaces. */\nexport const githubActionsConfigMetadataByName: Readonly<\n Record<\n GithubActionsConfigName,\n {\n description: string;\n files: readonly string[];\n icon: string;\n presetName: string;\n }\n >\n> = {\n actionMetadata: {\n description:\n \"Linting defaults for GitHub Action metadata files (`action.yml` / `action.yaml`).\",\n files: ACTION_METADATA_FILE_GLOBS,\n icon: \"\uD83E\uDDE9\",\n presetName: \"github-actions:action-metadata\",\n },\n all: {\n description:\n \"Enables every available GitHub Actions workflow rule published by this plugin.\",\n files: [\n ...WORKFLOW_FILE_GLOBS,\n ...ACTION_METADATA_FILE_GLOBS,\n ...WORKFLOW_TEMPLATE_FILE_GLOBS,\n ],\n icon: \"\uD83D\uDFE3\",\n presetName: \"github-actions:all\",\n },\n recommended: {\n description:\n \"Balanced defaults for most repositories authoring GitHub Actions workflows.\",\n files: WORKFLOW_FILE_GLOBS,\n icon: \"\uD83D\uDFE1\",\n presetName: \"github-actions:recommended\",\n },\n security: {\n description:\n \"Security-focused workflow hardening checks for action usage and token scope.\",\n files: WORKFLOW_FILE_GLOBS,\n icon: \"\uD83D\uDEE1\uFE0F\",\n presetName: \"github-actions:security\",\n },\n strict: {\n description:\n \"Opinionated operational guardrails for mature workflow estates.\",\n files: WORKFLOW_FILE_GLOBS,\n icon: \"\uD83D\uDD34\",\n presetName: \"github-actions:strict\",\n },\n workflowTemplateProperties: {\n description:\n \"Linting defaults for workflow-template metadata files (`*.properties.json`).\",\n files: WORKFLOW_TEMPLATE_PROPERTIES_FILE_GLOBS,\n icon: \"\uD83D\uDDC2\uFE0F\",\n presetName: \"github-actions:workflow-template-properties\",\n },\n workflowTemplates: {\n description:\n \"Workflow template package linting for both template YAML and metadata files.\",\n files: WORKFLOW_TEMPLATE_FILE_GLOBS,\n icon: \"\uD83E\uDDF1\",\n presetName: \"github-actions:workflow-templates\",\n },\n} as const;\n", "/**\n * @packageDocumentation\n * Canonical brand/acronym dictionary synced from case-police.\n * Source: https://github.com/antfu/case-police\n */\n\n/**\n * Canonical casing entries merged from case-police dictionaries.\n */\nexport const casePoliceDictionary: Readonly<Record<string, string>> = {\n \"1password\": \"1Password\",\n \"3dtiles\": \"3DTiles\",\n abi: \"ABI\",\n actionscript: \"ActionScript\",\n adblock: \"AdBlock\",\n aiaas: \"AIaaS\",\n airbnb: \"Airbnb\",\n ajax: \"AJAX\",\n alipay: \"Alipay\",\n alphago: \"AlphaGo\",\n amap: \"AMap\",\n amd: \"AMD\",\n angularjs: \"AngularJS\",\n antd: \"AntD\",\n \"ant design\": \"Ant Design\",\n antdesign: \"AntDesign\",\n \"ant design vue\": \"Ant Design Vue\",\n antdesignvue: \"AntDesignVue\",\n antv: \"AntV\",\n api: \"API\",\n apifox: \"Apifox\",\n \"apple pay\": \"Apple Pay\",\n applescript: \"AppleScript\",\n appletalk: \"AppleTalk\",\n \"app store\": \"App Store\",\n arangodb: \"ArangoDB\",\n arcgis: \"ArcGIS\",\n arcmap: \"ArcMap\",\n arcobjects: \"ArcObjects\",\n ast: \"AST\",\n baas: \"BaaS\",\n beego: \"Beego\",\n bitbucket: \"Bitbucket\",\n bittorrent: \"BitTorrent\",\n bluesky: \"Bluesky\",\n bom: \"BOM\",\n bsd: \"BSD\",\n busybox: \"BusyBox\",\n bytedance: \"ByteDance\",\n caas: \"CaaS\",\n cdn: \"CDN\",\n centos: \"CentOS\",\n cesiumjs: \"CesiumJS\",\n chatgpt: \"ChatGPT\",\n circleci: \"CircleCI\",\n citygml: \"CityGML\",\n cityjson: \"CityJSON\",\n cjs: \"CJS\",\n ckeditor: \"CKEditor\",\n clashx: \"ClashX\",\n cli: \"CLI\",\n clickhouse: \"ClickHouse\",\n cloudflare: \"Cloudflare\",\n cloudfront: \"CloudFront\",\n cmake: \"CMake\",\n cncf: \"CNCF\",\n cockroachdb: \"CockroachDB\",\n cocoapods: \"CocoaPods\",\n codepen: \"CodePen\",\n codesandbox: \"CodeSandbox\",\n coffeescript: \"CoffeeScript\",\n commonjs: \"CommonJS\",\n \"composition api\": \"Composition API\",\n compositionapi: \"CompositionAPI\",\n coredns: \"CoreDNS\",\n cors: \"CORS\",\n cpu: \"CPU\",\n crud: \"CRUD\",\n csrf: \"CSRF\",\n css: \"CSS\",\n \"css modules\": \"CSS Modules\",\n csv: \"CSV\",\n daas: \"DaaS\",\n dapr: \"Dapr\",\n datadog: \"Datadog\",\n datagrip: \"DataGrip\",\n db2: \"DB2\",\n dbase: \"dBase\",\n ddos: \"DDoS\",\n definitelytyped: \"DefinitelyTyped\",\n denodeploy: \"DenoDeploy\",\n devops: \"DevOps\",\n devtools: \"DevTools\",\n \"digital ocean\": \"DigitalOcean\",\n digitalocean: \"DigitalOcean\",\n dingtalk: \"DingTalk\",\n directx: \"DirectX\",\n django: \"Django\",\n dns: \"DNS\",\n dom: \"DOM\",\n dos: \"DOS\",\n duckduckgo: \"DuckDuckGo\",\n dynamodb: \"DynamoDB\",\n echarts: \"ECharts\",\n ecmascript: \"ECMAScript\",\n edgedb: \"EdgeDB\",\n eggjs: \"Egg.js\",\n elasticsearch: \"Elasticsearch\",\n \"element plus\": \"Element Plus\",\n elementui: \"ElementUI\",\n es6: \"ES6\",\n esbuild: \"esbuild\",\n esim: \"eSIM\",\n eslint: \"ESLint\",\n esm: \"ESM\",\n esxi: \"ESXi\",\n etcd: \"etcd\",\n faas: \"FaaS\",\n facetime: \"FaceTime\",\n fastapi: \"FastAPI\",\n fbi: \"FBI\",\n ffmpeg: \"FFmpeg\",\n filezilla: \"FileZilla\",\n firefox: \"Firefox\",\n freecodecamp: \"freeCodeCamp\",\n freemarker: \"FreeMarker\",\n ftp: \"FTP\",\n ftps: \"FTPS\",\n gcc: \"GCC\",\n gcp: \"GCP\",\n gdnative: \"GDNative\",\n gdscript: \"GDScript\",\n geforce: \"GeForce\",\n geojson: \"GeoJSON\",\n geopackage: \"GeoPackage\",\n geopandas: \"GeoPandas\",\n geoserver: \"GeoServer\",\n gitbook: \"GitBook\",\n gitea: \"Gitea\",\n gitee: \"Gitee\",\n github: \"GitHub\",\n gitkraken: \"GitKraken\",\n gitlab: \"GitLab\",\n gitops: \"GitOps\",\n gitpod: \"Gitpod\",\n glsl: \"GLSL\",\n gltf: \"glTF\",\n gnome: \"GNOME\",\n gnu: \"GNU\",\n gnupg: \"GnuPG\",\n goland: \"GoLand\",\n \"google pay\": \"Google Pay\",\n gorm: \"GORM\",\n gpl: \"GPL\",\n gps: \"GPS\",\n gpu: \"GPU\",\n graphql: \"GraphQL\",\n \"graph rag\": \"Graph RAG\",\n graphrag: \"GraphRAG\",\n gre: \"GRE\",\n greensock: \"GreenSock\",\n grpc: \"gRPC\",\n gui: \"GUI\",\n hackernews: \"Hacker News\",\n hacpai: \"HacPai\",\n hbase: \"HBase\",\n hbuilderx: \"HBuilderX\",\n hdmi: \"HDMI\",\n hmr: \"HMR\",\n hp: \"HP\",\n html: \"HTML\",\n http: \"HTTP\",\n https: \"HTTPS\",\n iaas: \"IaaS\",\n iac: \"IaC\",\n ibm: \"IBM\",\n ibook: \"iBook\",\n icloud: \"iCloud\",\n idrac: \"iDRAC\",\n iife: \"IIFE\",\n ilo: \"iLO\",\n imessage: \"iMessage\",\n imovie: \"iMovie\",\n imtoken: \"imToken\",\n influxdb: \"InfluxDB\",\n intellij: \"IntelliJ\",\n \"intellij idea\": \"IntelliJ IDEA\",\n ioc: \"IoC\",\n ios: \"iOS\",\n iot: \"IoT\",\n ipados: \"iPadOS\",\n ipc: \"IPC\",\n ipfs: \"IPFS\",\n iphoto: \"iPhoto\",\n ipmi: \"IPMI\",\n ipsec: \"IPsec\",\n iscsi: \"iSCSI\",\n iterm: \"iTerm\",\n itunes: \"iTunes\",\n iwork: \"iWork\",\n javascript: \"JavaScript\",\n jdbc: \"JDBC\",\n jdk: \"JDK\",\n jetbrains: \"JetBrains\",\n jit: \"JIT\",\n jpeg: \"JPEG\",\n jpg: \"JPG\",\n jquery: \"jQuery\",\n jre: \"JRE\",\n jsdelivr: \"jsDelivr\",\n jsdoc: \"JSDoc\",\n jsf: \"JSF\",\n json: \"JSON\",\n jsonp: \"JSONP\",\n jsp: \"JSP\",\n jupyterlab: \"JupyterLab\",\n jwt: \"JWT\",\n katex: \"KaTeX\",\n kcp: \"KCP\",\n kde: \"KDE\",\n kfc: \"KFC\",\n kpi: \"KPI\",\n kubernetes: \"Kubernetes\",\n latex: \"LaTeX\",\n leetcode: \"LeetCode\",\n less: \"Less\",\n lfu: \"LFU\",\n libreoffice: \"LibreOffice\",\n lineageos: \"LineageOS\",\n \"line pay\": \"LINE Pay\",\n linkedin: \"LinkedIn\",\n llvm: \"LLVM\",\n lru: \"LRU\",\n lts: \"LTS\",\n macos: \"macOS\",\n mariadb: \"MariaDB\",\n markdown: \"Markdown\",\n markdownlint: \"MarkdownLint\",\n mathjax: \"MathJax\",\n mathml: \"MathML\",\n mathtype: \"MathType\",\n matlab: \"MATLAB\",\n mcdonald: \"McDonald\",\n mdn: \"MDN\",\n mdx: \"MDX\",\n mediawiki: \"MediaWiki\",\n memcached: \"Memcached\",\n messagepack: \"MessagePack\",\n metamask: \"MetaMask\",\n mkdocs: \"MkDocs\",\n mlaas: \"MLaaS\",\n mlops: \"MLOps\",\n mobx: \"MobX\",\n mongodb: \"MongoDB\",\n mongoose: \"Mongoose\",\n mpaas: \"mPaaS\",\n \"ms-dos\": \"MS-DOS\",\n mvc: \"MVC\",\n mvp: \"MVP\",\n mvvm: \"MVVM\",\n mybatis: \"MyBatis\",\n mysql: \"MySQL\",\n \"naive ui\": \"Naive UI\",\n naiveui: \"NaiveUI\",\n neo4j: \"Neo4j\",\n nestjs: \"NestJS\",\n netbeans: \"NetBeans\",\n netbios: \"NetBIOS\",\n nextjs: \"Next.js\",\n nft: \"NFT\",\n nixos: \"NixOS\",\n nocodb: \"NocoDB\",\n \"node.js\": \"Node.js\",\n nosql: \"NoSQL\",\n \"notepad ++\": \"Notepad++\",\n npm: \"npm\",\n numpy: \"NumPy\",\n nuxtjs: \"NuxtJS\",\n nvidia: \"NVIDIA\",\n oauth: \"OAuth\",\n obs: \"OBS\",\n ocaml: \"OCaml\",\n odbc: \"ODBC\",\n onedrive: \"OneDrive\",\n onenote: \"OneNote\",\n ont: \"ONT\",\n openai: \"OpenAI\",\n openapi: \"OpenAPI\",\n opencv: \"OpenCV\",\n openfaas: \"OpenFaaS\",\n openflow: \"OpenFlow\",\n opengauss: \"openGauss\",\n opengl: \"OpenGL\",\n \"opengl es\": \"OpenGL ES\",\n openjdk: \"OpenJDK\",\n openlayers: \"OpenLayers\",\n openpgp: \"OpenPGP\",\n opensea: \"OpenSea\",\n openssl: \"OpenSSL\",\n openstack: \"OpenStack\",\n openstreetmap: \"OpenStreetMap\",\n opensuse: \"openSUSE\",\n openvino: \"OpenVINO\",\n openwrt: \"OpenWrt\",\n opnsense: \"OPNsense\",\n orm: \"ORM\",\n oss: \"OSS\",\n paas: \"PaaS\",\n pagerduty: \"PagerDuty\",\n pagp: \"PAgP\",\n paypal: \"PayPal\",\n pdf: \"PDF\",\n pdo: \"PDO\",\n photoshop: \"Photoshop\",\n php: \"PHP\",\n phpstorm: \"PhpStorm\",\n pihole: \"Pi-hole\",\n planetscale: \"PlanetScale\",\n posix: \"POSIX\",\n postcss: \"PostCSS\",\n postgis: \"PostGIS\",\n postgresql: \"PostgreSQL\",\n potplayer: \"PotPlayer\",\n powerpoint: \"PowerPoint\",\n powershell: \"PowerShell\",\n premid: \"PreMiD\",\n primevue: \"PrimeVue\",\n producthunt: \"Product Hunt\",\n protobuf: \"Protobuf\",\n pwa: \"PWA\",\n pycharm: \"PyCharm\",\n pytorch: \"PyTorch\",\n qemu: \"QEMU\",\n qgis: \"QGIS\",\n qtscript: \"QtScript\",\n quic: \"QUIC\",\n raii: \"RAII\",\n \"react native\": \"React Native\",\n redhat: \"RedHat\",\n redisearch: \"RediSearch\",\n redisjson: \"RedisJSON\",\n rescript: \"ReScript\",\n restful: \"RESTful\",\n rethinkdb: \"RethinkDB\",\n rfc: \"RFC\",\n rom: \"ROM\",\n rpc: \"RPC\",\n rss: \"RSS\",\n rss3: \"RSS3\",\n rsshub: \"RSSHub\",\n rust: \"Rust\",\n rxdb: \"RxDB\",\n rxjs: \"RxJS\",\n saas: \"SaaS\",\n \"samsung pay\": \"Samsung Pay\",\n sass: \"Sass\",\n scss: \"SCSS\",\n sdk: \"SDK\",\n segmentfault: \"SegmentFault\",\n seo: \"SEO\",\n sip: \"SIP\",\n smtp: \"SMTP\",\n \"socket.io\": \"Socket.IO\",\n solarwinds: \"SolarWinds\",\n spatiallite: \"SpatialLite\",\n \"spir-v\": \"SPIR-V\",\n springboot: \"SpringBoot\",\n springcloud: \"SpringCloud\",\n springmvc: \"SpringMVC\",\n sql: \"SQL\",\n sqlite: \"SQLite\",\n sqlserver: \"SQLServer\",\n sre: \"SRE\",\n ssg: \"SSG\",\n ssh: \"SSH\",\n sso: \"SSO\",\n ssr: \"SSR\",\n stackblitz: \"StackBlitz\",\n stackit: \"STACKIT\",\n stackoverflow: \"Stack Overflow\",\n storybook: \"Storybook\",\n stp: \"STP\",\n stylus: \"Stylus\",\n \"sublime text\": \"Sublime Text\",\n surrealdb: \"SurrealDB\",\n sveltekit: \"SvelteKit\",\n svg: \"SVG\",\n svn: \"SVN\",\n \"tailwind css\": \"Tailwind CSS\",\n tailwindcss: \"TailwindCSS\",\n tcp: \"TCP\",\n teamviewer: \"TeamViewer\",\n tensorflow: \"TensorFlow\",\n testflight: \"TestFlight\",\n tex: \"TeX\",\n threejs: \"ThreeJS\",\n tianocore: \"TianoCore\",\n tidb: \"TiDB\",\n tiflash: \"TiFlash\",\n tiktok: \"TikTok\",\n tikv: \"TiKV\",\n tls: \"TLS\",\n toml: \"TOML\",\n \"travis ci\": \"Travis CI\",\n trpc: \"tRPC\",\n tsc: \"TSC\",\n tsconfig: \"TSConfig\",\n tsdoc: \"TSDoc\",\n tsdx: \"TSdx\",\n turbopack: \"Turbopack\",\n turborepo: \"Turborepo\",\n typeorm: \"TypeORM\",\n typescript: \"TypeScript\",\n udp: \"UDP\",\n umd: \"UMD\",\n uniapp: \"uniapp\",\n unifi: \"UniFi\",\n unix: \"UNIX\",\n unjs: \"UnJS\",\n unocss: \"UnoCSS\",\n upnp: \"UPnP\",\n uri: \"URI\",\n url: \"URL\",\n usb: \"USB\",\n v2ex: \"V2EX\",\n vercel: \"Vercel\",\n videolan: \"VideoLAN\",\n vim: \"Vim\",\n virtualbox: \"VirtualBox\",\n \"visual studio\": \"Visual Studio\",\n \"visual studio code\": \"Visual Studio Code\",\n vitepress: \"VitePress\",\n vividcortex: \"VividCortex\",\n vlan: \"VLAN\",\n vlc: \"VLC\",\n vmware: \"VMware\",\n vnc: \"VNC\",\n voip: \"VoIP\",\n vpn: \"VPN\",\n vps: \"VPS\",\n \"vs code\": \"VS Code\",\n vscode: \"VS Code\",\n \"vs codium\": \"VSCodium\",\n vscodium: \"VSCodium\",\n \"vue cli\": \"Vue CLI\",\n vuefes: \"Vue Fes\",\n vuepress: \"VuePress\",\n vueuse: \"VueUse\",\n vulkan: \"Vulkan\",\n w3c: \"W3C\",\n wasm: \"Wasm\",\n watchos: \"watchOS\",\n webar: \"WebAR\",\n \"web assembly\": \"WebAssembly\",\n webassembly: \"WebAssembly\",\n webgl: \"WebGL\",\n webgpu: \"WebGPU\",\n webkit: \"WebKit\",\n webpack: \"webpack\",\n webrtc: \"WebRTC\",\n websocket: \"WebSocket\",\n webstorm: \"WebStorm\",\n webvr: \"WebVR\",\n webxr: \"WebXR\",\n wechat: \"WeChat\",\n \"wechat pay\": \"WeChat Pay\",\n wgsl: \"WGSL\",\n whatsapp: \"WhatsApp\",\n wifi: \"Wi-Fi\",\n \"windi css\": \"Windi CSS\",\n windicss: \"WindiCSS\",\n wireguard: \"WireGuard\",\n wlan: \"WLAN\",\n wordpress: \"WordPress\",\n wsa: \"WSA\",\n wsl: \"WSL\",\n xaas: \"XaaS\",\n xhtml: \"XHTML\",\n xmind: \"XMind\",\n xml: \"XML\",\n xss: \"XSS\",\n xstate: \"XState\",\n yaml: \"YAML\",\n yapi: \"YApi\",\n youtube: \"YouTube\",\n};\n", "/**\n * @packageDocumentation\n * Shared casing helpers for naming-oriented GitHub Actions rules.\n */\n\nimport { casePoliceDictionary } from \"./case-police-dictionary.js\";\n\n/** Supported naming conventions used by workflow naming rules. */\nexport const githubActionsCasingKinds = [\n \"camelCase\",\n \"kebab-case\",\n \"PascalCase\",\n \"snake_case\",\n \"Title Case\",\n \"Train-Case\",\n \"SCREAMING_SNAKE_CASE\",\n] as const;\n\n/** String literal union of supported naming conventions. */\nexport type GithubActionsCasingKind = (typeof githubActionsCasingKinds)[number];\n\n/** Casing variants that exclude title-cased words with spaces. */\nexport const githubActionsNonTitleCasingKinds = [\n \"camelCase\",\n \"kebab-case\",\n \"PascalCase\",\n \"snake_case\",\n \"Train-Case\",\n \"SCREAMING_SNAKE_CASE\",\n] as const;\n\n/** String literal union of supported non-title casing conventions. */\nexport type GithubActionsNonTitleCasingKind =\n (typeof githubActionsNonTitleCasingKinds)[number];\n\n/** Determine whether a character is an ASCII letter or digit. */\nconst isAlphaNumericCharacter = (character: string): boolean => {\n const codePoint = character.codePointAt(0) ?? -1;\n\n return (\n (codePoint >= 48 && codePoint <= 57) ||\n (codePoint >= 65 && codePoint <= 90) ||\n (codePoint >= 97 && codePoint <= 122)\n );\n};\n\n/** Determine whether a character is an ASCII uppercase letter. */\nconst isUppercaseCharacter = (character: string): boolean => {\n const codePoint = character.codePointAt(0) ?? -1;\n\n return codePoint >= 65 && codePoint <= 90;\n};\n\n/** Determine whether a character is an ASCII lowercase letter. */\nconst isLowercaseCharacter = (character: string): boolean => {\n const codePoint = character.codePointAt(0) ?? -1;\n\n return codePoint >= 97 && codePoint <= 122;\n};\n\n/** Normalize a free-form identifier or label into lowercase word tokens. */\nconst splitIntoWords = (value: string): readonly string[] => {\n const words: string[] = [];\n let currentWord = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index];\n\n if (character === undefined) {\n continue;\n }\n\n if (!isAlphaNumericCharacter(character)) {\n if (currentWord.length > 0) {\n words.push(currentWord.toLowerCase());\n currentWord = \"\";\n }\n\n continue;\n }\n\n const previousCharacter = index > 0 ? value[index - 1] : undefined;\n const nextCharacter =\n index + 1 < value.length ? value[index + 1] : undefined;\n const startsNewWord =\n currentWord.length > 0 &&\n previousCharacter !== undefined &&\n ((isLowercaseCharacter(previousCharacter) &&\n isUppercaseCharacter(character)) ||\n (isUppercaseCharacter(previousCharacter) &&\n isUppercaseCharacter(character) &&\n nextCharacter !== undefined &&\n isLowercaseCharacter(nextCharacter)));\n\n if (startsNewWord) {\n words.push(currentWord.toLowerCase());\n currentWord = character;\n\n continue;\n }\n\n currentWord += character;\n }\n\n if (currentWord.length > 0) {\n words.push(currentWord.toLowerCase());\n }\n\n return words;\n};\n\n/** Uppercase the first character of a normalized word token. */\nconst capitalizeWord = (word: string): string =>\n word.length === 0\n ? word\n : `${word[0]?.toUpperCase() ?? \"\"}${word.slice(1)}`;\n\n/** Case-police dictionary match shape keyed by collapsed word tokens. */\ntype CasePoliceDictionaryMatch = {\n readonly canonical: string;\n readonly tokenCount: number;\n};\n\n/** Index case-police entries by collapsed key and track longest token span. */\nconst buildCasePoliceDictionaryIndex = (): {\n readonly matchesByCollapsedKey: ReadonlyMap<\n string,\n readonly CasePoliceDictionaryMatch[]\n >;\n readonly maxTokenSpan: number;\n} => {\n const matchesByCollapsedKey = new Map<\n string,\n CasePoliceDictionaryMatch[]\n >();\n let maxTokenSpan = 1;\n\n for (const [dictionaryKey, canonical] of Object.entries(\n casePoliceDictionary\n )) {\n const keyWords = splitIntoWords(dictionaryKey);\n\n if (keyWords.length === 0) {\n continue;\n }\n\n const tokenCount = keyWords.length;\n const collapsedKey = keyWords.join(\"\");\n const existingMatches = matchesByCollapsedKey.get(collapsedKey) ?? [];\n const isDuplicateMatch = existingMatches.some(\n (existingMatch) =>\n existingMatch.canonical === canonical &&\n existingMatch.tokenCount === tokenCount\n );\n\n if (!isDuplicateMatch) {\n existingMatches.push({\n canonical,\n tokenCount,\n });\n matchesByCollapsedKey.set(collapsedKey, existingMatches);\n }\n\n if (tokenCount > maxTokenSpan) {\n maxTokenSpan = tokenCount;\n }\n }\n\n return {\n matchesByCollapsedKey,\n maxTokenSpan,\n };\n};\n\n/** Precomputed case-police dictionary index used by Title/Train conversions. */\nconst casePoliceDictionaryIndex = buildCasePoliceDictionaryIndex();\n\n/**\n * Resolve normalized words into title-style segments using the case-police\n * dictionary. Falls back to naive capitalization for unknown tokens.\n */\nconst resolveCasePoliceTitleSegments = (\n words: readonly string[]\n): readonly string[] => {\n const segments: string[] = [];\n\n for (let index = 0; index < words.length; ) {\n const remainingWordCount = words.length - index;\n const maxSpan = Math.min(\n casePoliceDictionaryIndex.maxTokenSpan,\n remainingWordCount\n );\n\n let matched = false;\n\n for (let span = maxSpan; span >= 1; span -= 1) {\n const collapsedCandidate = words\n .slice(index, index + span)\n .join(\"\");\n const candidateMatches =\n casePoliceDictionaryIndex.matchesByCollapsedKey.get(\n collapsedCandidate\n );\n\n if (candidateMatches === undefined) {\n continue;\n }\n\n const exactTokenCountMatch = candidateMatches.find(\n (candidateMatch) => candidateMatch.tokenCount === span\n );\n const selectedMatch = exactTokenCountMatch ?? candidateMatches[0];\n\n if (selectedMatch === undefined) {\n continue;\n }\n\n segments.push(selectedMatch.canonical);\n index += span;\n matched = true;\n\n break;\n }\n\n if (matched) {\n continue;\n }\n\n const currentWord = words[index];\n\n if (currentWord === undefined) {\n index += 1;\n\n continue;\n }\n\n segments.push(capitalizeWord(currentWord));\n index += 1;\n }\n\n return segments;\n};\n\n/** Convert a value into the exact requested casing convention. */\nexport const convertToGithubActionsCasing = (\n value: string,\n casingKind: GithubActionsCasingKind\n): string => {\n const words = splitIntoWords(value);\n const titleSegments = resolveCasePoliceTitleSegments(words);\n\n if (words.length === 0) {\n return value;\n }\n\n switch (casingKind) {\n case \"camelCase\": {\n const [firstWord = \"\", ...remainingWords] = words;\n\n return `${firstWord}${remainingWords.map((word) => capitalizeWord(word)).join(\"\")}`;\n }\n\n case \"kebab-case\": {\n return words.join(\"-\");\n }\n\n case \"PascalCase\": {\n return words.map((word) => capitalizeWord(word)).join(\"\");\n }\n\n case \"SCREAMING_SNAKE_CASE\": {\n return words.map((word) => word.toUpperCase()).join(\"_\");\n }\n\n case \"snake_case\": {\n return words.join(\"_\");\n }\n\n case \"Title Case\": {\n return titleSegments.join(\" \");\n }\n\n case \"Train-Case\": {\n return titleSegments\n .flatMap((segment) => segment.split(/\\s+/u))\n .filter((segment) => segment.length > 0)\n .join(\"-\");\n }\n\n default: {\n return value;\n }\n }\n};\n\n/** Determine whether a value already satisfies a requested casing convention. */\nexport const matchesGithubActionsCasing = (\n value: string,\n casingKind: GithubActionsCasingKind\n): boolean => convertToGithubActionsCasing(value, casingKind) === value;\n", "/**\n * @packageDocumentation\n * Enforce a consistent naming convention for workflow names.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n convertToGithubActionsCasing,\n type GithubActionsCasingKind,\n githubActionsCasingKinds,\n matchesGithubActionsCasing,\n} from \"../_internal/casing.js\";\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Object-style configuration for `action-name-casing`. */\ntype ActionNameCasingObjectOption = Partial<\n Record<GithubActionsCasingKind, boolean>\n> & {\n readonly ignores?: readonly string[];\n};\n\n/** Rule options for `action-name-casing`. */\ntype ActionNameCasingOptions = [\n (ActionNameCasingObjectOption | GithubActionsCasingKind)?,\n];\n\n/** Default casing enforced for workflow names. */\nconst DEFAULT_ACTION_NAME_CASING: GithubActionsCasingKind = \"Title Case\";\n\n/**\n * Normalize action-name-casing options into allowed casings and ignore\n * patterns.\n */\nconst normalizeActionNameCasingOptions = (\n option: Readonly<\n ActionNameCasingObjectOption | GithubActionsCasingKind | undefined\n >\n): {\n allowedCasings: readonly GithubActionsCasingKind[];\n ignoredNames: readonly string[];\n} => {\n if (option === undefined || typeof option === \"string\") {\n return {\n allowedCasings: [option ?? DEFAULT_ACTION_NAME_CASING],\n ignoredNames: [],\n };\n }\n\n const allowedCasings = githubActionsCasingKinds.filter(\n (casingKind) => option[casingKind] === true\n );\n\n return {\n allowedCasings:\n allowedCasings.length > 0\n ? allowedCasings\n : [DEFAULT_ACTION_NAME_CASING],\n ignoredNames: [...(option.ignores ?? [])],\n };\n};\n\n/** Rule implementation for enforcing workflow-name casing. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const [option] = context.options as ActionNameCasingOptions;\n const { allowedCasings, ignoredNames } =\n normalizeActionNameCasingOptions(option ?? undefined);\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const namePair = getMappingPair(root, \"name\");\n const nameNode = unwrapYamlValue(namePair?.value ?? null);\n const nameValue = getScalarStringValue(nameNode);\n\n if (\n namePair === null ||\n nameNode?.type !== \"YAMLScalar\" ||\n nameValue === null ||\n nameValue.trim().length === 0 ||\n ignoredNames.includes(nameValue)\n ) {\n return;\n }\n\n const matchesAllowedCasing = allowedCasings.some((casingKind) =>\n matchesGithubActionsCasing(nameValue, casingKind)\n );\n\n if (!matchesAllowedCasing) {\n const [firstAllowedCasing] = allowedCasings;\n\n context.report({\n data: {\n caseTypes: allowedCasings.join(\", \"),\n name: nameValue,\n },\n fix:\n firstAllowedCasing !== undefined &&\n allowedCasings.length === 1\n ? (fixer) =>\n fixer.replaceTextRange(\n nameNode.range,\n convertToGithubActionsCasing(\n nameValue,\n firstAllowedCasing\n )\n )\n : undefined,\n messageId: \"nameDoesNotMatchCasing\",\n node: nameNode as AST.YAMLNode as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n defaultOptions: [DEFAULT_ACTION_NAME_CASING],\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"enforce a consistent casing convention for workflow `name` values.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R009\",\n ruleNumber: 9,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/action-name-casing\",\n },\n fixable: \"code\",\n messages: {\n nameDoesNotMatchCasing:\n \"Workflow name '{{name}}' is not in the configured casing: {{caseTypes}}.\",\n },\n schema: [\n {\n anyOf: [\n {\n description:\n \"Single allowed casing convention for the workflow `name` value.\",\n enum: githubActionsCasingKinds,\n type: \"string\",\n },\n {\n additionalProperties: false,\n description:\n \"Allowed casing conventions and ignore patterns for the workflow `name` value.\",\n properties: {\n camelCase: {\n description: \"Allow camelCase workflow names.\",\n type: \"boolean\",\n },\n ignores: {\n description:\n \"Literal workflow names that should be ignored by this rule.\",\n items: {\n type: \"string\",\n },\n type: \"array\",\n uniqueItems: true,\n },\n \"kebab-case\": {\n description: \"Allow kebab-case workflow names.\",\n type: \"boolean\",\n },\n PascalCase: {\n description: \"Allow PascalCase workflow names.\",\n type: \"boolean\",\n },\n SCREAMING_SNAKE_CASE: {\n description:\n \"Allow SCREAMING_SNAKE_CASE workflow names.\",\n type: \"boolean\",\n },\n snake_case: {\n description: \"Allow snake_case workflow names.\",\n type: \"boolean\",\n },\n \"Title Case\": {\n description: \"Allow Title Case workflow names.\",\n type: \"boolean\",\n },\n \"Train-Case\": {\n description: \"Allow Train-Case workflow names.\",\n type: \"boolean\",\n },\n },\n type: \"object\",\n },\n ],\n description:\n \"Configure one or more allowed casing conventions for workflow `name` values.\",\n },\n ],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Enforce a consistent naming convention for workflow job identifiers.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n type GithubActionsNonTitleCasingKind,\n githubActionsNonTitleCasingKinds,\n matchesGithubActionsCasing,\n} from \"../_internal/casing.js\";\nimport {\n getWorkflowJobs,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Object-style configuration for `job-id-casing`. */\ntype JobIdCasingObjectOption = Partial<\n Record<GithubActionsNonTitleCasingKind, boolean>\n> & {\n readonly ignores?: readonly string[];\n};\n\n/** Rule options for `job-id-casing`. */\ntype JobIdCasingOptions = [\n (GithubActionsNonTitleCasingKind | JobIdCasingObjectOption)?,\n];\n\n/** Default casing enforced for workflow job ids. */\nconst DEFAULT_JOB_ID_CASING: GithubActionsNonTitleCasingKind = \"kebab-case\";\n\n/** Normalize job-id-casing options into allowed casings and ignore patterns. */\nconst normalizeJobIdCasingOptions = (\n option: Readonly<\n GithubActionsNonTitleCasingKind | JobIdCasingObjectOption | undefined\n >\n): {\n allowedCasings: readonly GithubActionsNonTitleCasingKind[];\n ignoredJobIds: readonly string[];\n} => {\n if (option === undefined || typeof option === \"string\") {\n return {\n allowedCasings: [option ?? DEFAULT_JOB_ID_CASING],\n ignoredJobIds: [],\n };\n }\n\n const allowedCasings = githubActionsNonTitleCasingKinds.filter(\n (casingKind) => option[casingKind] === true\n );\n\n return {\n allowedCasings:\n allowedCasings.length > 0\n ? allowedCasings\n : [DEFAULT_JOB_ID_CASING],\n ignoredJobIds: [...(option.ignores ?? [])],\n };\n};\n\n/** Rule implementation for enforcing job-id casing. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const [option] = context.options as JobIdCasingOptions;\n const { allowedCasings, ignoredJobIds } = normalizeJobIdCasingOptions(\n option ?? undefined\n );\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n if (ignoredJobIds.includes(job.id)) {\n continue;\n }\n\n const matchesAllowedCasing = allowedCasings.some(\n (casingKind) =>\n matchesGithubActionsCasing(job.id, casingKind)\n );\n\n if (!matchesAllowedCasing) {\n context.report({\n data: {\n caseTypes: allowedCasings.join(\", \"),\n jobId: job.id,\n },\n messageId: \"jobIdDoesNotMatchCasing\",\n node: job.idNode as unknown as Rule.Node,\n });\n }\n }\n },\n };\n },\n meta: {\n defaultOptions: [DEFAULT_JOB_ID_CASING],\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"enforce a consistent casing convention for workflow job identifiers.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R010\",\n ruleNumber: 10,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/job-id-casing\",\n },\n messages: {\n jobIdDoesNotMatchCasing:\n \"Job id '{{jobId}}' is not in the configured casing: {{caseTypes}}.\",\n },\n schema: [\n {\n anyOf: [\n {\n description:\n \"Single allowed casing convention for workflow job ids.\",\n enum: githubActionsNonTitleCasingKinds,\n type: \"string\",\n },\n {\n additionalProperties: false,\n description:\n \"Allowed casing conventions and ignore patterns for workflow job ids.\",\n properties: {\n camelCase: {\n description: \"Allow camelCase job ids.\",\n type: \"boolean\",\n },\n ignores: {\n description:\n \"Literal job ids that should be ignored by this rule.\",\n items: {\n type: \"string\",\n },\n type: \"array\",\n uniqueItems: true,\n },\n \"kebab-case\": {\n description: \"Allow kebab-case job ids.\",\n type: \"boolean\",\n },\n PascalCase: {\n description: \"Allow PascalCase job ids.\",\n type: \"boolean\",\n },\n SCREAMING_SNAKE_CASE: {\n description:\n \"Allow SCREAMING_SNAKE_CASE job ids.\",\n type: \"boolean\",\n },\n snake_case: {\n description: \"Allow snake_case job ids.\",\n type: \"boolean\",\n },\n \"Train-Case\": {\n description: \"Allow Train-Case job ids.\",\n type: \"boolean\",\n },\n },\n type: \"object\",\n },\n ],\n description:\n \"Configure one or more allowed casing conventions for workflow job ids.\",\n },\n ],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Enforce an upper bound on the number of jobs declared in one workflow file.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingValueAsMapping,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule options for `max-jobs-per-action`. */\ntype MaxJobsPerActionOptions = [number?];\n\n/** Default maximum number of jobs allowed in a single workflow file. */\nconst DEFAULT_MAX_JOBS = 3;\n\n/** Rule implementation for limiting workflow job counts. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const [configuredMaxJobs = DEFAULT_MAX_JOBS] =\n context.options as MaxJobsPerActionOptions;\n const maxJobs =\n configuredMaxJobs >= 1 ? configuredMaxJobs : DEFAULT_MAX_JOBS;\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const jobsMapping = getMappingValueAsMapping(root, \"jobs\");\n\n if (jobsMapping === null) {\n return;\n }\n\n const jobCount = jobsMapping.pairs.length;\n\n if (jobCount > maxJobs) {\n context.report({\n data: {\n count: String(jobCount),\n limit: String(maxJobs),\n },\n messageId: \"tooManyJobs\",\n node: jobsMapping as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n defaultOptions: [DEFAULT_MAX_JOBS],\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"enforce a maximum number of jobs per workflow file so large pipelines stay modular and reviewable.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R011\",\n ruleNumber: 11,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/max-jobs-per-action\",\n },\n messages: {\n tooManyJobs:\n \"This workflow defines {{count}} jobs, which exceeds the configured maximum of {{limit}}.\",\n },\n schema: [\n {\n description:\n \"Maximum number of jobs allowed in a single GitHub Actions workflow file.\",\n minimum: 1,\n type: \"integer\",\n },\n ],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow case-insensitive collisions between action input ids.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isActionMetadataFile } from \"../_internal/lint-targets.js\";\nimport {\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for case-insensitive input id collision detection. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isActionMetadataFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n const inputsMapping =\n root === null\n ? null\n : getMappingValueAsMapping(root, \"inputs\");\n\n if (inputsMapping === null) {\n return;\n }\n\n const inputByCanonicalId = new Map<string, string>();\n\n for (const pair of inputsMapping.pairs) {\n const inputId = getScalarStringValue(pair.key);\n\n if (inputId === null) {\n continue;\n }\n\n const canonicalId = inputId.toLowerCase();\n const firstSeenInputId =\n inputByCanonicalId.get(canonicalId);\n\n if (firstSeenInputId === undefined) {\n inputByCanonicalId.set(canonicalId, inputId);\n\n continue;\n }\n\n if (firstSeenInputId === inputId) {\n continue;\n }\n\n context.report({\n data: {\n firstInputId: firstSeenInputId,\n inputId,\n },\n messageId: \"collidingInputId\",\n node: pair.key as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.actionMetadata\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow case-insensitive collisions between action input ids.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R048\",\n ruleNumber: 48,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-case-insensitive-input-id-collision\",\n },\n messages: {\n collidingInputId:\n \"Input '{{inputId}}' collides with '{{firstInputId}}' when normalized case-insensitively.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Generic YAML AST traversal utilities shared by lint rules.\n */\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport { getScalarStringValue, unwrapYamlValue } from \"./workflow-yaml.js\";\n/* eslint-disable @typescript-eslint/prefer-readonly-parameter-types -- Traversal operates on parser-provided mutable AST node types. */\n\n/** Visit every string scalar contained in a YAML subtree. */\nexport const visitYamlStringScalars = (\n node: AST.YAMLContent | AST.YAMLWithMeta | null | undefined,\n visitor: (node: Readonly<AST.YAMLScalar>, value: string) => void\n): void => {\n const unwrappedNode = unwrapYamlValue(node ?? null);\n\n if (unwrappedNode === null) {\n return;\n }\n\n if (unwrappedNode.type === \"YAMLScalar\") {\n const scalarValue = getScalarStringValue(unwrappedNode);\n\n if (scalarValue !== null) {\n visitor(unwrappedNode, scalarValue);\n }\n\n return;\n }\n\n if (unwrappedNode.type === \"YAMLSequence\") {\n for (const entry of unwrappedNode.entries) {\n visitYamlStringScalars(entry, visitor);\n }\n\n return;\n }\n\n if (unwrappedNode.type !== \"YAMLMapping\") {\n return;\n }\n\n for (const pair of unwrappedNode.pairs) {\n visitYamlStringScalars(pair.value ?? null, visitor);\n }\n};\n\n/** Collect every string scalar value from a YAML subtree. */\nexport const collectYamlStringScalars = (\n node: AST.YAMLContent | AST.YAMLWithMeta | null | undefined\n): readonly string[] => {\n const values: string[] = [];\n\n visitYamlStringScalars(node, (_node, value) => {\n values.push(value);\n });\n\n return values;\n};\n\n/* eslint-enable @typescript-eslint/prefer-readonly-parameter-types -- Re-enable readonly-parameter checks outside YAML traversal internals. */\n", "/**\n * @packageDocumentation\n * Disallow INPUT_* environment variable access inside composite action runs.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isActionMetadataFile } from \"../_internal/lint-targets.js\";\nimport {\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\nimport { visitYamlStringScalars } from \"../_internal/yaml-traversal.js\";\n\n/** Composite-action INPUT_* environment variable reference detector. */\nconst inputEnvironmentPattern = /\\bINPUT_[\\dA-Z_]+\\b/g;\n\n/** Rule implementation for composite input access style checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isActionMetadataFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n const runsMapping =\n root === null\n ? null\n : getMappingValueAsMapping(root, \"runs\");\n\n if (runsMapping === null) {\n return;\n }\n\n const usingRuntime = getScalarStringValue(\n runsMapping.pairs.find(\n (pair) => getScalarStringValue(pair.key) === \"using\"\n )?.value\n );\n\n if (usingRuntime !== \"composite\") {\n return;\n }\n\n visitYamlStringScalars(runsMapping, (node, value) => {\n const firstMatch = value.match(\n inputEnvironmentPattern\n )?.[0];\n\n if (firstMatch === undefined) {\n return;\n }\n\n context.report({\n data: {\n inputEnvironmentReference: firstMatch,\n },\n messageId: \"compositeInputEnvAccess\",\n node: node as unknown as Rule.Node,\n });\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.actionMetadata\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow `INPUT_*` environment-variable access in composite actions and require `inputs.*` context references.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R049\",\n ruleNumber: 49,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-composite-input-env-access\",\n },\n messages: {\n compositeInputEnvAccess:\n \"Composite actions should reference inputs via `inputs.*`, not environment variable '{{inputEnvironmentReference}}'.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow deprecated Node.js action runtimes.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isActionMetadataFile } from \"../_internal/lint-targets.js\";\nimport {\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Deprecated Node runtime values for `runs.using`. */\nconst deprecatedNodeRuntimes = new Set([\"node12\", \"node16\"]);\n\n/** Rule implementation for deprecated Node runtime checks in action metadata. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isActionMetadataFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const runsMapping = getMappingValueAsMapping(root, \"runs\");\n\n if (runsMapping === null) {\n return;\n }\n\n const usingPair = runsMapping.pairs.find(\n (pair) => getScalarStringValue(pair.key) === \"using\"\n );\n const usingRuntime = getScalarStringValue(usingPair?.value);\n\n if (\n usingRuntime === null ||\n !deprecatedNodeRuntimes.has(usingRuntime)\n ) {\n return;\n }\n\n context.report({\n data: {\n runtime: usingRuntime,\n },\n messageId: \"deprecatedNodeRuntime\",\n node: (usingPair?.value ??\n usingPair) as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.actionMetadata\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow deprecated Node.js runtimes in action metadata `runs.using`.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R044\",\n ruleNumber: 44,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-deprecated-node-runtime\",\n },\n messages: {\n deprecatedNodeRuntime:\n \"Action metadata uses deprecated runtime `{{runtime}}` for `runs.using`.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow duplicate step IDs in composite actions.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isActionMetadataFile } from \"../_internal/lint-targets.js\";\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for duplicate composite step ID checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isActionMetadataFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n const runsMapping =\n root === null\n ? null\n : getMappingValueAsMapping(root, \"runs\");\n\n if (runsMapping === null) {\n return;\n }\n\n const usingRuntime = getScalarStringValue(\n getMappingPair(runsMapping, \"using\")?.value\n );\n\n if (usingRuntime !== \"composite\") {\n return;\n }\n\n const stepsSequence = getMappingValueAsSequence(\n runsMapping,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n return;\n }\n\n const firstSeenByStepId = new Set<string>();\n\n for (const stepEntry of stepsSequence.entries) {\n const stepMapping = unwrapYamlValue(stepEntry);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const stepIdPair = getMappingPair(stepMapping, \"id\");\n const stepId = getScalarStringValue(stepIdPair?.value);\n\n if (stepId === null) {\n continue;\n }\n\n if (!firstSeenByStepId.has(stepId)) {\n firstSeenByStepId.add(stepId);\n\n continue;\n }\n\n context.report({\n data: {\n stepId,\n },\n messageId: \"duplicateCompositeStepId\",\n node: (stepIdPair?.value ??\n stepIdPair) as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.actionMetadata\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow duplicate step IDs in `runs.steps` for composite actions.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R051\",\n ruleNumber: 51,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-duplicate-composite-step-id\",\n },\n messages: {\n duplicateCompositeStepId:\n \"Composite step id '{{stepId}}' is declared more than once.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Helpers for reading workflow-template metadata from `.properties.json` files.\n */\n/* eslint-disable @typescript-eslint/prefer-readonly-parameter-types -- YAML parser AST nodes are third-party mutable structures; readonly wrappers reduce interoperability across helper APIs. */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport { dirname, join } from \"node:path\";\n\nimport {\n getMappingPair,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowRoot,\n} from \"./workflow-yaml.js\";\n\n/** Read and return the template metadata root mapping if present. */\nexport const getWorkflowTemplatePropertiesRoot = (\n context: Rule.RuleContext\n): AST.YAMLMapping | null => getWorkflowRoot(context);\n\n/** Read a scalar string property from workflow-template metadata. */\nexport const getWorkflowTemplateStringProperty = (\n root: AST.YAMLMapping,\n key: string\n): null | string => getScalarStringValue(getMappingPair(root, key)?.value);\n\n/** Resolve `filePatterns` entries with both node and scalar string value. */\nexport const getWorkflowTemplateFilePatternEntries = (\n root: AST.YAMLMapping\n): readonly Readonly<{ node: AST.YAMLNode; value: string }>[] => {\n const filePatternsSequence = getMappingValueAsSequence(\n root,\n \"filePatterns\"\n );\n\n if (filePatternsSequence === null) {\n return [];\n }\n\n const entries: Readonly<{ node: AST.YAMLNode; value: string }>[] = [];\n\n for (const entry of filePatternsSequence.entries) {\n const entryValue = getScalarStringValue(entry);\n\n if (entryValue === null || entry === null || entry === undefined) {\n continue;\n }\n\n entries.push({\n node: entry,\n value: entryValue,\n });\n }\n\n return entries;\n};\n/* eslint-enable @typescript-eslint/prefer-readonly-parameter-types -- Re-enable readonly-parameter checks outside parser AST helper signatures. */\n\n/** Build the matching `.properties.json` path for a template YAML path. */\nexport const getPairedTemplatePropertiesPath = (filePath: string): string => {\n const stem = filePath.endsWith(\".yaml\")\n ? filePath.slice(0, -\".yaml\".length)\n : filePath.slice(0, -\".yml\".length);\n\n return `${stem}.properties.json`;\n};\n\n/** Build both valid template YAML paths for a `.properties.json` path. */\nexport const getPairedTemplateYamlPaths = (\n filePath: string\n): readonly [string, string] => {\n const fileDirectory = dirname(filePath);\n const fileName = filePath.slice(fileDirectory.length + 1);\n const stem = fileName.slice(0, -\".properties.json\".length);\n\n return [\n join(fileDirectory, `${stem}.yml`),\n join(fileDirectory, `${stem}.yaml`),\n ];\n};\n", "/**\n * @packageDocumentation\n * Disallow empty or whitespace-only `filePatterns` entries.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isWorkflowTemplatePropertiesFile } from \"../_internal/lint-targets.js\";\nimport {\n getWorkflowTemplateFilePatternEntries,\n getWorkflowTemplatePropertiesRoot,\n} from \"../_internal/workflow-template-properties.js\";\n\n/** Rule implementation for empty template file pattern checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowTemplatePropertiesRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const {\n node,\n value,\n } of getWorkflowTemplateFilePatternEntries(root)) {\n if (value.trim().length > 0) {\n continue;\n }\n\n context.report({\n messageId: \"emptyTemplateFilePattern\",\n node: node as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow empty or whitespace-only entries in workflow-template `filePatterns`.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R060\",\n ruleNumber: 60,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-empty-template-file-pattern\",\n },\n messages: {\n emptyTemplateFilePattern:\n \"Template `filePatterns` entries must be non-empty regex strings.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow defining jobs as reusable workflow invocations via `uses`.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getWorkflowJobs,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for disallowing reusable-workflow jobs. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n const usesPair = getMappingPair(job.mapping, \"uses\");\n\n if (usesPair === null) {\n continue;\n }\n\n context.report({\n data: {\n jobId: job.id,\n },\n messageId: \"externalJob\",\n node: (usesPair.value ??\n usesPair) as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow reusable-workflow jobs declared with `jobs.<id>.uses` when you want every job defined inline in the workflow file.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R012\",\n ruleNumber: 12,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-external-job\",\n },\n messages: {\n externalJob:\n \"Job '{{jobId}}' uses a reusable workflow via `uses`. Define the job inline instead.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow hardcoded default branch names in workflow templates.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isWorkflowTemplateYamlFile } from \"../_internal/lint-targets.js\";\nimport { getWorkflowRoot } from \"../_internal/workflow-yaml.js\";\nimport { visitYamlStringScalars } from \"../_internal/yaml-traversal.js\";\n\n/** Branch literals that should be replaced with `$default-branch` in templates. */\nconst hardcodedDefaultBranchNames = new Set([\"main\", \"master\"]);\n\n/** Rule implementation for hardcoded default branch checks in templates. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isWorkflowTemplateYamlFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n visitYamlStringScalars(root, (node, value) => {\n if (!hardcodedDefaultBranchNames.has(value.trim())) {\n return;\n }\n\n context.report({\n data: {\n branchName: value,\n },\n messageId: \"hardcodedDefaultBranch\",\n node: node as unknown as Rule.Node,\n });\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow hardcoded `main`/`master` branch literals in workflow template YAML files.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R068\",\n ruleNumber: 68,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-hardcoded-default-branch-in-template\",\n },\n messages: {\n hardcodedDefaultBranch:\n \"Template contains hardcoded default branch '{{branchName}}'; prefer `$default-branch` placeholder.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow including `.svg` extension in workflow-template `iconName`.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isWorkflowTemplatePropertiesFile } from \"../_internal/lint-targets.js\";\nimport {\n getWorkflowTemplatePropertiesRoot,\n getWorkflowTemplateStringProperty,\n} from \"../_internal/workflow-template-properties.js\";\n\n/** Rule implementation for `iconName` extension checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n if (!isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowTemplatePropertiesRoot(context);\n\n if (root === null) {\n return;\n }\n\n const iconName = getWorkflowTemplateStringProperty(\n root,\n \"iconName\"\n );\n\n if (iconName === null) {\n return;\n }\n\n if (!iconName.toLowerCase().endsWith(\".svg\")) {\n return;\n }\n\n context.report({\n data: {\n iconName,\n },\n messageId: \"iconNameIncludesExtension\",\n node: node as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow `.svg` extensions in workflow-template `iconName` values.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R063\",\n ruleNumber: 63,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-icon-file-extension-in-template-icon-name\",\n },\n messages: {\n iconNameIncludesExtension:\n \"Template `iconName` '{{iconName}}' should omit the `.svg` extension.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow broad reusable-workflow secret inheritance.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Determine whether a job references a reusable workflow. */\nconst isReusableWorkflowJob = (\n jobMapping: Readonly<AST.YAMLMapping>\n): boolean => getMappingPair(jobMapping, \"uses\") !== null;\n\n/** Determine whether a secrets pair uses the broad `inherit` shortcut. */\nconst isInheritSecretsValue = (\n secretsPair: Readonly<NonNullable<ReturnType<typeof getMappingPair>>>\n): boolean => getScalarStringValue(secretsPair.value)?.trim() === \"inherit\";\n\n/** Rule implementation for disallowing reusable-workflow `secrets: inherit`. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n if (!isReusableWorkflowJob(job.mapping)) {\n continue;\n }\n\n const secretsPair = getMappingPair(job.mapping, \"secrets\");\n\n if (\n secretsPair === null ||\n !isInheritSecretsValue(secretsPair)\n ) {\n continue;\n }\n\n context.report({\n data: {\n jobId: job.id,\n },\n messageId: \"inheritedSecrets\",\n node: secretsPair.value as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.security\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow `secrets: inherit` on reusable-workflow jobs so callers pass only the named secrets each workflow actually needs.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R026\",\n ruleNumber: 26,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-inherit-secrets\",\n },\n messages: {\n inheritedSecrets:\n \"Job '{{jobId}}' uses `secrets: inherit`. Pass only the specific named secrets the called workflow requires.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Shared helpers for extracting GitHub Actions `${{ ... }}` expressions.\n */\n\n/** Determine whether a character can begin a GitHub expression identifier. */\nconst isIdentifierStart = (character: string | undefined): boolean => {\n if (character === undefined) {\n return false;\n }\n\n return /[A-Z_a-z]/u.test(character);\n};\n\n/** Determine whether a character can continue a GitHub expression identifier. */\nconst isIdentifierContinue = (character: string | undefined): boolean => {\n if (character === undefined) {\n return false;\n }\n\n return /[\\w-]/u.test(character);\n};\n\n/** Known root context names available in GitHub Actions expressions. */\nconst knownContextRoots: ReadonlySet<string> = new Set([\n \"env\",\n \"github\",\n \"inputs\",\n \"job\",\n \"jobs\",\n \"matrix\",\n \"needs\",\n \"runner\",\n \"secrets\",\n \"steps\",\n \"strategy\",\n \"vars\",\n]);\n\n/** Extract every embedded GitHub expression body from a scalar value. */\nexport const getGithubExpressionBodies = (value: string): readonly string[] => {\n const expressions: string[] = [];\n let searchStart = 0;\n\n while (searchStart < value.length) {\n const startOffset = value.indexOf(\"${{\", searchStart);\n\n if (startOffset === -1) {\n break;\n }\n\n const endOffset = value.indexOf(\"}}\", startOffset + 3);\n\n if (endOffset === -1) {\n break;\n }\n\n const expression = value.slice(startOffset + 3, endOffset).trim();\n\n if (expression.length > 0) {\n expressions.push(expression);\n }\n\n searchStart = endOffset + 2;\n }\n\n return expressions;\n};\n\n/** Collect referenced root contexts from embedded GitHub expressions. */\nexport const getReferencedContextRoots = (value: string): readonly string[] => {\n const roots = new Set<string>();\n\n for (const expression of getGithubExpressionBodies(value)) {\n let index = 0;\n\n while (index < expression.length) {\n const character = expression[index];\n const previousCharacter = expression[index - 1];\n\n if (\n !isIdentifierStart(character) ||\n isIdentifierContinue(previousCharacter)\n ) {\n index += 1;\n\n continue;\n }\n\n let endOffset = index + 1;\n\n while (isIdentifierContinue(expression[endOffset])) {\n endOffset += 1;\n }\n\n const token = expression.slice(index, endOffset);\n const nextChar = expression[endOffset];\n\n if (nextChar !== \".\" && nextChar !== \"[\") {\n index = endOffset;\n\n continue;\n }\n\n const normalizedToken = token.toLowerCase();\n\n if (knownContextRoots.has(normalizedToken)) {\n roots.add(normalizedToken);\n }\n\n index = endOffset;\n }\n }\n\n return [...roots];\n};\n", "/**\n * @packageDocumentation\n * Disallow unavailable contexts inside workflow and job concurrency expressions.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getGithubExpressionBodies,\n getReferencedContextRoots,\n} from \"../_internal/github-expressions.js\";\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Allowed contexts for top-level workflow `concurrency`. */\nconst allowedWorkflowConcurrencyContexts: ReadonlySet<string> = new Set([\n \"github\",\n \"inputs\",\n \"vars\",\n]);\n\n/** Allowed contexts for `jobs.<job_id>.concurrency`. */\nconst allowedJobConcurrencyContexts: ReadonlySet<string> = new Set([\n \"github\",\n \"inputs\",\n \"matrix\",\n \"needs\",\n \"strategy\",\n \"vars\",\n]);\n\n/** Determine whether a scalar contains any GitHub expressions. */\nconst containsGithubExpression = (value: string): boolean =>\n getGithubExpressionBodies(value).length > 0;\n\n/** Collect disallowed context roots for the provided scalar value. */\nconst getDisallowedContexts = (\n value: string,\n allowedContexts: ReadonlySet<string>\n): readonly string[] =>\n getReferencedContextRoots(value).filter(\n (contextRoot) => !allowedContexts.has(contextRoot)\n );\n\n/** Check a single concurrency scalar for unsupported context usage. */\nconst reportInvalidContexts = (\n context: Readonly<Rule.RuleContext>,\n options: Readonly<{\n readonly allowedContexts: ReadonlySet<string>;\n readonly field: string;\n readonly jobId: string | undefined;\n readonly messageId:\n | \"invalidJobConcurrencyContext\"\n | \"invalidWorkflowConcurrencyContext\";\n readonly node: unknown;\n readonly value: string;\n }>\n): void => {\n if (!containsGithubExpression(options.value)) {\n return;\n }\n\n const disallowedContexts = getDisallowedContexts(\n options.value,\n options.allowedContexts\n );\n\n if (disallowedContexts.length === 0) {\n return;\n }\n\n context.report({\n data: {\n contexts: disallowedContexts.join(\", \"),\n field: options.field,\n jobId: options.jobId,\n },\n messageId: options.messageId,\n node: options.node as Rule.Node,\n });\n};\n\n/** Inspect a workflow-level or job-level concurrency declaration. */\nconst inspectConcurrencyValue = (\n context: Readonly<Rule.RuleContext>,\n options: Readonly<{\n readonly allowedContexts: ReadonlySet<string>;\n readonly concurrencyNode: Parameters<typeof unwrapYamlValue>[0];\n readonly jobId: string | undefined;\n readonly messageId:\n | \"invalidJobConcurrencyContext\"\n | \"invalidWorkflowConcurrencyContext\";\n }>\n): void => {\n const concurrencyValue = unwrapYamlValue(options.concurrencyNode);\n\n if (concurrencyValue === null) {\n return;\n }\n\n if (concurrencyValue.type === \"YAMLScalar\") {\n const scalarValue = getScalarStringValue(concurrencyValue);\n\n if (scalarValue === null || scalarValue.trim().length === 0) {\n return;\n }\n\n reportInvalidContexts(context, {\n allowedContexts: options.allowedContexts,\n field: \"concurrency\",\n jobId: options.jobId,\n messageId: options.messageId,\n node: concurrencyValue,\n value: scalarValue,\n });\n\n return;\n }\n\n if (concurrencyValue.type !== \"YAMLMapping\") {\n return;\n }\n\n for (const fieldName of [\"group\", \"cancel-in-progress\"] as const) {\n const fieldPair = getMappingPair(concurrencyValue, fieldName);\n\n if (fieldPair === null) {\n continue;\n }\n\n const fieldValueNode = unwrapYamlValue(fieldPair.value);\n const fieldValue = getScalarStringValue(fieldValueNode);\n\n if (fieldValue === null || fieldValue.trim().length === 0) {\n continue;\n }\n\n reportInvalidContexts(context, {\n allowedContexts: options.allowedContexts,\n field: `concurrency.${fieldName}`,\n jobId: options.jobId,\n messageId: options.messageId,\n node: fieldValueNode ?? fieldPair,\n value: fieldValue,\n });\n }\n};\n\n/** Rule implementation for validating concurrency context usage. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const workflowConcurrencyPair = getMappingPair(\n root,\n \"concurrency\"\n );\n\n if (workflowConcurrencyPair !== null) {\n inspectConcurrencyValue(context, {\n allowedContexts: allowedWorkflowConcurrencyContexts,\n concurrencyNode: workflowConcurrencyPair.value,\n jobId: undefined,\n messageId: \"invalidWorkflowConcurrencyContext\",\n });\n }\n\n for (const job of getWorkflowJobs(root)) {\n const jobConcurrencyPair = getMappingPair(\n job.mapping,\n \"concurrency\"\n );\n\n if (jobConcurrencyPair === null) {\n continue;\n }\n\n inspectConcurrencyValue(context, {\n allowedContexts: allowedJobConcurrencyContexts,\n concurrencyNode: jobConcurrencyPair.value,\n jobId: job.id,\n messageId: \"invalidJobConcurrencyContext\",\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow unavailable contexts in workflow-level and job-level `concurrency` expressions.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R042\",\n ruleNumber: 42,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-invalid-concurrency-context\",\n },\n messages: {\n invalidJobConcurrencyContext:\n \"Job '{{jobId}}' `{{field}}` references unsupported context access ({{contexts}}). Job-level concurrency may only reference `github`, `needs`, `strategy`, `matrix`, `inputs`, and `vars`.\",\n invalidWorkflowConcurrencyContext:\n \"Workflow `{{field}}` references unsupported context access ({{contexts}}). Top-level concurrency may only reference `github`, `inputs`, and `vars`.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow invalid keys in GitHub Actions workflow mappings.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingValueAsMapping,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Valid top-level workflow keys. */\nconst VALID_TOP_LEVEL_KEYS = new Set<string>([\n \"concurrency\",\n \"defaults\",\n \"env\",\n \"jobs\",\n \"name\",\n \"on\",\n \"permissions\",\n \"run-name\",\n]);\n\n/** Valid job-level keys under `jobs.<job_id>`. */\nconst VALID_JOB_KEYS = new Set<string>([\n \"concurrency\",\n \"container\",\n \"continue-on-error\",\n \"defaults\",\n \"env\",\n \"environment\",\n \"if\",\n \"name\",\n \"needs\",\n \"outputs\",\n \"permissions\",\n \"runs-on\",\n \"secrets\",\n \"services\",\n \"steps\",\n \"strategy\",\n \"timeout-minutes\",\n \"uses\",\n \"with\",\n]);\n\n/** Valid strategy keys under `jobs.<job_id>.strategy`. */\nconst VALID_STRATEGY_KEYS = new Set<string>([\n \"fail-fast\",\n \"matrix\",\n \"max-parallel\",\n]);\n\n/** Valid container and service keys. */\nconst VALID_CONTAINER_OR_SERVICE_KEYS = new Set<string>([\n \"credentials\",\n \"env\",\n \"image\",\n \"options\",\n \"ports\",\n \"volumes\",\n]);\n\n/** Valid step keys under `jobs.<job_id>.steps[]`. */\nconst VALID_STEP_KEYS = new Set<string>([\n \"continue-on-error\",\n \"env\",\n \"id\",\n \"if\",\n \"name\",\n \"run\",\n \"shell\",\n \"timeout-minutes\",\n \"uses\",\n \"with\",\n \"working-directory\",\n]);\n\n/** Report invalid mapping keys for one workflow section. */\nconst reportInvalidKeys = (\n context: Readonly<Rule.RuleContext>,\n mapping: Readonly<AST.YAMLMapping>,\n validKeys: ReadonlySet<string>,\n messageId:\n | \"invalidContainerKey\"\n | \"invalidJobKey\"\n | \"invalidServiceKey\"\n | \"invalidStepKey\"\n | \"invalidStrategyKey\"\n | \"invalidTopLevelKey\"\n): void => {\n for (const pair of mapping.pairs) {\n const keyValue = getScalarStringValue(pair.key);\n\n if (keyValue === null || validKeys.has(keyValue)) {\n continue;\n }\n\n context.report({\n data: {\n key: keyValue,\n },\n messageId,\n node: (pair.key ?? pair) as unknown as Rule.Node,\n });\n }\n};\n\n/** Rule implementation for validating workflow mapping keys. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n reportInvalidKeys(\n context,\n root,\n VALID_TOP_LEVEL_KEYS,\n \"invalidTopLevelKey\"\n );\n\n for (const job of getWorkflowJobs(root)) {\n reportInvalidKeys(\n context,\n job.mapping,\n VALID_JOB_KEYS,\n \"invalidJobKey\"\n );\n\n const strategyMapping = getMappingValueAsMapping(\n job.mapping,\n \"strategy\"\n );\n\n if (strategyMapping !== null) {\n reportInvalidKeys(\n context,\n strategyMapping,\n VALID_STRATEGY_KEYS,\n \"invalidStrategyKey\"\n );\n }\n\n const containerMapping = getMappingValueAsMapping(\n job.mapping,\n \"container\"\n );\n\n if (containerMapping !== null) {\n reportInvalidKeys(\n context,\n containerMapping,\n VALID_CONTAINER_OR_SERVICE_KEYS,\n \"invalidContainerKey\"\n );\n }\n\n const servicesMapping = getMappingValueAsMapping(\n job.mapping,\n \"services\"\n );\n\n if (servicesMapping !== null) {\n for (const servicePair of servicesMapping.pairs) {\n const serviceMapping = unwrapYamlValue(\n servicePair.value\n );\n\n if (serviceMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n reportInvalidKeys(\n context,\n serviceMapping,\n VALID_CONTAINER_OR_SERVICE_KEYS,\n \"invalidServiceKey\"\n );\n }\n }\n\n const stepsSequence = getMappingValueAsSequence(\n job.mapping,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n continue;\n }\n\n for (const step of stepsSequence.entries) {\n const stepMapping = unwrapYamlValue(step);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n reportInvalidKeys(\n context,\n stepMapping,\n VALID_STEP_KEYS,\n \"invalidStepKey\"\n );\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow unsupported keys in common GitHub Actions workflow mappings.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R019\",\n ruleNumber: 19,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-invalid-key\",\n },\n messages: {\n invalidContainerKey:\n \"`{{key}}` is not a valid key for a job `container` block.\",\n invalidJobKey:\n \"`{{key}}` is not a valid key for a workflow job definition.\",\n invalidServiceKey:\n \"`{{key}}` is not a valid key for a job `services` entry.\",\n invalidStepKey: \"`{{key}}` is not a valid key for a workflow step.\",\n invalidStrategyKey:\n \"`{{key}}` is not a valid key for a job `strategy` block.\",\n invalidTopLevelKey:\n \"`{{key}}` is not a valid top-level workflow key.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow unsupported keys on jobs that call reusable workflows.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Supported keywords for jobs that call reusable workflows via `uses`. */\nconst reusableWorkflowJobKeys = [\n \"name\",\n \"uses\",\n \"with\",\n \"secrets\",\n \"strategy\",\n \"needs\",\n \"if\",\n \"concurrency\",\n \"permissions\",\n] as const;\n\n/** Constant-time lookup for supported reusable-workflow caller job keys. */\nconst reusableWorkflowJobKeySet: ReadonlySet<string> = new Set(\n reusableWorkflowJobKeys\n);\n\n/** Determine whether a job calls a reusable workflow. */\nconst isReusableWorkflowJob = (\n jobMapping: Readonly<AST.YAMLMapping>\n): boolean => getMappingPair(jobMapping, \"uses\") !== null;\n\n/** Rule implementation for validating reusable-workflow caller job keys. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n if (!isReusableWorkflowJob(job.mapping)) {\n continue;\n }\n\n for (const pair of job.mapping.pairs) {\n const key = getScalarStringValue(pair.key);\n\n if (\n key === null ||\n reusableWorkflowJobKeySet.has(key)\n ) {\n continue;\n }\n\n context.report({\n data: {\n allowedKeys: reusableWorkflowJobKeys.join(\", \"),\n jobId: job.id,\n key,\n },\n messageId: \"invalidReusableWorkflowJobKey\",\n node: pair.key as unknown as Rule.Node,\n });\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow unsupported keys on jobs that call reusable workflows via `jobs.<job_id>.uses`.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R041\",\n ruleNumber: 41,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-invalid-reusable-workflow-job-key\",\n },\n messages: {\n invalidReusableWorkflowJobKey:\n \"Job '{{jobId}}' calls a reusable workflow via `uses`, so `{{key}}` is not supported here. Caller jobs may only use: {{allowedKeys}}.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow invalid regular expressions in workflow-template `filePatterns`.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isWorkflowTemplatePropertiesFile } from \"../_internal/lint-targets.js\";\nimport {\n getWorkflowTemplateFilePatternEntries,\n getWorkflowTemplatePropertiesRoot,\n} from \"../_internal/workflow-template-properties.js\";\n\n/** Construct a unicode regex from a pattern string. */\nconst createUnicodeRegex = (pattern: string): RegExp =>\n // eslint-disable-next-line security/detect-non-literal-regexp -- Intentional syntax validation of user-provided regex patterns.\n new RegExp(pattern, \"u\");\n\n/** Rule implementation for validating `filePatterns` regex syntax. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowTemplatePropertiesRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const {\n node,\n value,\n } of getWorkflowTemplateFilePatternEntries(root)) {\n try {\n createUnicodeRegex(value);\n } catch {\n context.report({\n data: {\n pattern: value,\n },\n messageId: \"invalidTemplateFilePatternRegex\",\n node: node as unknown as Rule.Node,\n });\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow syntactically invalid regexes in workflow-template `filePatterns`.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R059\",\n ruleNumber: 59,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-invalid-template-file-pattern-regex\",\n },\n messages: {\n invalidTemplateFilePatternRegex:\n \"Template `filePatterns` entry '{{pattern}}' is not a valid regular expression.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow invalid reusable workflow output values.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getGithubExpressionBodies,\n getReferencedContextRoots,\n} from \"../_internal/github-expressions.js\";\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Match reusable workflow output mappings to job outputs. */\nconst jobsOutputReferencePattern =\n /jobs\\.[A-Z_a-z][\\w-]*\\.outputs\\.[A-Z_a-z][\\w-]*/;\n\n/** Allowed expression contexts for `on.workflow_call.outputs.*.value`. */\nconst allowedWorkflowCallOutputContexts: ReadonlySet<string> = new Set([\n \"github\",\n \"inputs\",\n \"jobs\",\n \"vars\",\n]);\n\n/** Determine whether a scalar value reads at least one declared job output. */\nconst hasJobsOutputReference = (value: string): boolean =>\n getGithubExpressionBodies(value).some((expression) =>\n jobsOutputReferencePattern.test(expression)\n );\n\n/** Rule implementation for validating reusable workflow output values. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const onMapping = getMappingValueAsMapping(root, \"on\");\n\n if (onMapping === null) {\n return;\n }\n\n const workflowCallMapping = unwrapYamlValue(\n getMappingPair(onMapping, \"workflow_call\")?.value ?? null\n );\n\n if (workflowCallMapping?.type !== \"YAMLMapping\") {\n return;\n }\n\n const outputsMapping = getMappingValueAsMapping(\n workflowCallMapping,\n \"outputs\"\n );\n\n if (outputsMapping === null) {\n return;\n }\n\n for (const pair of outputsMapping.pairs) {\n const outputId = getScalarStringValue(pair.key);\n const outputMapping = unwrapYamlValue(pair.value);\n\n if (\n outputId === null ||\n outputMapping?.type !== \"YAMLMapping\"\n ) {\n continue;\n }\n\n const valuePair = getMappingPair(outputMapping, \"value\");\n const value = getScalarStringValue(\n valuePair?.value ?? null\n );\n\n if (\n valuePair === null ||\n value === null ||\n value.trim().length === 0\n ) {\n continue;\n }\n\n const disallowedContexts = getReferencedContextRoots(\n value\n ).filter(\n (contextRoot) =>\n !allowedWorkflowCallOutputContexts.has(contextRoot)\n );\n\n if (disallowedContexts.length > 0) {\n context.report({\n data: {\n contexts: disallowedContexts.join(\", \"),\n outputId,\n },\n messageId: \"invalidContext\",\n node: (valuePair.value ??\n valuePair) as unknown as Rule.Node,\n });\n\n continue;\n }\n\n if (!hasJobsOutputReference(value)) {\n context.report({\n data: {\n outputId,\n },\n messageId: \"missingJobOutputReference\",\n node: (valuePair.value ??\n valuePair) as unknown as Rule.Node,\n });\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow `workflow_call` output values that use unavailable contexts or fail to map from `jobs.<job_id>.outputs.<output_name>`.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R040\",\n ruleNumber: 40,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-invalid-workflow-call-output-value\",\n },\n messages: {\n invalidContext:\n \"`workflow_call` output '{{outputId}}' uses unsupported context access in `value` ({{contexts}}). Reusable workflow output values may only reference `github`, `jobs`, `vars`, and `inputs`.\",\n missingJobOutputReference:\n \"`workflow_call` output '{{outputId}}' must map `value` from a job output such as `jobs.build.outputs.artifact`.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow path separators in workflow-template `iconName` values.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isWorkflowTemplatePropertiesFile } from \"../_internal/lint-targets.js\";\nimport {\n getWorkflowTemplatePropertiesRoot,\n getWorkflowTemplateStringProperty,\n} from \"../_internal/workflow-template-properties.js\";\n\n/** Rule implementation for icon path-separator checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n if (!isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowTemplatePropertiesRoot(context);\n\n if (root === null) {\n return;\n }\n\n const iconName = getWorkflowTemplateStringProperty(\n root,\n \"iconName\"\n );\n\n if (\n iconName === null ||\n (!iconName.includes(\"/\") && !iconName.includes(\"\\\\\"))\n ) {\n return;\n }\n\n context.report({\n data: {\n iconName,\n },\n messageId: \"iconNameContainsPathSeparator\",\n node: node as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow path separators in workflow-template `iconName` values.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R064\",\n ruleNumber: 64,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-path-separators-in-template-icon-name\",\n },\n messages: {\n iconNameContainsPathSeparator:\n \"Template `iconName` '{{iconName}}' should be a plain icon token, not a path.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow `runs.post-if` when `runs.post` is not declared.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isActionMetadataFile } from \"../_internal/lint-targets.js\";\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for invalid `runs.post-if` usage. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isActionMetadataFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n const runsMapping =\n root === null\n ? null\n : getMappingValueAsMapping(root, \"runs\");\n\n if (runsMapping === null) {\n return;\n }\n\n const postIfPair = getMappingPair(runsMapping, \"post-if\");\n\n if (\n postIfPair === null ||\n getMappingPair(runsMapping, \"post\")\n ) {\n return;\n }\n\n context.report({\n messageId: \"postIfWithoutPost\",\n node: (postIfPair.value ??\n postIfPair) as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.actionMetadata\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow `runs.post-if` when `runs.post` is not configured in action metadata.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R046\",\n ruleNumber: 46,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-post-if-without-post\",\n },\n messages: {\n postIfWithoutPost:\n \"`runs.post-if` is set, but `runs.post` is missing. Remove `post-if` or add `post`.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow checking out pull-request head content in `pull_request_target` workflows.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowEventNames,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Detect `actions/checkout` references. */\nconst isCheckoutActionReference = (reference: string): boolean =>\n reference.startsWith(\"actions/checkout@\");\n\n/** Detect risky PR-head references in checkout parameters. */\nconst hasPullRequestHeadReference = (value: string): boolean =>\n /\\bgithub\\.head_ref\\b/u.test(value) ||\n /\\bgithub\\.event\\.pull_request\\.head\\./u.test(value);\n\n/**\n * Rule implementation for disallowing pull-request head checkouts in\n * pull_request_target.\n */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const eventNames = getWorkflowEventNames(root);\n\n if (!eventNames.has(\"pull_request_target\")) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n const stepsSequence = getMappingValueAsSequence(\n job.mapping,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n continue;\n }\n\n for (const entry of stepsSequence.entries) {\n const stepMapping = unwrapYamlValue(entry);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const usesPair = getMappingPair(stepMapping, \"uses\");\n const usesReference = getScalarStringValue(\n usesPair?.value ?? null\n );\n\n if (\n usesPair === null ||\n usesReference === null ||\n !isCheckoutActionReference(usesReference)\n ) {\n continue;\n }\n\n const withMapping = getMappingValueAsMapping(\n stepMapping,\n \"with\"\n );\n\n if (withMapping === null) {\n continue;\n }\n\n for (const key of [\"ref\", \"repository\"] as const) {\n const optionPair = getMappingPair(withMapping, key);\n const optionValue = getScalarStringValue(\n optionPair?.value ?? null\n );\n\n if (\n optionPair === null ||\n optionValue === null ||\n !hasPullRequestHeadReference(optionValue)\n ) {\n continue;\n }\n\n context.report({\n data: {\n jobId: job.id,\n key,\n },\n messageId: \"pullRequestHeadCheckout\",\n node: (optionPair.value ??\n optionPair) as unknown as Rule.Node,\n });\n }\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.security\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow `actions/checkout` configurations in `pull_request_target` workflows that fetch pull request head refs, SHAs, or repositories into a privileged run.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R030\",\n ruleNumber: 30,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-pr-head-checkout-in-pull-request-target\",\n },\n messages: {\n pullRequestHeadCheckout:\n \"Job '{{jobId}}' uses `actions/checkout` with `with.{{key}}` pointing at pull request head content inside a `pull_request_target` workflow. Avoid checking out untrusted PR head code in this privileged trigger.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow `runs.pre-if` when `runs.pre` is not declared.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isActionMetadataFile } from \"../_internal/lint-targets.js\";\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for invalid `runs.pre-if` usage. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isActionMetadataFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n const runsMapping =\n root === null\n ? null\n : getMappingValueAsMapping(root, \"runs\");\n\n if (runsMapping === null) {\n return;\n }\n\n const preIfPair = getMappingPair(runsMapping, \"pre-if\");\n\n if (preIfPair === null || getMappingPair(runsMapping, \"pre\")) {\n return;\n }\n\n context.report({\n messageId: \"preIfWithoutPre\",\n node: (preIfPair.value ??\n preIfPair) as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.actionMetadata\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow `runs.pre-if` when `runs.pre` is not configured in action metadata.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R045\",\n ruleNumber: 45,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-pre-if-without-pre\",\n },\n messages: {\n preIfWithoutPre:\n \"`runs.pre-if` is set, but `runs.pre` is missing. Remove `pre-if` or add `pre`.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow action inputs that are both required and defaulted.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isActionMetadataFile } from \"../_internal/lint-targets.js\";\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for contradictory action input definitions. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isActionMetadataFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n const inputsMapping =\n root === null\n ? null\n : getMappingValueAsMapping(root, \"inputs\");\n\n if (inputsMapping === null) {\n return;\n }\n\n for (const pair of inputsMapping.pairs) {\n const inputId = getScalarStringValue(pair.key);\n const inputMapping = unwrapYamlValue(pair.value);\n\n if (\n inputId === null ||\n inputMapping?.type !== \"YAMLMapping\"\n ) {\n continue;\n }\n\n const requiredPair = getMappingPair(\n inputMapping,\n \"required\"\n );\n const defaultPair = getMappingPair(inputMapping, \"default\");\n\n if (requiredPair === null || defaultPair === null) {\n continue;\n }\n\n const requiredValue = unwrapYamlValue(requiredPair.value);\n\n if (\n requiredValue?.type !== \"YAMLScalar\" ||\n requiredValue.value !== true\n ) {\n continue;\n }\n\n context.report({\n data: {\n inputId,\n },\n messageId: \"requiredInputWithDefault\",\n node: (defaultPair.value ??\n defaultPair) as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.actionMetadata\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow action inputs that set both `required: true` and `default`.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R047\",\n ruleNumber: 47,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-required-input-with-default\",\n },\n messages: {\n requiredInputWithDefault:\n \"Input '{{inputId}}' sets both `required: true` and `default`, which is contradictory for action callers.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow direct secret references in `if` conditionals.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Direct secret-access patterns that GitHub discourages in `if` conditionals. */\nconst directSecretsPatterns = [\n /\\bsecrets\\.\\w+\\b/u,\n /\\bsecrets\\[[\"'][^\"'\\]]+[\"']\\]/u,\n] as const;\n\n/**\n * Determine whether an `if` expression directly references the `secrets`\n * context.\n */\nconst hasDirectSecretsReference = (expression: string): boolean =>\n directSecretsPatterns.some((pattern) => pattern.test(expression));\n\n/** Report a direct-secrets conditional reference. */\nconst reportDirectSecretsConditional = (\n context: Readonly<Rule.RuleContext>,\n ifPair: Readonly<AST.YAMLPair>,\n scope: string\n): void => {\n context.report({\n data: {\n scope,\n },\n messageId: \"directSecretsInIf\",\n node: ifPair.value as unknown as Rule.Node,\n });\n};\n\n/** Rule implementation for disallowing direct secret usage in `if` conditionals. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n const jobIfPair = getMappingPair(job.mapping, \"if\");\n const jobIfExpression = getScalarStringValue(\n jobIfPair?.value ?? null\n );\n\n if (\n jobIfPair !== null &&\n jobIfExpression !== null &&\n hasDirectSecretsReference(jobIfExpression)\n ) {\n reportDirectSecretsConditional(\n context,\n jobIfPair,\n `job '${job.id}'`\n );\n }\n\n const stepsSequence = getMappingValueAsSequence(\n job.mapping,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n continue;\n }\n\n for (const entry of stepsSequence.entries) {\n const stepMapping = unwrapYamlValue(entry);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const stepIfPair = getMappingPair(stepMapping, \"if\");\n const stepIfExpression = getScalarStringValue(\n stepIfPair?.value ?? null\n );\n\n if (\n stepIfPair === null ||\n stepIfExpression === null ||\n !hasDirectSecretsReference(stepIfExpression)\n ) {\n continue;\n }\n\n reportDirectSecretsConditional(\n context,\n stepIfPair,\n `a step in job '${job.id}'`\n );\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.security\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow direct `secrets.*` references in job and step `if` conditionals; move secret values into `env` first and condition on that instead.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R027\",\n ruleNumber: 27,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-secrets-in-if\",\n },\n messages: {\n directSecretsInIf:\n \"Do not reference `secrets` directly in {{scope}} `if` conditionals. Assign the secret to `env` first, then check the environment variable.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow self-hosted runners on fork-capable pull request events.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowEventNames,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Pull-request-adjacent events that can be invoked from forked PR activity. */\nconst forkPullRequestEventNames = [\n \"issue_comment\",\n \"pull_request\",\n \"pull_request_review\",\n \"pull_request_review_comment\",\n \"pull_request_target\",\n] as const;\n\n/** Fast lookup set for fork-capable pull request events. */\nconst forkPullRequestEventNameSet: ReadonlySet<string> = new Set(\n forkPullRequestEventNames\n);\n\n/** Determine whether a scalar string denotes the self-hosted runner label. */\nconst isSelfHostedRunnerLabel = (value: string): boolean =>\n value.trim().toLowerCase() === \"self-hosted\";\n\n/** Determine whether a runs-on node selects a self-hosted runner. */\nconst hasSelfHostedRunner = (\n node: null | Readonly<AST.YAMLContent | AST.YAMLWithMeta>\n): boolean => {\n const unwrappedNode = unwrapYamlValue(\n node as AST.YAMLContent | AST.YAMLWithMeta | null\n );\n\n if (unwrappedNode === null) {\n return false;\n }\n\n if (unwrappedNode.type === \"YAMLScalar\") {\n const value = getScalarStringValue(unwrappedNode);\n\n return value !== null && isSelfHostedRunnerLabel(value);\n }\n\n if (unwrappedNode.type === \"YAMLSequence\") {\n return unwrappedNode.entries.some((entry) => {\n const value = getScalarStringValue(entry);\n\n return value !== null && isSelfHostedRunnerLabel(value);\n });\n }\n\n if (unwrappedNode.type !== \"YAMLMapping\") {\n return false;\n }\n\n return hasSelfHostedRunner(\n getMappingPair(unwrappedNode, \"labels\")?.value ?? null\n );\n};\n\n/** Rule implementation for blocking self-hosted runners on fork PR events. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const triggeringForkPullRequestEvents = [\n ...getWorkflowEventNames(root),\n ]\n .filter((eventName) =>\n forkPullRequestEventNameSet.has(eventName)\n )\n .toSorted((left, right) => left.localeCompare(right));\n\n if (triggeringForkPullRequestEvents.length === 0) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n const runsOnPair = getMappingPair(job.mapping, \"runs-on\");\n\n if (\n runsOnPair === null ||\n !hasSelfHostedRunner(runsOnPair.value ?? null)\n ) {\n continue;\n }\n\n context.report({\n data: {\n events: triggeringForkPullRequestEvents.join(\", \"),\n jobId: job.id,\n },\n messageId: \"selfHostedRunnerOnForkPullRequestEvent\",\n node: (runsOnPair.value ??\n runsOnPair) as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.security\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow self-hosted runners in workflows triggered by fork-capable pull-request events that can execute untrusted contributor activity.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R036\",\n ruleNumber: 36,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-self-hosted-runner-on-fork-pr-events\",\n },\n messages: {\n selfHostedRunnerOnForkPullRequestEvent:\n \"Job '{{jobId}}' uses a self-hosted runner in a workflow triggered by {{events}}, which can be invoked from forked or Dependabot pull requests. Prefer GitHub-hosted runners, or isolate the workload behind hardened ephemeral self-hosted infrastructure.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow workflow-template file patterns that target subdirectory paths.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isWorkflowTemplatePropertiesFile } from \"../_internal/lint-targets.js\";\nimport {\n getWorkflowTemplateFilePatternEntries,\n getWorkflowTemplatePropertiesRoot,\n} from \"../_internal/workflow-template-properties.js\";\n\n/** Rule implementation for root-directory-oriented template file pattern checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowTemplatePropertiesRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const {\n node,\n value,\n } of getWorkflowTemplateFilePatternEntries(root)) {\n if (!value.includes(\"/\") && !value.includes(\"\\\\\")) {\n continue;\n }\n\n context.report({\n data: {\n pattern: value,\n },\n messageId: \"subdirectoryTemplateFilePattern\",\n node: node as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow workflow-template `filePatterns` that match subdirectory paths instead of repository-root files.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R062\",\n ruleNumber: 62,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-subdirectory-template-file-pattern\",\n },\n messages: {\n subdirectoryTemplateFilePattern:\n \"Template file pattern '{{pattern}}' targets subdirectory paths; workflow-template file patterns should match repository-root files.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow `$default-branch` placeholder usage outside workflow template files.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n isWorkflowTemplatePropertiesFile,\n isWorkflowTemplateYamlFile,\n} from \"../_internal/lint-targets.js\";\nimport { getWorkflowRoot } from \"../_internal/workflow-yaml.js\";\nimport { visitYamlStringScalars } from \"../_internal/yaml-traversal.js\";\n\n/** Placeholder token supported in template files. */\nconst defaultBranchPlaceholder = \"$default-branch\";\n\n/** Rule implementation for invalid placeholder usage outside templates. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (isWorkflowTemplateYamlFile(context.filename)) {\n return;\n }\n\n if (isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n visitYamlStringScalars(root, (node, value) => {\n if (!value.includes(defaultBranchPlaceholder)) {\n return;\n }\n\n context.report({\n messageId: \"templatePlaceholderOutsideTemplate\",\n node: node as unknown as Rule.Node,\n });\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow `$default-branch` placeholder usage outside workflow template YAML files.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R069\",\n ruleNumber: 69,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-template-placeholder-in-non-template-workflow\",\n },\n messages: {\n templatePlaceholderOutsideTemplate:\n \"`$default-branch` is intended for workflow template files and should not be used in regular workflow YAML files.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow workflow-wide environment variables under the top-level `env` key.\n */\nimport type { Rule } from \"eslint\";\n\nimport { getMappingPair, getWorkflowRoot } from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for disallowing top-level workflow env. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const envPair = getMappingPair(root, \"env\");\n\n if (envPair !== null) {\n context.report({\n messageId: \"topLevelEnv\",\n node: envPair.key as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow top-level workflow `env` when you want environment variables scoped closer to the jobs and steps that use them.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R013\",\n ruleNumber: 13,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-top-level-env\",\n },\n messages: {\n topLevelEnv:\n \"Avoid top-level workflow `env`; prefer job-level or step-level `env` declarations instead.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow declaring workflow permissions at the top level.\n */\nimport type { Rule } from \"eslint\";\n\nimport { getMappingPair, getWorkflowRoot } from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for disallowing top-level workflow permissions. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const permissionsPair = getMappingPair(root, \"permissions\");\n\n if (permissionsPair !== null) {\n context.report({\n messageId: \"topLevelPermissions\",\n node: permissionsPair.key as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\"github-actions.configs.all\"],\n description:\n \"disallow top-level workflow `permissions` when you want every job to declare its own token scope explicitly.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R014\",\n ruleNumber: 14,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-top-level-permissions\",\n },\n messages: {\n topLevelPermissions:\n \"Avoid top-level workflow `permissions`; declare `permissions` on each job instead.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow universal catch-all regexes in template `filePatterns`.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isWorkflowTemplatePropertiesFile } from \"../_internal/lint-targets.js\";\nimport {\n getWorkflowTemplateFilePatternEntries,\n getWorkflowTemplatePropertiesRoot,\n} from \"../_internal/workflow-template-properties.js\";\n\n/** Normalized regex strings treated as universal catch-all template patterns. */\nconst universalTemplateFilePatterns = new Set([\n \".*\",\n \".+\",\n \"^.*$\",\n \"^.+$\",\n]);\n\n/** Rule implementation for universal template file pattern checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowTemplatePropertiesRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const {\n node,\n value,\n } of getWorkflowTemplateFilePatternEntries(root)) {\n const normalizedPattern = value.trim();\n\n if (!universalTemplateFilePatterns.has(normalizedPattern)) {\n continue;\n }\n\n context.report({\n data: {\n pattern: value,\n },\n messageId: \"universalTemplateFilePattern\",\n node: node as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow universal catch-all regexes in workflow-template `filePatterns`.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R061\",\n ruleNumber: 61,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-universal-template-file-pattern\",\n },\n messages: {\n universalTemplateFilePattern:\n \"Template file pattern '{{pattern}}' is too broad and matches nearly every repository.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow references to undeclared inputs in composite action metadata.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isActionMetadataFile } from \"../_internal/lint-targets.js\";\nimport {\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\nimport { visitYamlStringScalars } from \"../_internal/yaml-traversal.js\";\n\n/**\n * Pattern for extracting `inputs.<input_id>` references from expression-like\n * strings.\n */\nconst inputReferencePattern = /inputs\\.(?<inputId>[^\\s.\\]}]+)/g;\n\n/** Rule implementation for unknown composite input references. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isActionMetadataFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const runsMapping = getMappingValueAsMapping(root, \"runs\");\n\n if (runsMapping === null) {\n return;\n }\n\n const usingRuntime = getScalarStringValue(\n runsMapping.pairs.find(\n (pair) =>\n pair !== null &&\n getScalarStringValue(pair.key) === \"using\"\n )?.value\n );\n\n if (usingRuntime !== \"composite\") {\n return;\n }\n\n const inputsMapping = getMappingValueAsMapping(root, \"inputs\");\n const declaredInputIds = new Set<string>();\n\n if (inputsMapping !== null) {\n for (const pair of inputsMapping.pairs) {\n const inputId = getScalarStringValue(pair.key);\n\n if (inputId !== null) {\n declaredInputIds.add(inputId);\n }\n }\n }\n\n visitYamlStringScalars(runsMapping, (node, value) => {\n for (const match of value.matchAll(inputReferencePattern)) {\n const inputId = match.groups?.[\"inputId\"];\n\n if (\n inputId === undefined ||\n declaredInputIds.has(inputId)\n ) {\n continue;\n }\n\n context.report({\n data: {\n inputId,\n },\n messageId: \"unknownInputReference\",\n node: node as unknown as Rule.Node,\n });\n }\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.actionMetadata\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow `inputs.<id>` references in composite action metadata when the input id is not declared.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R050\",\n ruleNumber: 50,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-unknown-input-reference-in-composite\",\n },\n messages: {\n unknownInputReference:\n \"Composite action references `inputs.{{inputId}}`, but that input is not declared in `inputs`.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow references to undeclared job outputs.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/**\n * `needs.<job_id>.outputs.<output_name>` references inside workflow\n * expressions.\n */\nconst needsOutputReferencePattern =\n /needs\\.(?<neededJobId>[A-Z_a-z][\\w-]*)\\.outputs\\.(?<outputName>[A-Z_a-z][\\w-]*)/g;\n\n/**\n * `jobs.<job_id>.outputs.<output_name>` references inside reusable workflow\n * outputs.\n */\nconst jobsOutputReferencePattern =\n /jobs\\.(?<jobId>[A-Z_a-z][\\w-]*)\\.outputs\\.(?<outputName>[A-Z_a-z][\\w-]*)/g;\n\n/** Visit every string scalar reachable from a YAML value node. */\nconst visitStringScalars = (\n node: null | Readonly<AST.YAMLContent | AST.YAMLWithMeta>,\n visitor: (node: Readonly<AST.YAMLScalar>, value: string) => void\n): void => {\n const unwrappedNode = unwrapYamlValue(\n node as AST.YAMLContent | AST.YAMLWithMeta | null\n );\n\n if (unwrappedNode === null) {\n return;\n }\n\n if (unwrappedNode.type === \"YAMLScalar\") {\n const value = getScalarStringValue(unwrappedNode);\n\n if (value !== null) {\n visitor(unwrappedNode, value);\n }\n\n return;\n }\n\n if (unwrappedNode.type === \"YAMLSequence\") {\n for (const entry of unwrappedNode.entries) {\n visitStringScalars(entry, visitor);\n }\n\n return;\n }\n\n if (unwrappedNode.type !== \"YAMLMapping\") {\n return;\n }\n\n for (const pair of unwrappedNode.pairs) {\n visitStringScalars(pair.value ?? null, visitor);\n }\n};\n\n/** Collect declared output names from a job definition. */\nconst getDeclaredJobOutputNames = (\n jobMapping: Readonly<AST.YAMLMapping>\n): ReadonlySet<string> => {\n const outputsMapping = getMappingValueAsMapping(jobMapping, \"outputs\");\n const outputNames = new Set<string>();\n\n if (outputsMapping === null) {\n return outputNames;\n }\n\n for (const pair of outputsMapping.pairs) {\n const outputName = getScalarStringValue(pair.key);\n\n if (outputName !== null) {\n outputNames.add(outputName);\n }\n }\n\n return outputNames;\n};\n\n/** Collect the direct `needs` dependencies configured for a job. */\nconst getDirectNeedsJobIds = (\n jobMapping: Readonly<AST.YAMLMapping>\n): ReadonlySet<string> => {\n const needsPair = getMappingPair(jobMapping, \"needs\");\n const needsValue = unwrapYamlValue(needsPair?.value ?? null);\n const directNeeds = new Set<string>();\n\n if (needsValue === null) {\n return directNeeds;\n }\n\n if (needsValue.type === \"YAMLScalar\") {\n const jobId = getScalarStringValue(needsValue);\n\n if (jobId !== null) {\n directNeeds.add(jobId);\n }\n\n return directNeeds;\n }\n\n if (needsValue.type !== \"YAMLSequence\") {\n return directNeeds;\n }\n\n for (const entry of needsValue.entries) {\n const jobId = getScalarStringValue(entry);\n\n if (jobId !== null) {\n directNeeds.add(jobId);\n }\n }\n\n return directNeeds;\n};\n\n/** Rule implementation for validating job output references. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const jobs = getWorkflowJobs(root);\n const declaredOutputsByJobId = new Map(\n jobs.map((job) => [\n job.id,\n getDeclaredJobOutputNames(job.mapping),\n ])\n );\n\n const onMapping = getMappingValueAsMapping(root, \"on\");\n const workflowCallMapping =\n onMapping === null\n ? null\n : getMappingValueAsMapping(onMapping, \"workflow_call\");\n const workflowCallOutputsMapping =\n workflowCallMapping === null\n ? null\n : getMappingValueAsMapping(\n workflowCallMapping,\n \"outputs\"\n );\n\n if (workflowCallOutputsMapping !== null) {\n for (const pair of workflowCallOutputsMapping.pairs) {\n const reusableOutputName = getScalarStringValue(\n pair.key\n );\n const reusableOutputMapping = unwrapYamlValue(\n pair.value\n );\n\n if (\n reusableOutputName === null ||\n reusableOutputMapping?.type !== \"YAMLMapping\"\n ) {\n continue;\n }\n\n const valuePair = getMappingPair(\n reusableOutputMapping,\n \"value\"\n );\n\n visitStringScalars(\n valuePair?.value ?? null,\n (node, value) => {\n for (const match of value.matchAll(\n jobsOutputReferencePattern\n )) {\n const reference = match[0];\n const jobId = match.groups?.[\"jobId\"];\n const outputName =\n match.groups?.[\"outputName\"];\n\n if (\n jobId === undefined ||\n outputName === undefined\n ) {\n continue;\n }\n\n const declaredOutputNames =\n declaredOutputsByJobId.get(jobId);\n\n if (declaredOutputNames === undefined) {\n context.report({\n data: {\n jobId,\n reference,\n reusableOutputName,\n },\n messageId:\n \"unknownReusableWorkflowJob\",\n node: node as unknown as Rule.Node,\n });\n\n continue;\n }\n\n if (declaredOutputNames.has(outputName)) {\n continue;\n }\n\n context.report({\n data: {\n jobId,\n outputName,\n reference,\n reusableOutputName,\n },\n messageId:\n \"unknownReusableWorkflowJobOutput\",\n node: node as unknown as Rule.Node,\n });\n }\n }\n );\n }\n }\n\n for (const job of jobs) {\n const directNeedsJobIds = getDirectNeedsJobIds(job.mapping);\n\n visitStringScalars(job.mapping, (node, value) => {\n for (const match of value.matchAll(\n needsOutputReferencePattern\n )) {\n const reference = match[0];\n const neededJobId = match.groups?.[\"neededJobId\"];\n const outputName = match.groups?.[\"outputName\"];\n\n if (\n neededJobId === undefined ||\n outputName === undefined\n ) {\n continue;\n }\n\n const declaredOutputNames =\n declaredOutputsByJobId.get(neededJobId);\n\n if (declaredOutputNames === undefined) {\n context.report({\n data: {\n currentJobId: job.id,\n neededJobId,\n reference,\n },\n messageId: \"unknownNeedsJob\",\n node: node as unknown as Rule.Node,\n });\n\n continue;\n }\n\n if (!directNeedsJobIds.has(neededJobId)) {\n context.report({\n data: {\n currentJobId: job.id,\n neededJobId,\n reference,\n },\n messageId: \"missingNeedsDependency\",\n node: node as unknown as Rule.Node,\n });\n\n continue;\n }\n\n if (declaredOutputNames.has(outputName)) {\n continue;\n }\n\n context.report({\n data: {\n currentJobId: job.id,\n neededJobId,\n outputName,\n reference,\n },\n messageId: \"unknownNeedsOutput\",\n node: node as unknown as Rule.Node,\n });\n }\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow `needs.*.outputs.*` and reusable-workflow `jobs.*.outputs.*` references that point at undeclared jobs or outputs.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R037\",\n ruleNumber: 37,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-unknown-job-output-reference\",\n },\n messages: {\n missingNeedsDependency:\n \"Job '{{currentJobId}}' references `{{reference}}`, but job '{{neededJobId}}' is not listed in that job's direct `needs` dependencies.\",\n unknownNeedsJob:\n \"Job '{{currentJobId}}' references `{{reference}}`, but job '{{neededJobId}}' is not declared in this workflow.\",\n unknownNeedsOutput:\n \"Job '{{currentJobId}}' references `{{reference}}`, but job '{{neededJobId}}' does not declare output '{{outputName}}' under `jobs.{{neededJobId}}.outputs`.\",\n unknownReusableWorkflowJob:\n \"Reusable workflow output '{{reusableOutputName}}' references `{{reference}}`, but job '{{jobId}}' is not declared in this workflow.\",\n unknownReusableWorkflowJobOutput:\n \"Reusable workflow output '{{reusableOutputName}}' references `{{reference}}`, but job '{{jobId}}' does not declare output '{{outputName}}' under `jobs.{{jobId}}.outputs`.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow references to undefined or not-yet-available steps.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Step context references using property dereference syntax. */\nconst stepReferencePattern =\n /steps\\.(?<stepId>[A-Z_a-z][\\w-]*)\\.(?:outputs\\.[A-Z_a-z][\\w-]*|conclusion|outcome)/g;\n\n/**\n * Visit every string scalar in a job, tracking the current step index when\n * applicable.\n */\nconst visitJobStringScalars = (\n node: null | Readonly<AST.YAMLContent | AST.YAMLWithMeta>,\n visitor: (\n node: Readonly<AST.YAMLScalar>,\n value: string,\n currentStepIndex: null | number\n ) => void,\n currentStepIndex: null | number = null\n): void => {\n const unwrappedNode = unwrapYamlValue(\n node as AST.YAMLContent | AST.YAMLWithMeta | null\n );\n\n if (unwrappedNode === null) {\n return;\n }\n\n if (unwrappedNode.type === \"YAMLScalar\") {\n const value = getScalarStringValue(unwrappedNode);\n\n if (value !== null) {\n visitor(unwrappedNode, value, currentStepIndex);\n }\n\n return;\n }\n\n if (unwrappedNode.type === \"YAMLSequence\") {\n for (const entry of unwrappedNode.entries) {\n visitJobStringScalars(entry, visitor, currentStepIndex);\n }\n\n return;\n }\n\n if (unwrappedNode.type !== \"YAMLMapping\") {\n return;\n }\n\n const stepsSequence = getMappingValueAsSequence(unwrappedNode, \"steps\");\n\n if (stepsSequence !== null) {\n for (const [stepIndex, entry] of stepsSequence.entries.entries()) {\n visitJobStringScalars(entry, visitor, stepIndex);\n }\n }\n\n for (const pair of unwrappedNode.pairs) {\n if (getScalarStringValue(pair.key) === \"steps\") {\n continue;\n }\n\n visitJobStringScalars(pair.value ?? null, visitor, currentStepIndex);\n }\n};\n\n/** Collect the first declared index for each step id in a job. */\nconst getStepIndexById = (\n jobMapping: Readonly<AST.YAMLMapping>\n): ReadonlyMap<string, number> => {\n const stepsSequence = getMappingValueAsSequence(jobMapping, \"steps\");\n const stepIndexById = new Map<string, number>();\n\n if (stepsSequence === null) {\n return stepIndexById;\n }\n\n for (const [stepIndex, entry] of stepsSequence.entries.entries()) {\n const stepMapping = unwrapYamlValue(entry);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const stepId = getScalarStringValue(\n getMappingPair(stepMapping, \"id\")?.value ?? null\n );\n\n if (stepId !== null && !stepIndexById.has(stepId)) {\n stepIndexById.set(stepId, stepIndex);\n }\n }\n\n return stepIndexById;\n};\n\n/** Rule implementation for validating step context references. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n const stepIndexById = getStepIndexById(job.mapping);\n\n visitJobStringScalars(\n job.mapping,\n (node, value, currentStepIndex) => {\n for (const match of value.matchAll(\n stepReferencePattern\n )) {\n const reference = match[0];\n const stepId = match.groups?.[\"stepId\"];\n\n if (stepId === undefined) {\n continue;\n }\n\n const referencedStepIndex =\n stepIndexById.get(stepId);\n\n if (referencedStepIndex === undefined) {\n context.report({\n data: {\n jobId: job.id,\n reference,\n stepId,\n },\n messageId: \"unknownStepReference\",\n node: node as unknown as Rule.Node,\n });\n\n continue;\n }\n\n if (\n currentStepIndex === null ||\n referencedStepIndex < currentStepIndex\n ) {\n continue;\n }\n\n context.report({\n data: {\n jobId: job.id,\n reference,\n stepId,\n },\n messageId:\n \"stepReferenceBeforeAvailability\",\n node: node as unknown as Rule.Node,\n });\n }\n }\n );\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow `steps.<id>.*` references that target a missing step id or a step that has not run yet.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R038\",\n ruleNumber: 38,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-unknown-step-reference\",\n },\n messages: {\n stepReferenceBeforeAvailability:\n \"Job '{{jobId}}' references `{{reference}}` before step '{{stepId}}' has run. The `steps` context only contains prior steps in the same job.\",\n unknownStepReference:\n \"Job '{{jobId}}' references `{{reference}}`, but no step with `id: {{stepId}}` exists in that job.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow directly interpolating untrusted event inputs inside `run` steps.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/**\n * Untrusted workflow-expression sources that should not be embedded directly in\n * `run`.\n */\nconst untrustedRunExpressionSources = [\n {\n fragments: [\n \"github.event.pull_request.body\",\n \"github.event.pull_request.title\",\n ],\n source: \"pull request title/body\",\n },\n {\n fragments: [\"github.event.issue.body\", \"github.event.issue.title\"],\n source: \"issue title/body\",\n },\n {\n fragments: [\"github.event.comment.body\"],\n source: \"comment body\",\n },\n {\n fragments: [\"github.event.review.body\"],\n source: \"review body\",\n },\n {\n fragments: [\n \"github.event.discussion.body\",\n \"github.event.discussion.title\",\n ],\n source: \"discussion title/body\",\n },\n {\n fragments: [\"github.event.discussion_comment.body\"],\n source: \"discussion comment body\",\n },\n {\n fragments: [\"github.event.client_payload.\"],\n source: \"repository_dispatch client payload\",\n },\n] as const;\n\n/** Resolve the first matching untrusted expression source inside a run script. */\nconst getUnsafeRunSource = (runScript: string): null | string => {\n for (const source of untrustedRunExpressionSources) {\n if (source.fragments.some((fragment) => runScript.includes(fragment))) {\n return source.source;\n }\n }\n\n return null;\n};\n\n/** Rule implementation for disallowing unsafe direct interpolation in `run`. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n const stepsSequence = getMappingValueAsSequence(\n job.mapping,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n continue;\n }\n\n for (const entry of stepsSequence.entries) {\n const stepMapping = unwrapYamlValue(entry);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const runPair = getMappingPair(stepMapping, \"run\");\n const runScript = getScalarStringValue(\n runPair?.value ?? null\n );\n\n if (runPair === null || runScript === null) {\n continue;\n }\n\n const unsafeSource = getUnsafeRunSource(runScript);\n\n if (unsafeSource === null) {\n continue;\n }\n\n context.report({\n data: {\n jobId: job.id,\n source: unsafeSource,\n },\n messageId: \"unsafeRunInterpolation\",\n node: (runPair.value ??\n runPair) as unknown as Rule.Node,\n });\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.security\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow directly embedding untrusted event payload values inside `run` scripts; move them through `env` first or pass them to an action input.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R029\",\n ruleNumber: 29,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-untrusted-input-in-run\",\n },\n messages: {\n unsafeRunInterpolation:\n \"Job '{{jobId}}' interpolates untrusted {{source}} directly inside `run`. Assign the value to `env` first or pass it to an action input.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow declared inputs that are never used in a composite action.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isActionMetadataFile } from \"../_internal/lint-targets.js\";\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\nimport { collectYamlStringScalars } from \"../_internal/yaml-traversal.js\";\n\n/** Matches `inputs.<id>` references in composite-step string values. */\nconst INPUT_REFERENCE_PATTERN = /inputs\\.(?<inputId>[\\w-]+)/gu;\n\n/** Rule implementation for unused composite input checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isActionMetadataFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const runsMapping = getMappingValueAsMapping(root, \"runs\");\n const inputsMapping = getMappingValueAsMapping(root, \"inputs\");\n\n if (runsMapping === null || inputsMapping === null) {\n return;\n }\n\n const usingRuntime = getScalarStringValue(\n getMappingPair(runsMapping, \"using\")?.value\n );\n\n if (usingRuntime !== \"composite\") {\n return;\n }\n\n const allScalarValues = collectYamlStringScalars(runsMapping);\n const referencedInputIds = new Set<string>();\n\n for (const scalarValue of allScalarValues) {\n for (const match of scalarValue.matchAll(\n INPUT_REFERENCE_PATTERN\n )) {\n const matchedInputId = match.groups?.[\"inputId\"];\n\n if (matchedInputId === undefined) {\n continue;\n }\n\n referencedInputIds.add(matchedInputId);\n }\n }\n\n for (const inputPair of inputsMapping.pairs) {\n const inputId = getScalarStringValue(inputPair.key);\n\n if (inputId === null) {\n continue;\n }\n\n if (referencedInputIds.has(inputId)) {\n continue;\n }\n\n context.report({\n data: {\n inputId,\n },\n messageId: \"unusedCompositeInput\",\n node: inputPair.key as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.actionMetadata\",\n \"github-actions.configs.all\",\n ],\n description:\n \"disallow declared composite-action inputs that are never referenced.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R053\",\n ruleNumber: 53,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-unused-input-in-composite\",\n },\n messages: {\n unusedCompositeInput:\n \"Composite action input '{{inputId}}' is declared but never referenced via `inputs.{{inputId}}`.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Disallow broad `write-all` GitHub token permissions.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Determine whether a permissions node is the broad `write-all` shortcut. */\nconst isWriteAllPermissionsValue = (\n permissionsPair: Readonly<AST.YAMLPair>\n): boolean =>\n getScalarStringValue(permissionsPair.value)?.trim().toLowerCase() ===\n \"write-all\";\n\n/** Rule implementation for disallowing `permissions: write-all`. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const reportWriteAll = (\n permissionsPair: Readonly<AST.YAMLPair>,\n scope: string\n ): void => {\n context.report({\n data: {\n scope,\n },\n messageId: \"writeAllPermissions\",\n node: permissionsPair.value as unknown as Rule.Node,\n });\n };\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const workflowPermissionsPair = getMappingPair(\n root,\n \"permissions\"\n );\n\n if (\n workflowPermissionsPair !== null &&\n isWriteAllPermissionsValue(workflowPermissionsPair)\n ) {\n reportWriteAll(\n workflowPermissionsPair,\n \"top-level workflow `permissions`\"\n );\n }\n\n for (const job of getWorkflowJobs(root)) {\n const jobPermissionsPair = getMappingPair(\n job.mapping,\n \"permissions\"\n );\n\n if (\n jobPermissionsPair !== null &&\n isWriteAllPermissionsValue(jobPermissionsPair)\n ) {\n reportWriteAll(\n jobPermissionsPair,\n `job '${job.id}' permissions`\n );\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.security\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow `permissions: write-all` so workflows and jobs keep GitHub token scopes least-privileged.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R023\",\n ruleNumber: 23,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/no-write-all-permissions\",\n },\n messages: {\n writeAllPermissions:\n \"Avoid `write-all` in {{scope}}. Declare only the specific write scopes the workflow or job actually needs.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require immutable full-length SHA pins for third-party actions and reusable workflows.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Full commit SHA pattern recommended by GitHub for pinning action refs. */\nconst FULL_SHA_PATTERN = /^[0-9a-f]{40}$/u;\n\n/** Determine whether a `uses` reference is a local action path. */\nconst isLocalActionReference = (reference: string): boolean =>\n reference.startsWith(\"./\");\n\n/** Determine whether a `uses` reference is a Docker image reference. */\nconst isDockerReference = (reference: string): boolean =>\n reference.startsWith(\"docker://\");\n\n/** Determine whether a `uses` reference targets a reusable workflow. */\nconst isReusableWorkflowReference = (reference: string): boolean =>\n reference.includes(\"/.github/workflows/\");\n\n/** Extract the ref segment after the final `@` delimiter. */\nconst getReferenceRef = (reference: string): null | string => {\n const delimiterIndex = reference.lastIndexOf(\"@\");\n\n return delimiterIndex === -1 ? null : reference.slice(delimiterIndex + 1);\n};\n\n/** Determine whether a GitHub `uses` reference must be SHA pinned. */\nconst shouldValidateUsesReference = (reference: string): boolean =>\n !isLocalActionReference(reference) && !isDockerReference(reference);\n\n/**\n * Rule implementation for requiring immutable SHA pins on external uses\n * references.\n */\nconst rule: Rule.RuleModule = {\n create(context) {\n const reportReference = (\n node: Readonly<NonNullable<Rule.Node>>,\n reference: string\n ): void => {\n if (!shouldValidateUsesReference(reference)) {\n return;\n }\n\n const ref = getReferenceRef(reference);\n\n if (ref !== null && FULL_SHA_PATTERN.test(ref)) {\n return;\n }\n\n context.report({\n data: {\n ref: ref ?? \"<missing ref>\",\n reference,\n },\n messageId: isReusableWorkflowReference(reference)\n ? \"unpinnedReusableWorkflow\"\n : \"unpinnedAction\",\n node: node as Rule.Node,\n });\n };\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n const reusableWorkflowPair = getMappingPair(\n job.mapping,\n \"uses\"\n );\n const reusableWorkflowReference = getScalarStringValue(\n reusableWorkflowPair?.value ?? null\n );\n\n if (\n reusableWorkflowPair !== null &&\n reusableWorkflowReference !== null\n ) {\n reportReference(\n (reusableWorkflowPair.value ??\n reusableWorkflowPair) as unknown as Rule.Node,\n reusableWorkflowReference\n );\n }\n\n const stepsSequence = getMappingValueAsSequence(\n job.mapping,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n continue;\n }\n\n for (const entry of stepsSequence.entries) {\n const stepMapping = unwrapYamlValue(entry);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const usesPair = getMappingPair(stepMapping, \"uses\");\n const usesReference = getScalarStringValue(\n usesPair?.value ?? null\n );\n\n if (usesPair === null || usesReference === null) {\n continue;\n }\n\n reportReference(\n (usesPair.value ??\n usesPair) as unknown as Rule.Node,\n usesReference\n );\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.security\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require third-party `uses` references to pin full-length commit SHAs instead of mutable tags or branches.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R003\",\n ruleNumber: 3,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/pin-action-shas\",\n },\n messages: {\n unpinnedAction:\n \"Action reference '{{reference}}' should pin a full 40-character commit SHA instead of '{{ref}}'.\",\n unpinnedReusableWorkflow:\n \"Reusable workflow reference '{{reference}}' should pin a full 40-character commit SHA instead of '{{ref}}'.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Prefer `action.yml` over `action.yaml` for action metadata.\n */\nimport type { Rule } from \"eslint\";\n\n/** Rule implementation for preferring `action.yml`. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n if (!context.filename.toLowerCase().endsWith(\"action.yaml\")) {\n return;\n }\n\n context.report({\n messageId: \"preferActionYml\",\n node: node as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.actionMetadata\",\n \"github-actions.configs.all\",\n ],\n description:\n \"require action metadata files to prefer `action.yml` over `action.yaml`.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R043\",\n ruleNumber: 43,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/prefer-action-yml\",\n },\n messages: {\n preferActionYml:\n \"Prefer naming action metadata files `action.yml` instead of `action.yaml`.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Prefer matrix fail-fast behavior over explicitly disabling it.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n isGithubExpressionScalar,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for discouraging `strategy.fail-fast: false`. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n const strategyPair = getMappingPair(\n job.mapping,\n \"strategy\"\n );\n const strategyValue = unwrapYamlValue(\n strategyPair?.value ?? null\n );\n\n if (strategyValue?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const failFastPair = getMappingPair(\n strategyValue,\n \"fail-fast\"\n );\n\n if (\n failFastPair === null ||\n isGithubExpressionScalar(failFastPair.value)\n ) {\n continue;\n }\n\n const failFastValue = unwrapYamlValue(failFastPair.value);\n const failFastText = getScalarStringValue(\n failFastPair.value\n );\n\n if (\n failFastValue?.type === \"YAMLScalar\" &&\n (failFastValue.value === false ||\n failFastText === \"false\")\n ) {\n context.report({\n data: {\n jobId: job.id,\n },\n messageId: \"failFastDisabled\",\n node: (failFastPair.value ??\n failFastPair) as unknown as Rule.Node,\n });\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow `strategy.fail-fast: false` so failing matrix jobs can stop redundant work sooner.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R015\",\n ruleNumber: 15,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/prefer-fail-fast\",\n },\n messages: {\n failFastDisabled:\n \"Job '{{jobId}}' disables `strategy.fail-fast`. Prefer `true` or a GitHub expression instead.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Enforce a consistent file extension for workflow files.\n */\nimport type { Rule } from \"eslint\";\n\nimport { extname } from \"node:path\";\n\n/** Supported workflow filename extensions. */\nconst workflowFileExtensions = [\"yaml\", \"yml\"] as const;\n\n/** Allowed workflow filename extension. */\ntype WorkflowFileExtension = (typeof workflowFileExtensions)[number];\n\n/** Object-style options for `prefer-file-extension`. */\ntype WorkflowFileExtensionOptionObject = {\n readonly caseSensitive?: boolean;\n readonly extension?: WorkflowFileExtension;\n};\n\n/** Rule options for `prefer-file-extension`. */\ntype WorkflowFileExtensionOptions = [\n (WorkflowFileExtension | WorkflowFileExtensionOptionObject)?,\n];\n\n/** Default workflow file extension. */\nconst DEFAULT_WORKFLOW_FILE_EXTENSION: WorkflowFileExtension = \"yml\";\n\n/** Normalize file extension options into a consistent runtime shape. */\nconst normalizePreferFileExtensionOptions = (\n option: Readonly<\n undefined | WorkflowFileExtension | WorkflowFileExtensionOptionObject\n >\n): {\n caseSensitive: boolean;\n extension: WorkflowFileExtension;\n} => {\n if (option === undefined || typeof option === \"string\") {\n return {\n caseSensitive: true,\n extension: option ?? DEFAULT_WORKFLOW_FILE_EXTENSION,\n };\n }\n\n return {\n caseSensitive: option.caseSensitive ?? true,\n extension: option.extension ?? DEFAULT_WORKFLOW_FILE_EXTENSION,\n };\n};\n\n/** Rule implementation for enforcing workflow file extensions. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const [option] = context.options as WorkflowFileExtensionOptions;\n const { caseSensitive, extension } =\n normalizePreferFileExtensionOptions(option ?? undefined);\n\n return {\n Program(node) {\n const actualExtensionWithDot = extname(context.filename);\n\n if (actualExtensionWithDot.length === 0) {\n return;\n }\n\n const actualExtension = actualExtensionWithDot.slice(1);\n\n if (actualExtension === undefined) {\n return;\n }\n\n const normalizedActualExtension = caseSensitive\n ? actualExtension\n : actualExtension.toLowerCase();\n const normalizedExpectedExtension = caseSensitive\n ? extension\n : extension.toLowerCase();\n\n if (normalizedActualExtension === normalizedExpectedExtension) {\n return;\n }\n\n context.report({\n data: {\n actual: `.${actualExtension}`,\n expected: `.${extension}`,\n },\n messageId: \"unexpectedExtension\",\n node: node as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n defaultOptions: [DEFAULT_WORKFLOW_FILE_EXTENSION],\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"enforce a consistent file extension for GitHub Actions workflow files.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R020\",\n ruleNumber: 20,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/prefer-file-extension\",\n },\n messages: {\n unexpectedExtension:\n \"Expected workflow files to use the {{expected}} extension, but found {{actual}}.\",\n },\n schema: [\n {\n anyOf: [\n {\n description: \"Expected workflow filename extension.\",\n enum: workflowFileExtensions,\n type: \"string\",\n },\n {\n additionalProperties: false,\n description: \"Workflow filename extension options.\",\n properties: {\n caseSensitive: {\n description:\n \"Whether extension matching should preserve case.\",\n type: \"boolean\",\n },\n extension: {\n description:\n \"Expected workflow filename extension.\",\n enum: workflowFileExtensions,\n type: \"string\",\n },\n },\n type: \"object\",\n },\n ],\n description:\n \"Workflow filename extension preference, either as a simple extension string or an option object.\",\n },\n ],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Prefer the `inputs` context over `github.event.inputs` in manual workflows.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getScalarStringValue,\n getWorkflowEventNames,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Legacy workflow_dispatch inputs context prefix. */\nconst githubEventInputsPrefix = \"github.event.inputs.\";\n\n/** Preferred workflow_dispatch inputs context prefix. */\nconst inputsContextPrefix = \"inputs.\";\n\n/** Check whether a scalar string references the legacy inputs context. */\nconst hasGithubEventInputsReference = (value: string): boolean =>\n value.includes(githubEventInputsPrefix);\n\n/** Replace legacy workflow_dispatch inputs references with the preferred form. */\nconst replaceGithubEventInputsReferences = (value: string): string =>\n value.replaceAll(githubEventInputsPrefix, inputsContextPrefix);\n\n/** Visit every string scalar reachable from a YAML value node. */\nconst visitStringScalars = (\n node: null | Readonly<AST.YAMLContent | AST.YAMLWithMeta>,\n visitor: (node: Readonly<AST.YAMLScalar>, value: string) => void\n): void => {\n const unwrappedNode = unwrapYamlValue(\n node as AST.YAMLContent | AST.YAMLWithMeta | null\n );\n\n if (unwrappedNode === null) {\n return;\n }\n\n if (unwrappedNode.type === \"YAMLScalar\") {\n const value = getScalarStringValue(unwrappedNode);\n\n if (value !== null) {\n visitor(unwrappedNode, value);\n }\n\n return;\n }\n\n if (unwrappedNode.type === \"YAMLSequence\") {\n for (const entry of unwrappedNode.entries) {\n visitStringScalars(entry, visitor);\n }\n\n return;\n }\n\n if (unwrappedNode.type !== \"YAMLMapping\") {\n return;\n }\n\n for (const pair of unwrappedNode.pairs) {\n visitStringScalars(pair.value ?? null, visitor);\n }\n};\n\n/** Rule implementation for preferring the `inputs` context. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const eventNames = getWorkflowEventNames(root);\n\n if (!eventNames.has(\"workflow_dispatch\")) {\n return;\n }\n\n visitStringScalars(root, (node, value) => {\n if (!hasGithubEventInputsReference(value)) {\n return;\n }\n\n context.report({\n fix: (fixer) => {\n const originalText = context.sourceCode.text.slice(\n node.range[0],\n node.range[1]\n );\n const fixedText =\n replaceGithubEventInputsReferences(\n originalText\n );\n\n return originalText === fixedText\n ? null\n : fixer.replaceTextRange(node.range, fixedText);\n },\n messageId: \"preferInputsContext\",\n node: node as unknown as Rule.Node,\n });\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"enforce the `inputs` context instead of `github.event.inputs` in `workflow_dispatch` workflows so boolean inputs preserve their native type semantics.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R033\",\n ruleNumber: 33,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/prefer-inputs-context\",\n },\n fixable: \"code\",\n messages: {\n preferInputsContext:\n \"Prefer `inputs.*` over `github.event.inputs.*` in `workflow_dispatch` workflows because the `inputs` context preserves booleans and is the documented shorthand.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Enforce a consistent style for step-level `uses:` references.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Supported `uses:` reference styles. */\nconst usesStyles = [\n \"branch\",\n \"commit\",\n \"release\",\n] as const;\n\n/** Object-style configuration for `prefer-step-uses-style`. */\ntype PreferStepUsesStyleObjectOption = Partial<\n Record<\"branch\" | \"commit\" | \"release\", boolean>\n> & {\n readonly allowDocker?: boolean;\n readonly allowRepository?: boolean;\n readonly ignores?: readonly string[];\n};\n\n/** String literal union of supported `uses:` styles. */\ntype StepUsesStyle = (typeof usesStyles)[number];\n\n/** Default `uses:` style enforced by the rule. */\nconst DEFAULT_STEP_USES_STYLE: StepUsesStyle = \"commit\";\n\n/** Normalize prefer-step-uses-style options into a consistent runtime shape. */\nconst normalizeStepUsesStyleOptions = (\n option: Readonly<\n PreferStepUsesStyleObjectOption | StepUsesStyle | undefined\n >\n): {\n allowDocker: boolean;\n allowedStyles: readonly StepUsesStyle[];\n allowRepository: boolean;\n ignoredReferences: readonly string[];\n} => {\n if (option === undefined || typeof option === \"string\") {\n return {\n allowDocker: false,\n allowedStyles: [option ?? DEFAULT_STEP_USES_STYLE],\n allowRepository: false,\n ignoredReferences: [],\n };\n }\n\n const allowedStyles = usesStyles.filter((style) => option[style] === true);\n\n return {\n allowDocker: option.allowDocker ?? false,\n allowedStyles:\n allowedStyles.length > 0\n ? allowedStyles\n : [DEFAULT_STEP_USES_STYLE],\n allowRepository: option.allowRepository ?? false,\n ignoredReferences: [...(option.ignores ?? [])],\n };\n};\n\n/** Parse a step-level `uses:` reference into its normalized style. */\nconst parseStepUsesReference = (\n reference: string\n): {\n isDocker: boolean;\n isRepository: boolean;\n style: StepUsesStyle;\n} => {\n if (reference.startsWith(\"./\")) {\n return {\n isDocker: false,\n isRepository: true,\n style: DEFAULT_STEP_USES_STYLE,\n };\n }\n\n if (reference.startsWith(\"docker://\")) {\n return {\n isDocker: true,\n isRepository: false,\n style: DEFAULT_STEP_USES_STYLE,\n };\n }\n\n const delimiterIndex = reference.lastIndexOf(\"@\");\n const ref =\n delimiterIndex === -1 ? \"\" : reference.slice(delimiterIndex + 1);\n\n let isReleaseStyle = ref.startsWith(\"v\") && ref.length > 1;\n\n if (isReleaseStyle) {\n for (const character of ref.slice(1)) {\n if (character !== \".\" && (character < \"0\" || character > \"9\")) {\n isReleaseStyle = false;\n break;\n }\n }\n }\n\n if (/^[0-9a-f]{40}$/u.test(ref)) {\n return {\n isDocker: false,\n isRepository: false,\n style: \"commit\",\n };\n }\n\n if (isReleaseStyle) {\n return {\n isDocker: false,\n isRepository: false,\n style: \"release\",\n };\n }\n\n return {\n isDocker: false,\n isRepository: false,\n style: \"branch\",\n };\n};\n\n/** Rule implementation for enforcing step-level `uses:` reference style. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const [option] = context.options as [\n (PreferStepUsesStyleObjectOption | StepUsesStyle)?,\n ];\n const {\n allowDocker,\n allowedStyles,\n allowRepository,\n ignoredReferences,\n } = normalizeStepUsesStyleOptions(option ?? undefined);\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n const stepsSequence = getMappingValueAsSequence(\n job.mapping,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n continue;\n }\n\n for (const entry of stepsSequence.entries) {\n const stepMapping = unwrapYamlValue(entry);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const usesPair = getMappingPair(stepMapping, \"uses\");\n const usesReference = getScalarStringValue(\n usesPair?.value ?? null\n );\n\n if (usesPair === null || usesReference === null) {\n continue;\n }\n\n if (ignoredReferences.includes(usesReference)) {\n continue;\n }\n\n const parsedReference =\n parseStepUsesReference(usesReference);\n\n if (parsedReference.isRepository) {\n if (!allowRepository) {\n context.report({\n messageId: \"repositoryActionDisallowed\",\n node: (usesPair.value ??\n usesPair) as unknown as Rule.Node,\n });\n }\n\n continue;\n }\n\n if (parsedReference.isDocker) {\n if (!allowDocker) {\n context.report({\n messageId: \"dockerActionDisallowed\",\n node: (usesPair.value ??\n usesPair) as unknown as Rule.Node,\n });\n }\n\n continue;\n }\n\n if (!allowedStyles.includes(parsedReference.style)) {\n context.report({\n data: {\n style: parsedReference.style,\n },\n messageId: \"styleDisallowed\",\n node: (usesPair.value ??\n usesPair) as unknown as Rule.Node,\n });\n }\n }\n }\n },\n };\n },\n meta: {\n defaultOptions: [DEFAULT_STEP_USES_STYLE],\n docs: {\n configs: [\"github-actions.configs.all\"],\n description:\n \"enforce a consistent style for step-level `uses` references.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R016\",\n ruleNumber: 16,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/prefer-step-uses-style\",\n },\n messages: {\n dockerActionDisallowed:\n \"Docker-based `uses` references are disallowed by this rule configuration.\",\n repositoryActionDisallowed:\n \"Repository-local `uses` references are disallowed by this rule configuration.\",\n styleDisallowed:\n \"Step `uses` references with style '{{style}}' are disallowed by this rule configuration.\",\n },\n schema: [\n {\n anyOf: [\n {\n description:\n \"Single allowed style for step-level `uses` references.\",\n enum: usesStyles,\n type: \"string\",\n },\n {\n additionalProperties: false,\n description:\n \"Allowed styles and exceptions for step-level `uses` references.\",\n properties: {\n allowDocker: {\n description:\n \"Allow Docker-based step `uses` references such as docker://alpine:3.20.\",\n type: \"boolean\",\n },\n allowRepository: {\n description:\n \"Allow repository-local step `uses` references such as ./.github/actions/foo.\",\n type: \"boolean\",\n },\n branch: {\n description:\n \"Allow branch-style references such as @main.\",\n type: \"boolean\",\n },\n commit: {\n description:\n \"Allow full-commit-SHA references such as @0123...abcd.\",\n type: \"boolean\",\n },\n ignores: {\n description:\n \"Literal step `uses` references that should be ignored by this rule.\",\n items: {\n type: \"string\",\n },\n type: \"array\",\n uniqueItems: true,\n },\n release: {\n description:\n \"Allow release-style references such as @v4 or @v4.2.0.\",\n type: \"boolean\",\n },\n },\n type: \"object\",\n },\n ],\n description:\n \"Configure the allowed styles for step-level `uses` references.\",\n },\n ],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Prefer `.yml` over `.yaml` for workflow template YAML files.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n isWorkflowTemplateYamlFile,\n usesYamlExtension,\n} from \"../_internal/lint-targets.js\";\n\n/** Rule implementation for template YAML extension preference checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n if (!isWorkflowTemplateYamlFile(context.filename)) {\n return;\n }\n\n if (!usesYamlExtension(context.filename)) {\n return;\n }\n\n context.report({\n messageId: \"preferTemplateYml\",\n node: node as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"require workflow template files to prefer `.yml` over `.yaml`.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R066\",\n ruleNumber: 66,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/prefer-template-yml-extension\",\n },\n messages: {\n preferTemplateYml:\n \"Prefer `.yml` for workflow template files instead of `.yaml`.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require every workflow file to declare a human-readable top-level name.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for requiring a string workflow name. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n context.report({\n messageId: \"missingName\",\n node: node as unknown as Rule.Node,\n });\n\n return;\n }\n\n const namePair = getMappingPair(root, \"name\");\n\n if (namePair === null) {\n context.report({\n messageId: \"missingName\",\n node: root as unknown as Rule.Node,\n });\n\n return;\n }\n\n const nameValue = getScalarStringValue(namePair.value);\n\n if (nameValue === null || nameValue.trim().length === 0) {\n context.report({\n messageId: \"invalidName\",\n node: (namePair.value ??\n namePair) as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require a non-empty string workflow `name` so workflow runs stay readable in the GitHub Actions UI.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R005\",\n ruleNumber: 5,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-action-name\",\n },\n messages: {\n invalidName: \"Workflow `name` must be a non-empty string.\",\n missingName:\n \"Add a top-level workflow `name` so runs are identifiable in the GitHub Actions UI.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require every workflow file to declare a run-name string.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for requiring a string workflow run-name. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n context.report({\n messageId: \"missingRunName\",\n node: node as unknown as Rule.Node,\n });\n\n return;\n }\n\n const runNamePair = getMappingPair(root, \"run-name\");\n\n if (runNamePair === null) {\n context.report({\n messageId: \"missingRunName\",\n node: root as unknown as Rule.Node,\n });\n\n return;\n }\n\n const runNameValue = getScalarStringValue(runNamePair.value);\n\n if (runNameValue === null || runNameValue.trim().length === 0) {\n context.report({\n messageId: \"invalidRunName\",\n node: (runNamePair.value ??\n runNamePair) as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require a non-empty string workflow `run-name` when you want queued and in-progress runs to remain self-describing.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R006\",\n ruleNumber: 6,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-action-run-name\",\n },\n messages: {\n invalidRunName: \"Workflow `run-name` must be a non-empty string.\",\n missingRunName:\n \"Add a top-level workflow `run-name` so individual workflow runs are easier to distinguish.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require a checkout step before using repository-local actions.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Determine whether a step uses the checkout action. */\nconst isCheckoutActionReference = (reference: string): boolean =>\n reference.startsWith(\"actions/checkout@\");\n\n/** Determine whether a step uses a repository-local action path. */\nconst isLocalActionReference = (reference: string): boolean =>\n reference.startsWith(\"./\");\n\n/** Rule implementation for requiring checkout before local actions. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n const stepsSequence = getMappingValueAsSequence(\n job.mapping,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n continue;\n }\n\n let hasSeenCheckout = false;\n\n for (const entry of stepsSequence.entries) {\n const stepMapping = unwrapYamlValue(entry);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const usesPair = getMappingPair(stepMapping, \"uses\");\n const usesReference = getScalarStringValue(\n usesPair?.value ?? null\n );\n\n if (usesPair === null || usesReference === null) {\n continue;\n }\n\n if (isCheckoutActionReference(usesReference)) {\n hasSeenCheckout = true;\n continue;\n }\n\n if (\n isLocalActionReference(usesReference) &&\n !hasSeenCheckout\n ) {\n context.report({\n data: {\n jobId: job.id,\n reference: usesReference,\n },\n messageId: \"missingCheckoutBeforeLocalAction\",\n node: (usesPair.value ??\n usesPair) as unknown as Rule.Node,\n });\n }\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require an `actions/checkout` step before using repository-local step actions so local action paths resolve reliably.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R025\",\n ruleNumber: 25,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-checkout-before-local-action\",\n },\n messages: {\n missingCheckoutBeforeLocalAction:\n \"Job '{{jobId}}' uses local action '{{reference}}' before any `actions/checkout` step. Check out the repository first.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require `name` on composite action steps.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isActionMetadataFile } from \"../_internal/lint-targets.js\";\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for requiring names on composite steps. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n if (!isActionMetadataFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n const runsMapping =\n root === null\n ? null\n : getMappingValueAsMapping(root, \"runs\");\n\n if (runsMapping === null) {\n return;\n }\n\n const usingRuntime = getScalarStringValue(\n getMappingPair(runsMapping, \"using\")?.value\n );\n\n if (usingRuntime !== \"composite\") {\n return;\n }\n\n const stepsSequence = getMappingValueAsSequence(\n runsMapping,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n return;\n }\n\n for (const [\n index,\n stepEntry,\n ] of stepsSequence.entries.entries()) {\n const stepMapping = unwrapYamlValue(stepEntry);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const nameValue = getScalarStringValue(\n getMappingPair(stepMapping, \"name\")?.value\n );\n\n if (nameValue !== null && nameValue.trim().length > 0) {\n continue;\n }\n\n context.report({\n data: {\n index: String(index + 1),\n },\n messageId: \"missingCompositeStepName\",\n node: stepMapping as unknown as Rule.Node,\n });\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.actionMetadata\",\n \"github-actions.configs.all\",\n ],\n description:\n \"require each composite action step to declare a descriptive `name`.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R052\",\n ruleNumber: 52,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-composite-step-name\",\n },\n messages: {\n missingCompositeStepName:\n \"Composite step #{{index}} should declare a non-empty `name` for readability and debugging.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require every GitHub Actions job to declare a string name.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for requiring explicit job names. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const jobsMapping = getMappingValueAsMapping(root, \"jobs\");\n\n if (jobsMapping === null) {\n return;\n }\n\n for (const pair of jobsMapping.pairs) {\n const jobId = getScalarStringValue(pair.key) ?? \"<unknown>\";\n const jobValue = unwrapYamlValue(pair.value);\n\n if (jobValue?.type !== \"YAMLMapping\") {\n context.report({\n data: { jobId },\n messageId: \"missingJobName\",\n node: (pair.value ?? pair) as unknown as Rule.Node,\n });\n\n continue;\n }\n\n const namePair = getMappingPair(jobValue, \"name\");\n\n if (namePair === null) {\n context.report({\n data: { jobId },\n messageId: \"missingJobName\",\n node: pair.key as AST.YAMLNode as unknown as Rule.Node,\n });\n\n continue;\n }\n\n const nameValue = getScalarStringValue(namePair.value);\n\n if (nameValue === null || nameValue.trim().length === 0) {\n context.report({\n data: { jobId },\n messageId: \"invalidJobName\",\n node: (namePair.value ??\n namePair) as unknown as Rule.Node,\n });\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require every workflow job to declare a non-empty string `name` for readable run summaries.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R007\",\n ruleNumber: 7,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-job-name\",\n },\n messages: {\n invalidJobName:\n \"Job '{{jobId}}' must set `name` to a non-empty string.\",\n missingJobName:\n \"Job '{{jobId}}' is missing a human-readable `name`.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require every workflow step to declare a string name.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for requiring explicit job step names. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n const stepsSequence = getMappingValueAsSequence(\n job.mapping,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n continue;\n }\n\n for (const entry of stepsSequence.entries) {\n const stepMapping = unwrapYamlValue(entry);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const namePair = getMappingPair(stepMapping, \"name\");\n\n if (namePair === null) {\n context.report({\n data: {\n jobId: job.id,\n },\n messageId: \"missingStepName\",\n node: stepMapping as unknown as Rule.Node,\n });\n\n continue;\n }\n\n const nameValue = getScalarStringValue(namePair.value);\n\n if (\n nameValue === null ||\n nameValue.trim().length === 0\n ) {\n context.report({\n data: {\n jobId: job.id,\n },\n messageId: \"invalidStepName\",\n node: (namePair.value ??\n namePair) as unknown as Rule.Node,\n });\n }\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require every workflow step to declare a non-empty string `name` so job logs remain readable.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R008\",\n ruleNumber: 8,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-job-step-name\",\n },\n messages: {\n invalidStepName:\n \"A step in job '{{jobId}}' must set `name` to a non-empty string.\",\n missingStepName:\n \"A step in job '{{jobId}}' is missing a human-readable `name`.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require bounded job timeouts for GitHub Actions jobs.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getScalarNumberValue,\n getWorkflowJobs,\n getWorkflowRoot,\n isGithubExpressionScalar,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule options for `require-job-timeout-minutes`. */\ntype RequireJobTimeoutMinutesOptions = [\n {\n readonly maxMinutes?: number;\n }?,\n];\n\n/** Default upper bound used when validating workflow job timeouts. */\nconst DEFAULT_MAX_MINUTES = 60;\n\n/** Rule implementation for requiring bounded timeout-minutes on workflow jobs. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const [options] = context.options as RequireJobTimeoutMinutesOptions;\n const maxMinutes = options?.maxMinutes ?? DEFAULT_MAX_MINUTES;\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n for (const job of getWorkflowJobs(root)) {\n if (getMappingPair(job.mapping, \"uses\") !== null) {\n continue;\n }\n\n const timeoutPair = getMappingPair(\n job.mapping,\n \"timeout-minutes\"\n );\n\n if (timeoutPair === null) {\n context.report({\n data: {\n jobId: job.id,\n },\n messageId: \"missingTimeout\",\n node: job.idNode,\n });\n\n continue;\n }\n\n if (isGithubExpressionScalar(timeoutPair.value)) {\n continue;\n }\n\n const timeoutMinutes = getScalarNumberValue(\n timeoutPair.value\n );\n\n if (\n timeoutMinutes === null ||\n !Number.isInteger(timeoutMinutes) ||\n timeoutMinutes <= 0\n ) {\n context.report({\n data: {\n jobId: job.id,\n },\n messageId: \"invalidTimeout\",\n node: timeoutPair.value ?? timeoutPair,\n });\n\n continue;\n }\n\n if (timeoutMinutes > maxMinutes) {\n context.report({\n data: {\n actualMinutes: String(timeoutMinutes),\n jobId: job.id,\n maxMinutes: String(maxMinutes),\n },\n messageId: \"timeoutTooLarge\",\n node: timeoutPair.value ?? timeoutPair,\n });\n }\n }\n },\n };\n },\n meta: {\n defaultOptions: [{}],\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require every non-reusable workflow job to define a bounded `timeout-minutes` value.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R002\",\n ruleNumber: 2,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-job-timeout-minutes\",\n },\n messages: {\n invalidTimeout:\n \"Job '{{jobId}}' has an invalid `timeout-minutes` value. Use a positive integer or a GitHub expression.\",\n missingTimeout:\n \"Job '{{jobId}}' is missing `timeout-minutes`. Add an explicit timeout to prevent hung runners from waiting indefinitely.\",\n timeoutTooLarge:\n \"Job '{{jobId}}' sets `timeout-minutes` to {{actualMinutes}}, which exceeds the configured maximum of {{maxMinutes}}.\",\n },\n schema: [\n {\n additionalProperties: false,\n description:\n \"Optional configuration for the maximum allowed job timeout in minutes.\",\n properties: {\n maxMinutes: {\n description:\n \"Maximum allowed timeout-minutes value for a non-reusable workflow job.\",\n minimum: 1,\n type: \"integer\",\n },\n },\n type: \"object\",\n },\n ],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require merge-queue-aware workflows to listen for merge_group.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Determine whether the workflow declares a specific trigger event. */\nconst hasTriggerEvent = (\n root: Readonly<AST.YAMLMapping>,\n eventName: string\n): boolean => {\n const onPair = getMappingPair(root, \"on\");\n const onValue = unwrapYamlValue(onPair?.value ?? null);\n\n if (onValue === null) {\n return false;\n }\n\n if (onValue.type === \"YAMLScalar\") {\n return getScalarStringValue(onValue) === eventName;\n }\n\n if (onValue.type === \"YAMLSequence\") {\n return onValue.entries.some(\n (entry) =>\n entry !== null && getScalarStringValue(entry) === eventName\n );\n }\n\n if (onValue.type !== \"YAMLMapping\") {\n return false;\n }\n\n return getMappingPair(onValue, eventName) !== null;\n};\n\n/** Rule implementation for requiring merge_group triggers. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null || !hasTriggerEvent(root, \"pull_request\")) {\n return;\n }\n\n if (hasTriggerEvent(root, \"merge_group\")) {\n return;\n }\n\n const onPair = getMappingPair(root, \"on\");\n const onValue = unwrapYamlValue(onPair?.value ?? null);\n\n if (onValue === null) {\n return;\n }\n\n context.report({\n messageId: \"missingMergeGroup\",\n node: onValue as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require pull-request validation workflows to include the `merge_group` trigger so required checks also run for merge queues.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R035\",\n ruleNumber: 35,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-merge-group-trigger\",\n },\n messages: {\n missingMergeGroup:\n \"Workflows that validate pull requests should also listen to `merge_group` so required status checks are reported when pull requests enter a merge queue.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require base-branch scoping for `pull_request_target` triggers.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Determine whether a branch filter node is meaningfully configured. */\nconst hasConfiguredBranchFilter = (\n node: null | Readonly<AST.YAMLPair> | undefined\n): boolean => {\n const valueNode = unwrapYamlValue(node?.value ?? null);\n\n if (valueNode === null) {\n return false;\n }\n\n if (valueNode.type === \"YAMLScalar\") {\n const value = getScalarStringValue(valueNode);\n\n return value !== null && value.trim().length > 0;\n }\n\n if (valueNode.type !== \"YAMLSequence\") {\n return false;\n }\n\n return valueNode.entries.some((entry) => {\n const value = getScalarStringValue(entry);\n\n return value !== null && value.trim().length > 0;\n });\n};\n\n/** Rule implementation for requiring `pull_request_target` branch filters. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const reportMissingBranchFilter = (\n node: Readonly<AST.YAMLNode>\n ): void => {\n context.report({\n messageId: \"missingBranchFilter\",\n node: node as unknown as Rule.Node,\n });\n };\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const onPair = getMappingPair(root, \"on\");\n const onValue = unwrapYamlValue(onPair?.value ?? null);\n\n if (onValue === null) {\n return;\n }\n\n if (onValue.type === \"YAMLScalar\") {\n if (\n getScalarStringValue(onValue) === \"pull_request_target\"\n ) {\n reportMissingBranchFilter(onValue);\n }\n\n return;\n }\n\n if (onValue.type === \"YAMLSequence\") {\n for (const entry of onValue.entries) {\n if (\n entry !== null &&\n getScalarStringValue(entry) ===\n \"pull_request_target\"\n ) {\n reportMissingBranchFilter(entry);\n }\n }\n\n return;\n }\n\n const onMapping = getMappingValueAsMapping(root, \"on\");\n\n if (onMapping === null) {\n return;\n }\n\n const pullRequestTargetPair = getMappingPair(\n onMapping,\n \"pull_request_target\"\n );\n const pullRequestTargetValue = unwrapYamlValue(\n pullRequestTargetPair?.value ?? null\n );\n\n if (pullRequestTargetPair === null) {\n return;\n }\n\n if (pullRequestTargetValue?.type !== \"YAMLMapping\") {\n reportMissingBranchFilter(\n (pullRequestTargetPair.value ??\n pullRequestTargetPair) as AST.YAMLNode\n );\n\n return;\n }\n\n const branchesPair = getMappingPair(\n pullRequestTargetValue,\n \"branches\"\n );\n const branchesIgnorePair = getMappingPair(\n pullRequestTargetValue,\n \"branches-ignore\"\n );\n\n if (\n hasConfiguredBranchFilter(branchesPair) ||\n hasConfiguredBranchFilter(branchesIgnorePair)\n ) {\n return;\n }\n\n reportMissingBranchFilter(pullRequestTargetValue);\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.security\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require `on.pull_request_target` triggers to scope target base branches with `branches` or `branches-ignore` so privileged workflows do not react to every branch by default.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R032\",\n ruleNumber: 32,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-pull-request-target-branches\",\n },\n messages: {\n missingBranchFilter:\n \"`on.pull_request_target` should declare a non-empty `branches` or `branches-ignore` filter to scope which base branches can trigger this privileged workflow.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require `run` steps to declare an explicit shell directly or through defaults.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getMappingValueAsSequence,\n getScalarStringValue,\n getWorkflowJobs,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Runtime status for a discovered shell declaration. */\ntype ShellDeclarationState = \"invalid\" | \"missing\" | \"valid\";\n\n/** Inspect a shell pair and determine whether it is usable. */\nconst getShellDeclarationState = (\n shellPair: null | Readonly<AST.YAMLPair>\n): ShellDeclarationState => {\n if (shellPair === null) {\n return \"missing\";\n }\n\n const shellValue = getScalarStringValue(shellPair.value);\n\n return shellValue !== null && shellValue.trim().length > 0\n ? \"valid\"\n : \"invalid\";\n};\n\n/** Resolve `defaults.run.shell` from a mapping when present. */\nconst getRunDefaultsShellPair = (\n mapping: Readonly<AST.YAMLMapping>\n): AST.YAMLPair | null => {\n const defaultsMapping = getMappingValueAsMapping(mapping, \"defaults\");\n\n if (defaultsMapping === null) {\n return null;\n }\n\n const runDefaultsMapping = getMappingValueAsMapping(defaultsMapping, \"run\");\n\n return runDefaultsMapping === null\n ? null\n : getMappingPair(runDefaultsMapping, \"shell\");\n};\n\n/** Rule implementation for requiring explicit shells on run steps. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const reportInvalidShell = (\n shellPair: Readonly<AST.YAMLPair>,\n scope: string\n ): void => {\n context.report({\n data: {\n scope,\n },\n messageId: \"invalidShell\",\n node: (shellPair.value ?? shellPair) as unknown as Rule.Node,\n });\n };\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const workflowShellPair = getRunDefaultsShellPair(root);\n const workflowShellState =\n getShellDeclarationState(workflowShellPair);\n\n if (\n workflowShellPair !== null &&\n workflowShellState === \"invalid\"\n ) {\n reportInvalidShell(\n workflowShellPair,\n \"workflow `defaults.run.shell`\"\n );\n }\n\n for (const job of getWorkflowJobs(root)) {\n const jobShellPair = getRunDefaultsShellPair(job.mapping);\n const jobShellState =\n getShellDeclarationState(jobShellPair);\n\n if (jobShellPair !== null && jobShellState === \"invalid\") {\n reportInvalidShell(\n jobShellPair,\n `job '${job.id}' defaults.run.shell`\n );\n }\n\n const stepsSequence = getMappingValueAsSequence(\n job.mapping,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n continue;\n }\n\n for (const entry of stepsSequence.entries) {\n const stepMapping = unwrapYamlValue(entry);\n\n if (stepMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const runPair = getMappingPair(stepMapping, \"run\");\n\n if (runPair === null) {\n continue;\n }\n\n const stepShellPair = getMappingPair(\n stepMapping,\n \"shell\"\n );\n const stepShellState =\n getShellDeclarationState(stepShellPair);\n\n if (stepShellPair !== null) {\n if (stepShellState === \"valid\") {\n continue;\n }\n\n reportInvalidShell(\n stepShellPair,\n `a run step in job '${job.id}'`\n );\n\n continue;\n }\n\n if (\n jobShellState !== \"missing\" ||\n workflowShellState !== \"missing\"\n ) {\n continue;\n }\n\n context.report({\n data: {\n jobId: job.id,\n },\n messageId: \"missingShell\",\n node: (runPair.value ??\n stepMapping) as unknown as Rule.Node,\n });\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require `run` steps to use an explicit shell directly or through `defaults.run.shell` so execution behavior stays predictable across runners.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R021\",\n ruleNumber: 21,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-run-step-shell\",\n },\n messages: {\n invalidShell:\n \"{{scope}} must set `shell` to a non-empty string when declared.\",\n missingShell:\n \"A `run` step in job '{{jobId}}' should declare `shell` explicitly or inherit it from `defaults.run.shell`.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require `categories` in workflow-template properties metadata.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isWorkflowTemplatePropertiesFile } from \"../_internal/lint-targets.js\";\nimport {\n getWorkflowTemplatePropertiesRoot,\n getWorkflowTemplateStringProperty,\n} from \"../_internal/workflow-template-properties.js\";\nimport { getMappingValueAsSequence } from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for requiring template categories. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n if (!isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowTemplatePropertiesRoot(context);\n\n if (root === null) {\n return;\n }\n\n const categoriesSequence = getMappingValueAsSequence(\n root,\n \"categories\"\n );\n\n if (\n categoriesSequence !== null &&\n categoriesSequence.entries.length > 0\n ) {\n return;\n }\n\n const templateName =\n getWorkflowTemplateStringProperty(root, \"name\") ??\n \"<unnamed-template>\";\n\n context.report({\n data: {\n templateName,\n },\n messageId: \"missingCategories\",\n node: node as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"require non-empty `categories` in workflow-template metadata.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R057\",\n ruleNumber: 57,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-template-categories\",\n },\n messages: {\n missingCategories:\n \"Workflow template '{{templateName}}' should declare at least one category in `categories`.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require `filePatterns` in workflow-template properties metadata.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isWorkflowTemplatePropertiesFile } from \"../_internal/lint-targets.js\";\nimport {\n getWorkflowTemplatePropertiesRoot,\n getWorkflowTemplateStringProperty,\n} from \"../_internal/workflow-template-properties.js\";\nimport { getMappingValueAsSequence } from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for requiring non-empty template file patterns. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n if (!isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowTemplatePropertiesRoot(context);\n\n if (root === null) {\n return;\n }\n\n const filePatternsSequence = getMappingValueAsSequence(\n root,\n \"filePatterns\"\n );\n\n if (\n filePatternsSequence !== null &&\n filePatternsSequence.entries.length > 0\n ) {\n return;\n }\n\n const templateName =\n getWorkflowTemplateStringProperty(root, \"name\") ??\n \"<unnamed-template>\";\n\n context.report({\n data: {\n templateName,\n },\n messageId: \"missingFilePatterns\",\n node: node as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"require non-empty `filePatterns` in workflow-template metadata.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R058\",\n ruleNumber: 58,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-template-file-patterns\",\n },\n messages: {\n missingFilePatterns:\n \"Workflow template '{{templateName}}' should declare `filePatterns` to improve chooser relevance.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require local workflow-template icon files referenced by `iconName` to exist.\n */\nimport type { Rule } from \"eslint\";\n\nimport { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nimport { isWorkflowTemplatePropertiesFile } from \"../_internal/lint-targets.js\";\nimport {\n getWorkflowTemplatePropertiesRoot,\n getWorkflowTemplateStringProperty,\n} from \"../_internal/workflow-template-properties.js\";\n\n/** Rule implementation for template icon file existence checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n if (!isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowTemplatePropertiesRoot(context);\n\n if (root === null) {\n return;\n }\n\n const iconName = getWorkflowTemplateStringProperty(\n root,\n \"iconName\"\n );\n\n if (iconName === null || iconName.trim().length === 0) {\n return;\n }\n\n if (iconName.startsWith(\"octicon \")) {\n return;\n }\n\n const iconFilePath = join(\n dirname(context.filename),\n `${iconName}.svg`\n );\n\n if (existsSync(iconFilePath)) {\n return;\n }\n\n context.report({\n data: {\n iconFilePath,\n iconName,\n },\n messageId: \"missingTemplateIconFile\",\n node: node as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"require local `iconName` references in workflow-template metadata to point to existing SVG files.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R065\",\n ruleNumber: 65,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-template-icon-file-exists\",\n },\n messages: {\n missingTemplateIconFile:\n \"Template `iconName` '{{iconName}}' should resolve to an existing icon file at '{{iconFilePath}}'.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require `iconName` in workflow-template properties.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isWorkflowTemplatePropertiesFile } from \"../_internal/lint-targets.js\";\nimport {\n getWorkflowTemplatePropertiesRoot,\n getWorkflowTemplateStringProperty,\n} from \"../_internal/workflow-template-properties.js\";\n\n/** Rule implementation for requiring `iconName` in template properties metadata. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n if (!isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowTemplatePropertiesRoot(context);\n\n if (root === null) {\n return;\n }\n\n const iconName = getWorkflowTemplateStringProperty(\n root,\n \"iconName\"\n );\n\n if (iconName !== null && iconName.trim().length > 0) {\n return;\n }\n\n context.report({\n messageId: \"missingIconName\",\n node: node as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"require `iconName` in workflow-template `.properties.json` metadata.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R056\",\n ruleNumber: 56,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-template-icon-name\",\n },\n messages: {\n missingIconName:\n \"Workflow template metadata should define a non-empty `iconName`.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require template workflow YAML files to declare a non-empty top-level `name`.\n */\nimport type { Rule } from \"eslint\";\n\nimport { isWorkflowTemplateYamlFile } from \"../_internal/lint-targets.js\";\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for requiring workflow names in template YAML files. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n if (!isWorkflowTemplateYamlFile(context.filename)) {\n return;\n }\n\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const namePair = getMappingPair(root, \"name\");\n const workflowName = getScalarStringValue(namePair?.value);\n\n if (workflowName !== null && workflowName.trim().length > 0) {\n return;\n }\n\n context.report({\n messageId: \"missingTemplateWorkflowName\",\n node: (namePair ?? node) as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"require workflow template YAML files to declare a non-empty top-level `name`.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R067\",\n ruleNumber: 67,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-template-workflow-name\",\n },\n messages: {\n missingTemplateWorkflowName:\n \"Workflow template files should declare a non-empty top-level `name`.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require explicit activity `types` for selected multi-activity workflow events.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Events where explicit `types` improve trigger precision. */\nconst eventsRequiringTypes = new Set<string>([\n \"branch_protection_rule\",\n \"check_run\",\n \"check_suite\",\n \"discussion\",\n \"discussion_comment\",\n \"issue_comment\",\n \"issues\",\n \"label\",\n \"merge_group\",\n \"milestone\",\n \"pull_request_review\",\n \"pull_request_review_comment\",\n \"registry_package\",\n \"release\",\n \"repository_dispatch\",\n \"watch\",\n \"workflow_run\",\n]);\n\n/** Determine whether an event `types` node is meaningfully configured. */\nconst hasConfiguredTypes = (\n node: null | Readonly<AST.YAMLPair> | undefined\n): boolean => {\n const valueNode = unwrapYamlValue(node?.value ?? null);\n\n if (valueNode === null) {\n return false;\n }\n\n if (valueNode.type === \"YAMLScalar\") {\n const value = getScalarStringValue(valueNode);\n\n return value !== null && value.trim().length > 0;\n }\n\n if (valueNode.type !== \"YAMLSequence\") {\n return false;\n }\n\n return valueNode.entries.some((entry) => {\n const value = getScalarStringValue(entry);\n\n return value !== null && value.trim().length > 0;\n });\n};\n\n/** Rule implementation for requiring explicit event activity types. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const reportMissingTypes = (\n node: Readonly<AST.YAMLNode>,\n eventName: string\n ): void => {\n context.report({\n data: {\n event: eventName,\n },\n messageId: \"missingTypes\",\n node: node as unknown as Rule.Node,\n });\n };\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const onPair = getMappingPair(root, \"on\");\n const onValue = unwrapYamlValue(onPair?.value ?? null);\n\n if (onValue === null) {\n return;\n }\n\n if (onValue.type === \"YAMLScalar\") {\n const eventName = getScalarStringValue(onValue);\n\n if (\n eventName !== null &&\n eventsRequiringTypes.has(eventName)\n ) {\n reportMissingTypes(onValue, eventName);\n }\n\n return;\n }\n\n if (onValue.type === \"YAMLSequence\") {\n for (const entry of onValue.entries) {\n const eventName = getScalarStringValue(entry);\n\n if (\n entry !== null &&\n eventName !== null &&\n eventsRequiringTypes.has(eventName)\n ) {\n reportMissingTypes(entry, eventName);\n }\n }\n\n return;\n }\n\n const onMapping = getMappingValueAsMapping(root, \"on\");\n\n if (onMapping === null) {\n return;\n }\n\n for (const pair of onMapping.pairs) {\n const eventName = getScalarStringValue(pair.key);\n\n if (\n eventName === null ||\n !eventsRequiringTypes.has(eventName)\n ) {\n continue;\n }\n\n const eventValue = unwrapYamlValue(pair.value);\n\n if (eventValue?.type !== \"YAMLMapping\") {\n reportMissingTypes(\n (pair.value ?? pair.key) as AST.YAMLNode,\n eventName\n );\n\n continue;\n }\n\n if (\n hasConfiguredTypes(getMappingPair(eventValue, \"types\"))\n ) {\n continue;\n }\n\n reportMissingTypes(eventValue, eventName);\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require explicit `types` filters for selected multi-activity workflow events so workflows do not subscribe to every supported activity implicitly.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R031\",\n ruleNumber: 31,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-trigger-types\",\n },\n messages: {\n missingTypes:\n \"`on.{{event}}` should declare a non-empty `types` filter so the workflow is scoped to explicit activity types.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require explicit types for reusable workflow inputs.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Allowed GitHub reusable workflow input types. */\nconst allowedWorkflowCallInputTypes = [\n \"boolean\",\n \"number\",\n \"string\",\n] as const;\n\n/** Constant-time lookup for supported reusable workflow input types. */\nconst allowedWorkflowCallInputTypeSet: ReadonlySet<string> = new Set(\n allowedWorkflowCallInputTypes\n);\n\n/** Rule implementation for requiring explicit workflow_call input types. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const onMapping = getMappingValueAsMapping(root, \"on\");\n\n if (onMapping === null) {\n return;\n }\n\n const workflowCallMapping = unwrapYamlValue(\n getMappingPair(onMapping, \"workflow_call\")?.value ?? null\n );\n\n if (workflowCallMapping?.type !== \"YAMLMapping\") {\n return;\n }\n\n const inputsMapping = getMappingValueAsMapping(\n workflowCallMapping,\n \"inputs\"\n );\n\n if (inputsMapping === null) {\n return;\n }\n\n for (const pair of inputsMapping.pairs) {\n const inputId = getScalarStringValue(pair.key);\n const inputMapping = unwrapYamlValue(pair.value);\n\n if (\n inputId === null ||\n inputMapping?.type !== \"YAMLMapping\"\n ) {\n continue;\n }\n\n const typePair = getMappingPair(inputMapping, \"type\");\n\n if (typePair === null) {\n context.report({\n data: {\n inputId,\n },\n messageId: \"missingType\",\n node: pair.key as unknown as Rule.Node,\n });\n\n continue;\n }\n\n const typeValue = getScalarStringValue(typePair.value);\n\n if (\n typeValue === null ||\n !allowedWorkflowCallInputTypeSet.has(typeValue)\n ) {\n context.report({\n data: {\n allowedTypes:\n allowedWorkflowCallInputTypes.join(\", \"),\n inputId,\n },\n messageId: \"invalidType\",\n node: (typePair.value ??\n typePair) as unknown as Rule.Node,\n });\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require every `workflow_call` input to declare one of the documented reusable-workflow input types so callers and validators agree on interface semantics.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R034\",\n ruleNumber: 34,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-workflow-call-input-type\",\n },\n messages: {\n invalidType:\n \"`workflow_call` input '{{inputId}}' must set `type` to one of: {{allowedTypes}}.\",\n missingType:\n \"`workflow_call` input '{{inputId}}' should declare `type` explicitly.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require reusable workflow outputs to declare a non-empty `value`.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for requiring explicit reusable-workflow output values. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const onMapping = getMappingValueAsMapping(root, \"on\");\n\n if (onMapping === null) {\n return;\n }\n\n const workflowCallMapping = unwrapYamlValue(\n getMappingPair(onMapping, \"workflow_call\")?.value ?? null\n );\n\n if (workflowCallMapping?.type !== \"YAMLMapping\") {\n return;\n }\n\n const outputsMapping = getMappingValueAsMapping(\n workflowCallMapping,\n \"outputs\"\n );\n\n if (outputsMapping === null) {\n return;\n }\n\n for (const pair of outputsMapping.pairs) {\n const outputId = getScalarStringValue(pair.key);\n const outputMapping = unwrapYamlValue(pair.value);\n\n if (\n outputId === null ||\n outputMapping?.type !== \"YAMLMapping\"\n ) {\n continue;\n }\n\n const valuePair = getMappingPair(outputMapping, \"value\");\n\n if (valuePair === null) {\n context.report({\n data: {\n outputId,\n },\n messageId: \"missingValue\",\n node: pair.key as unknown as Rule.Node,\n });\n\n continue;\n }\n\n const value = getScalarStringValue(valuePair.value);\n\n if (value === null || value.trim().length === 0) {\n context.report({\n data: {\n outputId,\n },\n messageId: \"invalidValue\",\n node: (valuePair.value ??\n valuePair) as unknown as Rule.Node,\n });\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require every `workflow_call` output to declare a non-empty `value` so reusable workflows expose concrete runtime output mappings.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R039\",\n ruleNumber: 39,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-workflow-call-output-value\",\n },\n messages: {\n invalidValue:\n \"`workflow_call` output '{{outputId}}' must set `value` to a non-empty scalar expression.\",\n missingValue:\n \"`workflow_call` output '{{outputId}}' should declare `value` explicitly.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require top-level workflow concurrency controls for relevant workflow triggers.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowEventNames,\n getWorkflowRoot,\n isGithubExpressionScalar,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Default event set that most benefits from workflow-level concurrency. */\nconst DEFAULT_TRIGGER_EVENTS = [\n \"merge_group\",\n \"pull_request\",\n \"pull_request_target\",\n \"push\",\n \"workflow_dispatch\",\n] as const;\n\n/** Rule options for `require-workflow-concurrency`. */\ntype RequireWorkflowConcurrencyOptions = [\n {\n readonly onlyForEvents?: readonly string[];\n readonly requireCancelInProgress?: boolean;\n }?,\n];\n\n/** Rule implementation for requiring workflow-level concurrency controls. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const [options] = context.options as RequireWorkflowConcurrencyOptions;\n const requiredTriggerEvents = new Set<string>(\n options?.onlyForEvents ?? DEFAULT_TRIGGER_EVENTS\n );\n const requireCancelInProgress =\n options?.requireCancelInProgress ?? true;\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const eventNames = getWorkflowEventNames(root);\n const shouldRequireConcurrency = [\n ...requiredTriggerEvents,\n ].some((eventName) => eventNames.has(eventName));\n\n if (!shouldRequireConcurrency) {\n return;\n }\n\n const concurrencyPair = getMappingPair(root, \"concurrency\");\n\n if (concurrencyPair === null) {\n context.report({\n messageId: \"missingConcurrency\",\n node: root,\n });\n\n return;\n }\n\n const concurrencyValue = unwrapYamlValue(concurrencyPair.value);\n\n if (concurrencyValue === null) {\n context.report({\n messageId: \"invalidConcurrency\",\n node: concurrencyPair,\n });\n\n return;\n }\n\n if (concurrencyValue.type === \"YAMLScalar\") {\n const groupValue = getScalarStringValue(concurrencyValue);\n\n if (groupValue === null || groupValue.trim().length === 0) {\n context.report({\n messageId: \"invalidConcurrency\",\n node: concurrencyValue,\n });\n }\n\n return;\n }\n\n if (concurrencyValue.type !== \"YAMLMapping\") {\n context.report({\n messageId: \"invalidConcurrency\",\n node: concurrencyValue,\n });\n\n return;\n }\n\n const groupPair = getMappingPair(concurrencyValue, \"group\");\n const groupValue = getScalarStringValue(\n groupPair?.value ?? null\n );\n\n if (\n groupPair === null ||\n groupValue === null ||\n groupValue.trim() === \"\"\n ) {\n context.report({\n messageId: \"missingGroup\",\n node: groupPair?.key ?? concurrencyValue,\n });\n }\n\n if (!requireCancelInProgress) {\n return;\n }\n\n const cancelInProgressPair = getMappingPair(\n concurrencyValue,\n \"cancel-in-progress\"\n );\n\n if (cancelInProgressPair === null) {\n context.report({\n messageId: \"missingCancelInProgress\",\n node: concurrencyValue,\n });\n\n return;\n }\n\n if (isGithubExpressionScalar(cancelInProgressPair.value)) {\n return;\n }\n\n if (\n unwrapYamlValue(cancelInProgressPair.value)?.type !==\n \"YAMLScalar\"\n ) {\n context.report({\n messageId: \"cancelInProgressDisabled\",\n node:\n cancelInProgressPair.value ?? cancelInProgressPair,\n });\n\n return;\n }\n\n if (cancelInProgressPair.value?.type !== \"YAMLScalar\") {\n context.report({\n messageId: \"cancelInProgressDisabled\",\n node:\n cancelInProgressPair.value ?? cancelInProgressPair,\n });\n\n return;\n }\n\n if (cancelInProgressPair.value.value !== true) {\n context.report({\n messageId: \"cancelInProgressDisabled\",\n node: cancelInProgressPair.value,\n });\n }\n },\n };\n },\n meta: {\n defaultOptions: [{}],\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require workflow-level `concurrency` so redundant runs can be deduplicated predictably.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R004\",\n ruleNumber: 4,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-workflow-concurrency\",\n },\n messages: {\n cancelInProgressDisabled:\n \"Workflow `concurrency.cancel-in-progress` should be `true` or a GitHub expression so stale runs can be cancelled.\",\n invalidConcurrency:\n \"Workflow `concurrency` should be a string/expression or an object containing at least `group`.\",\n missingCancelInProgress:\n \"Workflow `concurrency` should set `cancel-in-progress` to cancel superseded runs.\",\n missingConcurrency:\n \"Add a top-level `concurrency` block so overlapping workflow runs do not pile up.\",\n missingGroup:\n \"Workflow `concurrency` should declare a non-empty `group` value.\",\n },\n schema: [\n {\n additionalProperties: false,\n description:\n \"Optional configuration for which events require workflow-level concurrency and whether cancel-in-progress is mandatory.\",\n properties: {\n onlyForEvents: {\n description:\n \"Event names that should trigger the workflow-level concurrency requirement.\",\n items: {\n minLength: 1,\n type: \"string\",\n },\n type: \"array\",\n uniqueItems: true,\n },\n requireCancelInProgress: {\n description:\n \"Require concurrency.cancel-in-progress so newer runs can cancel superseded work.\",\n type: \"boolean\",\n },\n },\n type: \"object\",\n },\n ],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require explicit types for `workflow_dispatch` inputs.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for requiring explicit workflow_dispatch input types. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const onMapping = getMappingValueAsMapping(root, \"on\");\n\n if (onMapping === null) {\n return;\n }\n\n const workflowDispatchMapping = unwrapYamlValue(\n getMappingPair(onMapping, \"workflow_dispatch\")?.value ??\n null\n );\n\n if (workflowDispatchMapping?.type !== \"YAMLMapping\") {\n return;\n }\n\n const inputsMapping = getMappingValueAsMapping(\n workflowDispatchMapping,\n \"inputs\"\n );\n\n if (inputsMapping === null) {\n return;\n }\n\n for (const pair of inputsMapping.pairs) {\n const inputId = getScalarStringValue(pair.key);\n const inputMapping = unwrapYamlValue(pair.value);\n\n if (\n inputId === null ||\n inputMapping?.type !== \"YAMLMapping\"\n ) {\n continue;\n }\n\n const typePair = getMappingPair(inputMapping, \"type\");\n\n if (typePair === null) {\n context.report({\n data: {\n inputId,\n },\n messageId: \"missingType\",\n node: pair.key as unknown as Rule.Node,\n });\n\n continue;\n }\n\n const typeValue = getScalarStringValue(typePair.value);\n\n if (typeValue === null || typeValue.trim().length === 0) {\n context.report({\n data: {\n inputId,\n },\n messageId: \"invalidType\",\n node: (typePair.value ??\n typePair) as unknown as Rule.Node,\n });\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require every `workflow_dispatch` input to declare an explicit `type` so manual runs expose clearer controls and preserve intended value semantics.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R022\",\n ruleNumber: 22,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-workflow-dispatch-input-type\",\n },\n messages: {\n invalidType:\n \"`workflow_dispatch` input '{{inputId}}' must set `type` to a non-empty string.\",\n missingType:\n \"`workflow_dispatch` input '{{inputId}}' should declare `type` explicitly.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require descriptions for manual and reusable workflow interfaces.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Report missing or invalid descriptions across interface mappings. */\nconst checkInterfaceDescriptions = (\n context: Readonly<Rule.RuleContext>,\n mapping: Readonly<AST.YAMLMapping>,\n kind: string\n): void => {\n for (const pair of mapping.pairs) {\n const name = getScalarStringValue(pair.key);\n const entryMapping = unwrapYamlValue(pair.value);\n\n if (name === null || entryMapping?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const descriptionPair = getMappingPair(entryMapping, \"description\");\n\n if (descriptionPair === null) {\n context.report({\n data: {\n kind,\n name,\n },\n messageId: \"missingDescription\",\n node: pair.key as unknown as Rule.Node,\n });\n\n continue;\n }\n\n const descriptionValue = getScalarStringValue(descriptionPair.value);\n\n if (descriptionValue === null || descriptionValue.trim().length === 0) {\n context.report({\n data: {\n kind,\n name,\n },\n messageId: \"invalidDescription\",\n node: (descriptionPair.value ??\n descriptionPair) as unknown as Rule.Node,\n });\n }\n }\n};\n\n/** Rule implementation for requiring workflow interface descriptions. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const onMapping = getMappingValueAsMapping(root, \"on\");\n\n if (onMapping === null) {\n return;\n }\n\n const workflowDispatchMapping = unwrapYamlValue(\n getMappingPair(onMapping, \"workflow_dispatch\")?.value ??\n null\n );\n\n if (workflowDispatchMapping?.type === \"YAMLMapping\") {\n const dispatchInputsMapping = getMappingValueAsMapping(\n workflowDispatchMapping,\n \"inputs\"\n );\n\n if (dispatchInputsMapping !== null) {\n checkInterfaceDescriptions(\n context,\n dispatchInputsMapping,\n \"workflow_dispatch input\"\n );\n }\n }\n\n const workflowCallMapping = unwrapYamlValue(\n getMappingPair(onMapping, \"workflow_call\")?.value ?? null\n );\n\n if (workflowCallMapping?.type !== \"YAMLMapping\") {\n return;\n }\n\n const workflowCallInputsMapping = getMappingValueAsMapping(\n workflowCallMapping,\n \"inputs\"\n );\n\n if (workflowCallInputsMapping !== null) {\n checkInterfaceDescriptions(\n context,\n workflowCallInputsMapping,\n \"workflow_call input\"\n );\n }\n\n const workflowCallSecretsMapping = getMappingValueAsMapping(\n workflowCallMapping,\n \"secrets\"\n );\n\n if (workflowCallSecretsMapping !== null) {\n checkInterfaceDescriptions(\n context,\n workflowCallSecretsMapping,\n \"workflow_call secret\"\n );\n }\n\n const workflowCallOutputsMapping = getMappingValueAsMapping(\n workflowCallMapping,\n \"outputs\"\n );\n\n if (workflowCallOutputsMapping !== null) {\n checkInterfaceDescriptions(\n context,\n workflowCallOutputsMapping,\n \"workflow_call output\"\n );\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require descriptions for `workflow_dispatch` inputs and reusable workflow interfaces so manual forms and callable workflows stay self-documenting.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R024\",\n ruleNumber: 24,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-workflow-interface-description\",\n },\n messages: {\n invalidDescription:\n \"{{kind}} '{{name}}' must set `description` to a non-empty string.\",\n missingDescription:\n \"{{kind}} '{{name}}' should declare `description` explicitly.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require explicit GitHub token permissions at workflow or job scope.\n */\nimport type { Rule } from \"eslint\";\n\nimport {\n getMappingPair,\n getWorkflowJobs,\n getWorkflowRoot,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule options for `require-workflow-permissions`. */\ntype RequireWorkflowPermissionsOptions = [\n {\n readonly allowJobLevelPermissions?: boolean;\n }?,\n];\n\n/** Rule implementation for requiring explicit workflow or job token permissions. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const [options] = context.options as RequireWorkflowPermissionsOptions;\n const allowJobLevelPermissions =\n options?.allowJobLevelPermissions ?? true;\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n if (getMappingPair(root, \"permissions\") !== null) {\n return;\n }\n\n const jobs = getWorkflowJobs(root);\n\n if (!allowJobLevelPermissions) {\n context.report({\n messageId: \"missingWorkflowPermissions\",\n node: root,\n });\n\n return;\n }\n\n if (jobs.length === 0) {\n context.report({\n messageId: \"missingWorkflowPermissions\",\n node: root,\n });\n\n return;\n }\n\n for (const job of jobs) {\n if (getMappingPair(job.mapping, \"permissions\") !== null) {\n continue;\n }\n\n context.report({\n data: {\n jobId: job.id,\n },\n messageId: \"missingJobPermissions\",\n node: job.idNode,\n });\n }\n },\n };\n },\n meta: {\n defaultOptions: [{}],\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.security\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require explicit `permissions` to avoid relying on GitHub Actions' default token scope.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R001\",\n ruleNumber: 1,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-workflow-permissions\",\n },\n messages: {\n missingJobPermissions:\n \"Job '{{jobId}}' is missing explicit `permissions`. Define workflow-level `permissions` or add `jobs.{{jobId}}.permissions`.\",\n missingWorkflowPermissions:\n \"Define explicit top-level `permissions` for this workflow, or configure job-level `permissions` for every job.\",\n },\n schema: [\n {\n additionalProperties: false,\n description:\n \"Optional configuration for how strictly workflow permissions must be declared.\",\n properties: {\n allowJobLevelPermissions: {\n description:\n \"Allow each job to declare its own permissions when the workflow omits a top-level permissions block.\",\n type: \"boolean\",\n },\n },\n type: \"object\",\n },\n ],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require branch scoping for `workflow_run` triggers.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/**\n * Determine whether a workflow_run branch filter node is meaningfully\n * configured.\n */\nconst hasConfiguredBranchFilter = (\n node: null | Readonly<AST.YAMLPair> | undefined\n): boolean => {\n const valueNode = unwrapYamlValue(node?.value ?? null);\n\n if (valueNode === null) {\n return false;\n }\n\n if (valueNode.type === \"YAMLScalar\") {\n const value = getScalarStringValue(valueNode);\n\n return value !== null && value.trim().length > 0;\n }\n\n if (valueNode.type !== \"YAMLSequence\") {\n return false;\n }\n\n return valueNode.entries.some((entry) => {\n const value = getScalarStringValue(entry);\n\n return value !== null && value.trim().length > 0;\n });\n};\n\n/** Rule implementation for requiring `workflow_run` branch filters. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const onMapping = getMappingValueAsMapping(root, \"on\");\n\n if (onMapping === null) {\n return;\n }\n\n const workflowRunPair = getMappingPair(\n onMapping,\n \"workflow_run\"\n );\n const workflowRunMapping = unwrapYamlValue(\n workflowRunPair?.value ?? null\n );\n\n if (workflowRunPair === null) {\n return;\n }\n\n if (workflowRunMapping?.type !== \"YAMLMapping\") {\n context.report({\n messageId: \"missingBranchFilter\",\n node: (workflowRunPair.value ??\n workflowRunPair) as unknown as Rule.Node,\n });\n\n return;\n }\n\n const branchesPair = getMappingPair(\n workflowRunMapping,\n \"branches\"\n );\n const branchesIgnorePair = getMappingPair(\n workflowRunMapping,\n \"branches-ignore\"\n );\n\n if (\n hasConfiguredBranchFilter(branchesPair) ||\n hasConfiguredBranchFilter(branchesIgnorePair)\n ) {\n return;\n }\n\n context.report({\n messageId: \"missingBranchFilter\",\n node: workflowRunMapping as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.security\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"require `on.workflow_run` triggers to scope upstream branches with `branches` or `branches-ignore` so follow-up workflows do not react to every branch indiscriminately.\",\n recommended: false,\n requiresTypeChecking: false,\n ruleId: \"R028\",\n ruleNumber: 28,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-workflow-run-branches\",\n },\n messages: {\n missingBranchFilter:\n \"`on.workflow_run` should declare a non-empty `branches` or `branches-ignore` filter to scope which upstream branches can trigger this workflow.\",\n },\n schema: [],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require each workflow template YAML file to have a paired `.properties.json` metadata file.\n */\nimport type { Rule } from \"eslint\";\n\nimport { existsSync } from \"node:fs\";\n\nimport { isWorkflowTemplateYamlFile } from \"../_internal/lint-targets.js\";\nimport { getPairedTemplatePropertiesPath } from \"../_internal/workflow-template-properties.js\";\n\n/** Rule implementation for workflow-template YAML pair checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n if (!isWorkflowTemplateYamlFile(context.filename)) {\n return;\n }\n\n const pairedPropertiesPath = getPairedTemplatePropertiesPath(\n context.filename\n );\n\n if (existsSync(pairedPropertiesPath)) {\n return;\n }\n\n context.report({\n data: {\n pairedPropertiesPath,\n },\n messageId: \"missingTemplatePropertiesPair\",\n node: node as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"require each workflow template YAML file to have a matching `.properties.json` metadata file.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R054\",\n ruleNumber: 54,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-workflow-template-pair\",\n },\n messages: {\n missingTemplatePropertiesPair:\n \"Workflow template file is missing its paired metadata file '{{pairedPropertiesPath}}'.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Require each workflow template properties file to have a paired template YAML file.\n */\nimport type { Rule } from \"eslint\";\n\nimport { existsSync } from \"node:fs\";\n\nimport { isWorkflowTemplatePropertiesFile } from \"../_internal/lint-targets.js\";\nimport { getPairedTemplateYamlPaths } from \"../_internal/workflow-template-properties.js\";\n\n/** Rule implementation for template metadata pair checks. */\nconst rule: Rule.RuleModule = {\n create(context) {\n return {\n Program(node) {\n if (!isWorkflowTemplatePropertiesFile(context.filename)) {\n return;\n }\n\n const [pairedYmlPath, pairedYamlPath] =\n getPairedTemplateYamlPaths(context.filename);\n\n if (existsSync(pairedYmlPath) || existsSync(pairedYamlPath)) {\n return;\n }\n\n context.report({\n data: {\n pairedYamlPath,\n pairedYmlPath,\n },\n messageId: \"missingTemplateYamlPair\",\n node: node as unknown as Rule.Node,\n });\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.workflowTemplateProperties\",\n \"github-actions.configs.workflowTemplates\",\n \"github-actions.configs.all\",\n ],\n description:\n \"require each workflow-template `.properties.json` file to have a matching template YAML file.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R055\",\n ruleNumber: 55,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/require-workflow-template-properties-pair\",\n },\n messages: {\n missingTemplateYamlPair:\n \"Workflow template metadata is missing its paired YAML file. Expected '{{pairedYmlPath}}' or '{{pairedYamlPath}}'.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Validate literal job and step timeout-minutes values.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport {\n getMappingPair,\n getMappingValueAsMapping,\n getMappingValueAsSequence,\n getScalarNumberValue,\n getWorkflowRoot,\n isGithubExpressionScalar,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Timeout range accepted by a timeout validator. */\ntype TimeoutRange = {\n readonly max?: number;\n readonly min?: number;\n};\n\n/** Split timeout configuration for jobs and steps. */\ntype TimeoutScopeOptions = {\n readonly job?: number | TimeoutRange;\n readonly step?: number | TimeoutRange;\n};\n\n/** Rule options for `valid-timeout-minutes`. */\ntype ValidTimeoutMinutesOptions = [\n (number | TimeoutRange | TimeoutScopeOptions)?,\n];\n\n/** Default lower bound for literal timeout-minutes values. */\nconst MIN_TIMEOUT_MINUTES = 1;\n\n/** Default upper bound for literal timeout-minutes values. */\nconst MAX_TIMEOUT_MINUTES = 24 * 60;\n\n/** Default recommended upper bound when only a single number is configured. */\nconst DEFAULT_MAX_TIMEOUT_MINUTES = 6 * 60;\n\n/** Normalize timeout range input into concrete min/max bounds. */\nconst normalizeTimeoutRange = (\n value: Readonly<number | TimeoutRange | undefined>,\n fallback: Readonly<{ max: number; min: number }>\n): { max: number; min: number } => {\n if (typeof value === \"number\") {\n return {\n max: value,\n min: fallback.min,\n };\n }\n\n if (value === undefined) {\n return {\n max: fallback.max,\n min: fallback.min,\n };\n }\n\n return {\n max: value.max ?? fallback.max,\n min: value.min ?? fallback.min,\n };\n};\n\n/** Determine whether an options value represents a shared timeout range. */\nconst isTimeoutRange = (value: unknown): value is TimeoutRange =>\n typeof value === \"object\" &&\n value !== null &&\n (\"min\" in value || \"max\" in value);\n\n/** Determine whether an options value represents split job/step timeout config. */\nconst isTimeoutScopeOptions = (value: unknown): value is TimeoutScopeOptions =>\n typeof value === \"object\" &&\n value !== null &&\n (\"job\" in value || \"step\" in value);\n\n/** Rule implementation for validating timeout-minutes ranges. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const [options] = context.options as ValidTimeoutMinutesOptions;\n const defaultRange = {\n max: DEFAULT_MAX_TIMEOUT_MINUTES,\n min: MIN_TIMEOUT_MINUTES,\n };\n const workflowMaximumRange = {\n max: MAX_TIMEOUT_MINUTES,\n };\n\n const jobRange = normalizeTimeoutRange(\n typeof options === \"number\" || isTimeoutRange(options)\n ? options\n : options?.job,\n defaultRange\n );\n const stepRange = normalizeTimeoutRange(\n typeof options === \"number\" || isTimeoutRange(options)\n ? options\n : options?.step,\n defaultRange\n );\n\n if (isTimeoutScopeOptions(options)) {\n jobRange.max = normalizeTimeoutRange(options.job, defaultRange).max;\n jobRange.min = normalizeTimeoutRange(options.job, defaultRange).min;\n stepRange.max = normalizeTimeoutRange(\n options.step,\n defaultRange\n ).max;\n stepRange.min = normalizeTimeoutRange(\n options.step,\n defaultRange\n ).min;\n }\n\n const validateTimeoutPair = (\n timeoutPair: Readonly<AST.YAMLPair>,\n range: Readonly<{ max: number; min: number }>\n ): \"invalidRange\" | \"notInteger\" | null => {\n if (isGithubExpressionScalar(timeoutPair.value)) {\n return null;\n }\n\n const timeoutValue = getScalarNumberValue(timeoutPair.value);\n\n if (\n timeoutValue === null ||\n !Number.isInteger(timeoutValue) ||\n timeoutValue <= 0\n ) {\n return \"notInteger\";\n }\n\n if (\n timeoutValue < range.min ||\n timeoutValue > range.max ||\n timeoutValue > workflowMaximumRange.max\n ) {\n return \"invalidRange\";\n }\n\n return null;\n };\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const jobsMapping = getMappingValueAsMapping(root, \"jobs\");\n\n if (jobsMapping === null) {\n return;\n }\n\n for (const jobPair of jobsMapping.pairs) {\n const jobValue = unwrapYamlValue(jobPair.value);\n\n if (jobValue?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const jobTimeoutPair = getMappingPair(\n jobValue,\n \"timeout-minutes\"\n );\n\n if (jobTimeoutPair !== null) {\n const validationResult = validateTimeoutPair(\n jobTimeoutPair,\n jobRange\n );\n\n if (validationResult !== null) {\n context.report({\n data: {\n max: String(jobRange.max),\n min: String(jobRange.min),\n },\n messageId: validationResult,\n node: (jobTimeoutPair.value ??\n jobTimeoutPair) as unknown as Rule.Node,\n });\n }\n }\n\n const stepsSequence = getMappingValueAsSequence(\n jobValue,\n \"steps\"\n );\n\n if (stepsSequence === null) {\n continue;\n }\n\n for (const stepEntry of stepsSequence.entries) {\n const stepValue = unwrapYamlValue(stepEntry);\n\n if (stepValue?.type !== \"YAMLMapping\") {\n continue;\n }\n\n const stepTimeoutPair = getMappingPair(\n stepValue,\n \"timeout-minutes\"\n );\n\n if (stepTimeoutPair === null) {\n continue;\n }\n\n const validationResult = validateTimeoutPair(\n stepTimeoutPair,\n stepRange\n );\n\n if (validationResult !== null) {\n context.report({\n data: {\n max: String(stepRange.max),\n min: String(stepRange.min),\n },\n messageId: validationResult,\n node: (stepTimeoutPair.value ??\n stepTimeoutPair) as unknown as Rule.Node,\n });\n }\n }\n }\n },\n };\n },\n meta: {\n defaultOptions: [DEFAULT_MAX_TIMEOUT_MINUTES],\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow invalid literal `timeout-minutes` values for jobs and steps.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R017\",\n ruleNumber: 17,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/valid-timeout-minutes\",\n },\n messages: {\n invalidRange:\n \"`timeout-minutes` must stay within the configured range of {{min}}-{{max}}.\",\n notInteger:\n \"`timeout-minutes` must be a positive integer or a GitHub expression.\",\n },\n schema: [\n {\n anyOf: [\n {\n description:\n \"Maximum allowed timeout-minutes value for both jobs and steps.\",\n maximum: MAX_TIMEOUT_MINUTES,\n minimum: MIN_TIMEOUT_MINUTES,\n type: \"integer\",\n },\n {\n additionalProperties: false,\n description:\n \"Shared min/max range for literal job and step timeout-minutes values.\",\n properties: {\n max: {\n description:\n \"Maximum allowed timeout-minutes value.\",\n maximum: MAX_TIMEOUT_MINUTES,\n minimum: MIN_TIMEOUT_MINUTES,\n type: \"integer\",\n },\n min: {\n description:\n \"Minimum allowed timeout-minutes value.\",\n maximum: MAX_TIMEOUT_MINUTES,\n minimum: MIN_TIMEOUT_MINUTES,\n type: \"integer\",\n },\n },\n type: \"object\",\n },\n {\n additionalProperties: false,\n description:\n \"Separate timeout-minutes limits for jobs and steps.\",\n properties: {\n job: {\n anyOf: [\n {\n description:\n \"Maximum allowed timeout-minutes value for jobs.\",\n maximum: MAX_TIMEOUT_MINUTES,\n minimum: MIN_TIMEOUT_MINUTES,\n type: \"integer\",\n },\n {\n additionalProperties: false,\n description:\n \"Min/max range for literal job timeout-minutes values.\",\n properties: {\n max: {\n description:\n \"Maximum allowed job timeout-minutes value.\",\n maximum: MAX_TIMEOUT_MINUTES,\n minimum: MIN_TIMEOUT_MINUTES,\n type: \"integer\",\n },\n min: {\n description:\n \"Minimum allowed job timeout-minutes value.\",\n maximum: MAX_TIMEOUT_MINUTES,\n minimum: MIN_TIMEOUT_MINUTES,\n type: \"integer\",\n },\n },\n type: \"object\",\n },\n ],\n },\n step: {\n anyOf: [\n {\n description:\n \"Maximum allowed timeout-minutes value for steps.\",\n maximum: MAX_TIMEOUT_MINUTES,\n minimum: MIN_TIMEOUT_MINUTES,\n type: \"integer\",\n },\n {\n additionalProperties: false,\n description:\n \"Min/max range for literal step timeout-minutes values.\",\n properties: {\n max: {\n description:\n \"Maximum allowed step timeout-minutes value.\",\n maximum: MAX_TIMEOUT_MINUTES,\n minimum: MIN_TIMEOUT_MINUTES,\n type: \"integer\",\n },\n min: {\n description:\n \"Minimum allowed step timeout-minutes value.\",\n maximum: MAX_TIMEOUT_MINUTES,\n minimum: MIN_TIMEOUT_MINUTES,\n type: \"integer\",\n },\n },\n type: \"object\",\n },\n ],\n },\n },\n type: \"object\",\n },\n ],\n description:\n \"Configure literal timeout-minutes validation for jobs and steps.\",\n },\n ],\n type: \"suggestion\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Current GitHub Actions workflow trigger events from the public docs.\n */\n\n/**\n * Valid workflow trigger events documented by GitHub.\n *\n * @see https://docs.github.com/en/actions/reference/events-that-trigger-workflows\n */\nexport const githubActionsTriggerEvents = [\n \"branch_protection_rule\",\n \"check_run\",\n \"check_suite\",\n \"create\",\n \"delete\",\n \"deployment\",\n \"deployment_status\",\n \"discussion\",\n \"discussion_comment\",\n \"fork\",\n \"gollum\",\n \"image_version\",\n \"issue_comment\",\n \"issues\",\n \"label\",\n \"merge_group\",\n \"milestone\",\n \"page_build\",\n \"public\",\n \"pull_request\",\n \"pull_request_review\",\n \"pull_request_review_comment\",\n \"pull_request_target\",\n \"push\",\n \"registry_package\",\n \"release\",\n \"repository_dispatch\",\n \"schedule\",\n \"status\",\n \"watch\",\n \"workflow_call\",\n \"workflow_dispatch\",\n \"workflow_run\",\n] as const;\n\n/** Constant-time lookup set for validating trigger-event names. */\nexport const githubActionsTriggerEventSet: ReadonlySet<string> = new Set(\n githubActionsTriggerEvents\n);\n", "/**\n * @packageDocumentation\n * Validate GitHub Actions workflow trigger event names.\n */\nimport type { Rule } from \"eslint\";\nimport type { AST } from \"yaml-eslint-parser\";\n\nimport { githubActionsTriggerEventSet } from \"../_internal/github-actions-trigger-events.js\";\nimport {\n getMappingPair,\n getScalarStringValue,\n getWorkflowRoot,\n unwrapYamlValue,\n} from \"../_internal/workflow-yaml.js\";\n\n/** Rule implementation for validating `on:` trigger event names. */\nconst rule: Rule.RuleModule = {\n create(context) {\n const reportInvalidEvent = (\n node: Readonly<AST.YAMLNode>,\n eventName: string\n ): void => {\n context.report({\n data: {\n event: eventName,\n },\n messageId: \"invalidEvent\",\n node: node as unknown as Rule.Node,\n });\n };\n\n return {\n Program() {\n const root = getWorkflowRoot(context);\n\n if (root === null) {\n return;\n }\n\n const onPair = getMappingPair(root, \"on\");\n const onValue = unwrapYamlValue(onPair?.value ?? null);\n\n if (onValue === null) {\n return;\n }\n\n if (onValue.type === \"YAMLScalar\") {\n const eventName = getScalarStringValue(onValue);\n\n if (\n eventName !== null &&\n !githubActionsTriggerEventSet.has(eventName)\n ) {\n reportInvalidEvent(onValue, eventName);\n }\n\n return;\n }\n\n if (onValue.type === \"YAMLSequence\") {\n for (const entry of onValue.entries) {\n const unwrappedEntry = unwrapYamlValue(entry);\n const eventName = getScalarStringValue(unwrappedEntry);\n\n if (\n unwrappedEntry !== null &&\n (eventName === null ||\n !githubActionsTriggerEventSet.has(eventName))\n ) {\n context.report({\n data: {\n event: eventName ?? \"<unknown>\",\n },\n messageId:\n eventName === null\n ? \"invalidEventEntry\"\n : \"invalidEvent\",\n node: unwrappedEntry as unknown as Rule.Node,\n });\n }\n }\n\n return;\n }\n\n if (onValue.type !== \"YAMLMapping\") {\n context.report({\n messageId: \"invalidEventEntry\",\n node: onValue as unknown as Rule.Node,\n });\n\n return;\n }\n\n for (const pair of onValue.pairs) {\n const eventName = getScalarStringValue(pair.key);\n\n if (eventName === null) {\n context.report({\n messageId: \"invalidEventEntry\",\n node: pair as unknown as Rule.Node,\n });\n\n continue;\n }\n\n if (!githubActionsTriggerEventSet.has(eventName)) {\n reportInvalidEvent(pair.key as AST.YAMLNode, eventName);\n }\n }\n },\n };\n },\n meta: {\n docs: {\n configs: [\n \"github-actions.configs.all\",\n \"github-actions.configs.recommended\",\n \"github-actions.configs.strict\",\n ],\n description:\n \"disallow invalid GitHub Actions trigger events under the workflow `on` key.\",\n recommended: true,\n requiresTypeChecking: false,\n ruleId: \"R018\",\n ruleNumber: 18,\n url: \"https://nick2bad4u.github.io/eslint-plugin-github-actions-2/docs/rules/valid-trigger-events\",\n },\n messages: {\n invalidEvent:\n \"`{{event}}` is not a documented GitHub Actions workflow trigger event.\",\n invalidEventEntry:\n \"Workflow `on` entries must use string event names.\",\n },\n schema: [],\n type: \"problem\",\n } as Rule.RuleMetaData,\n};\n\nexport default rule;\n", "/**\n * @packageDocumentation\n * Central rule registry for eslint-plugin-github-actions-2.\n */\nimport type { Rule } from \"eslint\";\n\nimport actionNameCasing from \"../rules/action-name-casing.js\";\nimport jobIdCasing from \"../rules/job-id-casing.js\";\nimport maxJobsPerAction from \"../rules/max-jobs-per-action.js\";\nimport noCaseInsensitiveInputIdCollision from \"../rules/no-case-insensitive-input-id-collision.js\";\nimport noCompositeInputEnvAccess from \"../rules/no-composite-input-env-access.js\";\nimport noDeprecatedNodeRuntime from \"../rules/no-deprecated-node-runtime.js\";\nimport noDuplicateCompositeStepId from \"../rules/no-duplicate-composite-step-id.js\";\nimport noEmptyTemplateFilePattern from \"../rules/no-empty-template-file-pattern.js\";\nimport noExternalJob from \"../rules/no-external-job.js\";\nimport noHardcodedDefaultBranchInTemplate from \"../rules/no-hardcoded-default-branch-in-template.js\";\nimport noIconFileExtensionInTemplateIconName from \"../rules/no-icon-file-extension-in-template-icon-name.js\";\nimport noInheritSecrets from \"../rules/no-inherit-secrets.js\";\nimport noInvalidConcurrencyContext from \"../rules/no-invalid-concurrency-context.js\";\nimport noInvalidKey from \"../rules/no-invalid-key.js\";\nimport noInvalidReusableWorkflowJobKey from \"../rules/no-invalid-reusable-workflow-job-key.js\";\nimport noInvalidTemplateFilePatternRegex from \"../rules/no-invalid-template-file-pattern-regex.js\";\nimport noInvalidWorkflowCallOutputValue from \"../rules/no-invalid-workflow-call-output-value.js\";\nimport noPathSeparatorsInTemplateIconName from \"../rules/no-path-separators-in-template-icon-name.js\";\nimport noPostIfWithoutPost from \"../rules/no-post-if-without-post.js\";\nimport noPrHeadCheckoutInPullRequestTarget from \"../rules/no-pr-head-checkout-in-pull-request-target.js\";\nimport noPreIfWithoutPre from \"../rules/no-pre-if-without-pre.js\";\nimport noRequiredInputWithDefault from \"../rules/no-required-input-with-default.js\";\nimport noSecretsInIf from \"../rules/no-secrets-in-if.js\";\nimport noSelfHostedRunnerOnForkPrEvents from \"../rules/no-self-hosted-runner-on-fork-pr-events.js\";\nimport noSubdirectoryTemplateFilePattern from \"../rules/no-subdirectory-template-file-pattern.js\";\nimport noTemplatePlaceholderInNonTemplateWorkflow from \"../rules/no-template-placeholder-in-non-template-workflow.js\";\nimport noTopLevelEnv from \"../rules/no-top-level-env.js\";\nimport noTopLevelPermissions from \"../rules/no-top-level-permissions.js\";\nimport noUniversalTemplateFilePattern from \"../rules/no-universal-template-file-pattern.js\";\nimport noUnknownInputReferenceInComposite from \"../rules/no-unknown-input-reference-in-composite.js\";\nimport noUnknownJobOutputReference from \"../rules/no-unknown-job-output-reference.js\";\nimport noUnknownStepReference from \"../rules/no-unknown-step-reference.js\";\nimport noUntrustedInputInRun from \"../rules/no-untrusted-input-in-run.js\";\nimport noUnusedInputInComposite from \"../rules/no-unused-input-in-composite.js\";\nimport noWriteAllPermissions from \"../rules/no-write-all-permissions.js\";\nimport pinActionShas from \"../rules/pin-action-shas.js\";\nimport preferActionYml from \"../rules/prefer-action-yml.js\";\nimport preferFailFast from \"../rules/prefer-fail-fast.js\";\nimport preferFileExtension from \"../rules/prefer-file-extension.js\";\nimport preferInputsContext from \"../rules/prefer-inputs-context.js\";\nimport preferStepUsesStyle from \"../rules/prefer-step-uses-style.js\";\nimport preferTemplateYmlExtension from \"../rules/prefer-template-yml-extension.js\";\nimport requireActionName from \"../rules/require-action-name.js\";\nimport requireActionRunName from \"../rules/require-action-run-name.js\";\nimport requireCheckoutBeforeLocalAction from \"../rules/require-checkout-before-local-action.js\";\nimport requireCompositeStepName from \"../rules/require-composite-step-name.js\";\nimport requireJobName from \"../rules/require-job-name.js\";\nimport requireJobStepName from \"../rules/require-job-step-name.js\";\nimport requireJobTimeoutMinutes from \"../rules/require-job-timeout-minutes.js\";\nimport requireMergeGroupTrigger from \"../rules/require-merge-group-trigger.js\";\nimport requirePullRequestTargetBranches from \"../rules/require-pull-request-target-branches.js\";\nimport requireRunStepShell from \"../rules/require-run-step-shell.js\";\nimport requireTemplateCategories from \"../rules/require-template-categories.js\";\nimport requireTemplateFilePatterns from \"../rules/require-template-file-patterns.js\";\nimport requireTemplateIconFileExists from \"../rules/require-template-icon-file-exists.js\";\nimport requireTemplateIconName from \"../rules/require-template-icon-name.js\";\nimport requireTemplateWorkflowName from \"../rules/require-template-workflow-name.js\";\nimport requireTriggerTypes from \"../rules/require-trigger-types.js\";\nimport requireWorkflowCallInputType from \"../rules/require-workflow-call-input-type.js\";\nimport requireWorkflowCallOutputValue from \"../rules/require-workflow-call-output-value.js\";\nimport requireWorkflowConcurrency from \"../rules/require-workflow-concurrency.js\";\nimport requireWorkflowDispatchInputType from \"../rules/require-workflow-dispatch-input-type.js\";\nimport requireWorkflowInterfaceDescription from \"../rules/require-workflow-interface-description.js\";\nimport requireWorkflowPermissions from \"../rules/require-workflow-permissions.js\";\nimport requireWorkflowRunBranches from \"../rules/require-workflow-run-branches.js\";\nimport requireWorkflowTemplatePair from \"../rules/require-workflow-template-pair.js\";\nimport requireWorkflowTemplatePropertiesPair from \"../rules/require-workflow-template-properties-pair.js\";\nimport validTimeoutMinutes from \"../rules/valid-timeout-minutes.js\";\nimport validTriggerEvents from \"../rules/valid-trigger-events.js\";\n\n/** Strongly typed plugin rule registry keyed by unqualified rule name. */\nconst githubActionsRulesDefinition: {\n readonly \"action-name-casing\": typeof actionNameCasing;\n readonly \"job-id-casing\": typeof jobIdCasing;\n readonly \"max-jobs-per-action\": typeof maxJobsPerAction;\n readonly \"no-case-insensitive-input-id-collision\": typeof noCaseInsensitiveInputIdCollision;\n readonly \"no-composite-input-env-access\": typeof noCompositeInputEnvAccess;\n readonly \"no-deprecated-node-runtime\": typeof noDeprecatedNodeRuntime;\n readonly \"no-duplicate-composite-step-id\": typeof noDuplicateCompositeStepId;\n readonly \"no-empty-template-file-pattern\": typeof noEmptyTemplateFilePattern;\n readonly \"no-external-job\": typeof noExternalJob;\n readonly \"no-hardcoded-default-branch-in-template\": typeof noHardcodedDefaultBranchInTemplate;\n readonly \"no-icon-file-extension-in-template-icon-name\": typeof noIconFileExtensionInTemplateIconName;\n readonly \"no-inherit-secrets\": typeof noInheritSecrets;\n readonly \"no-invalid-concurrency-context\": typeof noInvalidConcurrencyContext;\n readonly \"no-invalid-key\": typeof noInvalidKey;\n readonly \"no-invalid-reusable-workflow-job-key\": typeof noInvalidReusableWorkflowJobKey;\n readonly \"no-invalid-template-file-pattern-regex\": typeof noInvalidTemplateFilePatternRegex;\n readonly \"no-invalid-workflow-call-output-value\": typeof noInvalidWorkflowCallOutputValue;\n readonly \"no-path-separators-in-template-icon-name\": typeof noPathSeparatorsInTemplateIconName;\n readonly \"no-post-if-without-post\": typeof noPostIfWithoutPost;\n readonly \"no-pr-head-checkout-in-pull-request-target\": typeof noPrHeadCheckoutInPullRequestTarget;\n readonly \"no-pre-if-without-pre\": typeof noPreIfWithoutPre;\n readonly \"no-required-input-with-default\": typeof noRequiredInputWithDefault;\n readonly \"no-secrets-in-if\": typeof noSecretsInIf;\n readonly \"no-self-hosted-runner-on-fork-pr-events\": typeof noSelfHostedRunnerOnForkPrEvents;\n readonly \"no-subdirectory-template-file-pattern\": typeof noSubdirectoryTemplateFilePattern;\n readonly \"no-template-placeholder-in-non-template-workflow\": typeof noTemplatePlaceholderInNonTemplateWorkflow;\n readonly \"no-top-level-env\": typeof noTopLevelEnv;\n readonly \"no-top-level-permissions\": typeof noTopLevelPermissions;\n readonly \"no-universal-template-file-pattern\": typeof noUniversalTemplateFilePattern;\n readonly \"no-unknown-input-reference-in-composite\": typeof noUnknownInputReferenceInComposite;\n readonly \"no-unknown-job-output-reference\": typeof noUnknownJobOutputReference;\n readonly \"no-unknown-step-reference\": typeof noUnknownStepReference;\n readonly \"no-untrusted-input-in-run\": typeof noUntrustedInputInRun;\n readonly \"no-unused-input-in-composite\": typeof noUnusedInputInComposite;\n readonly \"no-write-all-permissions\": typeof noWriteAllPermissions;\n readonly \"pin-action-shas\": typeof pinActionShas;\n readonly \"prefer-action-yml\": typeof preferActionYml;\n readonly \"prefer-fail-fast\": typeof preferFailFast;\n readonly \"prefer-file-extension\": typeof preferFileExtension;\n readonly \"prefer-inputs-context\": typeof preferInputsContext;\n readonly \"prefer-step-uses-style\": typeof preferStepUsesStyle;\n readonly \"prefer-template-yml-extension\": typeof preferTemplateYmlExtension;\n readonly \"require-action-name\": typeof requireActionName;\n readonly \"require-action-run-name\": typeof requireActionRunName;\n readonly \"require-checkout-before-local-action\": typeof requireCheckoutBeforeLocalAction;\n readonly \"require-composite-step-name\": typeof requireCompositeStepName;\n readonly \"require-job-name\": typeof requireJobName;\n readonly \"require-job-step-name\": typeof requireJobStepName;\n readonly \"require-job-timeout-minutes\": typeof requireJobTimeoutMinutes;\n readonly \"require-merge-group-trigger\": typeof requireMergeGroupTrigger;\n readonly \"require-pull-request-target-branches\": typeof requirePullRequestTargetBranches;\n readonly \"require-run-step-shell\": typeof requireRunStepShell;\n readonly \"require-template-categories\": typeof requireTemplateCategories;\n readonly \"require-template-file-patterns\": typeof requireTemplateFilePatterns;\n readonly \"require-template-icon-file-exists\": typeof requireTemplateIconFileExists;\n readonly \"require-template-icon-name\": typeof requireTemplateIconName;\n readonly \"require-template-workflow-name\": typeof requireTemplateWorkflowName;\n readonly \"require-trigger-types\": typeof requireTriggerTypes;\n readonly \"require-workflow-call-input-type\": typeof requireWorkflowCallInputType;\n readonly \"require-workflow-call-output-value\": typeof requireWorkflowCallOutputValue;\n readonly \"require-workflow-concurrency\": typeof requireWorkflowConcurrency;\n readonly \"require-workflow-dispatch-input-type\": typeof requireWorkflowDispatchInputType;\n readonly \"require-workflow-interface-description\": typeof requireWorkflowInterfaceDescription;\n readonly \"require-workflow-permissions\": typeof requireWorkflowPermissions;\n readonly \"require-workflow-run-branches\": typeof requireWorkflowRunBranches;\n readonly \"require-workflow-template-pair\": typeof requireWorkflowTemplatePair;\n readonly \"require-workflow-template-properties-pair\": typeof requireWorkflowTemplatePropertiesPair;\n readonly \"valid-timeout-minutes\": typeof validTimeoutMinutes;\n readonly \"valid-trigger-events\": typeof validTriggerEvents;\n} = {\n \"action-name-casing\": actionNameCasing,\n \"job-id-casing\": jobIdCasing,\n \"max-jobs-per-action\": maxJobsPerAction,\n \"no-case-insensitive-input-id-collision\": noCaseInsensitiveInputIdCollision,\n \"no-composite-input-env-access\": noCompositeInputEnvAccess,\n \"no-deprecated-node-runtime\": noDeprecatedNodeRuntime,\n \"no-duplicate-composite-step-id\": noDuplicateCompositeStepId,\n \"no-empty-template-file-pattern\": noEmptyTemplateFilePattern,\n \"no-external-job\": noExternalJob,\n \"no-hardcoded-default-branch-in-template\":\n noHardcodedDefaultBranchInTemplate,\n \"no-icon-file-extension-in-template-icon-name\":\n noIconFileExtensionInTemplateIconName,\n \"no-inherit-secrets\": noInheritSecrets,\n \"no-invalid-concurrency-context\": noInvalidConcurrencyContext,\n \"no-invalid-key\": noInvalidKey,\n \"no-invalid-reusable-workflow-job-key\": noInvalidReusableWorkflowJobKey,\n \"no-invalid-template-file-pattern-regex\": noInvalidTemplateFilePatternRegex,\n \"no-invalid-workflow-call-output-value\": noInvalidWorkflowCallOutputValue,\n \"no-path-separators-in-template-icon-name\":\n noPathSeparatorsInTemplateIconName,\n \"no-post-if-without-post\": noPostIfWithoutPost,\n \"no-pr-head-checkout-in-pull-request-target\":\n noPrHeadCheckoutInPullRequestTarget,\n \"no-pre-if-without-pre\": noPreIfWithoutPre,\n \"no-required-input-with-default\": noRequiredInputWithDefault,\n \"no-secrets-in-if\": noSecretsInIf,\n \"no-self-hosted-runner-on-fork-pr-events\": noSelfHostedRunnerOnForkPrEvents,\n \"no-subdirectory-template-file-pattern\": noSubdirectoryTemplateFilePattern,\n \"no-template-placeholder-in-non-template-workflow\":\n noTemplatePlaceholderInNonTemplateWorkflow,\n \"no-top-level-env\": noTopLevelEnv,\n \"no-top-level-permissions\": noTopLevelPermissions,\n \"no-universal-template-file-pattern\": noUniversalTemplateFilePattern,\n \"no-unknown-input-reference-in-composite\":\n noUnknownInputReferenceInComposite,\n \"no-unknown-job-output-reference\": noUnknownJobOutputReference,\n \"no-unknown-step-reference\": noUnknownStepReference,\n \"no-untrusted-input-in-run\": noUntrustedInputInRun,\n \"no-unused-input-in-composite\": noUnusedInputInComposite,\n \"no-write-all-permissions\": noWriteAllPermissions,\n \"pin-action-shas\": pinActionShas,\n \"prefer-action-yml\": preferActionYml,\n \"prefer-fail-fast\": preferFailFast,\n \"prefer-file-extension\": preferFileExtension,\n \"prefer-inputs-context\": preferInputsContext,\n \"prefer-step-uses-style\": preferStepUsesStyle,\n \"prefer-template-yml-extension\": preferTemplateYmlExtension,\n \"require-action-name\": requireActionName,\n \"require-action-run-name\": requireActionRunName,\n \"require-checkout-before-local-action\": requireCheckoutBeforeLocalAction,\n \"require-composite-step-name\": requireCompositeStepName,\n \"require-job-name\": requireJobName,\n \"require-job-step-name\": requireJobStepName,\n \"require-job-timeout-minutes\": requireJobTimeoutMinutes,\n \"require-merge-group-trigger\": requireMergeGroupTrigger,\n \"require-pull-request-target-branches\": requirePullRequestTargetBranches,\n \"require-run-step-shell\": requireRunStepShell,\n \"require-template-categories\": requireTemplateCategories,\n \"require-template-file-patterns\": requireTemplateFilePatterns,\n \"require-template-icon-file-exists\": requireTemplateIconFileExists,\n \"require-template-icon-name\": requireTemplateIconName,\n \"require-template-workflow-name\": requireTemplateWorkflowName,\n \"require-trigger-types\": requireTriggerTypes,\n \"require-workflow-call-input-type\": requireWorkflowCallInputType,\n \"require-workflow-call-output-value\": requireWorkflowCallOutputValue,\n \"require-workflow-concurrency\": requireWorkflowConcurrency,\n \"require-workflow-dispatch-input-type\": requireWorkflowDispatchInputType,\n \"require-workflow-interface-description\":\n requireWorkflowInterfaceDescription,\n \"require-workflow-permissions\": requireWorkflowPermissions,\n \"require-workflow-run-branches\": requireWorkflowRunBranches,\n \"require-workflow-template-pair\": requireWorkflowTemplatePair,\n \"require-workflow-template-properties-pair\":\n requireWorkflowTemplatePropertiesPair,\n \"valid-timeout-minutes\": validTimeoutMinutes,\n \"valid-trigger-events\": validTriggerEvents,\n} satisfies Record<string, Rule.RuleModule>;\n\n/** Strongly typed plugin rule registry keyed by unqualified rule name. */\nexport const githubActionsRules: typeof githubActionsRulesDefinition =\n githubActionsRulesDefinition;\n"],
5
+ "mappings": "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",
6
+ "names": ["rule", "rule", "rule", "rule", "rule", "rule", "import_node_path", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "isReusableWorkflowJob", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "jobsOutputReferencePattern", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "import_node_path", "rule", "visitStringScalars", "rule", "rule", "rule", "rule", "rule", "isCheckoutActionReference", "isLocalActionReference", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "import_node_path", "rule", "rule", "rule", "rule", "rule", "rule", "rule", "groupValue", "rule", "rule", "rule", "hasConfiguredBranchFilter", "rule", "import_node_fs", "rule", "import_node_fs", "rule", "rule", "rule", "rule", "presetRuleNamesByConfig"]
7
+ }