diff --git a/packages/svelte/messages/compile-errors/attributes.md b/packages/svelte/messages/compile-errors/attributes.md index 239b71a43c..9501080ee0 100644 --- a/packages/svelte/messages/compile-errors/attributes.md +++ b/packages/svelte/messages/compile-errors/attributes.md @@ -48,7 +48,7 @@ Cannot use `%type%:` alongside existing `%existing%:` directive ## invalid_let_directive_placement -TODO +`let:` directive at invalid position ## invalid_style_directive_modifier diff --git a/packages/svelte/messages/compile-errors/css.md b/packages/svelte/messages/compile-errors/css.md index 02acd29e5a..a14eb8c190 100644 --- a/packages/svelte/messages/compile-errors/css.md +++ b/packages/svelte/messages/compile-errors/css.md @@ -52,4 +52,4 @@ Nesting selectors can only be used inside a rule ## invalid_css_declaration -TODO +Declaration cannot be empty diff --git a/packages/svelte/src/compiler/errors.js b/packages/svelte/src/compiler/errors.js index 0dfee4ec16..32bb014105 100644 --- a/packages/svelte/src/compiler/errors.js +++ b/packages/svelte/src/compiler/errors.js @@ -173,7 +173,7 @@ export function transition_conflict(node, type, existing) { * @returns {never} */ export function invalid_let_directive_placement(node) { - e(node, "invalid_let_directive_placement", "TODO"); + e(node, "invalid_let_directive_placement", "`let:` directive at invalid position"); } /** @@ -436,7 +436,7 @@ export function invalid_nesting_selector(node) { * @returns {never} */ export function invalid_css_declaration(node) { - e(node, "invalid_css_declaration", "TODO"); + e(node, "invalid_css_declaration", "Declaration cannot be empty"); } /** 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 78988af6d1..619f1703ad 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -738,12 +738,12 @@ function read_sequence(parser, done, location) { const index = parser.index - 1; parser.eat('#'); const name = parser.read_until(/[^a-z]/); - e.invalid_block_placement(index, location, name); + e.invalid_block_placement(index, name, location); } else if (parser.match('@')) { const index = parser.index - 1; parser.eat('@'); const name = parser.read_until(/[^a-z]/); - e.invalid_tag_placement(index, location, name); + e.invalid_tag_placement(index, name, location); } flush(parser.index - 1); diff --git a/packages/svelte/src/compiler/phases/2-analyze/validation.js b/packages/svelte/src/compiler/phases/2-analyze/validation.js index 7a416a2af0..86be1146a3 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/validation.js +++ b/packages/svelte/src/compiler/phases/2-analyze/validation.js @@ -187,14 +187,17 @@ function validate_element(node, context) { } } else if (attribute.type === 'TransitionDirective') { const existing = /** @type {import('#compiler').TransitionDirective | null} */ ( - attribute.intro ? in_transition : out_transition + (attribute.intro && in_transition) || (attribute.outro && out_transition) ); - if (existing !== null) { - if (attribute.name === existing.name) { - e.transition_duplicate(attribute, attribute.name); + if (existing) { + const a = existing.intro ? (existing.outro ? 'transition' : 'in') : 'out'; + const b = attribute.intro ? (attribute.outro ? 'transition' : 'in') : 'out'; + + if (a === b) { + e.transition_duplicate(attribute, a); } else { - e.transition_conflict(attribute, attribute.name, existing.name); + e.transition_conflict(attribute, a, b); } } @@ -205,7 +208,7 @@ function validate_element(node, context) { let conflicting_passive_modifier = ''; for (const modifier of attribute.modifiers) { if (!EventModifiers.includes(modifier)) { - const list = `${EventModifiers.slice(0, 1)} or ${EventModifiers.at(-1)}`; + const list = `${EventModifiers.slice(0, -1).join(', ')} or ${EventModifiers.at(-1)}`; e.invalid_event_modifier(attribute, list); } if (modifier === 'passive') { @@ -451,7 +454,7 @@ const validation = { if (!contenteditable) { e.missing_contenteditable_attribute(node); } else if (!is_text_attribute(contenteditable) && contenteditable.value !== true) { - e.dynamic_contenteditable_attribute(node); + e.dynamic_contenteditable_attribute(contenteditable); } } } else { @@ -459,7 +462,7 @@ const validation = { if (match) { const property = binding_properties[match]; if (!property.valid_elements || property.valid_elements.includes(parent.name)) { - e.bind_invalid_detailed(node, node.name, ` Did you mean '${match}'?`); + e.bind_invalid_detailed(node, node.name, `Did you mean '${match}'?`); } } e.bind_invalid(node, node.name); @@ -1026,6 +1029,8 @@ function validate_no_const_assignment(node, argument, scope, is_binding) { // TODO have a more specific error message for assignments to things like `{:then foo}` const thing = 'constant'; + console.log(binding); + if (is_binding) { e.invalid_binding(node, thing); } else { diff --git a/packages/svelte/tests/validator/samples/animation-duplicate/errors.json b/packages/svelte/tests/validator/samples/animation-duplicate/errors.json index 487196fc8f..03229646be 100644 --- a/packages/svelte/tests/validator/samples/animation-duplicate/errors.json +++ b/packages/svelte/tests/validator/samples/animation-duplicate/errors.json @@ -1,6 +1,6 @@ [ { - "code": "duplicate_animation", + "code": "animation_duplicate", "message": "An element can only have one 'animate' directive", "start": { "line": 7, diff --git a/packages/svelte/tests/validator/samples/animation-not-in-each/errors.json b/packages/svelte/tests/validator/samples/animation-not-in-each/errors.json index cbb4fab4c4..2b5f73585d 100644 --- a/packages/svelte/tests/validator/samples/animation-not-in-each/errors.json +++ b/packages/svelte/tests/validator/samples/animation-not-in-each/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid_animation", - "message": "An element that uses the animate directive must be the immediate child of a keyed each block", + "code": "animation_invalid_placement", + "message": "An element that uses the `animate:` directive must be the only child of a keyed `{#each ...}` block", "start": { "line": 5, "column": 5 diff --git a/packages/svelte/tests/validator/samples/animation-not-in-keyed-each/errors.json b/packages/svelte/tests/validator/samples/animation-not-in-keyed-each/errors.json index 4e4423dfa7..945376a1b1 100644 --- a/packages/svelte/tests/validator/samples/animation-not-in-keyed-each/errors.json +++ b/packages/svelte/tests/validator/samples/animation-not-in-keyed-each/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid_animation", - "message": "An element that uses the animate directive must be used inside a keyed each block. Did you forget to add a key to your each block?", + "code": "animation_missing_key", + "message": "An element that uses the `animate:` directive must be the only child of a keyed `{#each ...}` block. Did you forget to add a key to your each block?", "start": { "line": 6, "column": 6 diff --git a/packages/svelte/tests/validator/samples/animation-siblings/errors.json b/packages/svelte/tests/validator/samples/animation-siblings/errors.json index 46648d96fc..b6412ebca4 100644 --- a/packages/svelte/tests/validator/samples/animation-siblings/errors.json +++ b/packages/svelte/tests/validator/samples/animation-siblings/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid_animation", - "message": "An element that uses the animate directive must be the sole child of a keyed each block", + "code": "animation_invalid_placement", + "message": "An element that uses the `animate:` directive must be the only child of a keyed `{#each ...}` block", "start": { "line": 6, "column": 6 diff --git a/packages/svelte/tests/validator/samples/binding-await-catch/errors.json b/packages/svelte/tests/validator/samples/binding-await-catch/errors.json index c2acbb2e8d..93dea97135 100644 --- a/packages/svelte/tests/validator/samples/binding-await-catch/errors.json +++ b/packages/svelte/tests/validator/samples/binding-await-catch/errors.json @@ -1,6 +1,6 @@ [ { - "code": "invalid_assignment", + "code": "invalid_binding", "message": "Invalid binding to const variable ($derived values, let: directives, :then/:catch variables and @const declarations count as const)", "start": { "line": 6, diff --git a/packages/svelte/tests/validator/samples/binding-await-then-2/errors.json b/packages/svelte/tests/validator/samples/binding-await-then-2/errors.json index f0f4a7a3fd..71a45827e8 100644 --- a/packages/svelte/tests/validator/samples/binding-await-then-2/errors.json +++ b/packages/svelte/tests/validator/samples/binding-await-then-2/errors.json @@ -1,6 +1,6 @@ [ { - "code": "invalid_assignment", + "code": "invalid_binding", "message": "Invalid binding to const variable ($derived values, let: directives, :then/:catch variables and @const declarations count as const)", "start": { "line": 6, diff --git a/packages/svelte/tests/validator/samples/binding-await-then/errors.json b/packages/svelte/tests/validator/samples/binding-await-then/errors.json index c4f6009c78..ebc7ee5114 100644 --- a/packages/svelte/tests/validator/samples/binding-await-then/errors.json +++ b/packages/svelte/tests/validator/samples/binding-await-then/errors.json @@ -1,6 +1,6 @@ [ { - "code": "invalid_assignment", + "code": "invalid_binding", "message": "Invalid binding to const variable ($derived values, let: directives, :then/:catch variables and @const declarations count as const)", "start": { "line": 5, diff --git a/packages/svelte/tests/validator/samples/binding-const/errors.json b/packages/svelte/tests/validator/samples/binding-const/errors.json index 213a0808f7..d2f8b1a8b3 100644 --- a/packages/svelte/tests/validator/samples/binding-const/errors.json +++ b/packages/svelte/tests/validator/samples/binding-const/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid_assignment", - "message": "Invalid binding to const variable", + "code": "invalid_binding", + "message": "Cannot bind to constant", "start": { "line": 5, "column": 7 diff --git a/packages/svelte/tests/validator/samples/binding-invalid-foreign-namespace/errors.json b/packages/svelte/tests/validator/samples/binding-invalid-foreign-namespace/errors.json index 0049ed5359..de997e5394 100644 --- a/packages/svelte/tests/validator/samples/binding-invalid-foreign-namespace/errors.json +++ b/packages/svelte/tests/validator/samples/binding-invalid-foreign-namespace/errors.json @@ -1,7 +1,7 @@ [ { - "code": "bind_invalid_target", - "message": "'value' is not a valid binding. Foreign elements only support bind:this", + "code": "bind_invalid_detailed", + "message": "`bind:value` is not a valid binding. Foreign elements only support `bind:this`", "start": { "line": 6, "column": 7 diff --git a/packages/svelte/tests/validator/samples/binding-invalid/errors.json b/packages/svelte/tests/validator/samples/binding-invalid/errors.json index 280360c625..9e0e455eaf 100644 --- a/packages/svelte/tests/validator/samples/binding-invalid/errors.json +++ b/packages/svelte/tests/validator/samples/binding-invalid/errors.json @@ -1,7 +1,7 @@ [ { - "code": "bind_invalid_target", - "message": "'whatever' is not a valid binding", + "code": "bind_invalid", + "message": "`bind:whatever` is not a valid binding", "start": { "line": 5, "column": 5 diff --git a/packages/svelte/tests/validator/samples/binding-let/errors.json b/packages/svelte/tests/validator/samples/binding-let/errors.json index a133cbd1ea..cee8dd0177 100644 --- a/packages/svelte/tests/validator/samples/binding-let/errors.json +++ b/packages/svelte/tests/validator/samples/binding-let/errors.json @@ -1,6 +1,6 @@ [ { - "code": "invalid_assignment", + "code": "invalid_binding", "message": "Invalid binding to const variable ($derived values, let: directives, :then/:catch variables and @const declarations count as const)", "start": { "line": 6, diff --git a/packages/svelte/tests/validator/samples/component-event-modifiers-invalid/errors.json b/packages/svelte/tests/validator/samples/component-event-modifiers-invalid/errors.json index 275f5c5b07..14288a1385 100644 --- a/packages/svelte/tests/validator/samples/component-event-modifiers-invalid/errors.json +++ b/packages/svelte/tests/validator/samples/component-event-modifiers-invalid/errors.json @@ -1,7 +1,7 @@ [ { "message": "Event modifiers other than 'once' can only be used on DOM elements", - "code": "invalid_event_modifier", + "code": "invalid_component_event_modifier", "start": { "line": 6, "column": 8 diff --git a/packages/svelte/tests/validator/samples/component-slot-default-reserved/errors.json b/packages/svelte/tests/validator/samples/component-slot-default-reserved/errors.json index 0f4af538a4..190c4d81a2 100644 --- a/packages/svelte/tests/validator/samples/component-slot-default-reserved/errors.json +++ b/packages/svelte/tests/validator/samples/component-slot-default-reserved/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid_slot_name", - "message": "default is a reserved word — it cannot be used as a slot name", + "code": "invalid_slot_name_default", + "message": "`default` is a reserved word — it cannot be used as a slot name", "start": { "line": 1, "column": 6 diff --git a/packages/svelte/tests/validator/samples/const-tag-conflict-1/errors.json b/packages/svelte/tests/validator/samples/const-tag-conflict-1/errors.json index d63fcd88e7..07c6cbadca 100644 --- a/packages/svelte/tests/validator/samples/const-tag-conflict-1/errors.json +++ b/packages/svelte/tests/validator/samples/const-tag-conflict-1/errors.json @@ -1,7 +1,7 @@ [ { "code": "duplicate_declaration", - "message": "'a' has already been declared", + "message": "`a` has already been declared", "start": { "line": 7, "column": 10 diff --git a/packages/svelte/tests/validator/samples/const-tag-conflict-2/errors.json b/packages/svelte/tests/validator/samples/const-tag-conflict-2/errors.json index f7df4a21c4..543f2a0217 100644 --- a/packages/svelte/tests/validator/samples/const-tag-conflict-2/errors.json +++ b/packages/svelte/tests/validator/samples/const-tag-conflict-2/errors.json @@ -1,7 +1,7 @@ [ { "code": "duplicate_declaration", - "message": "'item' has already been declared", + "message": "`item` has already been declared", "start": { "line": 6, "column": 10 diff --git a/packages/svelte/tests/validator/samples/const-tag-readonly-2/errors.json b/packages/svelte/tests/validator/samples/const-tag-readonly-2/errors.json index eb6c7390aa..87e9234fbe 100644 --- a/packages/svelte/tests/validator/samples/const-tag-readonly-2/errors.json +++ b/packages/svelte/tests/validator/samples/const-tag-readonly-2/errors.json @@ -1,6 +1,6 @@ [ { - "code": "invalid_assignment", + "code": "invalid_binding", "message": "Invalid binding to const variable ($derived values, let: directives, :then/:catch variables and @const declarations count as const)", "start": { "line": 7, diff --git a/packages/svelte/tests/validator/samples/dollar-dollar-global-in-markup/errors.json b/packages/svelte/tests/validator/samples/dollar-dollar-global-in-markup/errors.json index ec2497f40e..630f8c5ea2 100644 --- a/packages/svelte/tests/validator/samples/dollar-dollar-global-in-markup/errors.json +++ b/packages/svelte/tests/validator/samples/dollar-dollar-global-in-markup/errors.json @@ -1,7 +1,7 @@ [ { "code": "illegal_global", - "message": "$$billsyall is an illegal variable name. To reference a global variable called $$billsyall, use globalThis.$$billsyall", + "message": "`$$billsyall` is an illegal variable name. To reference a global variable called `$$billsyall`, use `globalThis.$$billsyall`", "start": { "line": 1, "column": 1 diff --git a/packages/svelte/tests/validator/samples/dollar-dollar-global-in-script/errors.json b/packages/svelte/tests/validator/samples/dollar-dollar-global-in-script/errors.json index 85ad4c6df9..5876bcae80 100644 --- a/packages/svelte/tests/validator/samples/dollar-dollar-global-in-script/errors.json +++ b/packages/svelte/tests/validator/samples/dollar-dollar-global-in-script/errors.json @@ -1,7 +1,7 @@ [ { "code": "illegal_global", - "message": "$$billsyall is an illegal variable name. To reference a global variable called $$billsyall, use globalThis.$$billsyall", + "message": "`$$billsyall` is an illegal variable name. To reference a global variable called `$$billsyall`, use `globalThis.$$billsyall`", "start": { "line": 2, "column": 1 diff --git a/packages/svelte/tests/validator/samples/dollar-global-in-markup/errors.json b/packages/svelte/tests/validator/samples/dollar-global-in-markup/errors.json index c7231a3915..1623518ca0 100644 --- a/packages/svelte/tests/validator/samples/dollar-global-in-markup/errors.json +++ b/packages/svelte/tests/validator/samples/dollar-global-in-markup/errors.json @@ -1,7 +1,7 @@ [ { "code": "illegal_global", - "message": "$ is an illegal variable name. To reference a global variable called $, use globalThis.$", + "message": "`$` is an illegal variable name. To reference a global variable called `$`, use `globalThis.$`", "start": { "line": 1, "column": 1 diff --git a/packages/svelte/tests/validator/samples/dollar-global-in-script/errors.json b/packages/svelte/tests/validator/samples/dollar-global-in-script/errors.json index e1909896e6..5d33dc3d83 100644 --- a/packages/svelte/tests/validator/samples/dollar-global-in-script/errors.json +++ b/packages/svelte/tests/validator/samples/dollar-global-in-script/errors.json @@ -1,7 +1,7 @@ [ { "code": "illegal_global", - "message": "$ is an illegal variable name. To reference a global variable called $, use globalThis.$", + "message": "`$` is an illegal variable name. To reference a global variable called `$`, use `globalThis.$`", "start": { "line": 2, "column": 1 diff --git a/packages/svelte/tests/validator/samples/dynamic-element-missing-tag/errors.json b/packages/svelte/tests/validator/samples/dynamic-element-missing-tag/errors.json index 615138f3b0..d31bd1964c 100644 --- a/packages/svelte/tests/validator/samples/dynamic-element-missing-tag/errors.json +++ b/packages/svelte/tests/validator/samples/dynamic-element-missing-tag/errors.json @@ -1,7 +1,7 @@ [ { "code": "missing_svelte_element_definition", - "message": " must have a 'this' attribute", + "message": "`` must have a 'this' attribute", "start": { "line": 2, "column": 1 diff --git a/packages/svelte/tests/validator/samples/illegal-variable-declaration/errors.json b/packages/svelte/tests/validator/samples/illegal-variable-declaration/errors.json index 61f0ad0fed..d55986ec5a 100644 --- a/packages/svelte/tests/validator/samples/illegal-variable-declaration/errors.json +++ b/packages/svelte/tests/validator/samples/illegal-variable-declaration/errors.json @@ -1,7 +1,7 @@ [ { "code": "illegal_variable_declaration", - "message": "Cannot declare same variable name which is imported inside