eslint-plugin-chrome-extensions 2.6.0 → 2.7.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.
package/README.md CHANGED
@@ -76,6 +76,84 @@ Available bundles: `recommended`, `strict` (everything), `problem` (deterministi
76
76
  Supported rules
77
77
  </h2>
78
78
 
79
+ <h3 id="css-spacing">
80
+ <code>css-spacing</code>
81
+ <a title="Introduced in recent release" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0">
82
+ <img height=16 align="middle" src="https://api.iconify.design/mdi/sprout.svg?color=%234a4a4a"></a>
83
+ <a title="Only works in 'css/css' config block" href="#usage">
84
+ <img height=18 alt="[CSS only]" src="https://img.shields.io/badge/CSS_only-dcd6f7?style=flat-square" align="middle"></a>
85
+ <a title="Accepts eslint --fix" target="_blank" href="https://eslint.org/docs/latest/use/command-line-interface#--fix">
86
+ <img height=18 alt="[Auto-fixable]" src="https://img.shields.io/badge/Auto--fixable-3b5bdb?style=flat-square" align="middle"></a>
87
+ <a title="Doesn't prevent bugs" href="#css-spacing">
88
+ <img height=18 alt="[Stylistic]" src="https://img.shields.io/badge/Stylistic-af68ff?style=flat-square" align="middle"></a>
89
+ <a title="Accepts array w/ options" href="#usage">
90
+ <img height=18 alt="[Configurable]" src="https://img.shields.io/badge/Configurable-black?style=flat-square" align="middle"></a>
91
+ <a title="Copy rule URL" target="_blank"
92
+ href="https://copy-to-clipboard.onrender.com/copy/https%3A%2F%2Fcodeberg.org%2Fadamlui%2Feslint-plugin-chrome-extensions%2F%23css-spacing">
93
+ <img height=16 width=21 alt="[Copy rule URL]" src="https://api.iconify.design/mdi/content-copy.svg?color=%23cccccc" align="middle"></a>
94
+ </h3>
95
+
96
+ <details>
97
+
98
+ <summary>Enforces consistent indentation and spacing in CSS.</summary>
99
+
100
+ <h4 id="css-spacing-options">Options</h4>
101
+
102
+ - `spaces` (default `2`) – number of spaces per indent level <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
103
+ - `checkBraces` (default `true`) – enforce 1 space after `{` and before `}` in single-line rules <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
104
+ - `checkBrackets` (default `true`) – enforce 0 spaces after `[` and before `]` in attribute selectors <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
105
+ - `checkColons` (default `true`) – enforce 0 spaces before and 1 space after `:` in declarations, and 1 space between value tokens <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
106
+ - `checkCombinators` (default `true`) – enforce 1 space on each side of `>`, `+`, `~` in selectors <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
107
+ - `checkCommas` (default `true`) – enforce 0 spaces before and 1 space after `,` in selector lists <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
108
+ - `checkParentheses` (default `true`) – enforce 0 spaces after `(` and before `)` in functions and pseudo-classes <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
109
+ - `checkSemicolons` (default `true`) – enforce 1 space after `;` in single-line declaration blocks <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
110
+
111
+ #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/gray.svg" align="bottom"> Incorrect code
112
+
113
+ ```diff
114
+ ! .panel { background : blue }
115
+ ! .panel+em { font-style: italic }
116
+ ! :not( .bar ) { color: red }
117
+ ```
118
+
119
+ #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/green.svg" align="bottom"> Correct code
120
+
121
+ ```diff
122
+ - .panel { background : blue }
123
+ + .panel { background: blue }
124
+ - .panel+em { font-style: italic }
125
+ + .panel + em { font-style: italic }
126
+ - :not( .bar ) { color: red }
127
+ + :not(.bar) { color: red }
128
+ ```
129
+
130
+ #### When not to use it
131
+
132
+ If you don't care about visual consistency in your CSS, or you already use Stylelint to format CSS.
133
+
134
+ #### Introduced in
135
+
136
+ <a target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0">v2.7.0</a> (October 17, 2026)
137
+
138
+ #### See also
139
+
140
+ - [`manifest-spacing`](#manifest-spacing)
141
+ <a title="Only works in 'json/json' config block" href="#usage"><img height=14 alt="[Manifest only]" src="https://img.shields.io/badge/Manifest_only-999999?style=flat-square" align="middle"></a>
142
+ <a title="Accepts eslint --fix" target="_blank" href="https://eslint.org/docs/latest/use/command-line-interface#--fix"><img height=14 alt="[Auto-fixable]" src="https://img.shields.io/badge/Auto--fixable-3b5bdb?style=flat-square" align="middle"></a>
143
+ <a title="Doesn't prevent bugs" href="#manifest-spacing"><img height=14 alt="[Stylistic]" src="https://img.shields.io/badge/Stylistic-af68ff?style=flat-square" align="middle"></a>
144
+ <a title="Accepts array w/ options" href="#manifest-spacing-options"><img height=14 alt="[Configurable]" src="https://img.shields.io/badge/Configurable-black?style=flat-square" align="middle"></a>
145
+ - <img height=12 src="https://www.google.com/s2/favicons?domain=developer.mozilla.org&sz=64">&ensp;<a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax">MDN — CSS syntax</a>
146
+
147
+ <div align="center">
148
+
149
+ [Back to index ↑][epce-rules]
150
+
151
+ </div>
152
+
153
+ ---
154
+
155
+ </details>
156
+
79
157
  <h3 id="manifest-key-order">
80
158
  <code>manifest-key-order</code>
81
159
  <a title="Only works in 'json/json' config block" href="#usage">
@@ -240,6 +318,8 @@ If you don't care about visual consistency in your manifest.
240
318
 
241
319
  <h3 id="no-content-style-leak">
242
320
  <code>no-content-style-leak</code>
321
+ <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0">
322
+ <img height=18 align="middle" src="https://api.iconify.design/ph/flag-banner-fold-fill.svg?color=%234a4a4a"></a>
243
323
  <a title="Only included in strict config" href="#usage">
244
324
  <img height=18 alt="[Strict only]" src="https://img.shields.io/badge/Strict_only-ff8c42?style=flat-square" align="middle"></a>
245
325
  <a title="Copy rule URL" target="_blank"
@@ -292,6 +372,8 @@ If you intentionally interact w/ host page styles.
292
372
 
293
373
  <h3 id="no-deprecated-apis">
294
374
  <code>no-deprecated-apis</code>
375
+ <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0">
376
+ <img height=18 align="middle" src="https://api.iconify.design/ph/flag-banner-fold-fill.svg?color=%234a4a4a"></a>
295
377
  <a title="Included in recommended config" href="#usage">
296
378
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
297
379
  <a title="Accepts array w/ options" href="#usage">
@@ -307,8 +389,8 @@ If you intentionally interact w/ host page styles.
307
389
 
308
390
  <h4 id="no-deprecated-apis-options">Options</h4>
309
391
 
310
- - `target` (default `'mv3'`) – Chrome extension manifest version whose deprecations to validate against (`'mv3'`, `'mv2'`) <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-6b8e6b?style=flat-square&labelColor=464646" align="middle"></a>
311
- - `allowedAPIs` (default `[]`) – additional deprecated API namespaces to allow, as a single string or array <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-6b8e6b?style=flat-square&labelColor=464646" align="middle"></a>
392
+ - `target` (default `'mv3'`) – Chrome extension manifest version whose deprecations to validate against (`'mv3'`, `'mv2'`) <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-8a9199?style=flat-square&labelColor=464646" align="middle"></a>
393
+ - `allowedAPIs` (default `[]`) – additional deprecated API namespaces to allow, as a single string or array <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-8a9199?style=flat-square&labelColor=464646" align="middle"></a>
312
394
 
313
395
  #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/gray.svg" align="bottom"> Incorrect code
314
396
 
@@ -422,6 +504,142 @@ If you rely on a Chromium fork resolving duplicate keys in a specific order.
422
504
 
423
505
  </details>
424
506
 
507
+ <h3 id="no-global-keyframes">
508
+ <code>no-global-keyframes</code>
509
+ <a title="Introduced in recent release" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0">
510
+ <img height=16 align="middle" src="https://api.iconify.design/mdi/sprout.svg?color=%234a4a4a"></a>
511
+ <a title="Only works in 'css/css' config block" href="#usage">
512
+ <img height=18 alt="[CSS only]" src="https://img.shields.io/badge/CSS_only-dcd6f7?style=flat-square" align="middle"></a>
513
+ <a title="Accepts array w/ options" href="#usage">
514
+ <img height=18 alt="[Configurable]" src="https://img.shields.io/badge/Configurable-black?style=flat-square" align="middle"></a>
515
+ <a title="Copy rule URL" target="_blank"
516
+ href="https://copy-to-clipboard.onrender.com/copy/https%3A%2F%2Fcodeberg.org%2Fadamlui%2Feslint-plugin-chrome-extensions%2F%23no-global-keyframes">
517
+ <img height=16 width=21 alt="[Copy rule URL]" src="https://api.iconify.design/mdi/content-copy.svg?color=%23cccccc" align="middle"></a>
518
+ </h3>
519
+
520
+ <details>
521
+
522
+ <summary>Disallows <code>@keyframes</code> in content-script CSS to prevent collisions w/ host animations.</summary>
523
+
524
+ <h4 id="no-global-keyframes-options">Options</h4>
525
+
526
+ - `flagCommonNames` (default `true`) – flag well-known animation names (`spin`, `fade-in`, `slide-in-right`, etc.) that are most likely to collide w/ host pages <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
527
+ - `requiredPrefix` (default `undefined`) – flag names not starting w/ this prefix <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
528
+
529
+ #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/gray.svg" align="bottom"> Incorrect code
530
+
531
+ ```diff
532
+ ! @keyframes spin { from { transform: rotate(0) } to { transform: rotate(360deg) } }
533
+ ! @keyframes fade-in { from { opacity: 0 } to { opacity: 1 } }
534
+ ```
535
+
536
+ #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/green.svg" align="bottom"> Correct code
537
+
538
+ ```diff
539
+ - @keyframes spin { from { transform: rotate(0) } to { transform: rotate(360deg) } }
540
+ + @keyframes myext-spin { from { transform: rotate(0) } to { transform: rotate(360deg) } }
541
+ - @keyframes fade-in { from { opacity: 0 } to { opacity: 1 } }
542
+ + @keyframes myext-fade-in { from { opacity: 0 } to { opacity: 1 } }
543
+ ```
544
+
545
+ #### When not to use it
546
+
547
+ If your CSS is scoped inside a Shadow DOM root.
548
+
549
+ #### Introduced in
550
+
551
+ <a target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0">v2.7.0</a> (October 17, 2026)
552
+
553
+ #### See also
554
+
555
+ - [`no-host-page-selectors`](#no-host-page-selectors)
556
+ <a title="Only works in 'css/css' config block" href="#usage"><img height=14 alt="[CSS only]" src="https://img.shields.io/badge/CSS_only-dcd6f7?style=flat-square" align="middle"></a>
557
+ <a title="Accepts array w/ options" href="#no-host-page-selectors-options"><img height=14 alt="[Configurable]" src="https://img.shields.io/badge/Configurable-black?style=flat-square" align="middle"></a>
558
+ - <img height=12 src="https://www.google.com/s2/favicons?domain=developer.mozilla.org&sz=64">&ensp;<a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/@keyframes">MDN — `@keyframes`</a>
559
+ - <img height=12 src="https://www.google.com/s2/favicons?domain=developer.mozilla.org&sz=64">&ensp;<a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM">MDN — Using shadow DOM</a>
560
+
561
+ <div align="center">
562
+
563
+ [Back to index ↑][epce-rules]
564
+
565
+ </div>
566
+
567
+ ---
568
+
569
+ </details>
570
+
571
+ <h3 id="no-host-page-selectors">
572
+ <code>no-host-page-selectors</code>
573
+ <a title="Introduced in recent release" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0">
574
+ <img height=16 align="middle" src="https://api.iconify.design/mdi/sprout.svg?color=%234a4a4a"></a>
575
+ <a title="Only works in 'css/css' config block" href="#usage">
576
+ <img height=18 alt="[CSS only]" src="https://img.shields.io/badge/CSS_only-dcd6f7?style=flat-square" align="middle"></a>
577
+ <a title="Accepts array w/ options" href="#usage">
578
+ <img height=18 alt="[Configurable]" src="https://img.shields.io/badge/Configurable-black?style=flat-square" align="middle"></a>
579
+ <a title="Copy rule URL" target="_blank"
580
+ href="https://copy-to-clipboard.onrender.com/copy/https%3A%2F%2Fcodeberg.org%2Fadamlui%2Feslint-plugin-chrome-extensions%2F%23no-host-page-selectors">
581
+ <img height=16 width=21 alt="[Copy rule URL]" src="https://api.iconify.design/mdi/content-copy.svg?color=%23cccccc" align="middle"></a>
582
+ </h3>
583
+
584
+ <details>
585
+
586
+ <summary>Disallows host-page selectors (<code>html</code>, <code>body</code>, <code>:root</code>, <code>*</code>, bare elem types) in content-script CSS.</summary>
587
+
588
+ <h4 id="no-host-page-selectors-options">Options</h4>
589
+
590
+ - `allowedSelectors` (default `[]`) – selectors to explicitly allow (e.g. `['body.dark']`), as a single string or array <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
591
+ - `disallowUniversal` (default `true`) – flag `*` <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
592
+ - `disallowStructural` (default `true`) – flag `html`, `body`, `:root` <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
593
+ - `disallowBareElements` (default `true`) – flag elem types (e.g. `div`, `a`) that lack `class`/`id`/`attribute` <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
594
+
595
+ #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/gray.svg" align="bottom"> Incorrect code
596
+
597
+ ```diff
598
+ ! * { box-sizing: border-box }
599
+
600
+ ! body { margin: 0 }
601
+ ! html { font-family: sans-serif }
602
+ ! button:hover { opacity: 0.8 }
603
+ ```
604
+
605
+ #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/green.svg" align="bottom"> Correct code
606
+
607
+ ```diff
608
+ - * { box-sizing: border-box }
609
+ + :host { box-sizing: border-box }
610
+
611
+ - body { margin: 0 }
612
+ + :host { margin: 0 }
613
+ - html { font-family: sans-serif }
614
+ + :host { font-family: sans-serif }
615
+ - button:hover { opacity: 0.8 }
616
+ + .myext-button:hover { opacity: 0.8 }
617
+ ```
618
+
619
+ #### When not to use it
620
+
621
+ If you intentionally style the host page. For individual selectors you still need, prefer `allowedSelectors` over disabling the rule.
622
+
623
+ #### Introduced in
624
+
625
+ <a target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0">v2.7.0</a> (October 17, 2026)
626
+
627
+ #### See also
628
+
629
+ - [`no-content-style-leak`](#no-content-style-leak)
630
+ <a title="Only included in strict config" href="#usage"><img height=14 alt="[Strict only]" src="https://img.shields.io/badge/Strict_only-ff8c42?style=flat-square" align="middle"></a>
631
+ - <img height=12 src="https://www.google.com/s2/favicons?domain=developer.mozilla.org&sz=64">&ensp;<a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/:host">MDN — `:host`</a>
632
+
633
+ <div align="center">
634
+
635
+ [Back to index ↑][epce-rules]
636
+
637
+ </div>
638
+
639
+ ---
640
+
641
+ </details>
642
+
425
643
  <h3 id="no-insecure-fetch">
426
644
  <code>no-insecure-fetch</code>
427
645
  <a title="Included in recommended config" href="#usage">
@@ -477,6 +695,8 @@ If you intentionally target HTTP endpoints.
477
695
 
478
696
  <h3 id="no-insecure-messaging">
479
697
  <code>no-insecure-messaging</code>
698
+ <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0">
699
+ <img height=18 align="middle" src="https://api.iconify.design/ph/flag-banner-fold-fill.svg?color=%234a4a4a"></a>
480
700
  <a title="Included in recommended config" href="#usage">
481
701
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
482
702
  <a title="Included in security config" href="#usage">
@@ -635,6 +855,8 @@ If your `_locales/` is externally populated at build time. If you target a Chrom
635
855
 
636
856
  <h3 id="no-invalid-permissions">
637
857
  <code>no-invalid-permissions</code>
858
+ <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0">
859
+ <img height=18 align="middle" src="https://api.iconify.design/ph/flag-banner-fold-fill.svg?color=%234a4a4a"></a>
638
860
  <a title="Included in recommended config" href="#usage">
639
861
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
640
862
  <a title="Works in 'json/json' config block" href="#usage">
@@ -652,8 +874,8 @@ If your `_locales/` is externally populated at build time. If you target a Chrom
652
874
 
653
875
  <h4 id="no-invalid-permissions-options">Options</h4>
654
876
 
655
- - `target` (default `'mv3'`) – Chrome manifest version whose permissions to validate against (`'mv3'`, `'mv2'`) <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-6b8e6b?style=flat-square&labelColor=464646" align="middle"></a>
656
- - `allowedPermissions` (default `[]`) – additional permission names to allow beyond the built-in list, as a single string or array <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-6b8e6b?style=flat-square&labelColor=464646" align="middle"></a>
877
+ - `target` (default `'mv3'`) – Chrome manifest version whose permissions to validate against (`'mv3'`, `'mv2'`) <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-8a9199?style=flat-square&labelColor=464646" align="middle"></a>
878
+ - `allowedPermissions` (default `[]`) – additional permission names to allow beyond the built-in list, as a single string or array <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-8a9199?style=flat-square&labelColor=464646" align="middle"></a>
657
879
 
658
880
  #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/gray.svg" align="bottom"> Incorrect code
659
881
 
@@ -707,6 +929,8 @@ If you don't want permission validation at all. For custom permissions from a Ch
707
929
 
708
930
  <h3 id="no-missing-default-locale">
709
931
  <code>no-missing-default-locale</code>
932
+ <a title="JS support + new option added in recent release" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.6.0">
933
+ <img height=16 align="middle" src="https://api.iconify.design/mdi/sprout.svg?color=%234a4a4a"></a>
710
934
  <a title="Included in recommended config" href="#usage">
711
935
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
712
936
  <a title="Works in 'json/json' config block" href="#usage">
@@ -881,6 +1105,8 @@ If your `_locales/` is externally populated at build time.
881
1105
 
882
1106
  <h3 id="no-missing-permissions">
883
1107
  <code>no-missing-permissions</code>
1108
+ <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0">
1109
+ <img height=18 align="middle" src="https://api.iconify.design/ph/flag-banner-fold-fill.svg?color=%234a4a4a"></a>
884
1110
  <a title="Included in recommended config" href="#usage">
885
1111
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
886
1112
  <a title="Copy rule URL" target="_blank"
@@ -1012,6 +1238,8 @@ If your paths are built at runtime.
1012
1238
 
1013
1239
  <h3 id="no-remote-code">
1014
1240
  <code>no-remote-code</code>
1241
+ <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0">
1242
+ <img height=18 align="middle" src="https://api.iconify.design/ph/flag-banner-fold-fill.svg?color=%234a4a4a"></a>
1015
1243
  <a title="Included in recommended config" href="#usage">
1016
1244
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
1017
1245
  <a title="Included in security config" href="#usage">
@@ -1029,8 +1257,8 @@ If your paths are built at runtime.
1029
1257
 
1030
1258
  <h4 id="no-remote-code-options">Options</h4>
1031
1259
 
1032
- - `patterns` (default `['eval', 'new-function', 'string-timer', 'dynamic-import', 'remote-script-src', 'execute-script-url']`) – detection paths to enable, as a single string or array <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-6b8e6b?style=flat-square&labelColor=464646" align="middle"></a>
1033
- - `checkExecuteScriptClosures` (default `true`) – additionally flag <code>chrome.scripting.executeScript({ func })</code> bodies that capture outer-scope variables <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-6b8e6b?style=flat-square&labelColor=464646" align="middle"></a>
1260
+ - `patterns` (default `['eval', 'new-function', 'string-timer', 'dynamic-import', 'remote-script-src', 'execute-script-url']`) – detection paths to enable, as a single string or array <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-8a9199?style=flat-square&labelColor=464646" align="middle"></a>
1261
+ - `checkExecuteScriptClosures` (default `true`) – additionally flag <code>chrome.scripting.executeScript({ func })</code> bodies that capture outer-scope variables <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0"><img height=14 alt="[Since v1.0.0]" src="https://img.shields.io/badge/since-v1.0.0-8a9199?style=flat-square&labelColor=464646" align="middle"></a>
1034
1262
 
1035
1263
  #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/gray.svg" align="bottom"> Incorrect code
1036
1264
 
@@ -1064,12 +1292,160 @@ If you intentionally target forks w/ relaxed CSPs. For individual patterns you s
1064
1292
 
1065
1293
  #### See also
1066
1294
 
1067
- - [`require-mv3`](#require-mv3)
1068
- <a title="Included in recommended config" href="#usage"><img height=14 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
1069
- <a title="Works in 'json/json' config block" href="#usage"><img height=14 alt="[Manifest]" src="https://img.shields.io/badge/Manifest-999999?style=flat-square" align="middle"></a>
1070
- - [`valid-mv3-schema`](#valid-mv3-schema)
1295
+ - [`no-remote-urls`](#no-remote-urls)
1296
+ <a title="Only works in 'css/css' config block" href="#usage"><img height=14 alt="[CSS only]" src="https://img.shields.io/badge/CSS_only-dcd6f7?style=flat-square" align="middle"></a>
1297
+ <a title="Accepts array w/ options" href="#no-remote-urls-options"><img height=14 alt="[Configurable]" src="https://img.shields.io/badge/Configurable-black?style=flat-square" align="middle"></a>
1298
+
1299
+ <div align="center">
1300
+
1301
+ [Back to index ↑][epce-rules]
1302
+
1303
+ </div>
1304
+
1305
+ ---
1306
+
1307
+ </details>
1308
+
1309
+ <h3 id="no-remote-urls">
1310
+ <code>no-remote-urls</code>
1311
+ <a title="Introduced in recent release" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0">
1312
+ <img height=16 align="middle" src="https://api.iconify.design/mdi/sprout.svg?color=%234a4a4a"></a>
1313
+ <a title="Only works in 'css/css' config block" href="#usage">
1314
+ <img height=18 alt="[CSS only]" src="https://img.shields.io/badge/CSS_only-dcd6f7?style=flat-square" align="middle"></a>
1315
+ <a title="Accepts array w/ options" href="#usage">
1316
+ <img height=18 alt="[Configurable]" src="https://img.shields.io/badge/Configurable-black?style=flat-square" align="middle"></a>
1317
+ <a title="Copy rule URL" target="_blank"
1318
+ href="https://copy-to-clipboard.onrender.com/copy/https%3A%2F%2Fcodeberg.org%2Fadamlui%2Feslint-plugin-chrome-extensions%2F%23no-remote-urls">
1319
+ <img height=16 width=21 alt="[Copy rule URL]" src="https://api.iconify.design/mdi/content-copy.svg?color=%23cccccc" align="middle"></a>
1320
+ </h3>
1321
+
1322
+ <details>
1323
+
1324
+ <summary>Disallows remote resources (<code>@import</code>, <code>@namespace</code>, <code>url()</code>) in extension CSS.</summary>
1325
+
1326
+ <h4 id="no-remote-urls-options">Options</h4>
1327
+
1328
+ - `allowedSchemes` (default `['blob', 'chrome-extension', 'data']`) – URL schemes to allow (beyond relative paths, which are always permitted), as a single string or array <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
1329
+ - `patterns` (default `['at-import', 'url']`) – detection paths to enable, as a single string or array (`'at-import'`, `'url'`, `'namespace'`) <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
1330
+
1331
+ #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/gray.svg" align="bottom"> Incorrect code
1332
+
1333
+ ```diff
1334
+ ! @import url("https://cdn.jsdelivr.net/npm/normalize.css@8.0.1/normalize.css");
1335
+ ! @import "https://cdn.example.com/style.css";
1336
+
1337
+ ! .panel { background: url("https://cdn.example.com/bg.png") }
1338
+ ! .cursor-area { cursor: url("//cdn.example.com/c.cur"), auto }
1339
+
1340
+ ! @font-face { font-family: Lato; src: url("https://fonts.gstatic.com/s/lato/v24/S6uyw4BMUTPHjx4wXiWtFCc.woff2") }
1341
+ ```
1342
+
1343
+ #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/green.svg" align="bottom"> Correct code
1344
+
1345
+ ```diff
1346
+ - @import url("https://cdn.jsdelivr.net/npm/normalize.css@8.0.1/normalize.css");
1347
+ + @import url("./normalize.css");
1348
+ - @import "https://cdn.example.com/style.css";
1349
+ + @import "./reset.css";
1350
+
1351
+ - .panel { background: url("https://cdn.example.com/bg.png") }
1352
+ + .panel { background: url("/bg.png") }
1353
+ - .cursor-area { cursor: url("//cdn.example.com/c.cur"), auto }
1354
+ + .cursor-area { cursor: url("cursors/pointer.cur"), auto }
1355
+
1356
+ - @font-face { font-family: Lato; src: url("https://fonts.gstatic.com/s/lato/v24/S6uyw4BMUTPHjx4wXiWtFCc.woff2") }
1357
+ + @font-face { font-family: Lato; src: url("fonts/lato-v24.woff2") }
1358
+ ```
1359
+
1360
+ #### When not to use it
1361
+
1362
+ If you intentionally reference remote stylesheets, fonts, or images (e.g. Google Fonts, CDN assets). For individual schemes you still need, prefer `allowedSchemes` over disabling the rule.
1363
+
1364
+ #### Introduced in
1365
+
1366
+ <a target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0">v2.7.0</a> (October 17, 2026)
1367
+
1368
+ #### See also
1369
+
1370
+ - [`no-remote-code`](#no-remote-code)
1071
1371
  <a title="Included in recommended config" href="#usage"><img height=14 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
1072
- <a title="Works in 'json/json' config block" href="#usage"><img height=14 alt="[Manifest]" src="https://img.shields.io/badge/Manifest-999999?style=flat-square" align="middle"></a>
1372
+ <a title="Included in security config" href="#usage"><img height=14 alt="[Security]" src="https://img.shields.io/badge/Security-e8357a?style=flat-square" align="middle"></a>
1373
+ <a title="Accepts array w/ options" href="#no-remote-code-options"><img height=14 alt="[Configurable]" src="https://img.shields.io/badge/Configurable-black?style=flat-square" align="middle"></a>
1374
+ - <img height=12 src="https://www.google.com/s2/favicons?domain=developer.chrome.com&sz=64">&ensp;<a target="_blank" href="https://developer.chrome.com/docs/extensions/reference/manifest/content-security-policy">Chrome for Developers — `content_security_policy`</a>
1375
+ - <img height=12 src="https://www.google.com/s2/favicons?domain=developer.chrome.com&sz=64">&ensp;<a target="_blank" href="https://developer.chrome.com/docs/extensions/reference/manifest/web-accessible-resources">Chrome for Developers — `web_accessible_resources`</a>
1376
+
1377
+ <div align="center">
1378
+
1379
+ [Back to index ↑][epce-rules]
1380
+
1381
+ </div>
1382
+
1383
+ ---
1384
+
1385
+ </details>
1386
+
1387
+ <h3 id="no-scrollbar-styling">
1388
+ <code>no-scrollbar-styling</code>
1389
+ <a title="Introduced in recent release" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0">
1390
+ <img height=16 align="middle" src="https://api.iconify.design/mdi/sprout.svg?color=%234a4a4a"></a>
1391
+ <a title="Only works in 'css/css' config block" href="#usage">
1392
+ <img height=18 alt="[CSS only]" src="https://img.shields.io/badge/CSS_only-dcd6f7?style=flat-square" align="middle"></a>
1393
+ <a title="Accepts array w/ options" href="#usage">
1394
+ <img height=18 alt="[Configurable]" src="https://img.shields.io/badge/Configurable-black?style=flat-square" align="middle"></a>
1395
+ <a title="Copy rule URL" target="_blank"
1396
+ href="https://copy-to-clipboard.onrender.com/copy/https%3A%2F%2Fcodeberg.org%2Fadamlui%2Feslint-plugin-chrome-extensions%2F%23no-scrollbar-styling">
1397
+ <img height=16 width=21 alt="[Copy rule URL]" src="https://api.iconify.design/mdi/content-copy.svg?color=%23cccccc" align="middle"></a>
1398
+ </h3>
1399
+
1400
+ <details>
1401
+
1402
+ <summary>Disallows scrollbar pseudo-elements (e.g. <code>::-webkit-scrollbar</code>) on unscoped selectors in content-script CSS.</summary>
1403
+
1404
+ <h4 id="no-scrollbar-styling-options">Options</h4>
1405
+
1406
+ - `allowedSelectors` (default `[]`) – selectors to explicitly allow (e.g. `['body::-webkit-scrollbar']`), as a single string or array <a title="Introduced in v2.7.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0"><img height=14 alt="[Since v2.7.0]" src="https://img.shields.io/badge/since-v2.7.0-8a9199?style=flat-square" align="middle"></a>
1407
+
1408
+ #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/gray.svg" align="bottom"> Incorrect code
1409
+
1410
+ ```diff
1411
+ ! ::-webkit-scrollbar { width: 8px }
1412
+ ! ::-webkit-scrollbar-thumb { background: #888 }
1413
+
1414
+ ! *::-webkit-scrollbar { width: 8px }
1415
+ ! body::-webkit-scrollbar { width: 8px }
1416
+ ! html::-webkit-scrollbar { width: 8px }
1417
+ ```
1418
+
1419
+ #### <img width=13 height=13 src="https://cdn.staticdelivr.com/gl/adamlui/eslint-plugin-greasemonkey/99f14247b2/assets/images/icons/square/with-symbol/green.svg" align="bottom"> Correct code
1420
+
1421
+ ```diff
1422
+ - ::-webkit-scrollbar { width: 8px }
1423
+ + .myext-panel::-webkit-scrollbar { width: 8px }
1424
+ - ::-webkit-scrollbar-thumb { background: #888 }
1425
+ + .myext-panel::-webkit-scrollbar-thumb { background: #888 }
1426
+
1427
+ - *::-webkit-scrollbar { width: 8px }
1428
+ + .myext-root::-webkit-scrollbar { width: 8px }
1429
+ - body::-webkit-scrollbar { width: 8px }
1430
+ + .myext-panel::-webkit-scrollbar { width: 8px }
1431
+ - html::-webkit-scrollbar { width: 8px }
1432
+ + .myext-panel::-webkit-scrollbar { width: 8px }
1433
+ ```
1434
+
1435
+ #### When not to use it
1436
+
1437
+ If you intentionally theme the host page's scrollbar. For individual selectors you still need, prefer `allowedSelectors` over disabling the rule.
1438
+
1439
+ #### Introduced in
1440
+
1441
+ <a target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.7.0">v2.7.0</a> (October 17, 2026)
1442
+
1443
+ #### See also
1444
+
1445
+ - [`no-host-page-selectors`](#no-host-page-selectors)
1446
+ <a title="Only works in 'css/css' config block" href="#usage"><img height=14 alt="[CSS only]" src="https://img.shields.io/badge/CSS_only-dcd6f7?style=flat-square" align="middle"></a>
1447
+ <a title="Accepts array w/ options" href="#no-host-page-selectors-options"><img height=14 alt="[Configurable]" src="https://img.shields.io/badge/Configurable-black?style=flat-square" align="middle"></a>
1448
+ - <img height=12 src="https://www.google.com/s2/favicons?domain=developer.mozilla.org&sz=64">&ensp;<a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/::-webkit-scrollbar">MDN — `::-webkit-scrollbar`</a>
1073
1449
 
1074
1450
  <div align="center">
1075
1451
 
@@ -1154,6 +1530,8 @@ If you legitimately require sensitive permissions, or prefer manual security rev
1154
1530
 
1155
1531
  <h3 id="no-unrestricted-host-permissions">
1156
1532
  <code>no-unrestricted-host-permissions</code>
1533
+ <a title="JS support added in recent release" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.6.0">
1534
+ <img height=16 align="middle" src="https://api.iconify.design/mdi/sprout.svg?color=%234a4a4a"></a>
1157
1535
  <a title="Included in recommended config" href="#usage">
1158
1536
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
1159
1537
  <a title="Included in security config" href="#usage">
@@ -1295,6 +1673,10 @@ If your i18n keys are referenced dynamically.
1295
1673
 
1296
1674
  <h3 id="no-unused-permissions">
1297
1675
  <code>no-unused-permissions</code>
1676
+ <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0">
1677
+ <img height=18 align="middle" src="https://api.iconify.design/ph/flag-banner-fold-fill.svg?color=%234a4a4a"></a>
1678
+ <a title="JS support added in recent release" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.6.0">
1679
+ <img height=16 align="middle" src="https://api.iconify.design/mdi/sprout.svg?color=%234a4a4a"></a>
1298
1680
  <a title="Included in recommended config" href="#usage">
1299
1681
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
1300
1682
  <a title="Works in 'json/json' config block" href="#usage">
@@ -1414,6 +1796,8 @@ If you intentionally omit a license, or it's injected at build time.
1414
1796
 
1415
1797
  <h3 id="require-mv3">
1416
1798
  <code>require-mv3</code>
1799
+ <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0">
1800
+ <img height=18 align="middle" src="https://api.iconify.design/ph/flag-banner-fold-fill.svg?color=%234a4a4a"></a>
1417
1801
  <a title="Included in recommended config" href="#usage">
1418
1802
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
1419
1803
  <a title="Works in 'json/json' config block" href="#usage">
@@ -1697,6 +2081,8 @@ If your license is injected at build time, or you use one w/ no existing SPDX id
1697
2081
 
1698
2082
  <h3 id="valid-manifest-icons">
1699
2083
  <code>valid-manifest-icons</code>
2084
+ <a title="JS support added in recent release" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.6.0">
2085
+ <img height=16 align="middle" src="https://api.iconify.design/mdi/sprout.svg?color=%234a4a4a"></a>
1700
2086
  <a title="Included in recommended config" href="#usage">
1701
2087
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
1702
2088
  <a title="Works in 'json/json' config block" href="#usage">
@@ -1770,6 +2156,8 @@ If your icons are injected at build time, or you target browsers that support SV
1770
2156
 
1771
2157
  <h3 id="valid-mv3-schema">
1772
2158
  <code>valid-mv3-schema</code>
2159
+ <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0">
2160
+ <img height=18 align="middle" src="https://api.iconify.design/ph/flag-banner-fold-fill.svg?color=%234a4a4a"></a>
1773
2161
  <a title="Included in recommended config" href="#usage">
1774
2162
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
1775
2163
  <a title="Works in 'json/json' config block" href="#usage">
@@ -1839,6 +2227,8 @@ If you intentionally target MV2 for a browser that still supports it (e.g. Firef
1839
2227
 
1840
2228
  <h3 id="valid-service-worker">
1841
2229
  <code>valid-service-worker</code>
2230
+ <a title="Introduced in v1.0.0" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v1.0.0">
2231
+ <img height=18 align="middle" src="https://api.iconify.design/ph/flag-banner-fold-fill.svg?color=%234a4a4a"></a>
1842
2232
  <a title="Included in recommended config" href="#usage">
1843
2233
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
1844
2234
  <a title="Accepts array w/ options" href="#usage">
@@ -1910,6 +2300,8 @@ If your background context isn't a service worker.
1910
2300
 
1911
2301
  <h3 id="valid-url-fields">
1912
2302
  <code>valid-url-fields</code>
2303
+ <a title="JS support added in recent release" target="_blank" href="https://codeberg.org/adamlui/eslint-plugin-chrome-extensions/releases/tag/v2.6.0">
2304
+ <img height=16 align="middle" src="https://api.iconify.design/mdi/sprout.svg?color=%234a4a4a"></a>
1913
2305
  <a title="Included in recommended config" href="#usage">
1914
2306
  <img height=18 alt="[Recommended]" src="https://img.shields.io/badge/Recommended-f1f20a?style=flat-square" align="middle"></a>
1915
2307
  <a title="Works in 'json/json' config block" href="#usage">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-chrome-extensions",
3
- "version": "2.6.0",
3
+ "version": "2.7.0",
4
4
  "description": "ESLint rules for Chrome extensions",
5
5
  "keywords": [
6
6
  "eslint",
@@ -69,7 +69,7 @@
69
69
  "@eslint/js": "^10.0.1",
70
70
  "@eslint/json": "^2.1.1",
71
71
  "@eslint/markdown": "^7.5.1",
72
- "@html-eslint/eslint-plugin": "^0.66.1",
72
+ "@html-eslint/eslint-plugin": "^0.67.0",
73
73
  "@stylistic/eslint-plugin": "^5.10.0",
74
74
  "eslint": "^10.12.0",
75
75
  "eslint-plugin-constructors": "^1.4.3",
@@ -81,7 +81,8 @@
81
81
  "eslint-plugin-package-json": "^1.10.1",
82
82
  "eslint-plugin-promise": "^7.3.0",
83
83
  "eslint-plugin-regexp": "^3.3.1",
84
- "eslint-plugin-security": "^4.2.0"
84
+ "eslint-plugin-security": "^4.2.0",
85
+ "eslint-plugin-woodpecker": "^1.0.0"
85
86
  },
86
87
  "peerDependencies": {
87
88
  "@eslint/css": ">=0.5.0",
package/src/data/regex.js CHANGED
@@ -6,5 +6,6 @@ export default {
6
6
  manifest: /manifest\.json$/,
7
7
  script: /\.[cm]?[jt]sx?$/i
8
8
  },
9
+ prefix: { at: /^@/, css: /^CSS/ },
9
10
  url: /^https?:\/\//
10
11
  }
package/src/index.js CHANGED
@@ -1,12 +1,8 @@
1
1
  import init from './utils/init.js'
2
- import deprecations from './data/deprecations.js'
3
2
 
4
3
  const plugin = init.plugin()
5
4
 
6
5
  init.rules(plugin)
7
6
  init.configs(plugin)
8
7
 
9
- for (const entry of Object.entries(deprecations.bundles))
10
- init.bundleDeprecation(plugin, entry, 'chrome-extensions')
11
-
12
8
  export { plugin as default, plugin as chromeExtensions }