diff --git a/.changeset/seven-hornets-smile.md b/.changeset/seven-hornets-smile.md new file mode 100644 index 000000000000..7ae0106acb91 --- /dev/null +++ b/.changeset/seven-hornets-smile.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: correctly parse at-rules containing special characters in strings diff --git a/packages/svelte/src/compiler/phases/1-parse/read/style.js b/packages/svelte/src/compiler/phases/1-parse/read/style.js index 545542d80f4b..ff9f9a8fecca 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/style.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/style.js @@ -9,7 +9,6 @@ const REGEX_PERCENTAGE = /^\d+(\.\d+)?%/; const REGEX_NTH_OF = /^(even|odd|\+?(\d+|\d*n(\s*[+-]\s*\d+)?)|-\d*n(\s*\+\s*\d+))((?=\s*[,)])|\s+of\s+)/; const REGEX_WHITESPACE_OR_COLON = /[\s:]/; -const REGEX_BRACE_OR_SEMICOLON = /[{;]/; const REGEX_LEADING_HYPHEN_OR_DIGIT = /-?\d/; const REGEX_VALID_IDENTIFIER_CHAR = /[a-zA-Z0-9_-]/; const REGEX_COMMENT_CLOSE = /\*\//; @@ -79,7 +78,7 @@ function read_at_rule(parser) { const name = read_identifier(parser); - const prelude = parser.read_until(REGEX_BRACE_OR_SEMICOLON).trim(); + const prelude = read_value(parser); /** @type {import('#compiler').Css.Block | null} */ let block = null; @@ -398,7 +397,7 @@ function read_declaration(parser) { parser.eat(':'); parser.allow_whitespace(); - const value = read_declaration_value(parser); + const value = read_value(parser); const end = parser.index; @@ -419,7 +418,7 @@ function read_declaration(parser) { * @param {import('../index.js').Parser} parser * @returns {string} */ -function read_declaration_value(parser) { +function read_value(parser) { let value = ''; let escaped = false; let in_url = false; @@ -443,7 +442,7 @@ function read_declaration_value(parser) { quote_mark = char; } else if (char === '(' && value.slice(-3) === 'url') { in_url = true; - } else if ((char === ';' || char === '}') && !in_url && !quote_mark) { + } else if ((char === ';' || char === '{' || char === '}') && !in_url && !quote_mark) { return value.trim(); } diff --git a/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/input.svelte b/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/input.svelte new file mode 100644 index 000000000000..8473391f94da --- /dev/null +++ b/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/input.svelte @@ -0,0 +1,10 @@ +