From 990f45a8c7e502e210ec2e945232a38418cef5dd Mon Sep 17 00:00:00 2001 From: baseballyama Date: Fri, 3 Jan 2025 20:58:57 +0900 Subject: [PATCH 1/6] ignore css_unused_selector error if style is global --- .../src/rules/valid-compile.ts | 33 ++++++++++++++++++- .../valid/global-style-input.svelte | 5 +++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/global-style-input.svelte diff --git a/packages/eslint-plugin-svelte/src/rules/valid-compile.ts b/packages/eslint-plugin-svelte/src/rules/valid-compile.ts index 74da07972..f215588f3 100644 --- a/packages/eslint-plugin-svelte/src/rules/valid-compile.ts +++ b/packages/eslint-plugin-svelte/src/rules/valid-compile.ts @@ -2,6 +2,7 @@ import { createRule } from '../utils/index.js'; import type { SvelteCompileWarnings, Warning } from '../shared/svelte-compile-warns/index.js'; import { getSvelteCompileWarnings } from '../shared/svelte-compile-warns/index.js'; import { getSourceCode } from '../utils/compat.js'; +import type { Position } from 'svelte-eslint-parser/lib/ast/common.js'; export default createRule('valid-compile', { meta: { @@ -48,12 +49,33 @@ export default createRule('valid-compile', { 'invalid-slot-name' ]; + const unusedSelectorWarnings = ['css_unused_selector', 'css-unused-selector']; + const globalStyleRanges: [Position, Position][] = []; + + function isGlobalStyleNode(start?: Position, end?: Position) { + if (start == null || end == null) { + return false; + } + return globalStyleRanges.some(([rangeStart, rangeEnd]) => { + return ( + (rangeStart.line < start.line || + (rangeStart.line === start.line && rangeStart.column <= start.column)) && + (end.line < rangeEnd.line || + (end.line === rangeEnd.line && end.column <= rangeEnd.column)) + ); + }); + } + /** * report */ function report({ warnings, kind }: SvelteCompileWarnings) { for (const warn of warnings) { - if (warn.code && ignores.includes(warn.code)) { + if ( + warn.code && + (ignores.includes(warn.code) || + (isGlobalStyleNode(warn.start, warn.end) && unusedSelectorWarnings.includes(warn.code))) + ) { continue; } const reportWarn = kind === 'warn' ? transform(warn) : warn; @@ -71,6 +93,15 @@ export default createRule('valid-compile', { } return { + SvelteStyleElement(node) { + const { attributes } = node.startTag; + for (const attr of attributes) { + if (attr.type === 'SvelteAttribute' && attr.key.name === 'global') { + globalStyleRanges.push([node.loc.start, node.loc.end]); + break; + } + } + }, 'Program:exit'() { const result = getSvelteCompileWarnings(context); if (ignoreWarnings && result.kind === 'warn') { diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/global-style-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/global-style-input.svelte new file mode 100644 index 000000000..8ee932466 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/global-style-input.svelte @@ -0,0 +1,5 @@ + From 2073d5e0b0cef46998e34ba3f2f698a2337cf82d Mon Sep 17 00:00:00 2001 From: baseballyama Date: Fri, 3 Jan 2025 20:59:36 +0900 Subject: [PATCH 2/6] changeset --- .changeset/nice-clocks-buy.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/nice-clocks-buy.md diff --git a/.changeset/nice-clocks-buy.md b/.changeset/nice-clocks-buy.md new file mode 100644 index 000000000..da3ae8585 --- /dev/null +++ b/.changeset/nice-clocks-buy.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': patch +--- + +fix: ignore css_unused_selector error if style tag has global attribute From 6bbf2240fbece0af2f2d9114fccb15f73a028df8 Mon Sep 17 00:00:00 2001 From: Yuichiro Yamashita Date: Fri, 3 Jan 2025 21:23:04 +0900 Subject: [PATCH 3/6] Update .changeset/nice-clocks-buy.md --- .changeset/nice-clocks-buy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/nice-clocks-buy.md b/.changeset/nice-clocks-buy.md index da3ae8585..e7def6960 100644 --- a/.changeset/nice-clocks-buy.md +++ b/.changeset/nice-clocks-buy.md @@ -2,4 +2,4 @@ 'eslint-plugin-svelte': patch --- -fix: ignore css_unused_selector error if style tag has global attribute +fix: ignore `css_unused_selector` compile error if ` diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-requirements.json new file mode 100644 index 000000000..b650cc296 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-01-requirements.json @@ -0,0 +1,3 @@ +{ + "svelte": "^3.0.0 || ^4.0.0" +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-errors.yaml new file mode 100644 index 000000000..af1ae04c2 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-errors.yaml @@ -0,0 +1,6 @@ +- message: |- + Unused CSS selector "input" + https://svelte.dev/e/css_unused_selector(css_unused_selector) + line: 2 + column: 2 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-input.svelte new file mode 100644 index 000000000..c8c3bc812 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-input.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-requirements.json new file mode 100644 index 000000000..0192b1098 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/style-without-global-02-requirements.json @@ -0,0 +1,3 @@ +{ + "svelte": ">=5.0.0-0" +} From 7199a2bc06e621668c041722d56b09b2f5cba979 Mon Sep 17 00:00:00 2001 From: baseballyama Date: Fri, 3 Jan 2025 21:36:30 +0900 Subject: [PATCH 6/6] revert --- .../tests/fixtures/rules/.DS_Store | Bin 8196 -> 0 bytes .../invalid/calc01-errors.yaml | 5 ----- .../invalid/calc01-output.svelte | 2 +- 3 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/.DS_Store diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/.DS_Store b/packages/eslint-plugin-svelte/tests/fixtures/rules/.DS_Store deleted file mode 100644 index 1685005caf666eaa1ef1bc2a4f0d0e95ec754cd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMTWl0n82=2pMStNVnKxTcK51dI3vCF54RgTxWNNGGRKi?96V9 zgjglMfVadLpTtY_Q4-@N#smWi4@93dmB5Q8nE0X(#;8vw_@6nmU|V?bp@zszGUuQF zHfQFW|2wDu767oTXtn^<1At5?m#m70+Z^1_&pC$_St>~)&o*sq+ zri6^g7=ajpxd?FjB*CSwy$P%t{kuap15C2pCwU)KtI}FS)R`jiX7RA{mtB0cf5u0wu!)j-NfXcbWb*t8_ zZESAq*xJ*#YwvXReM?x4x=bA<#NEI?Y+Hr>hM%)s({{%OCu}n~GF-BKJL^~jt}$*Y zHJDMRtCz2+UzyM}5pXM^96D0W+Q*7^aGW*BayZ9oO;-<^^l-a8lh0zx>{GfA&EBBt z+5ztAE?6|0QNlXyL3O~VcaWJO0+Z@Sb>JwKio$$hX;B~61|1`7ISMnyJniacZMY<` zRan0;cB+qQBROw;oLe`bQ@DP7a{^BZn6&G1F)m#?VS(%PWRzLn`a*>1@uj?iZp zRFNA}8^jk9*fyk^qYoy-O4vv{<`Zy`_?L%M@DjWQXW>Km3@*ag@C{sp@8Jiy4nM*# z@EiPvl~|2SkYNoba2>A44cLgSn8Iz?h5fh(_hK3c@DOG(hZY`24~tmBNj#1(;AuRA zFXJotCccC3;`{gkp2PF_C0@Xb_!WMKSMVxc!|V7v{(*nu4M~wysYZBD?z0@cr zr8cQU>J-l|l^J+oX7Ncqq|e(5MGTBqDCyYk7?{|;L+!gO75!c2{j17syv0w!*FoZtH7Ro}Z&mn`!64KV ziS8b{(K7yOE10Tg++>Sf2 zkBWZ)2XP2TaFj~lq~ae#8w==TKm>RWr|@|^g)dV1zlyKn>-Ywq#kYwF??puT7(ba+ z*gIzyHlCl)!Y-u?uH(65G)I|OGp8r5LRji~|KEG(-~Z?2#fBJx7=ix}0$ACT?&+fU zxzkF)du^T0XXxYykDC%QOre2?aC_K}lf3y4L%P-@Un-JQLXwA$|NMu5868Tz|KI!@ OR_wI#{(q0`|9=CdtFayc diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-reactive-access/invalid/calc01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-reactive-access/invalid/calc01-errors.yaml index 8b4c3942a..139fa6c18 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-reactive-access/invalid/calc01-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-reactive-access/invalid/calc01-errors.yaml @@ -23,11 +23,6 @@ line: 13 column: 15 suggestions: null -- message: Unused eslint-disable directive (no problems were reported from - 'no-implicit-coercion'). - line: 14 - column: 2 - suggestions: null - message: Use the $ prefix or the get function to access reactive values instead of accessing the raw store. line: 15 diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-reactive-access/invalid/calc01-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-reactive-access/invalid/calc01-output.svelte index 257ef37c7..95d67cbe0 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-reactive-access/invalid/calc01-output.svelte +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-reactive-access/invalid/calc01-output.svelte @@ -11,7 +11,7 @@ // UnaryExpression console.log(-$store); - + // eslint-disable-next-line no-implicit-coercion -- test console.log(+$store); console.log(!store); console.log(~$store);