diff --git a/.changeset/true-berries-behave.md b/.changeset/true-berries-behave.md new file mode 100644 index 0000000000..0b9df87c4f --- /dev/null +++ b/.changeset/true-berries-behave.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: avoid duplicating escaped characters in CSS AST 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 c88a3707c1..55647b2c94 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/style.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/style.js @@ -508,8 +508,12 @@ function read_value(parser) { if (escaped) { value += '\\' + char; escaped = false; + parser.index++; + continue; } else if (char === '\\') { escaped = true; + parser.index++; + continue; } else if (char === quote_mark) { quote_mark = null; } else if (char === ')') { diff --git a/packages/svelte/tests/css-parse.test.ts b/packages/svelte/tests/css-parse.test.ts index fcb9bdc010..4d8ef8601b 100644 --- a/packages/svelte/tests/css-parse.test.ts +++ b/packages/svelte/tests/css-parse.test.ts @@ -135,4 +135,19 @@ describe('parseCss', () => { } } }); + + it('parses escaped characters', () => { + const ast = parseCss("div { background: url('./example.png?\\''); }"); + assert.equal(ast.type, 'StyleSheet'); + assert.equal(ast.children.length, 1); + const rule = ast.children[0]; + assert.equal(rule.type, 'Rule'); + if (rule.type === 'Rule') { + const declaration = rule.block.children[0]; + assert.equal(declaration.type, 'Declaration'); + if (declaration.type === 'Declaration') { + assert.equal(declaration.value, "url('./example.png?\\'')"); + } + } + }); });