@fabriziosalmi/slopless 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/engine/api.js +1 -1
  2. package/dist/index.js +2 -2
  3. package/package.json +1 -1
  4. package/rules/VBC-001.yaml +1 -0
  5. package/rules/VBC-004.yaml +1 -0
  6. package/rules/VBC-005.yaml +8 -1
  7. package/rules/VBC-007.yaml +1 -0
  8. package/rules/VBC-008.yaml +1 -0
  9. package/rules/VBC-009.yaml +1 -0
  10. package/rules/VBC-010.yaml +1 -0
  11. package/rules/VBC-011.yaml +1 -0
  12. package/rules/VBC-012.yaml +1 -0
  13. package/rules/VBC-015.yaml +1 -0
  14. package/rules/VBC-016.yaml +1 -0
  15. package/rules/VBC-017-B.yaml +1 -0
  16. package/rules/VBC-017.yaml +1 -0
  17. package/rules/VBC-018.yaml +1 -0
  18. package/rules/VBC-019.yaml +1 -0
  19. package/rules/VBC-023.yaml +1 -0
  20. package/rules/VBC-024.yaml +1 -0
  21. package/rules/VBC-027.yaml +1 -0
  22. package/rules/VBC-030.yaml +1 -0
  23. package/rules/VBC-033.yaml +1 -0
  24. package/rules/VBC-034.yaml +1 -0
  25. package/rules/VBC-035.yaml +1 -0
  26. package/rules/VBC-039.yaml +1 -0
  27. package/rules/VBC-042.yaml +1 -0
  28. package/rules/VBC-048.yaml +1 -0
  29. package/rules/VBC-049.yaml +1 -0
  30. package/rules/VBC-051.yaml +1 -0
  31. package/rules/VBC-052.yaml +1 -0
  32. package/rules/VBC-053.yaml +1 -0
  33. package/rules/VBC-054.yaml +1 -0
  34. package/rules/VBC-056.yaml +1 -0
  35. package/rules/VBC-057.yaml +1 -0
  36. package/rules/VBC-058.yaml +1 -0
  37. package/rules/VBC-063.yaml +1 -0
  38. package/rules/VBC-068.yaml +1 -0
  39. package/rules/VBC-070.yaml +1 -0
  40. package/rules/VBC-079.yaml +1 -0
  41. package/rules/VBC-080.yaml +1 -0
  42. package/rules/VBC-084.yaml +1 -0
  43. package/rules/VBC-086.yaml +1 -0
  44. package/rules/VBC-090.yaml +1 -0
  45. package/rules/VBC-096.yaml +1 -0
  46. package/rules/VBC-097.yaml +1 -0
  47. package/rules/VBC-101.yaml +1 -0
  48. package/rules/VBC-103.yaml +1 -0
  49. package/rules/VBC-104.yaml +1 -0
  50. package/rules/VBC-112.yaml +1 -0
  51. package/rules/VBC-113.yaml +1 -0
  52. package/rules/VBC-117.yaml +1 -0
  53. package/rules/VBC-123.yaml +1 -0
  54. package/rules/VBC-131.yaml +1 -0
  55. package/rules/VBC-150.yaml +1 -0
  56. package/rules/VBC-215.yaml +1 -0
  57. package/rules/VBC-334.yaml +1 -0
  58. package/rules/VBC-338.yaml +1 -0
  59. package/rules/VBC-385.yaml +1 -0
  60. package/rules/VBC-901.yaml +1 -0
  61. package/rules/VBC-902.yaml +1 -0
  62. package/rules/VBC-903.yaml +1 -0
  63. package/rules/VBC-904.yaml +1 -0
  64. package/rules/VBC-905.yaml +1 -0
  65. package/rules/VBC-906.yaml +1 -0
  66. package/rules/VBC-907.yaml +1 -0
  67. package/rules/VBC-908.yaml +1 -0
  68. package/rules/VBC-910.yaml +1 -0
  69. package/rules/VBC-911.yaml +1 -0
  70. package/rules/VBC-916.yaml +1 -0
  71. package/rules/VBC-917.yaml +1 -0
  72. package/rules/VBC-927.yaml +1 -0
  73. package/rules/VBC-928.yaml +1 -0
  74. package/rules/VBC-937.yaml +1 -0
  75. package/rules/VBC-938.yaml +1 -0
  76. package/rules/VBC-939.yaml +1 -0
  77. package/rules/VBC-940.yaml +1 -0
  78. package/rules/VBC-941.yaml +1 -0
  79. package/rules/VBC-942.yaml +1 -0
  80. package/rules/VBC-943.yaml +1 -0
  81. package/rules/VBC-944.yaml +10 -1
  82. package/rules/VBC-945.yaml +1 -0
  83. package/rules/VBC-946.yaml +1 -0
  84. package/rules/VBC-947.yaml +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fabriziosalmi/slopless",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -21,6 +21,7 @@ match:
