diff --git a/.changeset/wild-bulldogs-move.md b/.changeset/wild-bulldogs-move.md new file mode 100644 index 0000000000..c3c5580f77 --- /dev/null +++ b/.changeset/wild-bulldogs-move.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: allow characters in the supplementary special-purpose plane diff --git a/packages/svelte/CHANGELOG.md b/packages/svelte/CHANGELOG.md index cb3b356cc7..72cd00bc6a 100644 --- a/packages/svelte/CHANGELOG.md +++ b/packages/svelte/CHANGELOG.md @@ -1,5 +1,11 @@ # svelte +## 5.28.2 + +### Patch Changes + +- fix: don't mark selector lists inside `:global` with multiple items as unused ([#15817](https://github.com/sveltejs/svelte/pull/15817)) + ## 5.28.1 ### Patch Changes diff --git a/packages/svelte/package.json b/packages/svelte/package.json index c91fbdd7d3..ff71429d2f 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -2,7 +2,7 @@ "name": "svelte", "description": "Cybernetically enhanced web apps", "license": "MIT", - "version": "5.28.1", + "version": "5.28.2", "type": "module", "types": "./types/index.d.ts", "engines": { diff --git a/packages/svelte/src/compiler/phases/1-parse/utils/html.js b/packages/svelte/src/compiler/phases/1-parse/utils/html.js index a68acb996f..a0c2a5b06f 100644 --- a/packages/svelte/src/compiler/phases/1-parse/utils/html.js +++ b/packages/svelte/src/compiler/phases/1-parse/utils/html.js @@ -72,6 +72,8 @@ const NUL = 0; // to replace them ourselves // // Source: http://en.wikipedia.org/wiki/Character_encodings_in_HTML#Illegal_characters +// Also see: https://en.wikipedia.org/wiki/Plane_(Unicode) +// Also see: https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream /** @param {number} code */ function validate_code(code) { @@ -116,5 +118,10 @@ function validate_code(code) { return code; } + // supplementary special-purpose plane 0xe0000 - 0xe07f and 0xe0100 - 0xe01ef + if ((code >= 917504 && code <= 917631) || (code >= 917760 && code <= 917999)) { + return code; + } + return NUL; } diff --git a/packages/svelte/src/compiler/phases/3-transform/css/index.js b/packages/svelte/src/compiler/phases/3-transform/css/index.js index 9f1142cce9..cee7ab2791 100644 --- a/packages/svelte/src/compiler/phases/3-transform/css/index.js +++ b/packages/svelte/src/compiler/phases/3-transform/css/index.js @@ -196,9 +196,12 @@ const visitors = { next(); }, SelectorList(node, { state, next, path }) { + const parent = path.at(-1); + // Only add comments if we're not inside a complex selector that itself is unused or a global block if ( - (!is_in_global_block(path) || node.children.length > 1) && + (!is_in_global_block(path) || + (node.children.length > 1 && parent?.type === 'Rule' && parent.metadata.is_global_block)) && !path.find((n) => n.type === 'ComplexSelector' && !n.metadata.used) ) { const children = node.children; @@ -260,7 +263,6 @@ const visitors = { // if this selector list belongs to a rule, require a specificity bump for the // first scoped selector but only if we're at the top level - let parent = path.at(-1); if (parent?.type === 'Rule') { specificity = { bumped: false }; @@ -376,7 +378,6 @@ const visitors = { }; /** - * * @param {Array} path */ function is_in_global_block(path) { diff --git a/packages/svelte/src/version.js b/packages/svelte/src/version.js index a19a773cd1..a3a9979d65 100644 --- a/packages/svelte/src/version.js +++ b/packages/svelte/src/version.js @@ -4,5 +4,5 @@ * The current version, as set in package.json. * @type {string} */ -export const VERSION = '5.28.1'; +export const VERSION = '5.28.2'; export const PUBLIC_VERSION = '5'; diff --git a/packages/svelte/tests/css/samples/global-block/_config.js b/packages/svelte/tests/css/samples/global-block/_config.js index a8b11a73ec..18a56e9a97 100644 --- a/packages/svelte/tests/css/samples/global-block/_config.js +++ b/packages/svelte/tests/css/samples/global-block/_config.js @@ -7,28 +7,28 @@ export default test({ code: 'css_unused_selector', message: 'Unused CSS selector ".unused :global"', start: { - line: 69, + line: 73, column: 1, - character: 917 + character: 964 }, end: { - line: 69, + line: 73, column: 16, - character: 932 + character: 979 } }, { code: 'css_unused_selector', message: 'Unused CSS selector "unused :global"', start: { - line: 100, + line: 104, column: 29, - character: 1223 + character: 1270 }, end: { - line: 100, + line: 104, column: 43, - character: 1237 + character: 1284 } } ] diff --git a/packages/svelte/tests/css/samples/global-block/expected.css b/packages/svelte/tests/css/samples/global-block/expected.css index 12f9a75032..be1838fd98 100644 --- a/packages/svelte/tests/css/samples/global-block/expected.css +++ b/packages/svelte/tests/css/samples/global-block/expected.css @@ -3,6 +3,10 @@ .x { color: green; } + + .a, .selector, .list { + color: green; + } /*}*/ div.svelte-xyz { diff --git a/packages/svelte/tests/css/samples/global-block/input.svelte b/packages/svelte/tests/css/samples/global-block/input.svelte index ee05205d67..86d438031a 100644 --- a/packages/svelte/tests/css/samples/global-block/input.svelte +++ b/packages/svelte/tests/css/samples/global-block/input.svelte @@ -5,6 +5,10 @@ .x { color: green; } + + .a, .selector, .list { + color: green; + } } div :global {