diff --git a/packages/svelte/src/compiler/errors.js b/packages/svelte/src/compiler/errors.js index a4000fb111..7c46bd1b4d 100644 --- a/packages/svelte/src/compiler/errors.js +++ b/packages/svelte/src/compiler/errors.js @@ -24,7 +24,7 @@ const internal = { const parse = { /** @param {string} name */ 'unclosed-element': (name) => `<${name}> was left open`, - 'unclosed-block': () => `block was left open`, + 'unclosed-block': () => `Block was left open`, 'unexpected-block-close': () => `Unexpected block closing tag`, 'unexpected-eof': () => `Unexpected end of input`, /** @param {string} message */ diff --git a/packages/svelte/src/compiler/phases/1-parse/index.js b/packages/svelte/src/compiler/phases/1-parse/index.js index 5199ad5960..d74c776efc 100644 --- a/packages/svelte/src/compiler/phases/1-parse/index.js +++ b/packages/svelte/src/compiler/phases/1-parse/index.js @@ -77,8 +77,10 @@ export class Parser { const current = this.current(); if (current.type === 'RegularElement') { + current.end = current.start + 1; error(current, 'unclosed-element', current.name); } else { + current.end = current.start + 1; error(current, 'unclosed-block'); } } diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index a5e2a2a82a..31a3b2fe42 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -202,11 +202,12 @@ export default function tag(parser) { let attribute; while ((attribute = read(parser))) { - if ( - (attribute.type === 'Attribute' || attribute.type === 'BindDirective') && - unique_names.includes(attribute.name) - ) { - error(attribute.start, 'duplicate-attribute'); + if (attribute.type === 'Attribute' || attribute.type === 'BindDirective') { + if (unique_names.includes(attribute.name)) { + error(attribute.start, 'duplicate-attribute'); + } else { + unique_names.push(attribute.name); + } } element.attributes.push(attribute); @@ -635,13 +636,14 @@ function read_attribute_value(parser) { 'in attribute value' ); } catch (/** @type {any} e */ e) { - if (e.code === 'parse-error') { + if (e.code === 'js-parse-error') { // if the attribute value didn't close + self-closing tag // eg: `` // acorn may throw a `Unterminated regular expression` because of `/>` - if (parser.template.slice(e.pos - 1, e.pos + 1) === '/>') { - parser.index = e.pos; - error(e.pos, 'unclosed-attribute-value', quote_mark || '}'); + const pos = e.position?.[0]; + if (pos !== undefined && parser.template.slice(pos - 1, pos + 1) === '/>') { + parser.index = pos; + error(pos, 'unclosed-attribute-value', quote_mark || '}'); } } throw e; diff --git a/packages/svelte/tests/compiler-errors/samples/class-state-field-static/_config.js b/packages/svelte/tests/compiler-errors/samples/class-state-field-static/_config.js index b6dca4e40d..27991ba427 100644 --- a/packages/svelte/tests/compiler-errors/samples/class-state-field-static/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/class-state-field-static/_config.js @@ -4,6 +4,6 @@ export default test({ error: { code: 'invalid-state-location', message: '$state() can only be used as a variable declaration initializer or a class field', - position: process.platform === 'win32' ? [35, 43] : [33, 41] + position: [33, 41] } }); diff --git a/packages/svelte/tests/compiler-errors/samples/css-global-without-selector/_config.js b/packages/svelte/tests/compiler-errors/samples/css-global-without-selector/_config.js index c8e598d4a8..fc5349f233 100644 --- a/packages/svelte/tests/compiler-errors/samples/css-global-without-selector/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/css-global-without-selector/_config.js @@ -2,7 +2,7 @@ import { test } from '../../test'; export default test({ error: { - code: 'css-syntax-error', + code: 'invalid-css-identifier', message: ':global() must contain a selector', position: [9, 9] } diff --git a/packages/svelte/tests/compiler-errors/samples/css/_config.js b/packages/svelte/tests/compiler-errors/samples/css/_config.js index d1a7e346f9..9e7cd16601 100644 --- a/packages/svelte/tests/compiler-errors/samples/css/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/css/_config.js @@ -2,7 +2,7 @@ import { test } from '../../test'; export default test({ error: { - code: 'css-syntax-error', + code: 'invalid-css-identifier', message: '"{" is expected', position: [24, 24] } diff --git a/packages/svelte/tests/compiler-errors/samples/empty-classname-binding/_config.js b/packages/svelte/tests/compiler-errors/samples/empty-classname-binding/_config.js index 0051e827a5..bd1d1d7682 100644 --- a/packages/svelte/tests/compiler-errors/samples/empty-classname-binding/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/empty-classname-binding/_config.js @@ -3,7 +3,7 @@ import { test } from '../../test'; export default test({ error: { code: 'empty-directive-name', - message: 'Class name cannot be empty', + message: 'ClassDirective name cannot be empty', position: [10, 10] } }); diff --git a/packages/svelte/tests/compiler-errors/samples/empty-directive-name/_config.js b/packages/svelte/tests/compiler-errors/samples/empty-directive-name/_config.js index 7f6d0f1d0f..48a0eb32c4 100644 --- a/packages/svelte/tests/compiler-errors/samples/empty-directive-name/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/empty-directive-name/_config.js @@ -3,7 +3,7 @@ import { test } from '../../test'; export default test({ error: { code: 'empty-directive-name', - message: 'Action name cannot be empty', + message: 'UseDirective name cannot be empty', position: [8, 8] } }); diff --git a/packages/svelte/tests/compiler-errors/samples/illegal-expression/_config.js b/packages/svelte/tests/compiler-errors/samples/illegal-expression/_config.js index 659679c345..887f11e882 100644 --- a/packages/svelte/tests/compiler-errors/samples/illegal-expression/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/illegal-expression/_config.js @@ -2,7 +2,7 @@ import { test } from '../../test'; export default test({ error: { - code: 'parse-error', + code: 'js-parse-error', message: 'Assigning to rvalue', position: [1, 1] } diff --git a/packages/svelte/tests/compiler-errors/samples/multiple-styles/_config.js b/packages/svelte/tests/compiler-errors/samples/multiple-styles/_config.js index da3e69fc1e..66cdcd9553 100644 --- a/packages/svelte/tests/compiler-errors/samples/multiple-styles/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/multiple-styles/_config.js @@ -2,7 +2,7 @@ import { test } from '../../test'; export default test({ error: { - code: 'duplicate-style', + code: 'duplicate-style-element', message: 'You can only have one top-level