21
21
  - env
22
22
  - yaml
23
23
  - json
24
+ - astro
24
25
  message: >-
25
26
  Hardcoded credential at line {line}. Read it from the environment. Values that name what
26
27
  they are, such as CHANGEME or a fixture spelling out "secret", are not reported: they describe
@@ -23,6 +23,7 @@ match:
23
23
  - rb
24
24
  - java
25
25
  - cs
26
+ - astro
26
27
  message: >-
27
28
  SQL built by string concatenation at line {line}. An attacker controlling the interpolated
28
29
  value can rewrite the statement. Use parameterized queries or a query builder that binds
@@ -5,10 +5,14 @@ category: core
5
5
  tags:
6
6
  - best-practice
7
7
  match:
8
- regex: (?<!\bdeclare\s{1,4})\bvar\b
8
+ # `var(--x)` is CSS asking for a custom property, not a JavaScript
9
+ # declaration. An inline <style> block in an .astro or .html file is full
10
+ # of them, and `var (x)` is not valid JavaScript, so the exclusion is free.
11
+ regex: (?<!\bdeclare\s{1,4})\bvar\b(?!\s*\()
9
12
  file_types:
10
13
  - js
11
14
  - ts
15
+ - astro
12
16
  fix:
13
17
  regex_replace:
14
18
  pattern: \bvar\b
@@ -18,6 +22,9 @@ tests:
18
22
  fire:
19
23
  - var total = 0;
20
24
  quiet:
25
+ # CSS asking for a custom property, which an inline <style> block is full of.
26
+ - ' font-family: var(--font-serif);'
27
+ - ' width: calc(100% - var(--gap));'
21
28
  - const total = 0;
22
29
  - let total = 0;
23
30
  - file: global.d.ts
@@ -12,6 +12,7 @@ match:
12
12
  - js
13
13
  - ts
14
14
  - py
15
+ - astro
15
16
  message: >-
16
17
  Monetary value declared as a floating point literal at line {line}. Binary floats cannot
17
18
  represent decimal cents exactly. Store money as integer minor units or use a decimal type.
@@ -10,6 +10,7 @@ match:
10
10
  file_types:
11
11
  - js
12
12
  - ts
13
+ - astro
13
14
  message: >-
14
15
  Using setTimeout as a sleep to paper over a race condition at line {line}. This is a flaky
15
16
  band-aid that slows the app down. Fix the underlying async coordination with proper event
@@ -12,6 +12,7 @@ match:
12
12
  - ts
13
13
  - tsx
14
14
  - jsx
15
+ - astro
15
16
  message: >-
16
17
  jQuery dependency detected at line {line}. In 2026, native DOM APIs (querySelector, fetch,
17
18
  classList, addEventListener) are sufficient and far lighter. Dropping jQuery reduces bundle
@@ -13,6 +13,7 @@ match:
13
13
  - ts
14
14
  - tsx
15
15
  - jsx
16
+ - astro
16
17
  message: >-
17
18
  Clickable <div> with onclick handler at line {line}. Use <button> or <a> for interactive
18
19
  elements. Non-semantic clickable divs are invisible to keyboard navigation and screen readers,
@@ -10,6 +10,7 @@ match:
10
10
  file_types:
11
11
  - js
12
12
  - ts
13
+ - astro
13
14
  message: >-
14
15
  Direct document.cookie write at line {line}. Manual cookie manipulation is error-prone and
15
16
  easy to misconfigure. Use a cookie library that enforces proper security flags (HttpOnly,
@@ -10,6 +10,7 @@ match:
10
10
  file_types:
11
11
  - js
12
12
  - ts
13
+ - astro
13
14
  message: >-
14
15
  Redundant Promise constructor wrapping at line {line}. This is an anti-pattern called "Promise
15
16
  constructor anti-pattern". Use Promise.resolve() directly or return the value/promise without
@@ -11,6 +11,7 @@ match:
11
11
  - js
12
12
  - ts
13
13
  - py
14
+ - astro
14
15
  # The same decision as the paths below, for languages that keep their
15
16
  # tests in the file they test.
16
17
  exclude_test_code: true
@@ -11,6 +11,7 @@ match:
11
11
  file_types:
12
12
  - js
13
13
  - ts
14
+ - astro
14
15
  message: >-
15
16
  Potential commented-out code detected at line {line}. If the code is no longer needed, delete
16
17
  it. Use Git for history.
@@ -16,6 +16,7 @@ match:
16
16
  - jsx
17
17
  - ts
18
18
  - tsx
19
+ - astro
19
20
  message: >-
20
21
  Focused test at line {line}. Committed, it runs this test and silently skips every other
21
22
  one in the file, and the suite still reports green.
@@ -11,6 +11,7 @@ match:
11
11
  file_types:
12
12
  - js
13
13
  - ts
14
+ - astro
14
15
  message: >-
15
16
  Trivially true test assertion at line {line}. This test always passes regardless of the
16
17
  code under test and provides zero confidence. Write a real assertion that can actually fail
@@ -9,6 +9,7 @@ match:
9
9
  file_types:
10
10
  - js
11
11
  - ts
12
+ - astro
12
13
  message: >-
13
14
  Production code with console usage '{match}' found at line {line}. Consider a professional
14
15
  logging library.
@@ -13,6 +13,7 @@ match:
13
13
  - ts
14
14
  - py
15
15
  - sh
16
+ - astro
16
17
  # The same decision as the paths below, for languages that keep their
17
18
  # tests in the file they test.
18
19
  exclude_test_code: true
@@ -10,6 +10,7 @@ match:
10
10
  file_types:
11
11
  - js
12
12
  - ts
13
+ - astro
13
14
  message: >-
14
15
  Notification.requestPermission() detected at line {line}. Requesting browser notification
15
16
  permissions immediately on page load is hostile UX that causes most users to click "Block"
@@ -14,6 +14,7 @@ match:
14
14
  - ts
15
15
  - tsx
16
16
  - jsx
17
+ - astro
17
18
  message: >-
18
19
  Autoplay video without the muted attribute at line {line}. Autoplaying audio is one of the
19
20
  most hostile UX patterns: it embarrasses users in quiet environments, eats mobile data,
@@ -15,6 +15,7 @@ match:
15
15
  - ts
16
16
  - css
17
17
  - scss
18
+ - astro
18
19
  message: >-
19
20
  Parallax scrolling effect detected at line {line}. Parallax effects can trigger vestibular
20
21
  disorders (nausea, dizziness) in sensitive users, carry significant GPU cost, and break
@@ -11,6 +11,7 @@ match:
11
11
  file_types:
12
12
  - js
13
13
  - ts
14
+ - astro
14
15
  message: >-
15
16
  Confetti or particle animation library detected at line {line}. Overusing celebration effects
16
17
  devalues them and creates visual noise. Reserve confetti for genuinely significant milestones
@@ -15,6 +15,7 @@ match:
15
15
  - ts
16
16
  - tsx
17
17
  - jsx
18
+ - astro
18
19
  message: >-
19
20
  Placeholder image service URL detected at line {line}. External placeholder services break
20
21
  when the service is down, look unfinished, and represent content that was never completed.
@@ -17,6 +17,7 @@ match:
17
17
  - ts
18
18
  - py
19
19
  - html
20
+ - astro
20
21
  # The same decision as the paths below, for languages that keep their
21
22
  # tests in the file they test.
22
23
  exclude_test_code: true
@@ -11,6 +11,7 @@ match:
11
11
  - html
12
12
  - tsx
13
13
  - jsx
14
+ - astro
14
15
  message: >-
15
16
  Icon-only button without aria-label at line {line}. A button containing only an SVG icon
16
17
  has no accessible name, making it completely opaque to screen readers. Add aria-label="Descriptive
@@ -12,6 +12,7 @@ match:
12
12
  - py
13
13
  - rb
14
14
  - php
15
+ - astro
15
16
  message: >-
16
17
  Use of 'eval()' detected at line {line}. This is a massive security risk.
17
18
  tests:
@@ -14,6 +14,7 @@ match:
14
14
  - js
15
15
  - ts
16
16
  - py
17
+ - astro
17
18
  message: >-
18
19
  Too many consecutive comment lines at line {line}. Code should be self-documenting.
19
20
  tests:
@@ -11,6 +11,7 @@ match:
11
11
  - js
12
12
  - ts
13
13
  - py
14
+ - astro
14
15
  message: >-
15
16
  Meaningless variable name '{match}' detected at line {line}. Use descriptive names that
16
17
  convey intent.
@@ -16,6 +16,7 @@ match:
16
16
  - py
17
17
  - go
18
18
  - rs
19
+ - astro
19
20
  # The same decision as the paths below, for languages that keep their
20
21
  # tests in the file they test.
21
22
  exclude_test_code: true
@@ -11,6 +11,7 @@ match:
11
11
  file_types:
12
12
  - js
13
13
  - ts
14
+ - astro
14
15
  message: >-
15
16
  snake_case and camelCase mixed at line {line}. Pick one convention per file. Object keys
16
17
  are not reported: a wire format often dictates those names.
@@ -9,6 +9,7 @@ match:
9
9
  file_types:
10
10
  - js
11
11
  - ts
12
+ - astro
12
13
  message: >-
13
14
  Single-letter variable name detected at line {line}. Use more descriptive names.
14
15
  tests:
@@ -10,6 +10,7 @@ match:
10
10
  file_types:
11
11
  - js
12
12
  - ts
13
+ - astro
13
14
  message: >-
14
15
  Redundant string interpolation detected at line {line}. Use the variable directly.
15
16
  tests:
@@ -10,6 +10,7 @@ match:
10
10
  file_types:
11
11
  - js
12
12
  - ts
13
+ - astro
13
14
  message: >-
14
15
  Unnecessary 'else' after 'return' at line {line}. Remove the else and flatten the code.
15
16
  tests:
@@ -24,6 +24,7 @@ match:
24
24
  - kt
25
25
  - swift
26
26
  - rb
27
+ - astro
27
28
  supersedes:
28
29
  - VBC-907
29
30
  - VBC-150
@@ -9,6 +9,7 @@ match:
9
9
  file_types:
10
10
  - ts
11
11
  - tsx
12
+ - astro
12
13
  message: >-
13
14
  Avoid using 'any' type at line {line}. Use a more specific type or 'unknown'.
14
15
  tests:
@@ -9,6 +9,7 @@ match:
9
9
  file_types:
10
10
  - js
11
11
  - ts
12
+ - astro
12
13
  message: >-
13
14
  Overly long variable name (>35 chars) detected at line {line}. This is getting too vibey.
14
15
  tests:
@@ -10,6 +10,7 @@ match:
10
10
  - js
11
11
  - ts
12
12
  - py
13
+ - astro
13
14
  message: Empty else block detected at line {line}. This clutters the code.
14
15
  tests:
15
16
  fire:
@@ -10,6 +10,7 @@ match:
10
10
  file_types:
11
11
  - js
12
12
  - ts
13
+ - astro
13
14
  message: >-
14
15
  Chained or nested ternary at line {line}. Stacked conditionals are hard to read and hard
15
16
  to debug; use an if/else block or a lookup table.
@@ -22,6 +22,7 @@ match:
22
22
  file_types:
23
23
  - js
24
24
  - ts
25
+ - astro
25
26
  message: >-
26
27
  Use of 'innerHTML' detected at line {line}. Use 'textContent' or a sanitizer to avoid XSS.
27
28
  tests:
@@ -9,6 +9,7 @@ match:
9
9
  file_types:
10
10
  - js
11
11
  - ts
12
+ - astro
12
13
  message: >-
13
14
  debugger; statement found at line {line}. This should never reach production.
14
15
  tests:
@@ -9,6 +9,7 @@ match:
9
9
  file_types:
10
10
  - js
11
11
  - ts
12
+ - astro
12
13
  message: >-
13
14
  Avoid using alert() at line {line}. Use a modern UI notification system.
14
15
  tests:
@@ -12,6 +12,7 @@ match:
12
12
  - ts
13
13
  - py
14
14
  - go
15
+ - astro
15
16
  message: >-
16
17
  Line is too long ({count} characters). Consider wrapping it. Max recommended: 120.
17
18
  tests:
@@ -13,6 +13,7 @@ match:
13
13
  - js
14
14
  - ts
15
15
  - tsx
16
+ - astro
16
17
  message: target='_blank' without rel='noopener' detected at line {line}.
17
18
  tests:
18
19
  fire:
@@ -25,6 +25,7 @@ match:
25
25
  - kt
26
26
  - swift
27
27
  - rb
28
+ - astro
28
29
  message: >-
29
30
  Passive-aggressive or helpless comment '{match}' detected at line {line}. Replace with a
30
31
  technical explanation of the actual constraint or a link to the relevant issue tracker ticket.
@@ -12,6 +12,7 @@ match:
12
12
  file_types:
13
13
  - js
14
14
  - ts
15
+ - astro
15
16
  message: >-
16
17
  Long regular expression literal at line {line} with no explanation. Add a comment stating
17
18
  what it matches, or build it from named parts.
@@ -13,6 +13,7 @@ match:
13
13
  - js
14
14
  - ts
15
15
  - tsx
16
+ - astro
16
17
  message: Multiple <br> tags used for layout. Use CSS margin or padding instead.
17
18
  tests:
18
19
  fire:
@@ -12,6 +12,7 @@ match:
12
12
  - js
13
13
  - ts
14
14
  - tsx
15
+ - astro
15
16
  message: Image missing 'alt' attribute at line {line}.
16
17
  tests:
17
18
  fire:
@@ -25,6 +25,7 @@ match:
25
25
  - kt
26
26
  - swift
27
27
  - rb
28
+ - astro
28
29
  message: >-
29
30
  Block of decoration at line {line}: three or more comment lines that are shape and nothing
30
31
  else. A rule around a section heading is punctuation and is not reported; a banner is furniture
@@ -12,6 +12,7 @@ match:
12
12
  file_types:
13
13
  - js
14
14
  - ts
15
+ - astro
15
16
  message: Mixing 'require' and 'import' in the same file at line {line}.
16
17
  tests:
17
18
  fire:
@@ -10,6 +10,7 @@ match:
10
10
  - js
11
11
  - ts
12
12
  - css
13
+ - astro
13
14
  message: >-
14
15
  Potential scroll hijacking or forced smooth scrolling detected at line {line}.
15
16
  tests:
@@ -9,6 +9,7 @@ match:
9
9
  flags: i
10
10
  file_types:
11
11
  - html
12
+ - astro
12
13
  message: Disabling pinch-to-zoom is an accessibility violation.
13
14
  tests:
14
15
  fire:
@@ -12,6 +12,7 @@ match:
12
12
  - js
13
13
  - ts
14
14
  - html
15
+ - astro
15
16
  message: >-
16
17
  Blocking paste in input fields harms both UX and security (password managers).
17
18
  tests:
@@ -14,6 +14,7 @@ match:
14
14
  - js
15
15
  - ts
16
16
  - tsx
17
+ - astro
17
18
  message: >-
18
19
  Using placeholder as the only label at line {line} is bad for accessibility.
19
20
  tests:
@@ -12,6 +12,7 @@ match:
12
12
  - js
13
13
  - ts
14
14
  - tsx
15
+ - astro
15
16
  message: Autoplay video backgrounds can be distracting and impact performance.
16
17
  tests:
17
18
  fire:
@@ -22,6 +22,7 @@ match:
22
22
  - kt
23
23
  - swift
24
24
  - rb
25
+ - astro
25
26
  message: >-
26
27
  Tracked debt marker still in the code at line {line}. It is attributed, so close the ticket
27
28
  or delete the marker before shipping.
@@ -11,6 +11,7 @@ match:
11
11
  file_types:
12
12
  - js
13
13
  - ts
14
+ - astro
14
15
  message: >-
15
16
  Assignment to a window property at line {line}. Globals collide across scripts and outlive
16
17
  the code that set them. Export the value, or attach it under one namespaced object if a
@@ -30,6 +30,7 @@ match:
30
30
  - jsx
31
31
  - py
32
32
  - sh
33
+ - astro
33
34
  message: >-
34
35
  Potential AI-generated fluff or overused cliché '{match}' detected at line {line}. Keep
35
36
  documentation concise and human-centric.
@@ -17,6 +17,7 @@ match:
17
17
  - js
18
18
  - ts
19
19
  - py
20
+ - astro
20
21
  message: >-
21
22
  Non-inclusive terminology at line {line}. Prefer main, primary/replica, allowlist/blocklist,
22
23
  and a plain "check". Domain uses such as an audio master bus or a mastering chain are not
@@ -12,6 +12,7 @@ match:
12
12
  file_types:
13
13
  - js
14
14
  - ts
15
+ - astro
15
16
  message: >-
16
17
  Improper success message grammar at line {line}. Use 'Data saved successfully'.
17
18
  tests:
@@ -16,6 +16,7 @@ match:
16
16
  - java
17
17
  - json
18
18
  - env
19
+ - astro
19
20
  # The same decision as the paths below, for languages that keep their
20
21
  # tests in the file they test.
21
22
  exclude_test_code: true
@@ -10,6 +10,7 @@ match:
10
10
  file_types:
11
11
  - js
12
12
  - ts
13
+ - astro
13
14
  message: >-
14
15
  document.write() is prohibited at line {line}. It is insecure and performance-heavy.
15
16
  tests:
@@ -9,6 +9,7 @@ match:
9
9
  file_types:
10
10
  - js
11
11
  - ts
12
+ - astro
12
13
  message: Passing strings to timers is eval-like and insecure at line {line}.
13
14
  tests:
14
15
  fire:
@@ -10,6 +10,7 @@ match:
10
10
  file_types:
11
11
  - js
12
12
  - ts
13
+ - astro
13
14
  message: >-
14
15
  Magic string literal passed to function at line {line}. Use a named constant instead.
15
16
  tests:
@@ -9,6 +9,7 @@ match:
9
9
  file_types:
10
10
  - js
11
11
  - ts
12
+ - astro
12
13
  message: Debug console method '{line}' left in code. Remove before committing.
13
14
  tests:
14
15
  fire:
@@ -25,6 +25,7 @@ match:
25
25
  - kt
26
26
  - swift
27
27
  - rb
28
+ - astro
28
29
  supersedes:
29
30
  - VBC-907
30
31
  - VBC-150
@@ -25,6 +25,7 @@ match:
25
25
  - kt
26
26
  - swift
27
27
  - rb
28
+ - astro
28
29
  message: >-
29
30
  Unattributed debt marker at line {line}. Nobody owns it, so nobody will fix it. Use TODO(owner):
30
31
  or reference an issue such as TODO: #123.
@@ -12,6 +12,7 @@ match:
12
12
  - js
13
13
  - ts
14
14
  - tsx
15
+ - astro
15
16
  message: >-
16
17
  Overly long inline style attribute at line {line}. Move styles to a CSS file or component.
17
18
  tests:
@@ -9,6 +9,7 @@ match:
9
9
  file_types:
10
10
  - js
11
11
  - ts
12
+ - astro
12
13
  message: >-
13
14
  console.table() left in code at line {line}. Useful for debug, but clutters production logs.
14
15
  tests:
@@ -11,6 +11,7 @@ match:
11
11
  - js
12
12
  - ts
13
13
  - py
14
+ - astro
14
15
  message: >-
15
16
  Generic class name '{match}' detected. Use more specific semantic names (e.g., 'AuthValidator'
16
17
  instead of 'AuthHelper').
@@ -12,6 +12,7 @@ match:
12
12
  - html
13
13
  - tsx
14
14
  - jsx
15
+ - astro
15
16
  message: >-
16
17
  Vague link text '{match}' detected at line {line}. Use descriptive labels (e.g., 'View detailed
17
18
  report') for clarity and screen reader accessibility.
@@ -18,6 +18,7 @@ match:
18
18
  - rs
19
19
  - js
20
20
  - ts
21
+ - astro
21
22
  opt_in: true
22
23
  message: >-
23
24
  Sustained all-caps text at line {line}. Shouting does not add emphasis, it costs readability.