@askviraj/linter 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. package/node_modules/{synckit → @astrojs/compiler-binding}/LICENSE +1 -1
  2. package/node_modules/@astrojs/compiler-binding/browser.js +1 -0
  3. package/node_modules/@astrojs/compiler-binding/index.d.ts +337 -0
  4. package/node_modules/@astrojs/compiler-binding/index.js +599 -0
  5. package/node_modules/@astrojs/compiler-binding/package.json +83 -0
  6. package/node_modules/@astrojs/compiler-binding/webcontainer-fallback.cjs +23 -0
  7. package/node_modules/@astrojs/compiler-binding-linux-x64-gnu/README.md +3 -0
  8. package/node_modules/@astrojs/compiler-binding-linux-x64-gnu/astro.linux-x64-gnu.node +0 -0
  9. package/node_modules/@astrojs/compiler-binding-linux-x64-gnu/package.json +40 -0
  10. package/node_modules/{parse5 → @astrojs/compiler-rs}/LICENSE +7 -5
  11. package/node_modules/@astrojs/compiler-rs/README.md +62 -0
  12. package/node_modules/@astrojs/compiler-rs/async.d.ts +1 -0
  13. package/node_modules/@astrojs/compiler-rs/dist/async.d.mts +9 -0
  14. package/node_modules/@astrojs/compiler-rs/dist/async.mjs +1 -0
  15. package/node_modules/@astrojs/compiler-rs/dist/index.d.mts +9 -0
  16. package/node_modules/@astrojs/compiler-rs/dist/index.mjs +1 -0
  17. package/node_modules/@astrojs/compiler-rs/dist/shared.d.mts +45 -0
  18. package/node_modules/@astrojs/compiler-rs/dist/shared.mjs +1 -0
  19. package/node_modules/@astrojs/compiler-rs/dist/types.d.mts +94 -0
  20. package/node_modules/@astrojs/compiler-rs/dist/types.mjs +1 -0
  21. package/node_modules/@astrojs/compiler-rs/dist/utils.d.mts +4 -0
  22. package/node_modules/@astrojs/compiler-rs/dist/utils.mjs +1 -0
  23. package/node_modules/@astrojs/compiler-rs/package.json +55 -0
  24. package/node_modules/@astrojs/compiler-rs/types.d.ts +1 -0
  25. package/node_modules/@eslint/config-helpers/README.md +2 -2
  26. package/node_modules/@eslint/config-helpers/dist/cjs/index.cjs +27 -26
  27. package/node_modules/@eslint/config-helpers/dist/cjs/index.d.cts +13 -12
  28. package/node_modules/@eslint/config-helpers/dist/cjs/types.cts +4 -2
  29. package/node_modules/@eslint/config-helpers/dist/esm/index.d.ts +13 -12
  30. package/node_modules/@eslint/config-helpers/dist/esm/index.js +27 -26
  31. package/node_modules/@eslint/config-helpers/dist/esm/types.d.ts +2 -0
  32. package/node_modules/@eslint/config-helpers/dist/esm/types.ts +4 -2
  33. package/node_modules/@eslint/config-helpers/package.json +1 -1
  34. package/node_modules/@eslint/css/README.md +2 -2
  35. package/node_modules/@eslint/css/dist/build/rules.d.ts +75 -21
  36. package/node_modules/@eslint/css/dist/build/rules.js +15 -15
  37. package/node_modules/@eslint/css/dist/data/baseline-data.js +256 -32
  38. package/node_modules/@eslint/css/dist/index.js +1 -1
  39. package/node_modules/@eslint/css/dist/rules/font-family-fallbacks.d.ts +15 -15
  40. package/node_modules/@eslint/css/dist/rules/font-family-fallbacks.js +2 -5
  41. package/node_modules/@eslint/css/dist/rules/no-duplicate-imports.d.ts +18 -18
  42. package/node_modules/@eslint/css/dist/rules/no-duplicate-imports.js +9 -12
  43. package/node_modules/@eslint/css/dist/rules/no-duplicate-keyframe-selectors.d.ts +14 -14
  44. package/node_modules/@eslint/css/dist/rules/no-duplicate-keyframe-selectors.js +2 -3
  45. package/node_modules/@eslint/css/dist/rules/no-empty-blocks.d.ts +14 -14
  46. package/node_modules/@eslint/css/dist/rules/no-empty-blocks.js +2 -3
  47. package/node_modules/@eslint/css/dist/rules/no-important.d.ts +16 -16
  48. package/node_modules/@eslint/css/dist/rules/no-important.js +2 -3
  49. package/node_modules/@eslint/css/dist/rules/no-invalid-at-rule-placement.d.ts +16 -16
  50. package/node_modules/@eslint/css/dist/rules/no-invalid-at-rule-placement.js +2 -3
  51. package/node_modules/@eslint/css/dist/rules/no-invalid-at-rules.d.ts +21 -21
  52. package/node_modules/@eslint/css/dist/rules/no-invalid-at-rules.js +2 -3
  53. package/node_modules/@eslint/css/dist/rules/no-invalid-named-grid-areas.d.ts +16 -16
  54. package/node_modules/@eslint/css/dist/rules/no-invalid-named-grid-areas.js +2 -3
  55. package/node_modules/@eslint/css/dist/rules/no-invalid-properties.d.ts +18 -18
  56. package/node_modules/@eslint/css/dist/rules/no-invalid-properties.js +2 -3
  57. package/node_modules/@eslint/css/dist/rules/no-unmatchable-selectors.d.ts +14 -14
  58. package/node_modules/@eslint/css/dist/rules/no-unmatchable-selectors.js +2 -3
  59. package/node_modules/@eslint/css/dist/rules/prefer-logical-properties.d.ts +22 -19
  60. package/node_modules/@eslint/css/dist/rules/prefer-logical-properties.js +66 -23
  61. package/node_modules/@eslint/css/dist/rules/relative-font-units.d.ts +16 -16
  62. package/node_modules/@eslint/css/dist/rules/relative-font-units.js +13 -7
  63. package/node_modules/@eslint/css/dist/rules/selector-complexity.d.ts +17 -17
  64. package/node_modules/@eslint/css/dist/rules/selector-complexity.js +2 -3
  65. package/node_modules/@eslint/css/dist/rules/use-baseline.d.ts +22 -22
  66. package/node_modules/@eslint/css/dist/rules/use-baseline.js +2 -3
  67. package/node_modules/@eslint/css/dist/rules/use-layers.d.ts +18 -18
  68. package/node_modules/@eslint/css/dist/rules/use-layers.js +3 -4
  69. package/node_modules/@eslint/css/package.json +7 -12
  70. package/node_modules/@eslint/css-tree/README.md +2 -2
  71. package/node_modules/@eslint/css-tree/dist/csstree.esm.js +1 -1
  72. package/node_modules/@eslint/css-tree/dist/csstree.js +1 -1
  73. package/node_modules/@eslint/css-tree/dist/data.cjs +4 -1
  74. package/node_modules/@eslint/css-tree/dist/data.js +4 -1
  75. package/node_modules/@eslint/css-tree/dist/version.cjs +1 -1
  76. package/node_modules/@eslint/css-tree/dist/version.js +1 -1
  77. package/node_modules/@eslint/css-tree/package.json +3 -3
  78. package/node_modules/@eslint/json/README.md +2 -2
  79. package/node_modules/@eslint/json/dist/index.js +1 -1
  80. package/node_modules/@eslint/json/package.json +4 -9
  81. package/node_modules/@eslint/markdown/README.md +3 -3
  82. package/node_modules/@eslint/markdown/dist/build/rules.d.ts +105 -27
  83. package/node_modules/@eslint/markdown/dist/build/rules.js +21 -21
  84. package/node_modules/@eslint/markdown/dist/index.d.ts +2 -2
  85. package/node_modules/@eslint/markdown/dist/index.js +4 -4
  86. package/node_modules/@eslint/markdown/dist/processor.d.ts +4 -9
  87. package/node_modules/@eslint/markdown/dist/processor.js +12 -15
  88. package/node_modules/@eslint/markdown/dist/rules/fenced-code-language.d.ts +17 -17
  89. package/node_modules/@eslint/markdown/dist/rules/fenced-code-language.js +2 -3
  90. package/node_modules/@eslint/markdown/dist/rules/fenced-code-meta.d.ts +17 -17
  91. package/node_modules/@eslint/markdown/dist/rules/fenced-code-meta.js +2 -3
  92. package/node_modules/@eslint/markdown/dist/rules/heading-increment.d.ts +16 -16
  93. package/node_modules/@eslint/markdown/dist/rules/heading-increment.js +2 -3
  94. package/node_modules/@eslint/markdown/dist/rules/no-bare-urls.d.ts +14 -14
  95. package/node_modules/@eslint/markdown/dist/rules/no-bare-urls.js +2 -3
  96. package/node_modules/@eslint/markdown/dist/rules/no-duplicate-definitions.d.ts +17 -17
  97. package/node_modules/@eslint/markdown/dist/rules/no-duplicate-definitions.js +2 -3
  98. package/node_modules/@eslint/markdown/dist/rules/no-duplicate-headings.d.ts +15 -15
  99. package/node_modules/@eslint/markdown/dist/rules/no-duplicate-headings.js +2 -3
  100. package/node_modules/@eslint/markdown/dist/rules/no-empty-definitions.d.ts +17 -17
  101. package/node_modules/@eslint/markdown/dist/rules/no-empty-definitions.js +2 -3
  102. package/node_modules/@eslint/markdown/dist/rules/no-empty-images.d.ts +14 -14
  103. package/node_modules/@eslint/markdown/dist/rules/no-empty-images.js +2 -3
  104. package/node_modules/@eslint/markdown/dist/rules/no-empty-links.d.ts +14 -14
  105. package/node_modules/@eslint/markdown/dist/rules/no-empty-links.js +2 -3
  106. package/node_modules/@eslint/markdown/dist/rules/no-html.d.ts +15 -15
  107. package/node_modules/@eslint/markdown/dist/rules/no-html.js +2 -3
  108. package/node_modules/@eslint/markdown/dist/rules/no-invalid-label-refs.d.ts +14 -14
  109. package/node_modules/@eslint/markdown/dist/rules/no-invalid-label-refs.js +2 -3
  110. package/node_modules/@eslint/markdown/dist/rules/no-missing-atx-heading-space.d.ts +17 -17
  111. package/node_modules/@eslint/markdown/dist/rules/no-missing-atx-heading-space.js +2 -3
  112. package/node_modules/@eslint/markdown/dist/rules/no-missing-label-refs.d.ts +16 -16
  113. package/node_modules/@eslint/markdown/dist/rules/no-missing-label-refs.js +2 -3
  114. package/node_modules/@eslint/markdown/dist/rules/no-missing-link-fragments.d.ts +16 -16
  115. package/node_modules/@eslint/markdown/dist/rules/no-missing-link-fragments.js +2 -3
  116. package/node_modules/@eslint/markdown/dist/rules/no-multiple-h1.d.ts +16 -16
  117. package/node_modules/@eslint/markdown/dist/rules/no-multiple-h1.js +2 -3
  118. package/node_modules/@eslint/markdown/dist/rules/no-reference-like-urls.d.ts +15 -15
  119. package/node_modules/@eslint/markdown/dist/rules/no-reference-like-urls.js +2 -3
  120. package/node_modules/@eslint/markdown/dist/rules/no-reversed-media-syntax.d.ts +15 -15
  121. package/node_modules/@eslint/markdown/dist/rules/no-reversed-media-syntax.js +2 -3
  122. package/node_modules/@eslint/markdown/dist/rules/no-space-in-emphasis.d.ts +17 -17
  123. package/node_modules/@eslint/markdown/dist/rules/no-space-in-emphasis.js +2 -3
  124. package/node_modules/@eslint/markdown/dist/rules/no-unused-definitions.d.ts +17 -17
  125. package/node_modules/@eslint/markdown/dist/rules/no-unused-definitions.js +2 -3
  126. package/node_modules/@eslint/markdown/dist/rules/require-alt-text.d.ts +14 -14
  127. package/node_modules/@eslint/markdown/dist/rules/require-alt-text.js +2 -3
  128. package/node_modules/@eslint/markdown/dist/rules/table-column-count.d.ts +17 -17
  129. package/node_modules/@eslint/markdown/dist/rules/table-column-count.js +2 -3
  130. package/node_modules/@eslint/markdown/package.json +5 -10
  131. package/node_modules/@eslint-community/eslint-utils/index.js +1 -1
  132. package/node_modules/@eslint-community/eslint-utils/index.js.map +1 -1
  133. package/node_modules/@eslint-community/eslint-utils/index.mjs +1 -1
  134. package/node_modules/@eslint-community/eslint-utils/index.mjs.map +1 -1
  135. package/node_modules/@eslint-community/eslint-utils/package.json +12 -7
  136. package/node_modules/@html-eslint/core/dist/index.js +1 -0
  137. package/node_modules/@html-eslint/core/dist/index.js.map +1 -1
  138. package/node_modules/@html-eslint/core/dist/index.mjs +1 -0
  139. package/node_modules/@html-eslint/core/dist/index.mjs.map +1 -1
  140. package/node_modules/@html-eslint/core/package.json +3 -3
  141. package/node_modules/@html-eslint/eslint-plugin/lib/rules/require-content.js +20 -1
  142. package/node_modules/@html-eslint/eslint-plugin/lib/rules/require-input-label.js +110 -8
  143. package/node_modules/@html-eslint/eslint-plugin/lib/rules/utils/node.js +13 -0
  144. package/node_modules/@html-eslint/eslint-plugin/package.json +7 -7
  145. package/node_modules/@html-eslint/eslint-plugin/types/rules/require-content.d.ts.map +1 -1
  146. package/node_modules/@html-eslint/eslint-plugin/types/rules/require-input-label.d.ts.map +1 -1
  147. package/node_modules/@html-eslint/eslint-plugin/types/rules/utils/node.d.ts +7 -0
  148. package/node_modules/@html-eslint/eslint-plugin/types/rules/utils/node.d.ts.map +1 -1
  149. package/node_modules/@html-eslint/parser/lib/parser.js +0 -1
  150. package/node_modules/@html-eslint/parser/package.json +4 -4
  151. package/node_modules/@html-eslint/parser/types/parser.d.ts.map +1 -1
  152. package/node_modules/@html-eslint/template-parser/package.json +3 -3
  153. package/node_modules/@html-eslint/template-syntax-parser/package.json +3 -3
  154. package/node_modules/@html-eslint/types/package.json +2 -2
  155. package/node_modules/@rviscomi/capo.js/README.md +4 -4
  156. package/node_modules/@rviscomi/capo.js/dist/adapters/adapter.cjs +7 -2
  157. package/node_modules/@rviscomi/capo.js/dist/adapters/browser.cjs +31 -3
  158. package/node_modules/@rviscomi/capo.js/dist/adapters/index.cjs +36 -4
  159. package/node_modules/@rviscomi/capo.js/dist/adapters/test-suite.cjs +6 -1
  160. package/node_modules/@rviscomi/capo.js/dist/analyzer.cjs +53 -24
  161. package/node_modules/@rviscomi/capo.js/dist/chrome/README.md +53 -0
  162. package/node_modules/@rviscomi/capo.js/{crx → dist/chrome}/capo.html +1 -1
  163. package/node_modules/@rviscomi/capo.js/dist/chrome/capo.js +3 -0
  164. package/node_modules/@rviscomi/capo.js/{crx → dist/chrome}/chrome.js +56 -18
  165. package/node_modules/@rviscomi/capo.js/dist/chrome/manifest.json +26 -0
  166. package/node_modules/@rviscomi/capo.js/dist/chrome/options/options.js +1 -0
  167. package/node_modules/@rviscomi/capo.js/dist/chrome.zip +0 -0
  168. package/node_modules/@rviscomi/capo.js/dist/firefox/README.md +53 -0
  169. package/node_modules/@rviscomi/capo.js/dist/firefox/background.js +7 -0
  170. package/node_modules/@rviscomi/capo.js/dist/firefox/capo.css +59 -0
  171. package/node_modules/@rviscomi/capo.js/dist/firefox/capo.html +12 -0
  172. package/node_modules/@rviscomi/capo.js/dist/firefox/capo.js +3 -0
  173. package/node_modules/@rviscomi/capo.js/dist/firefox/chrome.js +120 -0
  174. package/node_modules/@rviscomi/capo.js/dist/firefox/images/icon128.png +0 -0
  175. package/node_modules/@rviscomi/capo.js/dist/firefox/manifest.json +39 -0
  176. package/node_modules/@rviscomi/capo.js/dist/firefox/options/options.css +81 -0
  177. package/node_modules/@rviscomi/capo.js/dist/firefox/options/options.html +43 -0
  178. package/node_modules/@rviscomi/capo.js/dist/firefox/options/options.js +1 -0
  179. package/node_modules/@rviscomi/capo.js/dist/firefox/styles/open-props.css +291 -0
  180. package/node_modules/@rviscomi/capo.js/dist/firefox.zip +0 -0
  181. package/node_modules/@rviscomi/capo.js/dist/index.cjs +93 -33
  182. package/node_modules/@rviscomi/capo.js/dist/lib/colors.cjs +1 -0
  183. package/node_modules/@rviscomi/capo.js/dist/lib/io.cjs +137 -28
  184. package/node_modules/@rviscomi/capo.js/dist/lib/options.cjs +61 -0
  185. package/node_modules/@rviscomi/capo.js/dist/lib/rules.cjs +28 -13
  186. package/node_modules/@rviscomi/capo.js/dist/lib/validation.cjs +31 -16
  187. package/node_modules/@rviscomi/capo.js/dist/source.zip +0 -0
  188. package/node_modules/@rviscomi/capo.js/dist/types/adapters/adapter.d.ts +105 -0
  189. package/node_modules/@rviscomi/capo.js/dist/types/adapters/browser.d.ts +107 -0
  190. package/node_modules/@rviscomi/capo.js/dist/types/adapters/index.d.ts +7 -0
  191. package/node_modules/@rviscomi/capo.js/dist/types/adapters/test-suite.d.ts +52 -0
  192. package/node_modules/@rviscomi/capo.js/dist/types/analyzer.d.ts +195 -0
  193. package/node_modules/@rviscomi/capo.js/dist/types/index.d.ts +29 -0
  194. package/node_modules/@rviscomi/capo.js/dist/types/lib/colors.d.ts +20 -0
  195. package/node_modules/@rviscomi/capo.js/dist/types/lib/io.d.ts +166 -0
  196. package/node_modules/@rviscomi/capo.js/dist/types/lib/options.d.ts +114 -0
  197. package/node_modules/@rviscomi/capo.js/dist/types/lib/rules.d.ts +111 -0
  198. package/node_modules/@rviscomi/capo.js/dist/types/lib/validation.d.ts +61 -0
  199. package/node_modules/@rviscomi/capo.js/dist/types/src/adapters/adapter.d.ts +105 -0
  200. package/node_modules/@rviscomi/capo.js/dist/types/src/adapters/browser.d.ts +107 -0
  201. package/node_modules/@rviscomi/capo.js/dist/types/src/adapters/index.d.ts +7 -0
  202. package/node_modules/@rviscomi/capo.js/dist/types/src/adapters/test-suite.d.ts +52 -0
  203. package/node_modules/@rviscomi/capo.js/dist/types/src/analyzer.d.ts +195 -0
  204. package/node_modules/@rviscomi/capo.js/dist/types/src/index.d.ts +13 -0
  205. package/node_modules/@rviscomi/capo.js/dist/types/src/lib/colors.d.ts +20 -0
  206. package/node_modules/@rviscomi/capo.js/dist/types/src/lib/io.d.ts +166 -0
  207. package/node_modules/@rviscomi/capo.js/dist/types/src/lib/options.d.ts +114 -0
  208. package/node_modules/@rviscomi/capo.js/dist/types/src/lib/rules.d.ts +111 -0
  209. package/node_modules/@rviscomi/capo.js/dist/types/src/lib/validation.d.ts +61 -0
  210. package/node_modules/@rviscomi/capo.js/package.json +34 -16
  211. package/node_modules/@rviscomi/capo.js/src/adapters/adapter.js +16 -5
  212. package/node_modules/@rviscomi/capo.js/src/adapters/browser.js +30 -4
  213. package/node_modules/@rviscomi/capo.js/src/adapters/test-suite.js +11 -10
  214. package/node_modules/@rviscomi/capo.js/src/analyzer.js +47 -25
  215. package/node_modules/@rviscomi/capo.js/src/extension/README.md +53 -0
  216. package/node_modules/@rviscomi/capo.js/src/extension/background.js +7 -0
  217. package/node_modules/@rviscomi/capo.js/src/extension/capo.css +59 -0
  218. package/node_modules/@rviscomi/capo.js/src/extension/capo.html +12 -0
  219. package/node_modules/@rviscomi/capo.js/src/extension/capo.js +93 -0
  220. package/node_modules/@rviscomi/capo.js/src/extension/chrome.js +120 -0
  221. package/node_modules/@rviscomi/capo.js/src/extension/images/icon128.png +0 -0
  222. package/node_modules/@rviscomi/capo.js/src/extension/images/icon256.png +0 -0
  223. package/node_modules/@rviscomi/capo.js/{crx → src/extension}/manifest.json +1 -1
  224. package/node_modules/@rviscomi/capo.js/src/extension/options/options.css +81 -0
  225. package/node_modules/@rviscomi/capo.js/src/extension/options/options.html +43 -0
  226. package/node_modules/@rviscomi/capo.js/src/extension/options.js +87 -0
  227. package/node_modules/@rviscomi/capo.js/src/extension/styles/open-props.css +291 -0
  228. package/node_modules/@rviscomi/capo.js/src/index.js +10 -0
  229. package/node_modules/@rviscomi/capo.js/src/lib/colors.js +14 -0
  230. package/node_modules/@rviscomi/capo.js/src/lib/io.js +171 -32
  231. package/node_modules/@rviscomi/capo.js/src/lib/options.js +82 -1
  232. package/node_modules/@rviscomi/capo.js/src/lib/rules.js +120 -43
  233. package/node_modules/@rviscomi/capo.js/src/lib/validation.js +211 -86
  234. package/node_modules/@rviscomi/capo.js/src/web/capo.js +5 -8
  235. package/node_modules/@types/hast/README.md +2 -2
  236. package/node_modules/@types/hast/index.d.ts +642 -0
  237. package/node_modules/@types/hast/package.json +9 -3
  238. package/node_modules/@typescript-eslint/eslint-plugin/dist/configs/eslintrc/all.d.ts +0 -4
  239. package/node_modules/@typescript-eslint/eslint-plugin/dist/configs/eslintrc/all.js +0 -4
  240. package/node_modules/@typescript-eslint/eslint-plugin/dist/configs/flat/all.js +0 -4
  241. package/node_modules/@typescript-eslint/eslint-plugin/dist/index.d.ts +0 -4
  242. package/node_modules/@typescript-eslint/eslint-plugin/dist/index.js +47 -0
  243. package/node_modules/@typescript-eslint/eslint-plugin/dist/raw-plugin.d.ts +0 -4
  244. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-comment.js +4 -4
  245. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/method-signature-style.d.ts +1 -1
  246. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/method-signature-style.js +23 -10
  247. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-base-to-string.js +1 -1
  248. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loop-func.js +16 -2
  249. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-promises.js +41 -3
  250. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-restricted-imports.js +12 -0
  251. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-shadow.d.ts +1 -1
  252. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-shadow.js +5 -4
  253. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-this-alias.js +1 -1
  254. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-parameter-property-assignment.js +1 -1
  255. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-template-expression.js +2 -2
  256. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-assertion.js +5 -1
  257. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars.js +1 -1
  258. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-string-starts-ends-with.js +2 -1
  259. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-array-sort-compare.js +1 -1
  260. package/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unbound-method.js +36 -9
  261. package/node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore/index.js +11 -2
  262. package/node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore/legacy.js +11 -2
  263. package/node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore/package.json +1 -1
  264. package/node_modules/@typescript-eslint/eslint-plugin/package.json +22 -11
  265. package/node_modules/@typescript-eslint/parser/dist/index.js +47 -0
  266. package/node_modules/@typescript-eslint/parser/dist/parser.js +11 -6
  267. package/node_modules/@typescript-eslint/parser/package.json +9 -7
  268. package/node_modules/@typescript-eslint/project-service/package.json +7 -5
  269. package/node_modules/@typescript-eslint/scope-manager/dist/scope/FunctionScope.js +2 -2
  270. package/node_modules/@typescript-eslint/scope-manager/dist/scope/index.d.ts +1 -0
  271. package/node_modules/@typescript-eslint/scope-manager/dist/scope/index.js +1 -0
  272. package/node_modules/@typescript-eslint/scope-manager/package.json +8 -6
  273. package/node_modules/@typescript-eslint/tsconfig-utils/package.json +5 -3
  274. package/node_modules/@typescript-eslint/type-utils/package.json +9 -7
  275. package/node_modules/@typescript-eslint/types/dist/generated/ast-spec.d.ts +10 -0
  276. package/node_modules/@typescript-eslint/types/dist/parser-options.d.ts +13 -0
  277. package/node_modules/@typescript-eslint/types/package.json +5 -3
  278. package/node_modules/@typescript-eslint/typescript-estree/dist/check-syntax-errors.js +22 -6
  279. package/node_modules/@typescript-eslint/typescript-estree/dist/convert.js +5 -4
  280. package/node_modules/@typescript-eslint/typescript-estree/dist/getImportClausePhaseModifier.d.ts +4 -0
  281. package/node_modules/@typescript-eslint/typescript-estree/dist/getImportClausePhaseModifier.js +56 -0
  282. package/node_modules/@typescript-eslint/typescript-estree/dist/parseSettings/createParseSettings.js +1 -1
  283. package/node_modules/@typescript-eslint/typescript-estree/dist/parseSettings/warnAboutTSVersion.d.ts +1 -1
  284. package/node_modules/@typescript-eslint/typescript-estree/dist/parseSettings/warnAboutTSVersion.js +27 -18
  285. package/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts +8 -0
  286. package/node_modules/@typescript-eslint/typescript-estree/package.json +9 -7
  287. package/node_modules/@typescript-eslint/utils/dist/ts-eslint/Rule.d.ts +1 -1
  288. package/node_modules/@typescript-eslint/utils/package.json +8 -6
  289. package/node_modules/@typescript-eslint/visitor-keys/package.json +6 -4
  290. package/node_modules/acorn/CHANGELOG.md +12 -0
  291. package/node_modules/acorn/README.md +5 -0
  292. package/node_modules/acorn/dist/acorn.d.mts +8 -0
  293. package/node_modules/acorn/dist/acorn.d.ts +8 -0
  294. package/node_modules/acorn/dist/acorn.js +16 -7
  295. package/node_modules/acorn/dist/acorn.mjs +16 -7
  296. package/node_modules/acorn/package.json +1 -1
  297. package/node_modules/astro-eslint-parser/lib/index.d.mts +113 -18
  298. package/node_modules/astro-eslint-parser/lib/index.mjs +871 -1172
  299. package/node_modules/astro-eslint-parser/package.json +7 -9
  300. package/node_modules/brace-expansion/README.md +11 -0
  301. package/node_modules/brace-expansion/dist/commonjs/index.d.ts +2 -0
  302. package/node_modules/brace-expansion/dist/commonjs/index.d.ts.map +1 -1
  303. package/node_modules/brace-expansion/dist/commonjs/index.js +162 -84
  304. package/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -1
  305. package/node_modules/brace-expansion/dist/esm/index.d.ts +2 -0
  306. package/node_modules/brace-expansion/dist/esm/index.d.ts.map +1 -1
  307. package/node_modules/brace-expansion/dist/esm/index.js +161 -83
  308. package/node_modules/brace-expansion/dist/esm/index.js.map +1 -1
  309. package/node_modules/brace-expansion/package.json +2 -2
  310. package/node_modules/eslint/README.md +2 -2
  311. package/node_modules/eslint/lib/cli-engine/formatters/html.js +1 -1
  312. package/node_modules/eslint/lib/languages/js/index.js +1 -1
  313. package/node_modules/eslint/lib/linter/code-path-analysis/debug-helpers.js +1 -1
  314. package/node_modules/eslint/lib/linter/vfile.js +1 -1
  315. package/node_modules/eslint/lib/rules/class-methods-use-this.js +6 -5
  316. package/node_modules/eslint/lib/rules/complexity.js +1 -1
  317. package/node_modules/eslint/lib/rules/eqeqeq.js +26 -6
  318. package/node_modules/eslint/lib/rules/func-name-matching.js +3 -3
  319. package/node_modules/eslint/lib/rules/generator-star-spacing.js +4 -6
  320. package/node_modules/eslint/lib/rules/indent.js +4 -6
  321. package/node_modules/eslint/lib/rules/key-spacing.js +5 -7
  322. package/node_modules/eslint/lib/rules/max-len.js +1 -1
  323. package/node_modules/eslint/lib/rules/max-nested-callbacks.js +11 -1
  324. package/node_modules/eslint/lib/rules/no-compare-neg-zero.js +91 -8
  325. package/node_modules/eslint/lib/rules/no-control-regex.js +3 -0
  326. package/node_modules/eslint/lib/rules/no-implicit-coercion.js +22 -8
  327. package/node_modules/eslint/lib/rules/no-invalid-regexp.js +3 -1
  328. package/node_modules/eslint/lib/rules/no-mixed-spaces-and-tabs.js +5 -7
  329. package/node_modules/eslint/lib/rules/no-promise-executor-return.js +5 -7
  330. package/node_modules/eslint/lib/rules/no-script-url.js +4 -6
  331. package/node_modules/eslint/lib/rules/no-shadow.js +14 -20
  332. package/node_modules/eslint/lib/rules/no-unreachable-loop.js +8 -4
  333. package/node_modules/eslint/lib/rules/prefer-numeric-literals.js +14 -6
  334. package/node_modules/eslint/lib/rules/prefer-object-has-own.js +4 -6
  335. package/node_modules/eslint/lib/rules/prefer-object-spread.js +9 -1
  336. package/node_modules/eslint/lib/rules/prefer-template.js +1 -1
  337. package/node_modules/eslint/lib/rules/preserve-caught-error.js +268 -116
  338. package/node_modules/eslint/lib/rules/quotes.js +1 -1
  339. package/node_modules/eslint/lib/rules/radix.js +58 -57
  340. package/node_modules/eslint/lib/rules/use-isnan.js +20 -12
  341. package/node_modules/eslint/lib/rules/utils/ast-utils.js +1 -1
  342. package/node_modules/eslint/lib/shared/serialization.js +1 -1
  343. package/node_modules/eslint/lib/shared/translate-cli-options.js +3 -3
  344. package/node_modules/eslint/lib/types/config-api.d.ts +8 -1
  345. package/node_modules/eslint/lib/types/index.d.ts +3 -6
  346. package/node_modules/eslint/lib/types/rules.d.ts +17 -9
  347. package/node_modules/eslint/package.json +7 -7
  348. package/node_modules/eslint-plugin-astro/README.md +10 -2
  349. package/node_modules/eslint-plugin-astro/lib/index.d.mts +0 -1
  350. package/node_modules/eslint-plugin-astro/lib/index.mjs +76 -637
  351. package/node_modules/eslint-plugin-astro/package.json +11 -11
  352. package/node_modules/eslint-plugin-toml/README.md +2 -0
  353. package/node_modules/eslint-plugin-toml/lib/index.d.mts +6 -5
  354. package/node_modules/eslint-plugin-toml/lib/index.mjs +32 -3
  355. package/node_modules/eslint-plugin-toml/package.json +7 -7
  356. package/node_modules/eslint-plugin-yml/README.md +1 -0
  357. package/node_modules/eslint-plugin-yml/lib/index.mjs +125 -21
  358. package/node_modules/eslint-plugin-yml/package.json +7 -7
  359. package/node_modules/flatted/golang/pkg/flatted/flatted.go +16 -14
  360. package/node_modules/flatted/package.json +10 -5
  361. package/node_modules/flatted/types/index.d.ts +1 -1
  362. package/node_modules/globals/globals.json +105 -33
  363. package/node_modules/globals/index.d.ts +105 -33
  364. package/node_modules/globals/package.json +2 -2
  365. package/node_modules/mdn-data/css/properties.json +64 -16
  366. package/node_modules/mdn-data/css/properties.schema.json +1 -7
  367. package/node_modules/mdn-data/css/syntaxes.json +1 -1
  368. package/node_modules/mdn-data/l10n/css.json +3 -62
  369. package/node_modules/mdn-data/package.json +1 -1
  370. package/node_modules/minimatch/package.json +9 -9
  371. package/node_modules/nanoid/non-secure/index.cjs +2 -2
  372. package/node_modules/nanoid/non-secure/index.js +2 -2
  373. package/node_modules/nanoid/package.json +1 -1
  374. package/node_modules/picomatch/README.md +15 -21
  375. package/node_modules/picomatch/lib/parse.js +39 -9
  376. package/node_modules/picomatch/lib/picomatch.js +14 -2
  377. package/node_modules/picomatch/package.json +3 -2
  378. package/node_modules/postcss/README.md +1 -2
  379. package/node_modules/postcss/lib/container.js +81 -34
  380. package/node_modules/postcss/lib/fromJSON.js +65 -26
  381. package/node_modules/postcss/lib/input.js +7 -1
  382. package/node_modules/postcss/lib/lazy-result.js +77 -14
  383. package/node_modules/postcss/lib/list.js +1 -0
  384. package/node_modules/postcss/lib/node.d.ts +2 -2
  385. package/node_modules/postcss/lib/node.js +90 -52
  386. package/node_modules/postcss/lib/postcss.d.ts +4 -1
  387. package/node_modules/postcss/lib/previous-map.js +6 -3
  388. package/node_modules/postcss/lib/processor.js +1 -1
  389. package/node_modules/postcss/lib/root.js +16 -1
  390. package/node_modules/postcss/lib/stringifier.js +112 -25
  391. package/node_modules/postcss/lib/warning.js +10 -0
  392. package/node_modules/postcss/package.json +2 -2
  393. package/node_modules/typescript-eslint/dist/index.js +47 -0
  394. package/node_modules/typescript-eslint/package.json +14 -6
  395. package/node_modules/yaml-eslint-parser/lib/chunk-CfYAbeIz.mjs +13 -0
  396. package/node_modules/yaml-eslint-parser/lib/index.d.mts +2 -2
  397. package/node_modules/yaml-eslint-parser/lib/index.mjs +164 -157
  398. package/node_modules/yaml-eslint-parser/package.json +17 -18
  399. package/package.json +23 -23
  400. package/node_modules/@astrojs/compiler/LICENSE +0 -53
  401. package/node_modules/@astrojs/compiler/README.md +0 -72
  402. package/node_modules/@astrojs/compiler/dist/astro.wasm +0 -0
  403. package/node_modules/@astrojs/compiler/dist/browser/index.cjs +0 -2
  404. package/node_modules/@astrojs/compiler/dist/browser/index.d.ts +0 -11
  405. package/node_modules/@astrojs/compiler/dist/browser/index.js +0 -1
  406. package/node_modules/@astrojs/compiler/dist/browser/utils.cjs +0 -3
  407. package/node_modules/@astrojs/compiler/dist/browser/utils.d.ts +0 -29
  408. package/node_modules/@astrojs/compiler/dist/browser/utils.js +0 -3
  409. package/node_modules/@astrojs/compiler/dist/browser/wasm_exec.cjs +0 -2
  410. package/node_modules/@astrojs/compiler/dist/browser/wasm_exec.d.ts +0 -37
  411. package/node_modules/@astrojs/compiler/dist/browser/wasm_exec.js +0 -1
  412. package/node_modules/@astrojs/compiler/dist/chunk-QR6QDSEV.js +0 -2
  413. package/node_modules/@astrojs/compiler/dist/chunk-W5DTLHV4.js +0 -1
  414. package/node_modules/@astrojs/compiler/dist/node/index.cjs +0 -1
  415. package/node_modules/@astrojs/compiler/dist/node/index.d.ts +0 -12
  416. package/node_modules/@astrojs/compiler/dist/node/index.js +0 -1
  417. package/node_modules/@astrojs/compiler/dist/node/sync.cjs +0 -1
  418. package/node_modules/@astrojs/compiler/dist/node/sync.d.ts +0 -16
  419. package/node_modules/@astrojs/compiler/dist/node/sync.js +0 -1
  420. package/node_modules/@astrojs/compiler/dist/node/utils.cjs +0 -3
  421. package/node_modules/@astrojs/compiler/dist/node/utils.d.ts +0 -29
  422. package/node_modules/@astrojs/compiler/dist/node/utils.js +0 -3
  423. package/node_modules/@astrojs/compiler/dist/node/wasm_exec.cjs +0 -1
  424. package/node_modules/@astrojs/compiler/dist/node/wasm_exec.d.ts +0 -37
  425. package/node_modules/@astrojs/compiler/dist/node/wasm_exec.js +0 -1
  426. package/node_modules/@astrojs/compiler/dist/shared/ast.cjs +0 -1
  427. package/node_modules/@astrojs/compiler/dist/shared/ast.d.ts +0 -74
  428. package/node_modules/@astrojs/compiler/dist/shared/ast.js +0 -0
  429. package/node_modules/@astrojs/compiler/dist/shared/diagnostics.cjs +0 -1
  430. package/node_modules/@astrojs/compiler/dist/shared/diagnostics.d.ts +0 -18
  431. package/node_modules/@astrojs/compiler/dist/shared/diagnostics.js +0 -1
  432. package/node_modules/@astrojs/compiler/dist/shared/types.cjs +0 -1
  433. package/node_modules/@astrojs/compiler/dist/shared/types.d.ts +0 -153
  434. package/node_modules/@astrojs/compiler/dist/shared/types.js +0 -1
  435. package/node_modules/@astrojs/compiler/package.json +0 -58
  436. package/node_modules/@astrojs/compiler/sync.d.ts +0 -1
  437. package/node_modules/@astrojs/compiler/types.d.ts +0 -1
  438. package/node_modules/@astrojs/compiler/utils.d.ts +0 -1
  439. package/node_modules/@pkgr/core/index.d.cts +0 -3
  440. package/node_modules/@pkgr/core/lib/constants.d.ts +0 -6
  441. package/node_modules/@pkgr/core/lib/constants.js +0 -9
  442. package/node_modules/@pkgr/core/lib/constants.js.map +0 -1
  443. package/node_modules/@pkgr/core/lib/helpers.d.ts +0 -19
  444. package/node_modules/@pkgr/core/lib/helpers.js +0 -67
  445. package/node_modules/@pkgr/core/lib/helpers.js.map +0 -1
  446. package/node_modules/@pkgr/core/lib/index.cjs +0 -91
  447. package/node_modules/@pkgr/core/lib/index.d.ts +0 -2
  448. package/node_modules/@pkgr/core/lib/index.js +0 -3
  449. package/node_modules/@pkgr/core/lib/index.js.map +0 -1
  450. package/node_modules/@pkgr/core/package.json +0 -38
  451. package/node_modules/@rviscomi/capo.js/crx/README.md +0 -10
  452. package/node_modules/@rviscomi/capo.js/crx/capo.js +0 -3
  453. package/node_modules/@rviscomi/capo.js/crx/options/options.js +0 -1
  454. package/node_modules/@rviscomi/capo.js/docs/.vscode/extensions.json +0 -4
  455. package/node_modules/@rviscomi/capo.js/docs/.vscode/launch.json +0 -11
  456. package/node_modules/@rviscomi/capo.js/docs/README.md +0 -51
  457. package/node_modules/@rviscomi/capo.js/docs/astro.config.mjs +0 -82
  458. package/node_modules/@rviscomi/capo.js/docs/package-lock.json +0 -7439
  459. package/node_modules/@rviscomi/capo.js/docs/package.json +0 -21
  460. package/node_modules/@rviscomi/capo.js/docs/public/capo-social-alt.webp +0 -0
  461. package/node_modules/@rviscomi/capo.js/docs/public/capo-social.png +0 -0
  462. package/node_modules/@rviscomi/capo.js/docs/public/capo-social.webp +0 -0
  463. package/node_modules/@rviscomi/capo.js/docs/public/favicon.svg +0 -13
  464. package/node_modules/@rviscomi/capo.js/docs/src/assets/bookmarklet-setup.png +0 -0
  465. package/node_modules/@rviscomi/capo.js/docs/src/assets/bookmarklet.png +0 -0
  466. package/node_modules/@rviscomi/capo.js/docs/src/assets/capo-chrome.png +0 -0
  467. package/node_modules/@rviscomi/capo.js/docs/src/assets/capo-extension.png +0 -0
  468. package/node_modules/@rviscomi/capo.js/docs/src/assets/capo800.png +0 -0
  469. package/node_modules/@rviscomi/capo.js/docs/src/assets/crx-console-expanded.png +0 -0
  470. package/node_modules/@rviscomi/capo.js/docs/src/assets/crx-console-interactive.png +0 -0
  471. package/node_modules/@rviscomi/capo.js/docs/src/assets/crx-console.png +0 -0
  472. package/node_modules/@rviscomi/capo.js/docs/src/assets/crx-hover-validation.png +0 -0
  473. package/node_modules/@rviscomi/capo.js/docs/src/assets/crx-menu.png +0 -0
  474. package/node_modules/@rviscomi/capo.js/docs/src/assets/crx-options-dark.png +0 -0
  475. package/node_modules/@rviscomi/capo.js/docs/src/assets/crx-options-light.png +0 -0
  476. package/node_modules/@rviscomi/capo.js/docs/src/assets/crx-store.png +0 -0
  477. package/node_modules/@rviscomi/capo.js/docs/src/assets/custom-palette.png +0 -0
  478. package/node_modules/@rviscomi/capo.js/docs/src/assets/developer-mode.png +0 -0
  479. package/node_modules/@rviscomi/capo.js/docs/src/assets/devtools-console.png +0 -0
  480. package/node_modules/@rviscomi/capo.js/docs/src/assets/devtools-snippet.png +0 -0
  481. package/node_modules/@rviscomi/capo.js/docs/src/assets/devtools-sources.png +0 -0
  482. package/node_modules/@rviscomi/capo.js/docs/src/assets/houston.webp +0 -0
  483. package/node_modules/@rviscomi/capo.js/docs/src/assets/load-unpacked.png +0 -0
  484. package/node_modules/@rviscomi/capo.js/docs/src/assets/validation-areas.png +0 -0
  485. package/node_modules/@rviscomi/capo.js/docs/src/assets/validation-base.png +0 -0
  486. package/node_modules/@rviscomi/capo.js/docs/src/assets/validation-crx-stripes.png +0 -0
  487. package/node_modules/@rviscomi/capo.js/docs/src/assets/validation-csp.png +0 -0
  488. package/node_modules/@rviscomi/capo.js/docs/src/assets/validation-invalid-element.png +0 -0
  489. package/node_modules/@rviscomi/capo.js/docs/src/assets/validation-origin-trial.png +0 -0
  490. package/node_modules/@rviscomi/capo.js/docs/src/assets/validation-title.png +0 -0
  491. package/node_modules/@rviscomi/capo.js/docs/src/components/CapoClient.astro +0 -165
  492. package/node_modules/@rviscomi/capo.js/docs/src/components/CapoOptions.astro +0 -10
  493. package/node_modules/@rviscomi/capo.js/docs/src/components/CapoPalette.astro +0 -26
  494. package/node_modules/@rviscomi/capo.js/docs/src/components/InlineCapoIcon.astro +0 -15
  495. package/node_modules/@rviscomi/capo.js/docs/src/components/InlineCapoWeightBars.astro +0 -39
  496. package/node_modules/@rviscomi/capo.js/docs/src/components/VirtualConsole.astro +0 -11
  497. package/node_modules/@rviscomi/capo.js/docs/src/content/config.ts +0 -7
  498. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/developer/contributing.mdx +0 -8
  499. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/developer/crx-local.mdx +0 -28
  500. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/developer/custom-adapters.mdx +0 -273
  501. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/index.mdx +0 -108
  502. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/migration-v2.mdx +0 -62
  503. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/user/actionability.mdx +0 -6
  504. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/user/assessment-mode.mdx +0 -29
  505. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/user/config.mdx +0 -195
  506. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/user/demo.mdx +0 -9
  507. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/user/extension.mdx +0 -116
  508. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/user/performance.mdx +0 -6
  509. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/user/quick-start.mdx +0 -26
  510. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/user/rules.mdx +0 -202
  511. package/node_modules/@rviscomi/capo.js/docs/src/content/docs/user/validation.mdx +0 -197
  512. package/node_modules/@rviscomi/capo.js/docs/src/env.d.ts +0 -2
  513. package/node_modules/@rviscomi/capo.js/docs/src/lib/VirtualConsole.js +0 -190
  514. package/node_modules/@rviscomi/capo.js/docs/src/lib/capo.js +0 -1533
  515. package/node_modules/@rviscomi/capo.js/docs/src/styles/custom.css +0 -7
  516. package/node_modules/@rviscomi/capo.js/docs/src/styles/virtual-console.css +0 -131
  517. package/node_modules/@rviscomi/capo.js/docs/tests/VirtualConsole.test.js +0 -108
  518. package/node_modules/@rviscomi/capo.js/docs/tsconfig.json +0 -3
  519. package/node_modules/@rviscomi/capo.js/src/crx/capo.js +0 -62
  520. package/node_modules/@rviscomi/capo.js/src/crx/options.js +0 -69
  521. package/node_modules/astrojs-compiler-sync/LICENSE +0 -53
  522. package/node_modules/astrojs-compiler-sync/README.md +0 -3
  523. package/node_modules/astrojs-compiler-sync/browser/index.d.ts +0 -6
  524. package/node_modules/astrojs-compiler-sync/browser/index.js +0 -76
  525. package/node_modules/astrojs-compiler-sync/browser/wasm_exec.js +0 -665
  526. package/node_modules/astrojs-compiler-sync/lib/astrojs-compiler-worker.js +0 -5
  527. package/node_modules/astrojs-compiler-sync/lib/compiler-sync.cjs +0 -31
  528. package/node_modules/astrojs-compiler-sync/lib/index.cjs +0 -30
  529. package/node_modules/astrojs-compiler-sync/lib/index.d.cts +0 -3
  530. package/node_modules/astrojs-compiler-sync/lib/index.d.ts +0 -14
  531. package/node_modules/astrojs-compiler-sync/lib/index.js +0 -18
  532. package/node_modules/astrojs-compiler-sync/package.json +0 -100
  533. package/node_modules/entities/LICENSE +0 -11
  534. package/node_modules/entities/dist/decode-codepoint.d.ts +0 -8
  535. package/node_modules/entities/dist/decode-codepoint.d.ts.map +0 -1
  536. package/node_modules/entities/dist/decode-codepoint.js +0 -46
  537. package/node_modules/entities/dist/decode-codepoint.js.map +0 -1
  538. package/node_modules/entities/dist/decode.d.ts +0 -194
  539. package/node_modules/entities/dist/decode.d.ts.map +0 -1
  540. package/node_modules/entities/dist/decode.js +0 -544
  541. package/node_modules/entities/dist/decode.js.map +0 -1
  542. package/node_modules/entities/dist/encode.d.ts +0 -24
  543. package/node_modules/entities/dist/encode.d.ts.map +0 -1
  544. package/node_modules/entities/dist/encode.js +0 -90
  545. package/node_modules/entities/dist/encode.js.map +0 -1
  546. package/node_modules/entities/dist/escape.d.ts +0 -48
  547. package/node_modules/entities/dist/escape.d.ts.map +0 -1
  548. package/node_modules/entities/dist/escape.js +0 -132
  549. package/node_modules/entities/dist/escape.js.map +0 -1
  550. package/node_modules/entities/dist/generated/decode-data-html.d.ts +0 -3
  551. package/node_modules/entities/dist/generated/decode-data-html.d.ts.map +0 -1
  552. package/node_modules/entities/dist/generated/decode-data-html.js +0 -5
  553. package/node_modules/entities/dist/generated/decode-data-html.js.map +0 -1
  554. package/node_modules/entities/dist/generated/decode-data-xml.d.ts +0 -3
  555. package/node_modules/entities/dist/generated/decode-data-xml.d.ts.map +0 -1
  556. package/node_modules/entities/dist/generated/decode-data-xml.js +0 -5
  557. package/node_modules/entities/dist/generated/decode-data-xml.js.map +0 -1
  558. package/node_modules/entities/dist/generated/encode-html.d.ts +0 -5
  559. package/node_modules/entities/dist/generated/encode-html.d.ts.map +0 -1
  560. package/node_modules/entities/dist/generated/encode-html.js +0 -12
  561. package/node_modules/entities/dist/generated/encode-html.js.map +0 -1
  562. package/node_modules/entities/dist/index.d.ts +0 -89
  563. package/node_modules/entities/dist/index.d.ts.map +0 -1
  564. package/node_modules/entities/dist/index.js +0 -91
  565. package/node_modules/entities/dist/index.js.map +0 -1
  566. package/node_modules/entities/dist/internal/bin-trie-flags.d.ts +0 -17
  567. package/node_modules/entities/dist/internal/bin-trie-flags.d.ts.map +0 -1
  568. package/node_modules/entities/dist/internal/bin-trie-flags.js +0 -18
  569. package/node_modules/entities/dist/internal/bin-trie-flags.js.map +0 -1
  570. package/node_modules/entities/dist/internal/decode-shared.d.ts +0 -7
  571. package/node_modules/entities/dist/internal/decode-shared.d.ts.map +0 -1
  572. package/node_modules/entities/dist/internal/decode-shared.js +0 -17
  573. package/node_modules/entities/dist/internal/decode-shared.js.map +0 -1
  574. package/node_modules/entities/dist/internal/encode-shared.d.ts +0 -33
  575. package/node_modules/entities/dist/internal/encode-shared.d.ts.map +0 -1
  576. package/node_modules/entities/dist/internal/encode-shared.js +0 -93
  577. package/node_modules/entities/dist/internal/encode-shared.js.map +0 -1
  578. package/node_modules/entities/package.json +0 -83
  579. package/node_modules/entities/readme.md +0 -131
  580. package/node_modules/entities/src/decode-codepoint.ts +0 -50
  581. package/node_modules/entities/src/decode.ts +0 -671
  582. package/node_modules/entities/src/encode.ts +0 -95
  583. package/node_modules/entities/src/escape.ts +0 -160
  584. package/node_modules/entities/src/generated/decode-data-html.ts +0 -7
  585. package/node_modules/entities/src/generated/decode-data-xml.ts +0 -7
  586. package/node_modules/entities/src/generated/encode-html.ts +0 -18
  587. package/node_modules/entities/src/index.ts +0 -162
  588. package/node_modules/entities/src/internal/bin-trie-flags.ts +0 -16
  589. package/node_modules/entities/src/internal/decode-shared.ts +0 -18
  590. package/node_modules/entities/src/internal/encode-shared.ts +0 -123
  591. package/node_modules/parse5/README.md +0 -38
  592. package/node_modules/parse5/dist/common/doctype.d.ts +0 -4
  593. package/node_modules/parse5/dist/common/doctype.js +0 -114
  594. package/node_modules/parse5/dist/common/error-codes.d.ts +0 -67
  595. package/node_modules/parse5/dist/common/error-codes.js +0 -63
  596. package/node_modules/parse5/dist/common/foreign-content.d.ts +0 -9
  597. package/node_modules/parse5/dist/common/foreign-content.js +0 -228
  598. package/node_modules/parse5/dist/common/html.d.ts +0 -289
  599. package/node_modules/parse5/dist/common/html.js +0 -523
  600. package/node_modules/parse5/dist/common/token.d.ts +0 -84
  601. package/node_modules/parse5/dist/common/token.js +0 -20
  602. package/node_modules/parse5/dist/common/unicode.d.ts +0 -42
  603. package/node_modules/parse5/dist/common/unicode.js +0 -62
  604. package/node_modules/parse5/dist/index.d.ts +0 -71
  605. package/node_modules/parse5/dist/index.js +0 -42
  606. package/node_modules/parse5/dist/parser/formatting-element-list.d.ts +0 -36
  607. package/node_modules/parse5/dist/parser/formatting-element-list.js +0 -110
  608. package/node_modules/parse5/dist/parser/index.d.ts +0 -221
  609. package/node_modules/parse5/dist/parser/index.js +0 -3245
  610. package/node_modules/parse5/dist/parser/open-element-stack.d.ts +0 -53
  611. package/node_modules/parse5/dist/parser/open-element-stack.js +0 -324
  612. package/node_modules/parse5/dist/serializer/index.d.ts +0 -60
  613. package/node_modules/parse5/dist/serializer/index.js +0 -168
  614. package/node_modules/parse5/dist/tokenizer/index.d.ts +0 -247
  615. package/node_modules/parse5/dist/tokenizer/index.js +0 -2712
  616. package/node_modules/parse5/dist/tokenizer/preprocessor.d.ts +0 -36
  617. package/node_modules/parse5/dist/tokenizer/preprocessor.js +0 -196
  618. package/node_modules/parse5/dist/tree-adapters/default.d.ts +0 -84
  619. package/node_modules/parse5/dist/tree-adapters/default.js +0 -173
  620. package/node_modules/parse5/dist/tree-adapters/interface.d.ts +0 -255
  621. package/node_modules/parse5/dist/tree-adapters/interface.js +0 -1
  622. package/node_modules/parse5/package.json +0 -53
  623. package/node_modules/synckit/README.md +0 -256
  624. package/node_modules/synckit/lib/common.d.ts +0 -5
  625. package/node_modules/synckit/lib/common.js +0 -22
  626. package/node_modules/synckit/lib/common.js.map +0 -1
  627. package/node_modules/synckit/lib/constants.d.ts +0 -38
  628. package/node_modules/synckit/lib/constants.js +0 -54
  629. package/node_modules/synckit/lib/constants.js.map +0 -1
  630. package/node_modules/synckit/lib/helpers.d.ts +0 -27
  631. package/node_modules/synckit/lib/helpers.js +0 -411
  632. package/node_modules/synckit/lib/helpers.js.map +0 -1
  633. package/node_modules/synckit/lib/index.cjs +0 -588
  634. package/node_modules/synckit/lib/index.d.cts +0 -138
  635. package/node_modules/synckit/lib/index.d.ts +0 -7
  636. package/node_modules/synckit/lib/index.js +0 -68
  637. package/node_modules/synckit/lib/index.js.map +0 -1
  638. package/node_modules/synckit/lib/types.d.ts +0 -48
  639. package/node_modules/synckit/lib/types.js +0 -2
  640. package/node_modules/synckit/lib/types.js.map +0 -1
  641. package/node_modules/synckit/package.json +0 -45
  642. package/node_modules/yaml-eslint-parser/lib/chunk-15K8U1wQ.mjs +0 -18
  643. /package/node_modules/@rviscomi/capo.js/{crx → dist/chrome}/background.js +0 -0
  644. /package/node_modules/@rviscomi/capo.js/{crx → dist/chrome}/capo.css +0 -0
  645. /package/node_modules/@rviscomi/capo.js/{crx → dist/chrome}/images/icon128.png +0 -0
  646. /package/node_modules/@rviscomi/capo.js/{crx → dist/chrome}/images/icon256.png +0 -0
  647. /package/node_modules/@rviscomi/capo.js/{crx → dist/chrome}/options/options.css +0 -0
  648. /package/node_modules/@rviscomi/capo.js/{crx → dist/chrome}/options/options.html +0 -0
  649. /package/node_modules/@rviscomi/capo.js/{crx → dist/chrome}/styles/open-props.css +0 -0
  650. /package/node_modules/@rviscomi/capo.js/{docs/src/assets/capo256.png → dist/firefox/images/icon256.png} +0 -0
  651. /package/node_modules/eslint-plugin-toml/lib/{chunk-CfYAbeIz.mjs → rolldown-runtime-D7D4PA-g.mjs} +0 -0
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  var __defProp = Object.defineProperty;
2
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
@@ -116,7 +117,7 @@ var AdapterInterface = class {
116
117
  /**
117
118
  * Get source location for a node (optional, for linting)
118
119
  * @param {any} node - Element node
119
- * @returns {{ line: number, column: number, endLine?: number, endColumn?: number } | null}
120
+ * @returns {SourceLocation | null}
120
121
  */
121
122
  getLocation(node) {
122
123
  return null;
@@ -131,8 +132,12 @@ var AdapterInterface = class {
131
132
  }
132
133
  };
133
134
  function validateAdapter(adapter) {
135
+ if (!adapter || typeof adapter !== "object") {
136
+ throw new Error("Adapter must be an object");
137
+ }
134
138
  for (const method of REQUIRED_METHODS) {
135
- if (typeof adapter[method] !== "function") {
139
+ if (typeof /** @type {Record<string, any>} */
140
+ adapter[method] !== "function") {
136
141
  throw new Error(`Adapter missing required method: ${method}()`);
137
142
  }
138
143
  }
@@ -142,6 +147,7 @@ function validateAdapter(adapter) {
142
147
  var BrowserAdapter = class extends AdapterInterface {
143
148
  /**
144
149
  * Check if node is an Element (not text, comment, etc.)
150
+ * @override
145
151
  * @param {any} node - The node to check
146
152
  * @returns {boolean}
147
153
  */
@@ -151,6 +157,7 @@ var BrowserAdapter = class extends AdapterInterface {
151
157
  }
152
158
  /**
153
159
  * Get the tag name of an element (lowercase)
160
+ * @override
154
161
  * @param {any} node - Element node
155
162
  * @returns {string} - Tag name like 'meta', 'link', 'script'
156
163
  */
@@ -158,10 +165,13 @@ var BrowserAdapter = class extends AdapterInterface {
158
165
  if (!node || !node.tagName) {
159
166
  return "";
160
167
  }
161
- return node.tagName.toLowerCase();
168
+ const name = node.tagName.toLowerCase();
169
+ if (name === "static-head") return "head";
170
+ return name;
162
171
  }
163
172
  /**
164
173
  * Get attribute value from element
174
+ * @override
165
175
  * @param {any} node - Element node
166
176
  * @param {string} attrName - Attribute name (case-insensitive)
167
177
  * @returns {string | null} - Attribute value or null if not found
@@ -174,6 +184,7 @@ var BrowserAdapter = class extends AdapterInterface {
174
184
  }
175
185
  /**
176
186
  * Check if element has a specific attribute
187
+ * @override
177
188
  * @param {any} node - Element node
178
189
  * @param {string} attrName - Attribute name (case-insensitive)
179
190
  * @returns {boolean} - True if attribute exists
@@ -186,6 +197,7 @@ var BrowserAdapter = class extends AdapterInterface {
186
197
  }
187
198
  /**
188
199
  * Get all attribute names for an element
200
+ * @override
189
201
  * @param {any} node - Element node
190
202
  * @returns {string[]} - Array of attribute names
191
203
  */
@@ -197,6 +209,7 @@ var BrowserAdapter = class extends AdapterInterface {
197
209
  }
198
210
  /**
199
211
  * Get text content of a node (for inline scripts/styles)
212
+ * @override
200
213
  * @param {any} node - Element node
201
214
  * @returns {string} - Text content
202
215
  */
@@ -208,17 +221,33 @@ var BrowserAdapter = class extends AdapterInterface {
208
221
  }
209
222
  /**
210
223
  * Get child elements of a node
224
+ * @override
211
225
  * @param {any} node - Parent node
212
226
  * @returns {any[]} - Array of child element nodes (excluding text/comment nodes)
213
227
  */
214
228
  getChildren(node) {
215
- if (!node || !node.children) {
229
+ if (!node) {
230
+ return [];
231
+ }
232
+ if (this.getTagName(node) === "noscript") {
233
+ const content = node.innerHTML || "";
234
+ if (content.trim()) {
235
+ const doc = node.ownerDocument || (typeof document !== "undefined" ? document : null);
236
+ if (doc) {
237
+ const temp = doc.createElement("div");
238
+ temp.innerHTML = content;
239
+ return Array.from(temp.children);
240
+ }
241
+ }
242
+ }
243
+ if (!node.children) {
216
244
  return [];
217
245
  }
218
246
  return Array.from(node.children);
219
247
  }
220
248
  /**
221
249
  * Get parent element of a node
250
+ * @override
222
251
  * @param {any} node - Child node
223
252
  * @returns {any | null} - Parent element node, or null if no parent
224
253
  */
@@ -230,6 +259,7 @@ var BrowserAdapter = class extends AdapterInterface {
230
259
  }
231
260
  /**
232
261
  * Get sibling elements of a node
262
+ * @override
233
263
  * @param {any} node - Element node
234
264
  * @returns {any[]} - Array of sibling element nodes (excluding the node itself)
235
265
  */
@@ -249,6 +279,7 @@ var BrowserAdapter = class extends AdapterInterface {
249
279
  * Browser DOM elements don't have source location information,
250
280
  * so this always returns null.
251
281
  *
282
+ * @override
252
283
  * @param {any} node - Element node
253
284
  * @returns {null}
254
285
  */
@@ -257,6 +288,7 @@ var BrowserAdapter = class extends AdapterInterface {
257
288
  }
258
289
  /**
259
290
  * Stringify element for logging/debugging
291
+ * @override
260
292
  * @param {any} node - Element node
261
293
  * @returns {string} - String representation like "<meta charset='utf-8'>"
262
294
  */
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -50,8 +51,12 @@ var REQUIRED_METHODS = [
50
51
  "stringify"
51
52
  ];
52
53
  function validateAdapter(adapter) {
54
+ if (!adapter || typeof adapter !== "object") {
55
+ throw new Error("Adapter must be an object");
56
+ }
53
57
  for (const method of REQUIRED_METHODS) {
54
- if (typeof adapter[method] !== "function") {
58
+ if (typeof /** @type {Record<string, any>} */
59
+ adapter[method] !== "function") {
55
60
  throw new Error(`Adapter missing required method: ${method}()`);
56
61
  }
57
62
  }
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  var __defProp = Object.defineProperty;
2
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
@@ -40,18 +41,6 @@ var ElementWeights = {
40
41
  PREFETCH_PRERENDER: 1,
41
42
  OTHER: 0
42
43
  };
43
- var ElementDetectors = {
44
- META: isMeta,
45
- TITLE: isTitle,
46
- PRECONNECT: isPreconnect,
47
- ASYNC_SCRIPT: isAsyncScript,
48
- IMPORT_STYLES: isImportStyles,
49
- SYNC_SCRIPT: isSyncScript,
50
- SYNC_STYLES: isSyncStyles,
51
- PRELOAD: isPreload,
52
- DEFER_SCRIPT: isDeferScript,
53
- PREFETCH_PRERENDER: isPrefetchPrerender
54
- };
55
44
  var META_HTTP_EQUIV_KEYWORDS = [
56
45
  "accept-ch",
57
46
  "content-security-policy",
@@ -99,6 +88,10 @@ function isAsyncScript(element, adapter) {
99
88
  function isImportStyles(element, adapter) {
100
89
  const importRe = /@import/;
101
90
  if (adapter.getTagName(element) === "style") {
91
+ const media = adapter.getAttribute(element, "media");
92
+ if (media && media.toLowerCase().trim() === "print") {
93
+ return false;
94
+ }
102
95
  return importRe.test(adapter.getTextContent(element));
103
96
  }
104
97
  return false;
@@ -128,11 +121,21 @@ function isSyncScript(element, adapter) {
128
121
  function isSyncStyles(element, adapter) {
129
122
  const tagName = adapter.getTagName(element);
130
123
  if (tagName === "style") {
124
+ const media = adapter.getAttribute(element, "media");
125
+ if (media && media.toLowerCase().trim() === "print") {
126
+ return false;
127
+ }
131
128
  return true;
132
129
  }
133
130
  if (tagName === "link") {
134
131
  const rel = adapter.getAttribute(element, "rel");
135
- return rel?.toLowerCase() === "stylesheet";
132
+ if (rel?.toLowerCase() === "stylesheet") {
133
+ const media = adapter.getAttribute(element, "media");
134
+ if (media && media.toLowerCase().trim() === "print") {
135
+ return false;
136
+ }
137
+ return true;
138
+ }
136
139
  }
137
140
  return false;
138
141
  }
@@ -192,6 +195,18 @@ function isMetaCSP(element, adapter) {
192
195
  const httpEquivLower = httpEquiv.toLowerCase();
193
196
  return httpEquivLower === "content-security-policy" || httpEquivLower === "content-security-policy-report-only";
194
197
  }
198
+ var ElementDetectors = {
199
+ META: isMeta,
200
+ TITLE: isTitle,
201
+ PRECONNECT: isPreconnect,
202
+ ASYNC_SCRIPT: isAsyncScript,
203
+ IMPORT_STYLES: isImportStyles,
204
+ SYNC_SCRIPT: isSyncScript,
205
+ SYNC_STYLES: isSyncStyles,
206
+ PRELOAD: isPreload,
207
+ DEFER_SCRIPT: isDeferScript,
208
+ PREFETCH_PRERENDER: isPrefetchPrerender
209
+ };
195
210
  function getWeight(element, adapter) {
196
211
  for (let [id, detector] of Object.entries(ElementDetectors)) {
197
212
  if (detector(element, adapter)) {
@@ -266,6 +281,16 @@ function getValidationWarnings(head, adapter) {
266
281
  }
267
282
  children.forEach((element) => {
268
283
  if (isValidElement(element, adapter)) {
284
+ const elementChildren = adapter.getChildren(element);
285
+ elementChildren.forEach((child) => {
286
+ if (!isValidElement(child, adapter)) {
287
+ validationWarnings.push({
288
+ ruleId: "no-invalid-head-elements",
289
+ warning: `${adapter.getTagName(child).toUpperCase()} elements are not allowed in the <head>`,
290
+ element
291
+ });
292
+ }
293
+ });
269
294
  return;
270
295
  }
271
296
  validationWarnings.push({
@@ -315,7 +340,7 @@ function getCustomValidations(element, adapter, parentElement = null) {
315
340
  };
316
341
  results.forEach((result) => {
317
342
  if (result.warnings) {
318
- combined.warnings.push(...result.warnings);
343
+ combined.warnings?.push(...result.warnings);
319
344
  }
320
345
  if (result.payload) {
321
346
  Object.assign(combined.payload, result.payload);
@@ -381,25 +406,26 @@ function validateOriginTrial(element, adapter) {
381
406
  try {
382
407
  metadata.payload = decodeOriginTrialToken(token);
383
408
  } catch {
384
- metadata.warnings.push("Invalid origin trial token: invalid token");
409
+ metadata.warnings?.push("Invalid origin trial token: invalid token");
385
410
  return metadata;
386
411
  }
387
412
  if (metadata.payload.expiry < /* @__PURE__ */ new Date()) {
388
- metadata.warnings.push("Invalid origin trial token: expired");
413
+ metadata.warnings?.push("Invalid origin trial token: expired");
389
414
  }
390
415
  if (typeof document !== "undefined" && document.location && document.location.href) {
391
416
  if (!isSameOrigin(metadata.payload.origin, document.location.href)) {
392
417
  const subdomain = isSubdomain(metadata.payload.origin, document.location.href);
393
418
  if (subdomain && !metadata.payload.isSubdomain) {
394
- metadata.warnings.push("Invalid origin trial token: invalid subdomain");
419
+ metadata.warnings?.push("Invalid origin trial token: invalid subdomain");
395
420
  } else if (!subdomain && !metadata.payload.isThirdParty) {
396
- metadata.warnings.push("Invalid origin trial token: invalid third-party origin");
421
+ metadata.warnings?.push("Invalid origin trial token: invalid third-party origin");
397
422
  }
398
423
  }
399
424
  }
400
425
  return metadata;
401
426
  }
402
427
  function decodeOriginTrialToken(token) {
428
+ if (!token) throw new Error("Missing token");
403
429
  const buffer = new Uint8Array([...atob(token)].map((a) => a.charCodeAt(0)));
404
430
  const view = new DataView(buffer.buffer);
405
431
  const length = view.getUint32(65, false);
@@ -411,9 +437,9 @@ function isSameOrigin(a, b) {
411
437
  return new URL(a).origin === new URL(b).origin;
412
438
  }
413
439
  function isSubdomain(a, b) {
414
- a = new URL(a);
415
- b = new URL(b);
416
- return b.host.endsWith(`.${a.host}`);
440
+ const urlA = new URL(a);
441
+ const urlB = new URL(b);
442
+ return urlB.host.endsWith(`.${urlA.host}`);
417
443
  }
418
444
  function isDefaultStyle(element, adapter) {
419
445
  if (adapter.getTagName(element) !== "meta") return false;
@@ -594,7 +620,7 @@ function validateContentType(element, adapter) {
594
620
  }
595
621
  function validateHttpEquiv(element, adapter) {
596
622
  const warnings = [];
597
- const type = adapter.getAttribute(element, "http-equiv").toLowerCase();
623
+ const type = adapter.getAttribute(element, "http-equiv")?.toLowerCase() || "";
598
624
  const content = adapter.getAttribute(element, "content")?.toLowerCase();
599
625
  switch (type) {
600
626
  case "content-security-policy":
@@ -776,14 +802,16 @@ function validateMetaViewport(element, adapter) {
776
802
  warnings.push(`Invalid maximum zoom level "${maxScale}". Values must be between 0.1 and 10.`);
777
803
  }
778
804
  if (maxScale < 2) {
779
- warnings.push(`Disabling zoom levels under 2x can cause accessibility issues. Found "${maxScale}".`);
805
+ warnings.push(
806
+ `Disabling zoom levels under 2x can cause accessibility issues. Found "maximum-scale=${directives["maximum-scale"]}".`
807
+ );
780
808
  }
781
809
  }
782
810
  if ("user-scalable" in directives) {
783
811
  const userScalable = directives["user-scalable"];
784
812
  if (userScalable == "no" || userScalable == "0") {
785
813
  warnings.push(
786
- `Disabling zooming can cause accessibility issues to users with visual impairments. Found "${userScalable}".`
814
+ `Disabling zooming can cause accessibility issues to users with visual impairments. Found "user-scalable=${userScalable}".`
787
815
  );
788
816
  }
789
817
  if (!["0", "1", "yes", "no"].includes(userScalable)) {
@@ -826,6 +854,7 @@ function validateMetaViewport(element, adapter) {
826
854
  return false;
827
855
  }
828
856
  if (directive == "viewport-fit") {
857
+ return false;
829
858
  }
830
859
  return true;
831
860
  }).forEach((directive) => {
@@ -0,0 +1,53 @@
1
+ # Capo Browser Extension Source Code
2
+
3
+ This directory contains the source code for the Capo browser extension (available for Chrome and Firefox).
4
+
5
+ ## Build Instructions
6
+
7
+ This extension is built from source using Node.js and Parcel. Follow these steps to produce the exact binary package submitted for verification.
8
+
9
+ ### Requirements
10
+
11
+ - **Operating System:** macOS, Linux, or Windows.
12
+ - **Environment:**
13
+ - **Node.js:** v18.0.0 or higher (v22.x recommended).
14
+ - **npm:** v9.0.0 or higher (v10.x recommended).
15
+
16
+ ### 1. Installation of Prerequisites
17
+
18
+ If Node.js and npm are not installed:
19
+ - **macOS (via Homebrew):** `brew install node`
20
+ - **Windows / Linux:** Download the installer from [nodejs.org](https://nodejs.org/).
21
+
22
+ Verify installation:
23
+ ```bash
24
+ node -v
25
+ npm -v
26
+ ```
27
+
28
+ ### 2. Install Project Dependencies
29
+
30
+ Run the following command from the root of the source code directory to install all required development and build dependencies:
31
+
32
+ ```bash
33
+ npm install
34
+ ```
35
+
36
+ ### 3. Execute the Build Script
37
+
38
+ Run the build script to compile and package the extension:
39
+
40
+ ```bash
41
+ npm run build
42
+ ```
43
+
44
+ This runs:
45
+ - `npm run build:cjs`: Compiles CommonJS bundles using `esbuild`.
46
+ - `parcel build`: Compiles, bundles, and minifies the extension source code (`src/extension/capo.js` and `src/extension/options.js`) using `Parcel`.
47
+ - `node scripts/build-extension.js`: Copies static files, generates the Firefox-compatible manifest, and packages them.
48
+
49
+ ### 4. Locate Build Outputs
50
+
51
+ Once the build is complete:
52
+ - The compiled Firefox extension files will be in `dist/firefox/`.
53
+ - The final zip package submitted to Mozilla is located at `dist/firefox.zip`.
@@ -1,7 +1,7 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
- <link rel="stylesheet" href="capo.css"></link>
4
+ <link rel="stylesheet" href="capo.css">
5
5
  </head>
6
6
  <body>
7
7
  <div id="actual" class="capo-container"></div>
@@ -0,0 +1,3 @@
1
+ (()=>{let e={META:10,TITLE:9,PRECONNECT:8,ASYNC_SCRIPT:7,IMPORT_STYLES:6,SYNC_SCRIPT:5,SYNC_STYLES:4,PRELOAD:3,DEFER_SCRIPT:2,PREFETCH_PRERENDER:1,OTHER:0},t=["accept-ch","content-security-policy","content-type","default-style","delegate-ch","origin-trial","x-dns-prefetch-control"],i={META:function(e,i){let n=i.getTagName(e);if("base"===n)return!0;if("meta"!==n)return!1;if(i.hasAttribute(e,"charset"))return!0;let r=i.getAttribute(e,"name");if(r&&"viewport"===r.toLowerCase())return!0;let a=i.getAttribute(e,"http-equiv");if(a){let e=a.toLowerCase();return t.includes(e)}return!1},TITLE:function(e,t){return"title"===t.getTagName(e)},PRECONNECT:function(e,t){if("link"!==t.getTagName(e))return!1;let i=t.getAttribute(e,"rel");return i?.toLowerCase()==="preconnect"},ASYNC_SCRIPT:function(e,t){return"script"===t.getTagName(e)&&t.hasAttribute(e,"src")&&t.hasAttribute(e,"async")},IMPORT_STYLES:function(e,t){if("style"===t.getTagName(e)){let i=t.getAttribute(e,"media");return(!i||"print"!==i.toLowerCase().trim())&&/@import/.test(t.getTextContent(e))}return!1},SYNC_SCRIPT:function(e,t){if("script"!==t.getTagName(e)||t.hasAttribute(e,"src")&&t.hasAttribute(e,"defer"))return!1;if(t.hasAttribute(e,"src")){let i=t.getAttribute(e,"type");if(i&&"module"===i.toLowerCase())return!1}if(t.hasAttribute(e,"src")&&t.hasAttribute(e,"async"))return!1;let i=t.getAttribute(e,"type");return!(i&&i.toLowerCase().includes("json"))},SYNC_STYLES:function(e,t){let i=t.getTagName(e);if("style"===i){let i=t.getAttribute(e,"media");return!i||"print"!==i.toLowerCase().trim()}if("link"===i){let i=t.getAttribute(e,"rel");if(i?.toLowerCase()==="stylesheet"){let i=t.getAttribute(e,"media");return!i||"print"!==i.toLowerCase().trim()}}return!1},PRELOAD:function(e,t){if("link"!==t.getTagName(e))return!1;let i=t.getAttribute(e,"rel");if(!i)return!1;let n=i.toLowerCase();return"preload"===n||"modulepreload"===n},DEFER_SCRIPT:function(e,t){if("script"!==t.getTagName(e)||!t.hasAttribute(e,"src"))return!1;if(t.hasAttribute(e,"defer"))return!0;let i=t.getAttribute(e,"type");return!!i&&"module"===i.toLowerCase()&&!t.hasAttribute(e,"async")},PREFETCH_PRERENDER:function(e,t){if("link"!==t.getTagName(e))return!1;let i=t.getAttribute(e,"rel");if(!i)return!1;let n=i.toLowerCase();return"prefetch"===n||"dns-prefetch"===n||"prerender"===n}},n=new Set(["base","link","meta","noscript","script","style","template","title"]);function r(e,t){let i=t.getTagName(e);return!i||""===i||n.has(i.toLowerCase())}function a(e,t,i,n){for(let r of n.getChildren(e)){if(r===i)continue;let e=n.getTagName(r);if("link"===e){let e=n.getAttribute(r,"rel");if(e&&/\b(preload|modulepreload)\b/i.test(e))continue;if(n.getAttribute(r,"href")===t)return r}if("script"===e&&n.getAttribute(r,"src")===t)return r}return null}class s{isElement(e){throw Error("isElement() not implemented")}getTagName(e){throw Error("getTagName() not implemented")}getAttribute(e,t){throw Error("getAttribute() not implemented")}hasAttribute(e,t){throw Error("hasAttribute() not implemented")}getAttributeNames(e){throw Error("getAttributeNames() not implemented")}getTextContent(e){throw Error("getTextContent() not implemented")}getChildren(e){throw Error("getChildren() not implemented")}getParent(e){throw Error("getParent() not implemented")}getSiblings(e){throw Error("getSiblings() not implemented")}getLocation(e){return null}stringify(e){throw Error("stringify() not implemented")}}class o extends s{isElement(e){return!!e&&1===e.nodeType}getTagName(e){if(!e||!e.tagName)return"";let t=e.tagName.toLowerCase();return"static-head"===t?"head":t}getAttribute(e,t){return e&&"function"==typeof e.getAttribute?e.getAttribute(t):null}hasAttribute(e,t){return!!e&&"function"==typeof e.hasAttribute&&e.hasAttribute(t)}getAttributeNames(e){return e&&"function"==typeof e.getAttributeNames?e.getAttributeNames():[]}getTextContent(e){return e&&e.textContent||""}getChildren(e){if(!e)return[];if("noscript"===this.getTagName(e)){let t=e.innerHTML||"";if(t.trim()){let i=e.ownerDocument||("u">typeof document?document:null);if(i){let e=i.createElement("div");return e.innerHTML=t,Array.from(e.children)}}}return e.children?Array.from(e.children):[]}getParent(e){return e&&e.parentElement||null}getSiblings(e){if(!e)return[];let t=e.parentElement;return t?Array.from(t.children).filter(t=>t!==e):[]}getLocation(e){return null}stringify(e){if(!e||!e.nodeName)return"[invalid node]";let t=this.getTagName(e),i=this.getAttributeNames(e);if(0===i.length)return`<${t}>`;let n=i.map(t=>{let i=this.getAttribute(e,t),n=i?i.replace(/"/g,"&quot;"):"";return`${t}="${n}"`}).join(" ");return`<${t} ${n}>`}}function l(e){return[`oklch(5% .1 ${e})`,`oklch(13% .2 ${e})`,`oklch(25% .2 ${e})`,`oklch(35% .25 ${e})`,`oklch(50% .27 ${e})`,`oklch(67% .31 ${e})`,`oklch(72% .25 ${e})`,`oklch(80% .2 ${e})`,`oklch(90% .1 ${e})`,`oklch(99% .05 ${e})`,"#ccc"]}let u=["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2","#cccccc"],c={DEFAULT:u,PINK:l(320),BLUE:l(200)};class d{constructor(e,t,i="u">typeof window?window.console:console){this.document=e,this.options=t,this.console=i,this.isStaticHead=!1,this.head=null}static formatStaticHeadHTML(e){return/<head[\s>]/i.test(e)?e.replace(/(\<\/?)(head)/gi,"$1static-head"):`<static-head>${e}</static-head>`}initFromStaticHead(e){this.head=e,this.isStaticHead=!0}initFromHTML(e){let t=d.formatStaticHeadHTML(e.trim()),i=new(this.document?.defaultView?.DOMParser||DOMParser)().parseFromString(t,"text/html");this.initFromStaticHead(i.querySelector("static-head")||i.head)}async init(){if(!this.head){if(this.options.prefersDynamicAssessment()){this.head=this.document?.querySelector("head")||null;return}try{let e=await this.getStaticHTML();e=d.formatStaticHeadHTML(e);let t=new(this.document?.defaultView?.DOMParser||DOMParser)().parseFromString(e,"text/html").querySelector("static-head");t?this.initFromStaticHead(t):this.head=this.document?.head||null}catch(e){this.console.error(`${this.options.loggingPrefix}An exception occurred while getting the static <head>:`,e),this.head=this.document?.head||null}this.isStaticHead||this.console.warn(`${this.options.loggingPrefix}Unable to parse the static (server-rendered) <head>. Falling back to document.head`,this.head)}}async getStaticHTML(){let e=this.document?.location.href||"",t=await fetch(e);return await t.text()}getHead(){return this.head}stringifyElement(e){return e.getAttributeNames().reduce((t,i)=>t+=`[${CSS.escape(i)}=${JSON.stringify(e.getAttribute(i))}]`,e.nodeName)}getLoggableElement(e){if(!this.isStaticHead)return e;let t=this.document?.head||this.head;if(!t)return e;let i=this.stringifyElement(e),n=Array.from(t.querySelectorAll(i));if(0==n.length)return e;if(1==n.length)return n[0];let r=n.find(t=>{if(t.childNodes.length!==e.childNodes.length)return!1;for(let i=0;i<t.childNodes.length;i++)if(!t.childNodes[i].isEqualNode(e.childNodes[i]))return!1;return!0});return r||e}createElementFromSelector(e){let t=e.match(/^[A-Za-z]+/),i=t?t[0]:null;if(!i)return;let n=document.createElement(i);return(e.match(/\[([A-Za-z-]+)="([^"]+)"\]/g)||[]).forEach(e=>{let t=(e=e.slice(1,-1)).indexOf("="),i=e.slice(0,t),r=e.slice(t+1).slice(1,-1);n.setAttribute(i,r)}),n}logAnalysis(e){let t=this.getHead(),i=e.weights.map(t=>{let i=e.customValidations.find(e=>e.element===t.element),n=e.validationWarnings.find(e=>e.element===t.element||e.elements&&e.elements.includes(t.element));return{element:t.element,weight:t.weight,isValid:!i&&!n,customValidations:i||{}}});this.logValidationWarnings(e.validationWarnings),e.customValidations.forEach(e=>{e.warnings.length>0&&this.console.warn(`${this.options.loggingPrefix}${e.warnings[0]}`,e.element,e.payload||"")}),this.visualizeHead("Actual",t,i);let n=[...i].sort((e,t)=>t.weight-e.weight),r=t.cloneNode(!1);return n.forEach(({element:e})=>{e&&r.appendChild(e.cloneNode(!0))}),this.visualizeHead("Sorted",r,n),i}logElementFromSelector({weight:e,selector:t,html:i,isValid:n,customValidations:r={}}){let a=+e,s=this.getElementVisualization(a,n),o=this.createElementFromSelector(t),l=new(this.document?.defaultView?.DOMParser||DOMParser)().parseFromString(i||"","text/html");[...l.head.childNodes,...l.body.childNodes].forEach(e=>o.appendChild(e.cloneNode(!0))),o=this.getLoggableElement(o),this.logElement({viz:s,weight:a,element:o,isValid:n,customValidations:r})}logElement({viz:e,weight:t,element:i,isValid:n,customValidations:r={},omitPrefix:a=!1}){a||(e.visual=`${this.options.loggingPrefix}${e.visual}`);let s="log",o=[e.visual,e.style,t+1,i];if(!this.options.isValidationEnabled())return void this.console[s](...o);let{payload:l,warnings:u}=r;l&&Object.keys(l).length>0&&("string"==typeof l.expiry&&(l.expiry=new Date(l.expiry)),o.push(l)),u?.length?(s="warn",o.push("\n"+u.map(e=>` \u{274C} ${e}`).join("\n"))):!n&&(this.options.prefersDynamicAssessment()||this.isStaticHead)&&(s="warn",o.push(`
2
+ \u{274C} invalid element (${i.tagName})`)),this.console[s](...o)}logValidationWarnings(e){this.options.isValidationEnabled()&&e.forEach(({warning:e,elements:t=[],element:i})=>{t=t.map(this.getLoggableElement.bind(this)),this.console.warn(`${this.options.loggingPrefix}${e}`,...t,i||"")})}getColor(e){return this.options.palette[10-e]}getHeadVisualization(e){let t="",i=[];return e.forEach(({weight:e,isValid:n})=>{t+="%c ";let r=this.getColor(e),a="padding: 5px; margin: 4px -1px 0; display: inline-block; ";if(n)a+=`background-color: ${r};`;else{let e;a+=`background-image: ${r==(e="#cccccc")&&(e="red"),`repeating-linear-gradient(45deg, ${r}, ${r} 3px, ${e} 3px, ${e} 6px)`}`}i.push(a)}),{visual:t,styles:i}}getElementVisualization(e,t=!0){let i=`%c${Array(e+1).fill("█").join("")}`,n=this.getColor(e);return{visual:i,style:`color: ${n}`}}visualizeHead(e,t,i){let n=this.getHeadVisualization(i);this.console.groupCollapsed(`${this.options.loggingPrefix}${e} %chead%c order
3
+ ${n.visual}`,"font-family: monospace","font-family: inherit",...n.styles),i.forEach(({weight:e,element:t,isValid:i,customValidations:n})=>{let r=this.getElementVisualization(e,i);this.logElement({viz:r,weight:e,element:t,isValid:i,customValidations:n,omitPrefix:!0})}),this.console.log(`${e} %chead%c element`,"font-family: monospace","font-family: inherit",t),this.console.groupEnd()}}class h{constructor({preferredAssessmentMode:e=h.AssessmentMode.STATIC,validation:t=!0,palette:i=u,loggingPrefix:n="Capo: "}={}){this.preferredAssessmentMode=h.AssessmentMode.STATIC,this.validation=!0,this.palette=u,this.loggingPrefix="Capo: ",this.setPreferredAssessmentMode(e),this.setValidation(t),this.setPalette(i),this.setLoggingPrefix(n)}static get AssessmentMode(){return{STATIC:"static",DYNAMIC:"dynamic"}}static get Palettes(){return c}prefersStaticAssessment(){return this.preferredAssessmentMode===h.AssessmentMode.STATIC}prefersDynamicAssessment(){return this.preferredAssessmentMode===h.AssessmentMode.DYNAMIC}isValidationEnabled(){return this.validation}setPreferredAssessmentMode(e){if(!this.isValidAssessmentMode(e))throw Error(`Invalid option: preferred assessment mode, expected AssessmentMode.STATIC or AssessmentMode.DYNAMIC, got "${e}".`);this.preferredAssessmentMode=e}setPreferredAssessmentModeToStatic(e){let t=h.AssessmentMode.STATIC;e||(t=h.AssessmentMode.DYNAMIC),this.setPreferredAssessmentMode(t)}setValidation(e){if(!this.isValidValidation(e))throw Error(`Invalid option: validation, expected boolean, got "${e}".`);this.validation=e}setPalette(e){if(!this.isValidPalette(e))throw Error(`Invalid option: palette, expected [${Object.keys(c).join("|")}] or an array of colors, got "${e}".`);if("string"==typeof e){this.palette=c[e];return}this.palette=e}setLoggingPrefix(e){if(!this.isValidLoggingPrefix(e))throw Error(`Invalid option: logging prefix, expected string, got "${e}".`);this.loggingPrefix=e}isValidAssessmentMode(e){return Object.values(h.AssessmentMode).includes(e)}isValidValidation(e){return"boolean"==typeof e}isValidPalette(e){return"string"==typeof e?Object.keys(c).includes(e):!!Array.isArray(e)&&11===e.length&&e.every(e=>"string"==typeof e)}isValidLoggingPrefix(e){return"string"==typeof e}isPreferredPalette(e){return JSON.stringify(this.palette)==JSON.stringify(e)}valueOf(){return{preferredAssessmentMode:this.preferredAssessmentMode,validation:this.validation,palette:this.palette,loggingPrefix:this.loggingPrefix}}}async function g(t){await t.init();let n=function(t,n,s={}){let o,l,u,c,d,h,g,{includeValidation:m=!0,includeCustomValidations:p=!0}=s;return{weights:n.getChildren(t).filter(e=>{let t=n.getTagName(e);return t&&""!==t}).map(t=>({element:t,weight:function(t,n){for(let[r,a]of Object.entries(i))if(a(t,n))return e[r];return e.OTHER}(t,n)})),validationWarnings:m?(o=[],1!=(c=(u=(l=n.getChildren(t)).filter(e=>"title"===n.getTagName(e))).length)&&o.push({ruleId:0===c?"require-title":"no-duplicate-title",warning:`Expected exactly 1 <title> element, found ${c}`,elements:u}),1!=(d=l.filter(e=>{if("meta"!==n.getTagName(e))return!1;let t=n.getAttribute(e,"name");return t&&"viewport"===t.toLowerCase()})).length&&o.push({ruleId:0===d.length?"require-meta-viewport":"valid-meta-viewport",warning:`Expected exactly 1 <meta name=viewport> element, found ${d.length}`,elements:d}),(g=(h=l.filter(e=>"base"===n.getTagName(e))).length)>1&&o.push({ruleId:"no-duplicate-base",warning:`Expected at most 1 <base> element, found ${g}`,elements:h}),l.forEach(e=>{r(e,n)?n.getChildren(e).forEach(t=>{r(t,n)||o.push({ruleId:"no-invalid-head-elements",warning:`${n.getTagName(t).toUpperCase()} elements are not allowed in the <head>`,element:e})}):o.push({ruleId:"no-invalid-head-elements",warning:`${n.getTagName(e)} elements are not allowed in the <head>`,element:e})}),o):[],customValidations:p?function(e,t){let i=[];for(let n of t.getChildren(e)){let r=function(e,t,i=null){var n,r;let s=[];if(function(e,t){if("meta"!==t.getTagName(e))return!1;let i=t.getAttribute(e,"http-equiv");return i?.toLowerCase()==="origin-trial"}(e,t)&&s.push(function(e,t){var i,n;let r={ruleId:"no-invalid-origin-trial",payload:null,warnings:[]},a=t.getAttribute(e,"content");try{r.payload=function(e){if(!e)throw Error("Missing token");let t=new Uint8Array([...atob(e)].map(e=>e.charCodeAt(0))),i=new DataView(t.buffer).getUint32(65,!1),n=JSON.parse(new TextDecoder().decode(t.slice(69,69+i)));return n.expiry=new Date(1e3*n.expiry),n}(a)}catch{return r.warnings?.push("Invalid origin trial token: invalid token"),r}if(r.payload.expiry<new Date&&r.warnings?.push("Invalid origin trial token: expired"),"u">typeof document&&document.location&&document.location.href&&(i=r.payload.origin,n=document.location.href,new URL(i).origin!==new URL(n).origin)){let e=function(e,t){let i=new URL(e);return new URL(t).host.endsWith(`.${i.host}`)}(r.payload.origin,document.location.href);e&&!r.payload.isSubdomain?r.warnings?.push("Invalid origin trial token: invalid subdomain"):e||r.payload.isThirdParty||r.warnings?.push("Invalid origin trial token: invalid third-party origin")}return r}(e,t)),function(e,t){if("meta"!==t.getTagName(e))return!1;let i=t.getAttribute(e,"http-equiv");if(!i)return!1;let n=i.toLowerCase();return"content-security-policy"===n||"content-security-policy-report-only"===n}(e,t)&&s.push(function(e,t){let i=[],n=null,r=t.getAttribute(e,"http-equiv"),a=r?.toLowerCase();if("content-security-policy-report-only"===a)return i.push("CSP Report-Only is forbidden in meta tags"),{ruleId:"no-meta-csp",warnings:i,payload:n};"content-security-policy"===a&&i.push("meta CSP discouraged. See https://crbug.com/1458493.");let s=t.getAttribute(e,"content");if(!s)return i.push("Invalid CSP. The content attribute must be set."),{warnings:i,payload:n};let o=Object.fromEntries(s.split(/\s*;\s*/).map(e=>{let[t,...i]=e.split(" ");return[t,i.join(" ")]}));return(n=n??{}).directives=o,"report-uri"in o&&i.push("The report-uri directive is not supported. Use the Content-Security-Policy-Report-Only HTTP header instead."),"frame-ancestors"in o&&i.push("The frame-ancestors directive is not supported. Use the Content-Security-Policy HTTP header instead."),"sandbox"in o&&i.push("The sandbox directive is not supported. Use the Content-Security-Policy HTTP header instead."),{ruleId:"no-meta-csp",warnings:i,payload:n}}(e,t)),function(e,t){if("meta"!==t.getTagName(e))return!1;let i=t.getAttribute(e,"http-equiv");return i?.toLowerCase()==="default-style"}(e,t)&&s.push(function(e,t){let i=[],n=null,r=t.getAttribute(e,"content");if(e.parentElement&&e.parentElement.querySelector){let t=e.parentElement.querySelector(`link[rel~="alternate" i][rel~="stylesheet" i][title="${r}"]`);r?t||(n={alternateStylesheets:Array.from(e.parentElement.querySelectorAll('link[rel~="alternate" i][rel~="stylesheet" i]'))},i.push(`This has no effect. No alternate stylesheet found having title="${r}".`)):i.push("This has no effect. The content attribute must be set to a valid stylesheet title.")}else r||i.push("This has no effect. The content attribute must be set to a valid stylesheet title.");return i.push("Even when used correctly, the default-style method of setting a preferred stylesheet results in a flash of unstyled content. Use modern CSS features like @media rules instead."),{ruleId:"no-default-style",warnings:i,payload:n}}(e,t)),function(e,t){if("meta"!==t.getTagName(e))return!1;let i=t.getAttribute(e,"name");return i?.toLowerCase()==="viewport"}(e,t)&&s.push(function(e,t){let i=[],n=null;if(t.getSiblings(e).some(e=>{if("meta"!==t.getTagName(e))return!1;let i=t.getAttribute(e,"name");return i?.toLowerCase()==="viewport"})){let r=t.getParent(e);if(r){let a=t.getChildren(r).filter(e=>{if("meta"!==t.getTagName(e))return!1;let i=t.getAttribute(e,"name");return i?.toLowerCase()==="viewport"}).find(t=>t!==e);if(a)return n={firstMetaViewport:a},i.push("Another meta viewport element has already been declared. Having multiple viewport settings can lead to unexpected behavior."),{warnings:i,payload:n}}}let r=t.getAttribute(e,"content")?.toLowerCase();if(!r)return i.push("Invalid viewport. The content attribute must be set."),{warnings:i,payload:n};let a=Object.fromEntries(r.split(",").map(e=>{let[t,i]=e.split("=");return[t?.trim(),i?.trim()]}));if("width"in a){let e=a.width;1>Number(e)||Number(e)>1e4?i.push(`Invalid width "${e}". Numeric values must be between 1 and 10000.`):"device-width"!=e&&i.push(`Invalid width "${e}".`)}if("height"in a){let e=a.height;1>Number(e)||Number(e)>1e4?i.push(`Invalid height "${e}". Numeric values must be between 1 and 10000.`):"device-height"!=e&&i.push(`Invalid height "${e}".`)}if("initial-scale"in a){let e=Number(a["initial-scale"]);isNaN(e)&&i.push(`Invalid initial zoom level "${a["initial-scale"]}". Values must be numeric.`),(e<.1||e>10)&&i.push(`Invalid initial zoom level "${e}". Values must be between 0.1 and 10.`)}if("minimum-scale"in a){let e=Number(a["minimum-scale"]);isNaN(e)&&i.push(`Invalid minimum zoom level "${a["minimum-scale"]}". Values must be numeric.`),(e<.1||e>10)&&i.push(`Invalid minimum zoom level "${e}". Values must be between 0.1 and 10.`)}if("maximum-scale"in a){let e=Number(a["maximum-scale"]);isNaN(e)&&i.push(`Invalid maximum zoom level "${a["maximum-scale"]}". Values must be numeric.`),(e<.1||e>10)&&i.push(`Invalid maximum zoom level "${e}". Values must be between 0.1 and 10.`),e<2&&i.push(`Disabling zoom levels under 2x can cause accessibility issues. Found "maximum-scale=${a["maximum-scale"]}".`)}if("user-scalable"in a){let e=a["user-scalable"];("no"==e||"0"==e)&&i.push(`Disabling zooming can cause accessibility issues to users with visual impairments. Found "user-scalable=${e}".`),["0","1","yes","no"].includes(e)||i.push(`Unsupported value "${e}" found.`)}if("interactive-widget"in a){let e=a["interactive-widget"];["resizes-visual","resizes-content","overlays-content"].includes(e)||i.push(`Unsupported value "${e}" found.`)}if("viewport-fit"in a){let e=a["viewport-fit"],t=["auto","contain","cover"];t.includes(e)||i.push(`Unsupported value "${e}" found. Should be one of: ${t.join(", ")}.`)}"shrink-to-fit"in a&&i.push("The shrink-to-fit directive has been obsolete since iOS 9.2.\n See https://www.scottohara.me/blog/2018/12/11/shrink-to-fit.html");let s=new Set(["width","height","initial-scale","minimum-scale","maximum-scale","user-scalable","interactive-widget"]);return Object.keys(a).filter(e=>!s.has(e)&&"shrink-to-fit"!=e&&"viewport-fit"!=e).forEach(e=>{i.push(`Invalid viewport directive "${e}".`)}),{ruleId:"valid-meta-viewport",warnings:i,payload:n}}(e,t)),function(e,t){if("meta"!==t.getTagName(e))return!1;if(t.hasAttribute(e,"charset"))return!0;let i=t.getAttribute(e,"http-equiv");return i?.toLowerCase()==="content-type"}(e,t)&&s.push(function(e,t){let i=[],n=null,r=t.hasAttribute(e,"charset"),a=t.getAttribute(e,"http-equiv"),s=a?.toLowerCase()==="content-type";if((r||s)&&t.getSiblings(e).some(e=>{if("meta"!==t.getTagName(e))return!1;if(t.hasAttribute(e,"charset"))return!0;let i=t.getAttribute(e,"http-equiv");return i?.toLowerCase()==="content-type"})){let r=t.getParent(e);if(r){let a=t.getChildren(r).filter(e=>{if("meta"!==t.getTagName(e))return!1;if(t.hasAttribute(e,"charset"))return!0;let i=t.getAttribute(e,"http-equiv");return i?.toLowerCase()==="content-type"}).find(t=>t!==e);a&&((n=n??{}).encodingDeclaration=a,i.push(`There can only be one meta-based character encoding declaration per document. Already found \`${t.stringify(a)}\`.`))}}if(e.ownerDocument?.documentElement?.outerHTML&&e.outerHTML){let t=e.ownerDocument.documentElement.outerHTML.indexOf(e.outerHTML)+e.outerHTML.length;t>1024&&((n=n??{}).characterPosition=t,i.push(`The element containing the character encoding declaration must be serialized completely within the first 1024 bytes of the document. Found at byte ${t}.`))}let o=null;return o=r?t.getAttribute(e,"charset"):t.getAttribute(e,"content")?.match(/text\/html;\s*charset=(.*)/i)?.[1]?.trim(),o?.toLowerCase()!="utf-8"&&((n=n??{}).charset=o,i.push(`Documents are required to use UTF-8 encoding. Found "${o}".`)),i.length&&(i[i.length-1]+="\nLearn more: https://html.spec.whatwg.org/multipage/semantics.html#character-encoding-declaration"),{ruleId:"valid-charset",warnings:i,payload:n}}(e,t)),n=e,"meta"===(r=t).getTagName(n)&&r.hasAttribute(n,"http-equiv")&&s.push(function(e,t){let i=[],n=t.getAttribute(e,"http-equiv")?.toLowerCase()||"",r=t.getAttribute(e,"content")?.toLowerCase();switch(n){case"content-security-policy":case"content-security-policy-report-only":case"origin-trial":case"content-type":case"default-style":break;case"refresh":if(!r){i.push("This doesn't do anything. The content attribute must be set. However, using refresh is discouraged.");break}r.includes("url=")?i.push("Meta auto-redirects are discouraged. Use HTTP 3XX responses instead."):i.push("Meta auto-refreshes are discouraged unless users have the ability to disable it.");break;case"x-dns-prefetch-control":"on"==r?i.push(`DNS prefetching is enabled by default. Setting it to "${r}" has no effect.`):"off"!=r?i.push(`This is a non-standard way of disabling DNS prefetching, which is a performance optimization. Found content="${r}". Use content="off" if you have a legitimate security concern, otherwise remove it.`):i.push("This is non-standard, however most browsers support disabling speculative DNS prefetching. It should still be noted that DNS prefetching is a generally accepted performance optimization and you should only disable it if you have specific security concerns.");break;case"cache-control":case"etag":case"pragma":case"expires":case"last-modified":i.push("This doesn't do anything. Use HTTP headers for any cache directives.");break;case"x-frame-options":i.push("This doesn't do anything. Use the CSP HTTP header with the frame-ancestors directive instead.");break;case"x-ua-compatible":case"content-style-type":case"content-script-type":case"imagetoolbar":case"cleartype":case"page-enter":case"page-exit":case"site-enter":case"site-exit":case"msthemecompatible":case"window-target":i.push("This doesn't do anything. It was an Internet Explorer feature and is now deprecated.");break;case"content-language":case"language":i.push("This is non-conforming. Use the html[lang] attribute instead.");break;case"set-cookie":i.push("This is non-conforming. Use the Set-Cookie HTTP header instead.");break;case"application-name":case"author":case"description":case"generator":case"keywords":case"referrer":case"theme-color":case"color-scheme":case"viewport":case"creator":case"googlebot":case"publisher":case"robots":i.push(`This doesn't do anything. Did you mean \`meta[name=${n}]\`?`);break;case"encoding":i.push("This doesn't do anything. Did you mean `meta[charset]`?");break;case"title":i.push("This doesn't do anything. Did you mean to use the `title` tag instead?");break;case"accept-ch":case"delegate-ch":i.push("This is non-standard and may not work across browsers. Use HTTP headers instead.");break;default:i.push("This is non-standard and may not work across browsers. http-equiv is not an alternative to HTTP headers.")}return{ruleId:"no-invalid-http-equiv",warnings:i}}(e,t)),function(e,t,i=null){if("link"!==t.getTagName(e))return!1;let n=t.getAttribute(e,"rel"),r=n?.toLowerCase();if("preload"!==r&&"modulepreload"!==r)return!1;let s=t.getAttribute(e,"href");if(!s)return!1;let o=i||t.getParent(e);return!!o&&null!=a(o,s,e,t)}(e,t,i)&&s.push(function(e,t,i=null){let n=t.getAttribute(e,"href");if(!n)return{ruleId:"no-unnecessary-preload",warnings:[]};let r=i||t.getParent(e);if(!r)return{ruleId:"no-unnecessary-preload",warnings:[]};let s=a(r,n,e,t);return s?{ruleId:"no-unnecessary-preload",warnings:[`This preload has little to no effect. ${n} is already discoverable by another ${t.getTagName(s)} element.`]}:{ruleId:"no-unnecessary-preload",warnings:[]}}(e,t,i)),function(e,t){if("link"!==t.getTagName(e))return!1;let i=t.getAttribute(e,"rel");if(i?.toLowerCase()!=="preload")return!1;let n=t.getAttribute(e,"as");return n?.toLowerCase()==="font"&&!t.hasAttribute(e,"crossorigin")}(e,t)&&s.push({ruleId:"valid-font-preload",warnings:["Font preloads must have the crossorigin attribute set, even for same-origin fonts."],payload:null}),0===s.length)return{};if(1===s.length)return s[0];let o={warnings:[],payload:{},ruleId:s[0].ruleId};return s.forEach(e=>{e.warnings&&o.warnings?.push(...e.warnings),e.payload&&Object.assign(o.payload,e.payload)}),o}(n,t,e);r&&r.warnings&&r.warnings.length>0&&i.push({ruleId:r.ruleId,element:n,warnings:r.warnings,payload:r.payload})}return i}(t,n):[],headElement:t}}(t.getHead(),new o);return{actual:t.logAnalysis(n).map(({element:e,weight:i,isValid:n,customValidations:r})=>({weight:i,color:t.getColor(i),selector:t.stringifyElement(e),html:e.innerHTML,isValid:!!n,customValidations:function e(t,i){if(null==t)return t;if("object"==typeof t&&(t.nodeType||"u">typeof Element&&t instanceof Element))return i?i.stringifyElement(t):t.outerHTML||t.tagName||String(t);if(t instanceof Date)return t.toString();if(Array.isArray(t))return t.map(t=>e(t,i));if("object"==typeof t){let n={};for(let[r,a]of Object.entries(t))"element"===r&&a&&"object"==typeof a&&(a.nodeType||"u">typeof Element&&a instanceof Element)||(n[r]=e(a,i));return n}return t}(r,t)}))}}async function m(){let{options:e}=await chrome.storage.sync.get("options");return new h(e)}!async function(){let e=new d(document,await m()),{click:t}=await chrome.storage.local.get("click");if(t)e.logElementFromSelector(JSON.parse(t)),await chrome.storage.local.remove("click");else{let t=await g(e);await chrome.storage.local.set({data:t})}}()})();
@@ -1,18 +1,20 @@
1
1
  init();
2
2
 
3
+ /**
4
+ * @returns {Promise<chrome.scripting.InjectionTarget>}
5
+ */
3
6
  async function getCurrentTab() {
4
7
  let [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
5
- return { tabId: tab.id };
8
+ if (!tab) {
9
+ [tab] = await chrome.tabs.query({ active: true, lastFocusedWindow: true });
10
+ }
11
+ return { tabId: tab?.id || 0 };
6
12
  }
7
13
 
14
+ /**
15
+ * @returns {Promise<void>}
16
+ */
8
17
  async function init() {
9
- await chrome.storage.local.remove("data");
10
-
11
- await chrome.scripting.executeScript({
12
- target: await getCurrentTab(),
13
- files: ["capo.js"],
14
- });
15
-
16
18
  chrome.storage.onChanged.addListener((changes) => {
17
19
  console.log("Storage changed", changes);
18
20
  const { data } = changes;
@@ -20,57 +22,93 @@ async function init() {
20
22
  print(data.newValue);
21
23
  }
22
24
  });
25
+
26
+ await chrome.storage.local.remove("data");
27
+
28
+ await chrome.scripting.executeScript({
29
+ target: await getCurrentTab(),
30
+ files: ["capo.js"],
31
+ });
32
+
33
+ const { data } = await chrome.storage.local.get("data");
34
+ if (data) {
35
+ print(data);
36
+ }
23
37
  }
24
38
 
39
+ /**
40
+ * @param {any} result
41
+ */
25
42
  function print(result) {
26
43
  console.log("Data", result);
44
+ const actualEl = document.getElementById("actual");
45
+ const sortedEl = document.getElementById("sorted");
46
+
47
+ if (actualEl) actualEl.textContent = "";
48
+ if (sortedEl) sortedEl.textContent = "";
49
+
27
50
  let frag = document.createDocumentFragment();
28
51
  for (let r of result.actual) {
29
52
  frag.appendChild(getCapoHeadElement(r));
30
53
  }
31
- actual.appendChild(frag);
54
+ if (actualEl) actualEl.appendChild(frag);
32
55
 
33
- result.sorted = result.actual.sort((a, b) => {
56
+ result.sorted = result.actual.slice().sort((/** @type {any} */ a, /** @type {any} */ b) => {
34
57
  return b.weight - a.weight;
35
58
  });
36
59
  frag = document.createDocumentFragment();
37
60
  for (let r of result.sorted) {
38
61
  frag.appendChild(getCapoHeadElement(r));
39
62
  }
40
- sorted.appendChild(frag);
63
+ if (sortedEl) sortedEl.appendChild(frag);
41
64
  document.body.addEventListener("click", handleCapoClick);
42
65
  }
43
66
 
67
+ /**
68
+ * @param {Object} params
69
+ * @param {number} params.weight
70
+ * @param {string} params.color
71
+ * @param {string} params.selector
72
+ * @param {string} params.html
73
+ * @param {boolean} params.isValid
74
+ * @param {any} params.customValidations
75
+ * @returns {HTMLSpanElement}
76
+ */
44
77
  function getCapoHeadElement({
45
78
  weight,
46
79
  color,
47
80
  selector,
48
- innerHTML,
81
+ html,
49
82
  isValid,
50
83
  customValidations,
51
84
  }) {
52
85
  const span = document.createElement("span");
53
86
  span.classList.add("capo-head-element");
54
87
  span.classList.toggle("invalid", !isValid);
55
- span.dataset.weight = weight;
88
+ span.dataset.weight = String(weight);
56
89
  span.style.backgroundColor = color;
57
90
  span.dataset.selector = selector;
58
- span.dataset.innerHTML = innerHTML;
91
+ span.dataset.html = html;
59
92
  span.dataset.customValidations = JSON.stringify(customValidations);
60
93
  span.title = `[${weight + 1}] ${selector}`;
61
94
  return span;
62
95
  }
63
96
 
97
+ /**
98
+ * @param {MouseEvent} event
99
+ */
64
100
  async function handleCapoClick(event) {
65
- const { weight, selector, innerHTML } = event.target.dataset;
66
- const customValidations = JSON.parse(event.target.dataset.customValidations);
67
- const isValid = !event.target.classList.contains("invalid");
101
+ const target = /** @type {HTMLElement} */ (event.target);
102
+ if (!target || !target.dataset) return;
103
+ const { weight, selector, html } = target.dataset;
104
+ const customValidations = JSON.parse(target.dataset.customValidations || '{}');
105
+ const isValid = !target.classList.contains("invalid");
68
106
 
69
107
  await chrome.storage.local.set({
70
108
  click: JSON.stringify({
71
109
  weight,
72
110
  selector,
73
- innerHTML,
111
+ html,
74
112
  isValid,
75
113
  customValidations,
76
114
  }),
@@ -0,0 +1,26 @@
1
+ {
2
+ "manifest_version": 3,
3
+ "name": "Capo: get your ﹤𝚑𝚎𝚊𝚍﹥ in order",
4
+ "description": "Visualize the optimal ordering of ﹤𝚑𝚎𝚊𝚍﹥ elements on any web page",
5
+ "version": "2.2.0",
6
+ "permissions": [
7
+ "scripting",
8
+ "activeTab",
9
+ "storage"
10
+ ],
11
+ "action": {
12
+ "default_icon": "images/icon128.png",
13
+ "default_popup": "capo.html"
14
+ },
15
+ "options_page": "options/options.html",
16
+ "background": {
17
+ "service_worker": "background.js"
18
+ },
19
+ "content_security_policy": {
20
+ "extension_pages": "default-src 'self'; style-src 'self';"
21
+ },
22
+ "icons": {
23
+ "128": "images/icon128.png",
24
+ "256": "images/icon256.png"
25
+ }
26
+ }
@@ -0,0 +1 @@
1
+ (()=>{let e;function t(e){return[`oklch(5% .1 ${e})`,`oklch(13% .2 ${e})`,`oklch(25% .2 ${e})`,`oklch(35% .25 ${e})`,`oklch(50% .27 ${e})`,`oklch(67% .31 ${e})`,`oklch(72% .25 ${e})`,`oklch(80% .2 ${e})`,`oklch(90% .1 ${e})`,`oklch(99% .05 ${e})`,"#ccc"]}let s=["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2","#cccccc"],i={DEFAULT:s,PINK:t(320),BLUE:t(200)};class o{constructor({preferredAssessmentMode:e=o.AssessmentMode.STATIC,validation:t=!0,palette:i=s,loggingPrefix:r="Capo: "}={}){this.preferredAssessmentMode=o.AssessmentMode.STATIC,this.validation=!0,this.palette=s,this.loggingPrefix="Capo: ",this.setPreferredAssessmentMode(e),this.setValidation(t),this.setPalette(i),this.setLoggingPrefix(r)}static get AssessmentMode(){return{STATIC:"static",DYNAMIC:"dynamic"}}static get Palettes(){return i}prefersStaticAssessment(){return this.preferredAssessmentMode===o.AssessmentMode.STATIC}prefersDynamicAssessment(){return this.preferredAssessmentMode===o.AssessmentMode.DYNAMIC}isValidationEnabled(){return this.validation}setPreferredAssessmentMode(e){if(!this.isValidAssessmentMode(e))throw Error(`Invalid option: preferred assessment mode, expected AssessmentMode.STATIC or AssessmentMode.DYNAMIC, got "${e}".`);this.preferredAssessmentMode=e}setPreferredAssessmentModeToStatic(e){let t=o.AssessmentMode.STATIC;e||(t=o.AssessmentMode.DYNAMIC),this.setPreferredAssessmentMode(t)}setValidation(e){if(!this.isValidValidation(e))throw Error(`Invalid option: validation, expected boolean, got "${e}".`);this.validation=e}setPalette(e){if(!this.isValidPalette(e))throw Error(`Invalid option: palette, expected [${Object.keys(i).join("|")}] or an array of colors, got "${e}".`);if("string"==typeof e){this.palette=i[e];return}this.palette=e}setLoggingPrefix(e){if(!this.isValidLoggingPrefix(e))throw Error(`Invalid option: logging prefix, expected string, got "${e}".`);this.loggingPrefix=e}isValidAssessmentMode(e){return Object.values(o.AssessmentMode).includes(e)}isValidValidation(e){return"boolean"==typeof e}isValidPalette(e){return"string"==typeof e?Object.keys(i).includes(e):!!Array.isArray(e)&&11===e.length&&e.every(e=>"string"==typeof e)}isValidLoggingPrefix(e){return"string"==typeof e}isPreferredPalette(e){return JSON.stringify(this.palette)==JSON.stringify(e)}valueOf(){return{preferredAssessmentMode:this.preferredAssessmentMode,validation:this.validation,palette:this.palette,loggingPrefix:this.loggingPrefix}}}async function r(){e=new o((await chrome.storage.sync.get("options")).options)}async function n(t){let s,i=t.target;if(!i||!i.dataset)return;let o=i.dataset.option;switch(o){case"PREFERRED_ASSESSMENT_MODE":s=i.checked,e.setPreferredAssessmentModeToStatic(s);break;case"VALIDATION":s=i.checked,e.setValidation(s);break;case"PALETTE":s=i.value,e.setPalette(s);break;default:console.warn(`Unknown option: ${o}`);return}await chrome.storage.sync.set({options:e.valueOf()}),await chrome.storage.sync.get("options")}!async function(){let t,s,i,a;await r();t=document.getElementById("prefer-static"),s=document.getElementById("validation"),i=document.getElementById("palette"),t&&(t.checked=e.prefersStaticAssessment(),t.dataset.option="PREFERRED_ASSESSMENT_MODE"),s&&(s.checked=e.isValidationEnabled(),s.dataset.option="VALIDATION"),i&&(Object.entries(o.Palettes).forEach(([t,s])=>{let o=document.createElement("option");o.textContent=t,o.value=t,o.selected=e.isPreferredPalette(s),o.dataset.colors=JSON.stringify(s),i.appendChild(o)}),i.dataset.option="PALETTE"),(a=document.getElementById("options"))&&a.addEventListener("change",n)}()})();