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