From 402a322317817f542be3194fa8baf7503cc172aa Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Mon, 4 Dec 2023 11:35:56 +0100 Subject: [PATCH] chore: more validation errors (#9723) * invalid directive on component * duplicate animation * invalid animation * no const assignment * expected token * invalid-attribute-name * fixes * invalid event modifier * component name * slot validation * fix test * const validation + fix double declaration bug * omg this validation is skipped in svelte 4, remove it entirely then * gah * unskip * contenteditable * invalid css selector * css global selector + css parser fixes * export default * dynamic element * each block * html tag * logic block * reactive declaration * duplicate script * namespace * module context * slot * svelte fragment * textarea * title * transition * window bindings * changeset * svelte head, let directive, tweaks --- .changeset/gentle-sheep-hug.md | 5 + packages/svelte/src/compiler/errors.js | 162 ++++++------- .../src/compiler/phases/1-parse/index.js | 8 +- .../src/compiler/phases/1-parse/read/style.js | 35 ++- .../compiler/phases/2-analyze/css/Selector.js | 15 +- .../compiler/phases/2-analyze/validation.js | 208 +++++++++++++++-- .../client/visitors/javascript-legacy.js | 9 +- .../3-transform/client/visitors/template.js | 12 +- .../3-transform/server/transform-server.js | 12 +- .../svelte/src/compiler/phases/constants.js | 12 + .../svelte/src/compiler/phases/patterns.js | 1 + packages/svelte/src/compiler/phases/scope.js | 18 +- packages/svelte/src/compiler/types/css.d.ts | 2 +- .../svelte/src/compiler/types/template.d.ts | 2 +- packages/svelte/src/compiler/warnings.js | 16 +- .../directives-with-member-access/main.svelte | 4 +- .../samples/typescript-const1/_config.js | 2 +- .../samples/typescript-const1/main.svelte | 2 + .../samples/typescript-const2/_config.js | 5 - .../samples/typescript-const2/main.svelte | 5 - .../input.svelte | 2 +- .../samples/action-on-component/_config.js | 3 - .../samples/action-on-component/errors.json | 4 +- .../samples/animation-duplicate/_config.js | 3 - .../samples/animation-not-in-each/_config.js | 3 - .../animation-not-in-keyed-each/_config.js | 3 - .../samples/animation-on-component/_config.js | 3 - .../animation-on-component/errors.json | 4 +- .../samples/animation-siblings/_config.js | 3 - .../samples/assignment-to-const-2/_config.js | 3 - .../samples/assignment-to-const-2/errors.json | 4 +- .../samples/assignment-to-const-3/_config.js | 3 - .../samples/assignment-to-const-3/errors.json | 4 +- .../samples/assignment-to-const-4/_config.js | 3 - .../samples/assignment-to-const-4/errors.json | 4 +- .../samples/assignment-to-const-5/_config.js | 3 - .../samples/assignment-to-const-5/errors.json | 4 +- .../samples/assignment-to-const-7/_config.js | 3 - .../samples/assignment-to-const-7/errors.json | 4 +- .../samples/assignment-to-const/_config.js | 3 - .../samples/assignment-to-const/errors.json | 4 +- .../attribute-expected-equals/_config.js | 3 - .../attribute-expected-equals/errors.json | 4 +- .../attribute-invalid-name-2/_config.js | 3 - .../attribute-invalid-name-2/errors.json | 2 +- .../attribute-invalid-name-3/_config.js | 3 - .../attribute-invalid-name-3/errors.json | 2 +- .../attribute-invalid-name-4/_config.js | 3 - .../attribute-invalid-name-4/errors.json | 2 +- .../attribute-invalid-name-5/_config.js | 3 - .../attribute-invalid-name-5/errors.json | 2 +- .../samples/attribute-invalid-name/_config.js | 3 - .../attribute-invalid-name/errors.json | 2 +- .../samples/component-dynamic/options.json | 3 - .../_config.js | 3 - .../_config.js | 3 - .../errors.json | 4 +- .../component-name-lowercase/_config.js | 3 - .../_config.js | 3 - .../errors.json | 9 - .../input.svelte | 2 - .../_config.js | 3 - .../_config.js | 3 - .../errors.json | 2 +- .../samples/component-slot-dynamic/_config.js | 3 - .../component-slot-dynamic/errors.json | 4 +- .../component-slot-named-duplicate/_config.js | 3 - .../errors.json | 9 - .../input.svelte | 2 - .../_config.js | 3 - .../errors.json | 2 +- .../component-slotted-each-block/_config.js | 3 - .../component-slotted-each-block/errors.json | 2 +- .../component-slotted-if-block/_config.js | 3 - .../component-slotted-if-block/errors.json | 2 +- .../samples/const-tag-conflict-1/_config.js | 3 - .../samples/const-tag-conflict-1/errors.json | 6 +- .../samples/const-tag-conflict-2/_config.js | 3 - .../samples/const-tag-conflict-2/errors.json | 6 +- .../samples/const-tag-placement-1/_config.js | 3 - .../samples/const-tag-placement-2/_config.js | 3 - .../samples/const-tag-readonly-2/_config.js | 3 - .../samples/const-tag-readonly-2/errors.json | 4 +- .../contenteditable-dynamic/_config.js | 3 - .../contenteditable-missing/_config.js | 3 - .../_config.js | 3 - .../errors.json | 4 +- .../_config.js | 3 - .../errors.json | 4 +- .../_config.js | 3 - .../errors.json | 4 +- .../_config.js | 3 - .../errors.json | 6 +- .../css-invalid-global-placement-2/_config.js | 3 - .../errors.json | 2 +- .../css-invalid-global-placement-3/_config.js | 3 - .../errors.json | 2 +- .../css-invalid-global-placement-4/_config.js | 3 - .../errors.json | 4 +- .../css-invalid-global-placement-5/_config.js | 3 - .../errors.json | 4 +- .../css-invalid-global-placement/_config.js | 3 - .../css-invalid-global-placement/errors.json | 2 +- .../css-invalid-global-selector-2/_config.js | 3 - .../css-invalid-global-selector-2/errors.json | 4 +- .../css-invalid-global-selector-3/_config.js | 3 - .../css-invalid-global-selector-3/errors.json | 4 +- .../css-invalid-global-selector-4/_config.js | 3 - .../css-invalid-global-selector-4/errors.json | 4 +- .../css-invalid-global-selector-5/_config.js | 3 - .../css-invalid-global-selector-5/errors.json | 4 +- .../css-invalid-global-selector-6/_config.js | 3 - .../css-invalid-global-selector-6/errors.json | 4 +- .../input.svelte | 4 +- .../css-invalid-global-selector/_config.js | 3 - .../css-invalid-global-selector/errors.json | 4 +- .../samples/debug-invalid-args/_config.js | 3 - .../samples/debug-invalid-args/errors.json | 2 +- .../default-export-anonymous-class/_config.js | 3 - .../_config.js | 3 - .../samples/default-export/_config.js | 3 - .../dynamic-element-invalid-tag/_config.js | 3 - .../dynamic-element-invalid-tag/errors.json | 4 +- .../dynamic-element-missing-tag/_config.js | 3 - .../dynamic-element-missing-tag/errors.json | 2 +- .../_config.js | 3 - .../errors.json | 2 +- .../_config.js | 3 - .../errors.json | 2 +- .../_config.js | 3 - .../errors.json | 2 +- .../_config.js | 3 - .../errors.json | 2 +- .../_config.js | 3 - .../errors.json | 2 +- .../event-modifiers-invalid/_config.js | 3 - .../samples/event-modifiers-legacy/_config.js | 8 - .../event-modifiers-legacy/errors.json | 14 -- .../event-modifiers-legacy/input.svelte | 1 - .../html-block-in-attribute/_config.js | 3 - .../html-block-in-attribute/errors.json | 2 +- .../samples/html-block-in-textarea/_config.js | 3 - .../html-block-in-textarea/errors.json | 2 +- .../samples/let-directive/errors.json | 8 + .../samples/let-directive/input.svelte | 6 + .../logic-block-in-attribute/_config.js | 3 - .../logic-block-in-attribute/errors.json | 4 +- .../logic-block-in-textarea/_config.js | 3 - .../logic-block-in-textarea/errors.json | 4 +- .../_config.js | 3 - .../warnings.json | 4 +- .../_config.js | 3 - .../errors.json | 4 +- .../multiple-script-module-context/_config.js | 3 - .../errors.json | 4 +- .../namespace-invalid-unguessable/_config.js | 3 - .../namespace-invalid-unguessable/errors.json | 14 -- .../input.svelte | 1 - .../samples/namespace-invalid/_config.js | 3 - .../samples/namespace-invalid/errors.json | 4 +- .../samples/namespace-non-literal/_config.js | 3 - .../samples/namespace-non-literal/errors.json | 4 +- .../_config.js | 3 - .../warnings.json | 4 +- .../rest-eachblock-binding-2/_config.js | 1 + .../rest-eachblock-binding-3/_config.js | 1 + .../_config.js | 1 + .../samples/rest-eachblock-binding/_config.js | 1 + .../samples/script-invalid-context/_config.js | 3 - .../script-invalid-context/errors.json | 2 +- .../_config.js | 8 - .../input.svelte | 33 --- .../warnings.json | 218 ------------------ .../samples/slot-attribute-invalid/_config.js | 3 - .../slot-attribute-invalid/errors.json | 2 +- .../svelte-fragment-placement-2/_config.js | 3 - .../svelte-fragment-placement-2/errors.json | 4 +- .../svelte-fragment-placement/_config.js | 3 - .../svelte-fragment-placement/errors.json | 4 +- .../svelte-head-attributes/errors.json | 8 + .../svelte-head-attributes/input.svelte | 1 + .../textarea-value-children/_config.js | 3 - .../textarea-value-children/errors.json | 8 +- .../samples/title-no-attributes/_config.js | 3 - .../samples/title-no-attributes/errors.json | 4 +- .../samples/title-no-children/_config.js | 3 - .../samples/title-no-children/errors.json | 2 +- .../_config.js | 3 - .../transition-duplicate-in/_config.js | 3 - .../_config.js | 3 - .../transition-duplicate-out/_config.js | 3 - .../_config.js | 3 - .../_config.js | 3 - .../_config.js | 3 - .../transition-on-component/_config.js | 3 - .../transition-on-component/errors.json | 4 +- .../_config.js | 3 - .../errors.json | 6 +- .../input.svelte | 6 +- .../window-binding-invalid-value/_config.js | 3 - .../window-binding-invalid-value/errors.json | 14 -- .../window-binding-invalid-value/input.svelte | 1 - .../window-binding-invalid-width/_config.js | 3 - .../window-binding-invalid-width/errors.json | 14 -- .../window-binding-invalid-width/input.svelte | 1 - .../samples/window-binding-invalid/_config.js | 3 - .../window-binding-invalid/errors.json | 6 +- .../window-binding-invalid/input.svelte | 6 +- .../03-appendix/02-breaking-changes.md | 12 + 209 files changed, 525 insertions(+), 928 deletions(-) create mode 100644 .changeset/gentle-sheep-hug.md delete mode 100644 packages/svelte/tests/runtime-runes/samples/typescript-const2/_config.js delete mode 100644 packages/svelte/tests/runtime-runes/samples/typescript-const2/main.svelte delete mode 100644 packages/svelte/tests/validator/samples/action-on-component/_config.js delete mode 100644 packages/svelte/tests/validator/samples/animation-duplicate/_config.js delete mode 100644 packages/svelte/tests/validator/samples/animation-not-in-each/_config.js delete mode 100644 packages/svelte/tests/validator/samples/animation-not-in-keyed-each/_config.js delete mode 100644 packages/svelte/tests/validator/samples/animation-on-component/_config.js delete mode 100644 packages/svelte/tests/validator/samples/animation-siblings/_config.js delete mode 100644 packages/svelte/tests/validator/samples/assignment-to-const-2/_config.js delete mode 100644 packages/svelte/tests/validator/samples/assignment-to-const-3/_config.js delete mode 100644 packages/svelte/tests/validator/samples/assignment-to-const-4/_config.js delete mode 100644 packages/svelte/tests/validator/samples/assignment-to-const-5/_config.js delete mode 100644 packages/svelte/tests/validator/samples/assignment-to-const-7/_config.js delete mode 100644 packages/svelte/tests/validator/samples/assignment-to-const/_config.js delete mode 100644 packages/svelte/tests/validator/samples/attribute-expected-equals/_config.js delete mode 100644 packages/svelte/tests/validator/samples/attribute-invalid-name-2/_config.js delete mode 100644 packages/svelte/tests/validator/samples/attribute-invalid-name-3/_config.js delete mode 100644 packages/svelte/tests/validator/samples/attribute-invalid-name-4/_config.js delete mode 100644 packages/svelte/tests/validator/samples/attribute-invalid-name-5/_config.js delete mode 100644 packages/svelte/tests/validator/samples/attribute-invalid-name/_config.js delete mode 100644 packages/svelte/tests/validator/samples/component-dynamic/options.json delete mode 100644 packages/svelte/tests/validator/samples/component-event-modifiers-invalid/_config.js delete mode 100644 packages/svelte/tests/validator/samples/component-invalid-style-directive/_config.js delete mode 100644 packages/svelte/tests/validator/samples/component-name-lowercase/_config.js delete mode 100644 packages/svelte/tests/validator/samples/component-slot-default-duplicate/_config.js delete mode 100644 packages/svelte/tests/validator/samples/component-slot-default-duplicate/errors.json delete mode 100644 packages/svelte/tests/validator/samples/component-slot-default-duplicate/input.svelte delete mode 100644 packages/svelte/tests/validator/samples/component-slot-default-reserved/_config.js delete mode 100644 packages/svelte/tests/validator/samples/component-slot-dynamic-attribute/_config.js delete mode 100644 packages/svelte/tests/validator/samples/component-slot-dynamic/_config.js delete mode 100644 packages/svelte/tests/validator/samples/component-slot-named-duplicate/_config.js delete mode 100644 packages/svelte/tests/validator/samples/component-slot-named-duplicate/errors.json delete mode 100644 packages/svelte/tests/validator/samples/component-slot-named-duplicate/input.svelte delete mode 100644 packages/svelte/tests/validator/samples/component-slotted-custom-element-2/_config.js delete mode 100644 packages/svelte/tests/validator/samples/component-slotted-each-block/_config.js delete mode 100644 packages/svelte/tests/validator/samples/component-slotted-if-block/_config.js delete mode 100644 packages/svelte/tests/validator/samples/const-tag-conflict-1/_config.js delete mode 100644 packages/svelte/tests/validator/samples/const-tag-conflict-2/_config.js delete mode 100644 packages/svelte/tests/validator/samples/const-tag-placement-1/_config.js delete mode 100644 packages/svelte/tests/validator/samples/const-tag-placement-2/_config.js delete mode 100644 packages/svelte/tests/validator/samples/const-tag-readonly-2/_config.js delete mode 100644 packages/svelte/tests/validator/samples/contenteditable-dynamic/_config.js delete mode 100644 packages/svelte/tests/validator/samples/contenteditable-missing/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-combinator-selector-1/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-combinator-selector-2/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-combinator-selector-3/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-combinator-selector-4/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-global-placement-2/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-global-placement-3/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-global-placement-4/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-global-placement-5/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-global-placement/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-global-selector-2/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-global-selector-3/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-global-selector-4/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-global-selector-5/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-global-selector-6/_config.js delete mode 100644 packages/svelte/tests/validator/samples/css-invalid-global-selector/_config.js delete mode 100644 packages/svelte/tests/validator/samples/debug-invalid-args/_config.js delete mode 100644 packages/svelte/tests/validator/samples/default-export-anonymous-class/_config.js delete mode 100644 packages/svelte/tests/validator/samples/default-export-anonymous-function/_config.js delete mode 100644 packages/svelte/tests/validator/samples/default-export/_config.js delete mode 100644 packages/svelte/tests/validator/samples/dynamic-element-invalid-tag/_config.js delete mode 100644 packages/svelte/tests/validator/samples/dynamic-element-missing-tag/_config.js delete mode 100644 packages/svelte/tests/validator/samples/each-block-destructured-object-rest-comma-after/_config.js delete mode 100644 packages/svelte/tests/validator/samples/each-block-invalid-context-destructured-object/_config.js delete mode 100644 packages/svelte/tests/validator/samples/each-block-invalid-context-destructured/_config.js delete mode 100644 packages/svelte/tests/validator/samples/event-modifiers-invalid-nonpassive/_config.js delete mode 100644 packages/svelte/tests/validator/samples/event-modifiers-invalid-passive/_config.js delete mode 100644 packages/svelte/tests/validator/samples/event-modifiers-invalid/_config.js delete mode 100644 packages/svelte/tests/validator/samples/event-modifiers-legacy/_config.js delete mode 100644 packages/svelte/tests/validator/samples/event-modifiers-legacy/errors.json delete mode 100644 packages/svelte/tests/validator/samples/event-modifiers-legacy/input.svelte delete mode 100644 packages/svelte/tests/validator/samples/html-block-in-attribute/_config.js delete mode 100644 packages/svelte/tests/validator/samples/html-block-in-textarea/_config.js create mode 100644 packages/svelte/tests/validator/samples/let-directive/errors.json create mode 100644 packages/svelte/tests/validator/samples/let-directive/input.svelte delete mode 100644 packages/svelte/tests/validator/samples/logic-block-in-attribute/_config.js delete mode 100644 packages/svelte/tests/validator/samples/logic-block-in-textarea/_config.js delete mode 100644 packages/svelte/tests/validator/samples/module-script-reactive-declaration/_config.js delete mode 100644 packages/svelte/tests/validator/samples/multiple-script-default-context/_config.js delete mode 100644 packages/svelte/tests/validator/samples/multiple-script-module-context/_config.js delete mode 100644 packages/svelte/tests/validator/samples/namespace-invalid-unguessable/_config.js delete mode 100644 packages/svelte/tests/validator/samples/namespace-invalid-unguessable/errors.json delete mode 100644 packages/svelte/tests/validator/samples/namespace-invalid-unguessable/input.svelte delete mode 100644 packages/svelte/tests/validator/samples/namespace-invalid/_config.js delete mode 100644 packages/svelte/tests/validator/samples/namespace-non-literal/_config.js delete mode 100644 packages/svelte/tests/validator/samples/reactive-declaration-non-top-level/_config.js delete mode 100644 packages/svelte/tests/validator/samples/script-invalid-context/_config.js delete mode 100644 packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/_config.js delete mode 100644 packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/input.svelte delete mode 100644 packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/warnings.json delete mode 100644 packages/svelte/tests/validator/samples/slot-attribute-invalid/_config.js delete mode 100644 packages/svelte/tests/validator/samples/svelte-fragment-placement-2/_config.js delete mode 100644 packages/svelte/tests/validator/samples/svelte-fragment-placement/_config.js create mode 100644 packages/svelte/tests/validator/samples/svelte-head-attributes/errors.json create mode 100644 packages/svelte/tests/validator/samples/svelte-head-attributes/input.svelte delete mode 100644 packages/svelte/tests/validator/samples/textarea-value-children/_config.js delete mode 100644 packages/svelte/tests/validator/samples/title-no-attributes/_config.js delete mode 100644 packages/svelte/tests/validator/samples/title-no-children/_config.js delete mode 100644 packages/svelte/tests/validator/samples/transition-duplicate-in-transition/_config.js delete mode 100644 packages/svelte/tests/validator/samples/transition-duplicate-in/_config.js delete mode 100644 packages/svelte/tests/validator/samples/transition-duplicate-out-transition/_config.js delete mode 100644 packages/svelte/tests/validator/samples/transition-duplicate-out/_config.js delete mode 100644 packages/svelte/tests/validator/samples/transition-duplicate-transition-in/_config.js delete mode 100644 packages/svelte/tests/validator/samples/transition-duplicate-transition-out/_config.js delete mode 100644 packages/svelte/tests/validator/samples/transition-duplicate-transition/_config.js delete mode 100644 packages/svelte/tests/validator/samples/transition-on-component/_config.js delete mode 100644 packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/_config.js delete mode 100644 packages/svelte/tests/validator/samples/window-binding-invalid-value/_config.js delete mode 100644 packages/svelte/tests/validator/samples/window-binding-invalid-value/errors.json delete mode 100644 packages/svelte/tests/validator/samples/window-binding-invalid-value/input.svelte delete mode 100644 packages/svelte/tests/validator/samples/window-binding-invalid-width/_config.js delete mode 100644 packages/svelte/tests/validator/samples/window-binding-invalid-width/errors.json delete mode 100644 packages/svelte/tests/validator/samples/window-binding-invalid-width/input.svelte delete mode 100644 packages/svelte/tests/validator/samples/window-binding-invalid/_config.js diff --git a/.changeset/gentle-sheep-hug.md b/.changeset/gentle-sheep-hug.md new file mode 100644 index 0000000000..a2a852449c --- /dev/null +++ b/.changeset/gentle-sheep-hug.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +chore: more validation errors diff --git a/packages/svelte/src/compiler/errors.js b/packages/svelte/src/compiler/errors.js index 700ec21e19..a4000fb111 100644 --- a/packages/svelte/src/compiler/errors.js +++ b/packages/svelte/src/compiler/errors.js @@ -132,9 +132,12 @@ const special_elements = { 'invalid-customElement-shadow-attribute': () => '"shadow" must be either "open" or "none"', 'unknown-svelte-option-attribute': /** @param {string} name */ (name) => ` unknown attribute '${name}'`, + 'illegal-svelte-head-attribute': () => ' cannot have attributes nor directives', 'invalid-svelte-fragment-attribute': () => ` can only have a slot attribute and (optionally) a let: directive`, 'invalid-svelte-fragment-slot': () => ` slot attribute must have a static value`, + 'invalid-svelte-fragment-placement': () => + ` must be the direct child of a component`, /** @param {string} name */ 'invalid-svelte-element-placement': (name) => `<${name}> tags cannot be inside elements or blocks`, @@ -211,12 +214,14 @@ const elements = { * @param {string} node * @param {string} parent */ - 'invalid-node-placement': (node, parent) => `${node} is invalid inside <${parent}>` + 'invalid-node-placement': (node, parent) => `${node} is invalid inside <${parent}>`, + 'illegal-title-attribute': () => ' cannot have attributes nor directives', + 'invalid-title-content': () => '<title> can only contain text and {tags}' }; /** @satisfies {Errors} */ const components = { - 'invalid-component-directive': () => `Directive is not valid on components` + 'invalid-component-directive': () => `This type of directive is not valid on components` }; /** @satisfies {Errors} */ @@ -224,18 +229,60 @@ const attributes = { 'empty-attribute-shorthand': () => `Attribute shorthand cannot be empty`, 'duplicate-attribute': () => `Attributes need to be unique`, 'invalid-event-attribute-value': () => - `Event attribute must be a JavaScript expression, not a string` + `Event attribute must be a JavaScript expression, not a string`, + /** @param {string} name */ + 'invalid-attribute-name': (name) => `'${name}' is not a valid attribute name`, + /** @param {'no-each' | 'each-key' | 'child'} type */ + 'invalid-animation': (type) => + type === 'no-each' + ? `An element that uses the animate directive must be the immediate child of a keyed each block` + : type === 'each-key' + ? `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?` + : `An element that uses the animate directive must be the sole child of a keyed each block`, + 'duplicate-animation': () => `An element can only have one 'animate' directive`, + /** @param {string[] | undefined} [modifiers] */ + 'invalid-event-modifier': (modifiers) => + modifiers + ? `Valid event modifiers are ${modifiers.slice(0, -1).join(', ')} or ${modifiers.slice(-1)}` + : `Event modifiers other than 'once' can only be used on DOM elements`, + /** + * @param {string} modifier1 + * @param {string} modifier2 + */ + 'invalid-event-modifier-combination': (modifier1, modifier2) => + `The '${modifier1}' and '${modifier2}' modifiers cannot be used together`, + /** + * @param {string} directive1 + * @param {string} directive2 + */ + 'duplicate-transition': (directive1, directive2) => { + /** @param {string} _directive */ + function describe(_directive) { + return _directive === 'transition' ? "a 'transition'" : `an '${_directive}'`; + } + + return directive1 === directive2 + ? `An element can only have one '${directive1}' directive` + : `An element cannot have both ${describe(directive1)} directive and ${describe( + directive2 + )} directive`; + }, + 'invalid-let-directive-placement': () => 'let directive at invalid position' }; /** @satisfies {Errors} */ const slots = { 'invalid-slot-element-attribute': () => `<slot> can only receive attributes, not directives`, 'invalid-slot-attribute': () => `slot attribute must be a static value`, - 'invalid-slot-name': () => `slot attribute must be a static value`, + /** @param {boolean} is_default */ + 'invalid-slot-name': (is_default) => + is_default + ? `default is a reserved word — it cannot be used as a slot name` + : `slot attribute must be a static value`, 'invalid-slot-placement': () => `Element with a slot='...' attribute must be a child of a component or a descendant of a custom element`, - 'duplicate-slot-name': /** @param {string} name @param {string} component */ (name, component) => - `Duplicate slot name '${name}' in <${component}>`, + /** @param {string} name @param {string} component */ + 'duplicate-slot-name': (name, component) => `Duplicate slot name '${name}' in <${component}>`, 'invalid-default-slot-content': () => `Found default slot content alongside an explicit slot="default"` }; @@ -256,13 +303,20 @@ const bindings = { 'invalid-type-attribute': () => `'type' attribute must be a static text value if input uses two-way binding`, 'invalid-multiple-attribute': () => - `'multiple' attribute must be static if select uses two-way binding` + `'multiple' attribute must be static if select uses two-way binding`, + 'missing-contenteditable-attribute': () => + `'contenteditable' attribute is required for textContent, innerHTML and innerText two-way bindings`, + 'dynamic-contenteditable-attribute': () => + `'contenteditable' attribute cannot be dynamic if element uses two-way binding` }; /** @satisfies {Errors} */ const variables = { 'illegal-global': /** @param {string} name */ (name) => - `${name} is an illegal variable name. To reference a global variable called ${name}, use globalThis.${name}` + `${name} is an illegal variable name. To reference a global variable called ${name}, use globalThis.${name}`, + /** @param {string} name */ + 'duplicate-declaration': (name) => `'${name}' has already been declared`, + 'default-export': () => `A component cannot have a default export` }; /** @satisfies {Errors} */ @@ -279,6 +333,12 @@ const compiler_options = { 'removed-compiler-option': (msg) => `Invalid compiler option: ${msg}` }; +/** @satisfies {Errors} */ +const const_tag = { + 'invalid-const-placement': () => + `{@const} must be the immediate child of {#if}, {:else if}, {:else}, {#each}, {:then}, {:catch}, <svelte:fragment> or <Component>` +}; + /** @satisfies {Errors} */ const errors = { ...internal, @@ -293,7 +353,8 @@ const errors = { ...bindings, ...variables, ...compiler_options, - ...legacy_reactivity + ...legacy_reactivity, + ...const_tag // missing_contenteditable_attribute: { // code: 'missing-contenteditable-attribute', @@ -304,34 +365,11 @@ const errors = { // code: 'dynamic-contenteditable-attribute', // message: "'contenteditable' attribute cannot be dynamic if element uses two-way binding" // }, - // invalid_event_modifier_combination: /** - // * @param {string} modifier1 - // * @param {string} modifier2 - // */ (modifier1, modifier2) => ({ - // code: 'invalid-event-modifier', - // message: `The '${modifier1}' and '${modifier2}' modifiers cannot be used together` - // }), - // invalid_event_modifier_legacy: /** @param {string} modifier */ (modifier) => ({ - // code: 'invalid-event-modifier', - // message: `The '${modifier}' modifier cannot be used in legacy mode` - // }), - // invalid_event_modifier: /** @param {string} valid */ (valid) => ({ - // code: 'invalid-event-modifier', - // message: `Valid event modifiers are ${valid}` - // }), - // invalid_event_modifier_component: { - // code: 'invalid-event-modifier', - // message: "Event modifiers other than 'once' can only be used on DOM elements" - // }, // textarea_duplicate_value: { // code: 'textarea-duplicate-value', // message: // 'A <textarea> can have either a value attribute or (equivalently) child content, but not both' // }, - // illegal_attribute: /** @param {string} name */ (name) => ({ - // code: 'illegal-attribute', - // message: `'${name}' is not a valid attribute name` - // }), // invalid_attribute_head: { // code: 'invalid-attribute', // message: '<svelte:head> should not have any attributes or directives' @@ -340,10 +378,6 @@ const errors = { // code: 'invalid-action', // message: 'Actions can only be applied to DOM elements, not components' // }, - // invalid_animation: { - // code: 'invalid-animation', - // message: 'Animations can only be applied to DOM elements, not components' - // }, // invalid_class: { // code: 'invalid-class', // message: 'Classes can only be applied to DOM elements, not components' @@ -364,22 +398,10 @@ const errors = { // code: 'dynamic-slot-name', // message: '<slot> name cannot be dynamic' // }, - // invalid_slot_name: { - // code: 'invalid-slot-name', - // message: 'default is a reserved word — it cannot be used as a slot name' - // }, // invalid_slot_attribute_value_missing: { // code: 'invalid-slot-attribute', // message: 'slot attribute value is missing' // }, - // invalid_slotted_content_fragment: { - // code: 'invalid-slotted-content', - // message: '<svelte:fragment> must be a child of a component' - // }, - // illegal_attribute_title: { - // code: 'illegal-attribute', - // message: '<title> cannot have attributes' - // }, // illegal_structure_title: { // code: 'illegal-structure', // message: '<title> can only contain text and {tags}' @@ -428,10 +450,6 @@ const errors = { // code: 'illegal-variable-declaration', // message: 'Cannot declare same variable name which is imported inside <script context="module">' // }, - // css_invalid_global: { - // code: 'css-invalid-global', - // message: ':global(...) can be at the start or end of a selector sequence, but not in the middle' - // }, // css_invalid_global_selector: { // code: 'css-invalid-global-selector', // message: ':global(...) must contain a single selector' @@ -445,55 +463,15 @@ const errors = { // code: 'css-invalid-selector', // message: `Invalid selector "${selector}"` // }), - // duplicate_animation: { - // code: 'duplicate-animation', - // message: "An element can only have one 'animate' directive" - // }, - // invalid_animation_immediate: { - // code: 'invalid-animation', - // message: - // 'An element that uses the animate directive must be the immediate child of a keyed each block' - // }, - // invalid_animation_key: { - // 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?' - // }, - // invalid_animation_sole: { - // code: 'invalid-animation', - // message: - // 'An element that uses the animate directive must be the sole child of a keyed each block' - // }, - // invalid_animation_dynamic_element: { - // code: 'invalid-animation', - // message: '<svelte:element> cannot have a animate directive' - // }, // invalid_directive_value: { // code: 'invalid-directive-value', // message: // 'Can only bind to an identifier (e.g. `foo`) or a member expression (e.g. `foo.bar` or `foo[baz]`)' // }, - // invalid_const_placement: { - // code: 'invalid-const-placement', - // message: - // '{@const} must be the immediate child of {#if}, {:else if}, {:else}, {#each}, {:then}, {:catch}, <svelte:fragment> or <Component>' - // }, - // invalid_const_declaration: /** @param {string} name */ (name) => ({ - // code: 'invalid-const-declaration', - // message: `'${name}' has already been declared` - // }), - // invalid_const_update: /** @param {string} name */ (name) => ({ - // code: 'invalid-const-update', - // message: `'${name}' is declared using {@const ...} and is read-only` - // }), // cyclical_const_tags: /** @param {string[]} cycle */ (cycle) => ({ // code: 'cyclical-const-tags', // message: `Cyclical dependency detected: ${cycle.join(' → ')}` // }), - // invalid_component_style_directive: { - // code: 'invalid-component-style-directive', - // message: 'Style directives cannot be used on components' - // }, // invalid_var_declaration: { // code: 'invalid_var_declaration', // message: '"var" scope should not extend outside the reactive block' diff --git a/packages/svelte/src/compiler/phases/1-parse/index.js b/packages/svelte/src/compiler/phases/1-parse/index.js index 8c1bb174f8..5199ad5960 100644 --- a/packages/svelte/src/compiler/phases/1-parse/index.js +++ b/packages/svelte/src/compiler/phases/1-parse/index.js @@ -156,7 +156,13 @@ export class Parser { /** @param {string} str */ match(str) { - return this.template.slice(this.index, this.index + str.length) === str; + const length = str.length; + if (length === 1) { + // more performant than slicing + return this.template[this.index] === str; + } + + return this.template.slice(this.index, this.index + length) === str; } /** 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 34d22bc7c3..0cc56ff8ea 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/style.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/style.js @@ -1,7 +1,7 @@ import { error } from '../../../errors.js'; const REGEX_MATCHER = /^[~^$*|]?=/; -const REGEX_CLOSING_PAREN = /\)/; +const REGEX_CLOSING_PAREN = /(?<!\\)\)/; // \) is a way of escaping a closing paren, so we need to exclude it const REGEX_CLOSING_BRACKET = /[\s\]]/; const REGEX_ATTRIBUTE_FLAGS = /^[a-zA-Z]+/; // only `i` and `s` are valid today, but make it future-proof const REGEX_COMBINATOR_WHITESPACE = /^\s*(\+|~|>|\|\|)\s*/; @@ -145,22 +145,23 @@ function read_rule(parser) { /** * @param {import('../index.js').Parser} parser + * @param {boolean} [inside_pseudo_class] * @returns {import('#compiler').Css.SelectorList} */ -function read_selector_list(parser) { +function read_selector_list(parser, inside_pseudo_class = false) { /** @type {import('#compiler').Css.Selector[]} */ const children = []; const start = parser.index; while (parser.index < parser.template.length) { - children.push(read_selector(parser)); + children.push(read_selector(parser, inside_pseudo_class)); const end = parser.index; parser.allow_whitespace(); - if (parser.match('{')) { + if (parser.match('{') || (inside_pseudo_class && parser.match(')'))) { return { type: 'SelectorList', start, @@ -178,9 +179,10 @@ function read_selector_list(parser) { /** * @param {import('../index.js').Parser} parser + * @param {boolean} [inside_pseudo_class] * @returns {import('#compiler').Css.Selector} */ -function read_selector(parser) { +function read_selector(parser, inside_pseudo_class = false) { const list_start = parser.index; /** @type {Array<import('#compiler').Css.SimpleSelector | import('#compiler').Css.Combinator>} */ @@ -190,9 +192,16 @@ function read_selector(parser) { const start = parser.index; if (parser.eat('*')) { + let name = '*'; + if (parser.match('|')) { + // * is the namespace (which we ignore) + parser.index++; + name = read_identifier(parser); + } + children.push({ type: 'TypeSelector', - name: '*', + name, start, end: parser.index }); @@ -220,11 +229,11 @@ function read_selector(parser) { } else if (parser.eat(':')) { const name = read_identifier(parser); - /** @type {string | null} */ + /** @type {null | import('#compiler').Css.SelectorList} */ let args = null; if (parser.eat('(')) { - args = parser.read_until(REGEX_CLOSING_PAREN); + args = read_selector_list(parser, true); parser.eat(')', true); } @@ -284,9 +293,15 @@ function read_selector(parser) { end: parser.index }); } else { + let name = read_identifier(parser); + if (parser.match('|')) { + // we ignore the namespace when trying to find matching element classes + parser.index++; + name = read_identifier(parser); + } children.push({ type: 'TypeSelector', - name: read_identifier(parser), + name, start, end: parser.index }); @@ -295,7 +310,7 @@ function read_selector(parser) { const index = parser.index; parser.allow_whitespace(); - if (parser.match('{') || parser.match(',')) { + if (parser.match('{') || parser.match(',') || (inside_pseudo_class && parser.match(')'))) { parser.index = index; return { diff --git a/packages/svelte/src/compiler/phases/2-analyze/css/Selector.js b/packages/svelte/src/compiler/phases/2-analyze/css/Selector.js index 25e44b4e40..fcddaf2df6 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/css/Selector.js +++ b/packages/svelte/src/compiler/phases/2-analyze/css/Selector.js @@ -17,7 +17,6 @@ const whitelist_attribute_selector = new Map([ ['details', new Set(['open'])], ['dialog', new Set(['open'])] ]); -const regex_is_single_css_selector = /[^\\],(?!([^([]+[^\\]|[^([\\])[)\]])/; export default class Selector { /** @type {import('#compiler').Css.Selector} */ @@ -157,11 +156,10 @@ export default class Selector { if ( selector.type === 'PseudoClassSelector' && selector.name === 'global' && - selector.args !== null + selector.args !== null && + selector.args.children.length > 1 ) { - if (regex_is_single_css_selector.test(selector.args)) { - error(selector, 'invalid-css-global-selector'); - } + error(selector, 'invalid-css-global-selector'); } } } @@ -179,11 +177,14 @@ export default class Selector { validate_global_compound_selector() { for (const block of this.blocks) { - for (const selector of block.selectors) { + for (let i = 0; i < block.selectors.length; i++) { + const selector = block.selectors[i]; if ( selector.type === 'PseudoClassSelector' && selector.name === 'global' && - block.selectors.length !== 1 + block.selectors.length !== 1 && + (i === block.selectors.length - 1 || + block.selectors.slice(i + 1).some((s) => s.type !== 'PseudoElementSelector')) ) { error(selector, 'invalid-css-global-selector-list'); } diff --git a/packages/svelte/src/compiler/phases/2-analyze/validation.js b/packages/svelte/src/compiler/phases/2-analyze/validation.js index 99cc8137d6..60aaf060f3 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/validation.js +++ b/packages/svelte/src/compiler/phases/2-analyze/validation.js @@ -8,9 +8,13 @@ import { import { warn } from '../../warnings.js'; import fuzzymatch from '../1-parse/utils/fuzzymatch.js'; import { binding_properties } from '../bindings.js'; -import { SVGElements } from '../constants.js'; +import { ContentEditableBindings, EventModifiers, SVGElements } from '../constants.js'; import { is_custom_element_node } from '../nodes.js'; -import { regex_not_whitespace, regex_only_whitespaces } from '../patterns.js'; +import { + regex_illegal_attribute_character, + regex_not_whitespace, + regex_only_whitespaces +} from '../patterns.js'; import { Scope, get_rune } from '../scope.js'; import { merge } from '../visitors.js'; import { a11y_validators } from './a11y.js'; @@ -30,6 +34,13 @@ function validate_component(node, context) { ) { error(attribute, 'invalid-component-directive'); } + + if ( + attribute.type === 'OnDirective' && + (attribute.modifiers.length > 1 || attribute.modifiers.some((m) => m !== 'once')) + ) { + error(attribute, 'invalid-event-modifier'); + } } context.next({ @@ -44,17 +55,79 @@ function validate_component(node, context) { * @param {import('zimmerframe').Context<import('#compiler').SvelteNode, import('./types.js').AnalysisState>} context */ function validate_element(node, context) { + let has_animate_directive = false; + let has_in_transition = false; + let has_out_transition = false; + for (const attribute of node.attributes) { - if ( - attribute.type === 'Attribute' && - attribute.name === 'is' && - context.state.options.namespace !== 'foreign' - ) { - warn(context.state.analysis.warnings, attribute, context.path, 'avoid-is'); - } - if (attribute.type === 'Attribute' && attribute.name === 'slot') { - /** @type {import('#compiler').RegularElement | import('#compiler').SvelteElement | import('#compiler').Component | import('#compiler').SvelteComponent | import('#compiler').SvelteSelf | undefined} */ - validate_slot_attribute(context, attribute); + if (attribute.type === 'Attribute') { + if (regex_illegal_attribute_character.test(attribute.name)) { + error(attribute, 'invalid-attribute-name', attribute.name); + } + + if (attribute.name === 'is' && context.state.options.namespace !== 'foreign') { + warn(context.state.analysis.warnings, attribute, context.path, 'avoid-is'); + } else if (attribute.name === 'slot') { + /** @type {import('#compiler').RegularElement | import('#compiler').SvelteElement | import('#compiler').Component | import('#compiler').SvelteComponent | import('#compiler').SvelteSelf | undefined} */ + validate_slot_attribute(context, attribute); + } + } else if (attribute.type === 'AnimateDirective') { + const parent = context.path.at(-2); + if (parent?.type !== 'EachBlock') { + error(attribute, 'invalid-animation', 'no-each'); + } else if (!parent.key) { + error(attribute, 'invalid-animation', 'each-key'); + } else if ( + parent.body.nodes.filter( + (n) => + n.type !== 'Comment' && + n.type !== 'ConstTag' && + (n.type !== 'Text' || n.data.trim() !== '') + ).length > 1 + ) { + error(attribute, 'invalid-animation', 'child'); + } + + if (has_animate_directive) { + error(attribute, 'duplicate-animation'); + } else { + has_animate_directive = true; + } + } else if (attribute.type === 'TransitionDirective') { + if ((attribute.outro && has_out_transition) || (attribute.intro && has_in_transition)) { + /** @param {boolean} _in @param {boolean} _out */ + const type = (_in, _out) => (_in && _out ? 'transition' : _in ? 'in' : 'out'); + error( + attribute, + 'duplicate-transition', + type(has_in_transition, has_out_transition), + type(attribute.intro, attribute.outro) + ); + } + + has_in_transition = has_in_transition || attribute.intro; + has_out_transition = has_out_transition || attribute.outro; + } else if (attribute.type === 'OnDirective') { + let has_passive_modifier = false; + let conflicting_passive_modifier = ''; + for (const modifier of attribute.modifiers) { + if (!EventModifiers.includes(modifier)) { + error(attribute, 'invalid-event-modifier', EventModifiers); + } + if (modifier === 'passive') { + has_passive_modifier = true; + } else if (modifier === 'nonpassive' || modifier === 'preventDefault') { + conflicting_passive_modifier = modifier; + } + if (has_passive_modifier && conflicting_passive_modifier) { + error( + attribute, + 'invalid-event-modifier-combination', + 'passive', + conflicting_passive_modifier + ); + } + } } } } @@ -361,6 +434,17 @@ export const validation = { `non-<svg> elements. Use 'clientWidth' for <svg> instead` ); } + + if (ContentEditableBindings.includes(node.name)) { + const contenteditable = /** @type {import('#compiler').Attribute} */ ( + parent.attributes.find((a) => a.type === 'Attribute' && a.name === 'contenteditable') + ); + if (!contenteditable) { + error(node, 'missing-contenteditable-attribute'); + } else if (!is_text_attribute(contenteditable)) { + error(contenteditable, 'dynamic-contenteditable-attribute'); + } + } } else { const match = fuzzymatch(node.name, Object.keys(binding_properties)); if (match) { @@ -373,6 +457,40 @@ export const validation = { } } }, + ExportDefaultDeclaration(node) { + error(node, 'default-export'); + }, + ConstTag(node, context) { + const parent = context.path.at(-1); + const grand_parent = context.path.at(-2); + if ( + parent?.type !== 'Fragment' || + (grand_parent?.type !== 'IfBlock' && + grand_parent?.type !== 'SvelteFragment' && + grand_parent?.type !== 'Component' && + grand_parent?.type !== 'SvelteComponent' && + grand_parent?.type !== 'EachBlock' && + grand_parent?.type !== 'AwaitBlock' && + ((grand_parent?.type !== 'RegularElement' && grand_parent?.type !== 'SvelteElement') || + !grand_parent.attributes.some((a) => a.type === 'Attribute' && a.name === 'slot'))) + ) { + error(node, 'invalid-const-placement'); + } + }, + LetDirective(node, context) { + const parent = context.path.at(-1); + if ( + parent === undefined || + (parent.type !== 'Component' && + parent.type !== 'RegularElement' && + parent.type !== 'SvelteElement' && + parent.type !== 'SvelteComponent' && + parent.type !== 'SvelteSelf' && + parent.type !== 'SvelteFragment') + ) { + error(node, 'invalid-let-directive-placement'); + } + }, RegularElement(node, context) { if (node.name === 'textarea' && node.fragment.nodes.length > 0) { for (const attribute of node.attributes) { @@ -382,6 +500,21 @@ export const validation = { } } + const binding = context.state.scope.get(node.name); + if ( + binding !== null && + binding.declaration_kind === 'import' && + binding.references.length === 0 + ) { + warn( + context.state.analysis.warnings, + node, + context.path, + 'component-name-lowercase', + node.name + ); + } + validate_element(node, context); if (context.state.parent_element) { @@ -395,6 +528,12 @@ export const validation = { parent_element: node.name }); }, + SvelteHead(node) { + const attribute = node.attributes[0]; + if (attribute) { + error(attribute, 'illegal-svelte-head-attribute'); + } + }, SvelteElement(node, context) { validate_element(node, context); context.next({ @@ -403,6 +542,11 @@ export const validation = { }); }, SvelteFragment(node, context) { + const parent = context.path.at(-2); + if (parent?.type !== 'Component' && parent?.type !== 'SvelteComponent') { + error(node, 'invalid-svelte-fragment-placement'); + } + for (const attribute of node.attributes) { if (attribute.type === 'Attribute') { if (attribute.name === 'slot') { @@ -418,7 +562,11 @@ export const validation = { if (attribute.type === 'Attribute') { if (attribute.name === 'name') { if (!is_text_attribute(attribute)) { - error(attribute, 'invalid-slot-name'); + error(attribute, 'invalid-slot-name', false); + } + const slot_name = attribute.value[0].data; + if (slot_name === 'default') { + error(attribute, 'invalid-slot-name', true); } } } else if (attribute.type !== 'SpreadAttribute') { @@ -437,6 +585,17 @@ export const validation = { } } }, + TitleElement(node) { + const attribute = node.attributes[0]; + if (attribute) { + error(attribute, 'illegal-title-attribute'); + } + + const child = node.fragment.nodes.find((n) => n.type !== 'Text' && n.type !== 'ExpressionTag'); + if (child) { + error(child, 'invalid-title-content'); + } + }, ExpressionTag(node, context) { if (!node.parent) return; if (context.state.parent_element) { @@ -468,6 +627,15 @@ export const validation_legacy = merge(validation, a11y_validators, { if (parent && parent.type === 'ConstTag') return; validate_assignment(node, node.left, state); }, + LabeledStatement(node, { path, state }) { + if ( + node.label.name === '$' && + (state.ast_type !== 'instance' || + /** @type {import('#compiler').SvelteNode} */ (path.at(-1)).type !== 'Program') + ) { + warn(state.analysis.warnings, node, path, 'no-reactive-declaration'); + } + }, UpdateExpression(node, { state }) { validate_assignment(node, node.argument, state); } @@ -628,7 +796,19 @@ export const validation_runes_js = { * @param {boolean} is_binding */ function validate_no_const_assignment(node, argument, scope, is_binding) { - if (argument.type === 'Identifier') { + if (argument.type === 'ArrayPattern') { + for (const element of argument.elements) { + if (element) { + validate_no_const_assignment(node, element, scope, is_binding); + } + } + } else if (argument.type === 'ObjectPattern') { + for (const element of argument.properties) { + if (element.type === 'Property') { + validate_no_const_assignment(node, element.value, scope, is_binding); + } + } + } else if (argument.type === 'Identifier') { const binding = scope.get(argument.name); if (binding?.declaration_kind === 'const' && binding.kind !== 'each') { error( diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/javascript-legacy.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/javascript-legacy.js index 218756ad8c..bfc7998b86 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/javascript-legacy.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/javascript-legacy.js @@ -104,15 +104,16 @@ export const javascript_visitors_legacy = { if (context.path.length > 1) return; if (node.label.name !== '$') return; const state = context.state; - - // TODO bail out if we're in module context - // To recreate Svelte 4 behaviour, we track the dependencies // the compiler can 'see', but we untrack the effect itself - const { dependencies } = /** @type {import('#compiler').ReactiveStatement} */ ( + const reactive_stmt = /** @type {import('#compiler').ReactiveStatement} */ ( state.analysis.reactive_statements.get(node) ); + if (!reactive_stmt) return; // not the instance context + + const { dependencies } = reactive_stmt; + let serialized_body = /** @type {import('estree').Statement} */ (context.visit(node.body)); if (serialized_body.type !== 'BlockStatement') { diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js index 5b4003f180..dbde21e95e 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js @@ -2757,19 +2757,9 @@ export const template_visitors = { serialize_event_attribute(node, context); } }, - LetDirective(node, { state, path }) { + LetDirective(node, { state }) { // let:x --> const x = $.derived(() => $.unwrap($$slotProps).x); // let:x={{y, z}} --> const derived_x = $.derived(() => { const { y, z } = $.unwrap($$slotProps).x; return { y, z })); - const parent = path.at(-1); - if ( - parent === undefined || - (parent.type !== 'Component' && - parent.type !== 'RegularElement' && - parent.type !== 'SvelteFragment') - ) { - error(node, 'INTERNAL', 'let directive at invalid position'); - } - if (node.expression && node.expression.type !== 'Identifier') { const name = state.scope.generate(node.name); const bindings = state.scope.get_bindings(node); diff --git a/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js b/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js index 79153baed6..0bbd094498 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js @@ -1495,17 +1495,7 @@ const template_visitors = { state.template.push(t_statement(call)); state.template.push(t_expression(id)); }, - LetDirective(node, { state, path }) { - const parent = path.at(-1); - if ( - parent === undefined || - (parent.type !== 'Component' && - parent.type !== 'RegularElement' && - parent.type !== 'SvelteFragment') - ) { - error(node, 'INTERNAL', 'let directive at invalid position'); - } - + LetDirective(node, { state }) { if (node.expression && node.expression.type !== 'Identifier') { const name = state.scope.generate(node.name); const bindings = state.scope.get_bindings(node); diff --git a/packages/svelte/src/compiler/phases/constants.js b/packages/svelte/src/compiler/phases/constants.js index 9c4af55145..d31a30f051 100644 --- a/packages/svelte/src/compiler/phases/constants.js +++ b/packages/svelte/src/compiler/phases/constants.js @@ -184,3 +184,15 @@ export const SVGElements = [ 'view', 'vkern' ]; + +export const EventModifiers = [ + 'preventDefault', + 'stopPropagation', + 'stopImmediatePropagation', + 'capture', + 'once', + 'passive', + 'nonpassive', + 'self', + 'trusted' +]; diff --git a/packages/svelte/src/compiler/phases/patterns.js b/packages/svelte/src/compiler/phases/patterns.js index c6abc94d5c..880296dd59 100644 --- a/packages/svelte/src/compiler/phases/patterns.js +++ b/packages/svelte/src/compiler/phases/patterns.js @@ -20,3 +20,4 @@ export const regex_special_chars = /[\d+`!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?~]/; export const regex_starts_with_vowel = /^[aeiou]/; export const regex_heading_tags = /^h[1-6]$/; +export const regex_illegal_attribute_character = /(^[0-9-.])|[\^$@%&#?!|()[\]{}^*+~;]/; diff --git a/packages/svelte/src/compiler/phases/scope.js b/packages/svelte/src/compiler/phases/scope.js index 4f836f8f7a..f4b1265550 100644 --- a/packages/svelte/src/compiler/phases/scope.js +++ b/packages/svelte/src/compiler/phases/scope.js @@ -87,6 +87,11 @@ export class Scope { } } + if (this.declarations.has(node.name)) { + // This also errors on var/function types, but that's arguably a good thing + error(node, 'duplicate-declaration', node.name); + } + /** @type {import('#compiler').Binding} */ const binding = { node, @@ -170,6 +175,7 @@ export class Scope { * @param {import('#compiler').SvelteNode[]} path */ reference(node, path) { + path = [...path]; // ensure that mutations to path afterwards don't affect this reference let references = this.references.get(node.name); if (!references) this.references.set(node.name, (references = [])); @@ -596,18 +602,6 @@ export function create_scopes(ast, root, allow_reactive_declarations, parent) { ) ]); context.next(); - }, - - ConstTag(node, { state, next }) { - const declaration = node.declaration.declarations[0]; - for (const identifier of extract_identifiers(declaration.id)) { - state.scope.declare( - /** @type {import('estree').Identifier} */ (identifier), - 'derived', - 'const' - ); - } - next(); } // TODO others diff --git a/packages/svelte/src/compiler/types/css.d.ts b/packages/svelte/src/compiler/types/css.d.ts index e4d587ef65..7d936207ac 100644 --- a/packages/svelte/src/compiler/types/css.d.ts +++ b/packages/svelte/src/compiler/types/css.d.ts @@ -59,7 +59,7 @@ export interface PseudoElementSelector extends BaseNode { export interface PseudoClassSelector extends BaseNode { type: 'PseudoClassSelector'; name: string; - args: string | null; + args: SelectorList | null; } export interface Percentage extends BaseNode { diff --git a/packages/svelte/src/compiler/types/template.d.ts b/packages/svelte/src/compiler/types/template.d.ts index 621e8092b2..6343b7ae32 100644 --- a/packages/svelte/src/compiler/types/template.d.ts +++ b/packages/svelte/src/compiler/types/template.d.ts @@ -132,7 +132,7 @@ export interface Comment extends BaseNode { export interface ConstTag extends BaseNode { type: 'ConstTag'; declaration: VariableDeclaration & { - declarations: [VariableDeclarator & { id: Identifier; init: Expression }]; + declarations: [VariableDeclarator & { id: Pattern; init: Expression }]; }; } diff --git a/packages/svelte/src/compiler/warnings.js b/packages/svelte/src/compiler/warnings.js index 6c38b1e052..f9e74786e3 100644 --- a/packages/svelte/src/compiler/warnings.js +++ b/packages/svelte/src/compiler/warnings.js @@ -201,6 +201,18 @@ const performance = { 'avoid-nested-class': () => `Avoid declaring classes below the top level scope` }; +/** @satisfies {Warnings} */ +const components = { + /** @param {string} name */ + 'component-name-lowercase': (name) => + `<${name}> will be treated as an HTML element unless it begins with a capital letter` +}; + +const legacy = { + 'no-reactive-declaration': () => + `Reactive declarations only exist at the top level of the instance script` +}; + /** @satisfies {Warnings} */ const warnings = { ...css, @@ -208,7 +220,9 @@ const warnings = { ...runes, ...a11y, ...performance, - ...state + ...state, + ...components, + ...legacy }; /** @typedef {typeof warnings} AllWarnings */ diff --git a/packages/svelte/tests/runtime-runes/samples/directives-with-member-access/main.svelte b/packages/svelte/tests/runtime-runes/samples/directives-with-member-access/main.svelte index 66eb1eed36..c5e7087991 100644 --- a/packages/svelte/tests/runtime-runes/samples/directives-with-member-access/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/directives-with-member-access/main.svelte @@ -14,6 +14,8 @@ in other words a number. Relatedly, people should not do this. It is stupid. --> <div use:directive.b.c-d /> <div transition:directive.b.c-d /> -<div animate:directive.b.c-d /> +{#each [] as i (i)} + <div animate:directive.b.c-d /> +{/each} <div in:directive.b.c-d /> <div out:directive.b.c-d /> diff --git a/packages/svelte/tests/runtime-runes/samples/typescript-const1/_config.js b/packages/svelte/tests/runtime-runes/samples/typescript-const1/_config.js index 644f802ac6..b34c10c8f3 100644 --- a/packages/svelte/tests/runtime-runes/samples/typescript-const1/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/typescript-const1/_config.js @@ -1,5 +1,5 @@ import { test } from '../../test'; export default test({ - html: '<p>10 * 10 = 100</p><p>20 * 20 = 400</p>' + html: '<p>10 * 10 = 100</p><p>{}</p><p>20 * 20 = 400</p><p>{}</p>' }); diff --git a/packages/svelte/tests/runtime-runes/samples/typescript-const1/main.svelte b/packages/svelte/tests/runtime-runes/samples/typescript-const1/main.svelte index 1ec792c4ec..04d555cabc 100644 --- a/packages/svelte/tests/runtime-runes/samples/typescript-const1/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/typescript-const1/main.svelte @@ -4,5 +4,7 @@ {#each boxes as box} {@const area: number = box.width * box.height} + {@const name: string = "{}"} <p>{box.width} * {box.height} = {area}</p> + <p>{name}</p> {/each} diff --git a/packages/svelte/tests/runtime-runes/samples/typescript-const2/_config.js b/packages/svelte/tests/runtime-runes/samples/typescript-const2/_config.js deleted file mode 100644 index 646f2812a2..0000000000 --- a/packages/svelte/tests/runtime-runes/samples/typescript-const2/_config.js +++ /dev/null @@ -1,5 +0,0 @@ -import { test } from '../../test'; - -export default test({ - html: '<p>{}</p>' -}); diff --git a/packages/svelte/tests/runtime-runes/samples/typescript-const2/main.svelte b/packages/svelte/tests/runtime-runes/samples/typescript-const2/main.svelte deleted file mode 100644 index f1096908f8..0000000000 --- a/packages/svelte/tests/runtime-runes/samples/typescript-const2/main.svelte +++ /dev/null @@ -1,5 +0,0 @@ -<script lang="ts"> -</script> - -{@const name: string = "{}"} -<p>{name}</p> diff --git a/packages/svelte/tests/validator/samples/a11y-contenteditable-element-without-child/input.svelte b/packages/svelte/tests/validator/samples/a11y-contenteditable-element-without-child/input.svelte index 0702c3cb45..101e08e7a7 100644 --- a/packages/svelte/tests/validator/samples/a11y-contenteditable-element-without-child/input.svelte +++ b/packages/svelte/tests/validator/samples/a11y-contenteditable-element-without-child/input.svelte @@ -3,4 +3,4 @@ </script> <p bind:textContent={text} contenteditable="true"></p> <p bind:innerHTML={text} contenteditable="true"></p> -<p bind:innerHTML={text}></p> +<p bind:innerHTML={text} contenteditable="true"></p> diff --git a/packages/svelte/tests/validator/samples/action-on-component/_config.js b/packages/svelte/tests/validator/samples/action-on-component/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/action-on-component/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/action-on-component/errors.json b/packages/svelte/tests/validator/samples/action-on-component/errors.json index c85695f9bb..6516cf9108 100644 --- a/packages/svelte/tests/validator/samples/action-on-component/errors.json +++ b/packages/svelte/tests/validator/samples/action-on-component/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-action", - "message": "Actions can only be applied to DOM elements, not components", + "code": "invalid-component-directive", + "message": "This type of directive is not valid on components", "start": { "line": 7, "column": 8 diff --git a/packages/svelte/tests/validator/samples/animation-duplicate/_config.js b/packages/svelte/tests/validator/samples/animation-duplicate/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/animation-duplicate/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/animation-not-in-each/_config.js b/packages/svelte/tests/validator/samples/animation-not-in-each/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/animation-not-in-each/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/animation-not-in-keyed-each/_config.js b/packages/svelte/tests/validator/samples/animation-not-in-keyed-each/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/animation-not-in-keyed-each/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/animation-on-component/_config.js b/packages/svelte/tests/validator/samples/animation-on-component/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/animation-on-component/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/animation-on-component/errors.json b/packages/svelte/tests/validator/samples/animation-on-component/errors.json index b6e5ade74f..eabf72bb02 100644 --- a/packages/svelte/tests/validator/samples/animation-on-component/errors.json +++ b/packages/svelte/tests/validator/samples/animation-on-component/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-animation", - "message": "Animations can only be applied to DOM elements, not components", + "code": "invalid-component-directive", + "message": "This type of directive is not valid on components", "start": { "line": 7, "column": 8 diff --git a/packages/svelte/tests/validator/samples/animation-siblings/_config.js b/packages/svelte/tests/validator/samples/animation-siblings/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/animation-siblings/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/assignment-to-const-2/_config.js b/packages/svelte/tests/validator/samples/assignment-to-const-2/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/assignment-to-const-2/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/assignment-to-const-2/errors.json b/packages/svelte/tests/validator/samples/assignment-to-const-2/errors.json index 7bbd36b9a1..1b74f51563 100644 --- a/packages/svelte/tests/validator/samples/assignment-to-const-2/errors.json +++ b/packages/svelte/tests/validator/samples/assignment-to-const-2/errors.json @@ -1,7 +1,7 @@ [ { - "code": "assignment-to-const", - "message": "You are assigning to a const", + "code": "invalid-const-assignment", + "message": "Invalid assignment to const variable", "start": { "line": 13, "column": 24 diff --git a/packages/svelte/tests/validator/samples/assignment-to-const-3/_config.js b/packages/svelte/tests/validator/samples/assignment-to-const-3/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/assignment-to-const-3/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/assignment-to-const-3/errors.json b/packages/svelte/tests/validator/samples/assignment-to-const-3/errors.json index 1201c10a83..b00dd32495 100644 --- a/packages/svelte/tests/validator/samples/assignment-to-const-3/errors.json +++ b/packages/svelte/tests/validator/samples/assignment-to-const-3/errors.json @@ -1,7 +1,7 @@ [ { - "code": "assignment-to-const", - "message": "You are assigning to a const", + "code": "invalid-const-assignment", + "message": "Invalid assignment to const variable", "start": { "line": 14, "column": 3 diff --git a/packages/svelte/tests/validator/samples/assignment-to-const-4/_config.js b/packages/svelte/tests/validator/samples/assignment-to-const-4/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/assignment-to-const-4/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/assignment-to-const-4/errors.json b/packages/svelte/tests/validator/samples/assignment-to-const-4/errors.json index 39474b2f70..1fcfaf2406 100644 --- a/packages/svelte/tests/validator/samples/assignment-to-const-4/errors.json +++ b/packages/svelte/tests/validator/samples/assignment-to-const-4/errors.json @@ -1,7 +1,7 @@ [ { - "code": "assignment-to-const", - "message": "You are assigning to a const", + "code": "invalid-const-assignment", + "message": "Invalid assignment to const variable", "start": { "line": 17, "column": 2 diff --git a/packages/svelte/tests/validator/samples/assignment-to-const-5/_config.js b/packages/svelte/tests/validator/samples/assignment-to-const-5/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/assignment-to-const-5/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/assignment-to-const-5/errors.json b/packages/svelte/tests/validator/samples/assignment-to-const-5/errors.json index 715f33b638..9bff01645a 100644 --- a/packages/svelte/tests/validator/samples/assignment-to-const-5/errors.json +++ b/packages/svelte/tests/validator/samples/assignment-to-const-5/errors.json @@ -1,7 +1,7 @@ [ { - "code": "assignment-to-const", - "message": "You are assigning to a const", + "code": "invalid-const-assignment", + "message": "Invalid assignment to const variable", "start": { "line": 3, "column": 1 diff --git a/packages/svelte/tests/validator/samples/assignment-to-const-7/_config.js b/packages/svelte/tests/validator/samples/assignment-to-const-7/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/assignment-to-const-7/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/assignment-to-const-7/errors.json b/packages/svelte/tests/validator/samples/assignment-to-const-7/errors.json index 5ac8ad8b68..02e5503b16 100644 --- a/packages/svelte/tests/validator/samples/assignment-to-const-7/errors.json +++ b/packages/svelte/tests/validator/samples/assignment-to-const-7/errors.json @@ -1,7 +1,7 @@ [ { - "code": "assignment-to-const", - "message": "You are assigning to a const", + "code": "invalid-const-assignment", + "message": "Invalid assignment to const variable", "start": { "line": 3, "column": 1 diff --git a/packages/svelte/tests/validator/samples/assignment-to-const/_config.js b/packages/svelte/tests/validator/samples/assignment-to-const/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/assignment-to-const/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/assignment-to-const/errors.json b/packages/svelte/tests/validator/samples/assignment-to-const/errors.json index b822452b92..88d6b728b9 100644 --- a/packages/svelte/tests/validator/samples/assignment-to-const/errors.json +++ b/packages/svelte/tests/validator/samples/assignment-to-const/errors.json @@ -1,7 +1,7 @@ [ { - "code": "assignment-to-const", - "message": "You are assigning to a const", + "code": "invalid-const-assignment", + "message": "Invalid assignment to const variable", "start": { "line": 16, "column": 2 diff --git a/packages/svelte/tests/validator/samples/attribute-expected-equals/_config.js b/packages/svelte/tests/validator/samples/attribute-expected-equals/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/attribute-expected-equals/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/attribute-expected-equals/errors.json b/packages/svelte/tests/validator/samples/attribute-expected-equals/errors.json index 9b4c0e80a0..deb2331622 100644 --- a/packages/svelte/tests/validator/samples/attribute-expected-equals/errors.json +++ b/packages/svelte/tests/validator/samples/attribute-expected-equals/errors.json @@ -1,7 +1,7 @@ [ { - "code": "unexpected-token", - "message": "Expected =", + "code": "expected-token", + "message": "Expected token =", "start": { "line": 5, "column": 9 diff --git a/packages/svelte/tests/validator/samples/attribute-invalid-name-2/_config.js b/packages/svelte/tests/validator/samples/attribute-invalid-name-2/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/attribute-invalid-name-2/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/attribute-invalid-name-2/errors.json b/packages/svelte/tests/validator/samples/attribute-invalid-name-2/errors.json index 2c4e083c7e..0e4afb3009 100644 --- a/packages/svelte/tests/validator/samples/attribute-invalid-name-2/errors.json +++ b/packages/svelte/tests/validator/samples/attribute-invalid-name-2/errors.json @@ -1,6 +1,6 @@ [ { - "code": "illegal-attribute", + "code": "invalid-attribute-name", "message": "'3aa' is not a valid attribute name", "start": { "line": 1, diff --git a/packages/svelte/tests/validator/samples/attribute-invalid-name-3/_config.js b/packages/svelte/tests/validator/samples/attribute-invalid-name-3/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/attribute-invalid-name-3/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/attribute-invalid-name-3/errors.json b/packages/svelte/tests/validator/samples/attribute-invalid-name-3/errors.json index f90739a52a..c13a5c5b90 100644 --- a/packages/svelte/tests/validator/samples/attribute-invalid-name-3/errors.json +++ b/packages/svelte/tests/validator/samples/attribute-invalid-name-3/errors.json @@ -1,6 +1,6 @@ [ { - "code": "illegal-attribute", + "code": "invalid-attribute-name", "message": "'a*a' is not a valid attribute name", "start": { "line": 1, diff --git a/packages/svelte/tests/validator/samples/attribute-invalid-name-4/_config.js b/packages/svelte/tests/validator/samples/attribute-invalid-name-4/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/attribute-invalid-name-4/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/attribute-invalid-name-4/errors.json b/packages/svelte/tests/validator/samples/attribute-invalid-name-4/errors.json index 1368e0c12a..4cccb34b28 100644 --- a/packages/svelte/tests/validator/samples/attribute-invalid-name-4/errors.json +++ b/packages/svelte/tests/validator/samples/attribute-invalid-name-4/errors.json @@ -1,6 +1,6 @@ [ { - "code": "illegal-attribute", + "code": "invalid-attribute-name", "message": "'-a' is not a valid attribute name", "start": { "line": 1, diff --git a/packages/svelte/tests/validator/samples/attribute-invalid-name-5/_config.js b/packages/svelte/tests/validator/samples/attribute-invalid-name-5/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/attribute-invalid-name-5/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/attribute-invalid-name-5/errors.json b/packages/svelte/tests/validator/samples/attribute-invalid-name-5/errors.json index 5d2d1390df..b99bb946ae 100644 --- a/packages/svelte/tests/validator/samples/attribute-invalid-name-5/errors.json +++ b/packages/svelte/tests/validator/samples/attribute-invalid-name-5/errors.json @@ -1,6 +1,6 @@ [ { - "code": "illegal-attribute", + "code": "invalid-attribute-name", "message": "'a;' is not a valid attribute name", "start": { "line": 1, diff --git a/packages/svelte/tests/validator/samples/attribute-invalid-name/_config.js b/packages/svelte/tests/validator/samples/attribute-invalid-name/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/attribute-invalid-name/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/attribute-invalid-name/errors.json b/packages/svelte/tests/validator/samples/attribute-invalid-name/errors.json index a688cba3de..5b674a6f7d 100644 --- a/packages/svelte/tests/validator/samples/attribute-invalid-name/errors.json +++ b/packages/svelte/tests/validator/samples/attribute-invalid-name/errors.json @@ -1,6 +1,6 @@ [ { - "code": "illegal-attribute", + "code": "invalid-attribute-name", "message": "'}' is not a valid attribute name", "start": { "line": 1, diff --git a/packages/svelte/tests/validator/samples/component-dynamic/options.json b/packages/svelte/tests/validator/samples/component-dynamic/options.json deleted file mode 100644 index 0b2a999c76..0000000000 --- a/packages/svelte/tests/validator/samples/component-dynamic/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "generate": true -} diff --git a/packages/svelte/tests/validator/samples/component-event-modifiers-invalid/_config.js b/packages/svelte/tests/validator/samples/component-event-modifiers-invalid/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/component-event-modifiers-invalid/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/component-invalid-style-directive/_config.js b/packages/svelte/tests/validator/samples/component-invalid-style-directive/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/component-invalid-style-directive/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/component-invalid-style-directive/errors.json b/packages/svelte/tests/validator/samples/component-invalid-style-directive/errors.json index 8c4a686766..6c37a888ff 100644 --- a/packages/svelte/tests/validator/samples/component-invalid-style-directive/errors.json +++ b/packages/svelte/tests/validator/samples/component-invalid-style-directive/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-component-style-directive", - "message": "Style directives cannot be used on components", + "code": "invalid-component-directive", + "message": "This type of directive is not valid on components", "start": { "line": 7, "column": 19 }, "end": { "line": 7, "column": 36 } } diff --git a/packages/svelte/tests/validator/samples/component-name-lowercase/_config.js b/packages/svelte/tests/validator/samples/component-name-lowercase/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/component-name-lowercase/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/component-slot-default-duplicate/_config.js b/packages/svelte/tests/validator/samples/component-slot-default-duplicate/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/component-slot-default-duplicate/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/component-slot-default-duplicate/errors.json b/packages/svelte/tests/validator/samples/component-slot-default-duplicate/errors.json deleted file mode 100644 index 8c093fd705..0000000000 --- a/packages/svelte/tests/validator/samples/component-slot-default-duplicate/errors.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "message": "duplicate default <slot> element", - "start": { - "line": 2, - "column": 0 - } - } -] diff --git a/packages/svelte/tests/validator/samples/component-slot-default-duplicate/input.svelte b/packages/svelte/tests/validator/samples/component-slot-default-duplicate/input.svelte deleted file mode 100644 index 9dffac4144..0000000000 --- a/packages/svelte/tests/validator/samples/component-slot-default-duplicate/input.svelte +++ /dev/null @@ -1,2 +0,0 @@ -<slot></slot> -<slot></slot> \ No newline at end of file diff --git a/packages/svelte/tests/validator/samples/component-slot-default-reserved/_config.js b/packages/svelte/tests/validator/samples/component-slot-default-reserved/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/component-slot-default-reserved/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/component-slot-dynamic-attribute/_config.js b/packages/svelte/tests/validator/samples/component-slot-dynamic-attribute/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/component-slot-dynamic-attribute/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/component-slot-dynamic-attribute/errors.json b/packages/svelte/tests/validator/samples/component-slot-dynamic-attribute/errors.json index cb15babd60..9194e8aa9b 100644 --- a/packages/svelte/tests/validator/samples/component-slot-dynamic-attribute/errors.json +++ b/packages/svelte/tests/validator/samples/component-slot-dynamic-attribute/errors.json @@ -1,7 +1,7 @@ [ { "code": "invalid-slot-attribute", - "message": "slot attribute cannot have a dynamic value", + "message": "slot attribute must be a static value", "start": { "line": 6, "column": 9 diff --git a/packages/svelte/tests/validator/samples/component-slot-dynamic/_config.js b/packages/svelte/tests/validator/samples/component-slot-dynamic/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/component-slot-dynamic/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/component-slot-dynamic/errors.json b/packages/svelte/tests/validator/samples/component-slot-dynamic/errors.json index 65b400437f..963cb1f40d 100644 --- a/packages/svelte/tests/validator/samples/component-slot-dynamic/errors.json +++ b/packages/svelte/tests/validator/samples/component-slot-dynamic/errors.json @@ -1,7 +1,7 @@ [ { - "code": "dynamic-slot-name", - "message": "<slot> name cannot be dynamic", + "code": "invalid-slot-name", + "message": "slot attribute must be a static value", "start": { "line": 1, "column": 6 diff --git a/packages/svelte/tests/validator/samples/component-slot-named-duplicate/_config.js b/packages/svelte/tests/validator/samples/component-slot-named-duplicate/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/component-slot-named-duplicate/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/component-slot-named-duplicate/errors.json b/packages/svelte/tests/validator/samples/component-slot-named-duplicate/errors.json deleted file mode 100644 index e8152c3602..0000000000 --- a/packages/svelte/tests/validator/samples/component-slot-named-duplicate/errors.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "message": "duplicate 'foo' <slot> element", - "start": { - "line": 2, - "column": 6 - } - } -] diff --git a/packages/svelte/tests/validator/samples/component-slot-named-duplicate/input.svelte b/packages/svelte/tests/validator/samples/component-slot-named-duplicate/input.svelte deleted file mode 100644 index b0affc0608..0000000000 --- a/packages/svelte/tests/validator/samples/component-slot-named-duplicate/input.svelte +++ /dev/null @@ -1,2 +0,0 @@ -<slot name='foo'></slot> -<slot name='foo'></slot> \ No newline at end of file diff --git a/packages/svelte/tests/validator/samples/component-slotted-custom-element-2/_config.js b/packages/svelte/tests/validator/samples/component-slotted-custom-element-2/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/component-slotted-custom-element-2/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/component-slotted-custom-element-2/errors.json b/packages/svelte/tests/validator/samples/component-slotted-custom-element-2/errors.json index a0be2a67ac..da10838a69 100644 --- a/packages/svelte/tests/validator/samples/component-slotted-custom-element-2/errors.json +++ b/packages/svelte/tests/validator/samples/component-slotted-custom-element-2/errors.json @@ -1,6 +1,6 @@ [ { - "code": "invalid-slotted-content", + "code": "invalid-slot-placement", "message": "Element with a slot='...' attribute must be a child of a component or a descendant of a custom element", "start": { "line": 10, "column": 9 }, "end": { "line": 10, "column": 19 } diff --git a/packages/svelte/tests/validator/samples/component-slotted-each-block/_config.js b/packages/svelte/tests/validator/samples/component-slotted-each-block/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/component-slotted-each-block/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/component-slotted-each-block/errors.json b/packages/svelte/tests/validator/samples/component-slotted-each-block/errors.json index 38f4e6f671..12d2407540 100644 --- a/packages/svelte/tests/validator/samples/component-slotted-each-block/errors.json +++ b/packages/svelte/tests/validator/samples/component-slotted-each-block/errors.json @@ -1,6 +1,6 @@ [ { - "code": "invalid-slotted-content", + "code": "invalid-slot-placement", "message": "Element with a slot='...' attribute must be a child of a component or a descendant of a custom element", "start": { "line": 7, diff --git a/packages/svelte/tests/validator/samples/component-slotted-if-block/_config.js b/packages/svelte/tests/validator/samples/component-slotted-if-block/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/component-slotted-if-block/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/component-slotted-if-block/errors.json b/packages/svelte/tests/validator/samples/component-slotted-if-block/errors.json index 38f4e6f671..12d2407540 100644 --- a/packages/svelte/tests/validator/samples/component-slotted-if-block/errors.json +++ b/packages/svelte/tests/validator/samples/component-slotted-if-block/errors.json @@ -1,6 +1,6 @@ [ { - "code": "invalid-slotted-content", + "code": "invalid-slot-placement", "message": "Element with a slot='...' attribute must be a child of a component or a descendant of a custom element", "start": { "line": 7, diff --git a/packages/svelte/tests/validator/samples/const-tag-conflict-1/_config.js b/packages/svelte/tests/validator/samples/const-tag-conflict-1/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/const-tag-conflict-1/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); 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 d92528566a..78beca08c7 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,8 +1,8 @@ [ { - "code": "invalid-const-declaration", + "code": "duplicate-declaration", "message": "'a' has already been declared", - "start": { "line": 7, "column": 2 }, - "end": { "line": 7, "column": 19 } + "start": { "line": 7, "column": 10 }, + "end": { "line": 7, "column": 11 } } ] diff --git a/packages/svelte/tests/validator/samples/const-tag-conflict-2/_config.js b/packages/svelte/tests/validator/samples/const-tag-conflict-2/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/const-tag-conflict-2/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); 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 7636f8fcbc..dc3c1322c7 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,8 +1,8 @@ [ { - "code": "invalid-const-declaration", + "code": "duplicate-declaration", "message": "'item' has already been declared", - "start": { "line": 6, "column": 2 }, - "end": { "line": 6, "column": 21 } + "start": { "line": 6, "column": 10 }, + "end": { "line": 6, "column": 14 } } ] diff --git a/packages/svelte/tests/validator/samples/const-tag-placement-1/_config.js b/packages/svelte/tests/validator/samples/const-tag-placement-1/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/const-tag-placement-1/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/const-tag-placement-2/_config.js b/packages/svelte/tests/validator/samples/const-tag-placement-2/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/const-tag-placement-2/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/const-tag-readonly-2/_config.js b/packages/svelte/tests/validator/samples/const-tag-readonly-2/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/const-tag-readonly-2/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); 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 15307d637e..a8c60a8b56 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,7 +1,7 @@ [ { - "code": "invalid-binding", - "message": "Cannot bind to a variable declared with {@const ...}", + "code": "invalid-const-assignment", + "message": "Invalid binding to const variable ($derived values, let: directives, :then/:catch variables and @const declarations count as const)", "start": { "line": 7, "column": 9 }, "end": { "line": 7, "column": 23 } } diff --git a/packages/svelte/tests/validator/samples/contenteditable-dynamic/_config.js b/packages/svelte/tests/validator/samples/contenteditable-dynamic/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/contenteditable-dynamic/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/contenteditable-missing/_config.js b/packages/svelte/tests/validator/samples/contenteditable-missing/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/contenteditable-missing/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-1/_config.js b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-1/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-1/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-1/errors.json b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-1/errors.json index 3bce9fbc01..fc90941b1c 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-1/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-1/errors.json @@ -1,7 +1,7 @@ [ { - "code": "css-invalid-selector", - "message": "Invalid selector \"> span\"", + "code": "invalid-css-selector", + "message": "Invalid selector", "start": { "line": 10, "column": 1 }, "end": { "line": 10, "column": 7 } } diff --git a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-2/_config.js b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-2/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-2/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-2/errors.json b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-2/errors.json index 38305e106b..aae67dc75a 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-2/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-2/errors.json @@ -1,7 +1,7 @@ [ { - "code": "css-invalid-selector", - "message": "Invalid selector \"+ p\"", + "code": "invalid-css-selector", + "message": "Invalid selector", "start": { "line": 8, "column": 1 }, "end": { "line": 8, "column": 4 } } diff --git a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-3/_config.js b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-3/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-3/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-3/errors.json b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-3/errors.json index ad35720249..9f3d06660c 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-3/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-3/errors.json @@ -1,7 +1,7 @@ [ { - "code": "css-invalid-selector", - "message": "Invalid selector \"> span\"", + "code": "invalid-css-selector", + "message": "Invalid selector", "start": { "line": 5, "column": 2 }, "end": { "line": 5, "column": 8 } } diff --git a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-4/_config.js b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-4/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-4/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-4/errors.json b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-4/errors.json index 78b0815863..d7c9cfeb2e 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-4/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-combinator-selector-4/errors.json @@ -1,8 +1,8 @@ [ { - "code": "css-invalid-selector", - "message": "Invalid selector \"p >\"", + "code": "invalid-css-selector", + "message": "Invalid selector", "start": { "line": 4, "column": 1 }, - "end": { "line": 4, "column": 4 } + "end": { "line": 4, "column": 5 } } ] diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-placement-2/_config.js b/packages/svelte/tests/validator/samples/css-invalid-global-placement-2/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-global-placement-2/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-placement-2/errors.json b/packages/svelte/tests/validator/samples/css-invalid-global-placement-2/errors.json index eb1b20c807..7ba32a53fb 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-placement-2/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-global-placement-2/errors.json @@ -1,6 +1,6 @@ [ { - "code": "css-invalid-global", + "code": "invalid-css-global-placement", "message": ":global(...) can be at the start or end of a selector sequence, but not in the middle", "start": { "line": 2, diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-placement-3/_config.js b/packages/svelte/tests/validator/samples/css-invalid-global-placement-3/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-global-placement-3/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-placement-3/errors.json b/packages/svelte/tests/validator/samples/css-invalid-global-placement-3/errors.json index cd5464ccac..53e24d8d81 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-placement-3/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-global-placement-3/errors.json @@ -1,6 +1,6 @@ [ { - "code": "css-invalid-global", + "code": "invalid-css-global-placement", "message": ":global(...) can be at the start or end of a selector sequence, but not in the middle", "start": { "line": 5, diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-placement-4/_config.js b/packages/svelte/tests/validator/samples/css-invalid-global-placement-4/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-global-placement-4/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-placement-4/errors.json b/packages/svelte/tests/validator/samples/css-invalid-global-placement-4/errors.json index fbb4d30569..ab791212c6 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-placement-4/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-global-placement-4/errors.json @@ -1,7 +1,7 @@ [ { - "code": "css-invalid-global-selector-position", - "message": ":global(...) not at the start of a selector sequence should not contain type or universal selectors", + "code": "invalid-css-global-selector-list", + "message": ":global(...) cannot be used to modify a selector, or be modified by another selector", "start": { "line": 2, "column": 5 diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-placement-5/_config.js b/packages/svelte/tests/validator/samples/css-invalid-global-placement-5/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-global-placement-5/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-placement-5/errors.json b/packages/svelte/tests/validator/samples/css-invalid-global-placement-5/errors.json index 4b495faff0..9099d7adcb 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-placement-5/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-global-placement-5/errors.json @@ -1,7 +1,7 @@ [ { - "code": "css-invalid-global-selector-position", - "message": ":global(...) not at the start of a selector sequence should not contain type or universal selectors", + "code": "invalid-css-global-selector-list", + "message": ":global(...) cannot be used to modify a selector, or be modified by another selector", "start": { "line": 2, "column": 5 diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-placement/_config.js b/packages/svelte/tests/validator/samples/css-invalid-global-placement/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-global-placement/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-placement/errors.json b/packages/svelte/tests/validator/samples/css-invalid-global-placement/errors.json index eb1b20c807..7ba32a53fb 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-placement/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-global-placement/errors.json @@ -1,6 +1,6 @@ [ { - "code": "css-invalid-global", + "code": "invalid-css-global-placement", "message": ":global(...) can be at the start or end of a selector sequence, but not in the middle", "start": { "line": 2, diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector-2/_config.js b/packages/svelte/tests/validator/samples/css-invalid-global-selector-2/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector-2/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector-2/errors.json b/packages/svelte/tests/validator/samples/css-invalid-global-selector-2/errors.json index 3049ff71ef..36b3ec4753 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector-2/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-global-selector-2/errors.json @@ -1,7 +1,7 @@ [ { - "code": "css-invalid-global-selector", - "message": ":global(...) must contain a single selector", + "code": "invalid-css-global-selector", + "message": ":global(...) must contain exactly one selector", "start": { "line": 11, "column": 5 diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector-3/_config.js b/packages/svelte/tests/validator/samples/css-invalid-global-selector-3/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector-3/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector-3/errors.json b/packages/svelte/tests/validator/samples/css-invalid-global-selector-3/errors.json index 651acb3089..f4a75dcb17 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector-3/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-global-selector-3/errors.json @@ -1,7 +1,7 @@ [ { - "code": "css-invalid-global-selector", - "message": ":global(...) must contain a single selector", + "code": "invalid-css-global-selector", + "message": ":global(...) must contain exactly one selector", "start": { "line": 5, "column": 5 diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector-4/_config.js b/packages/svelte/tests/validator/samples/css-invalid-global-selector-4/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector-4/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector-4/errors.json b/packages/svelte/tests/validator/samples/css-invalid-global-selector-4/errors.json index c1bb229deb..a6ae2d595b 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector-4/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-global-selector-4/errors.json @@ -1,7 +1,7 @@ [ { - "code": "css-invalid-global-selector", - "message": ":global(...) must contain a single selector", + "code": "invalid-css-global-selector", + "message": ":global(...) must contain exactly one selector", "start": { "line": 2, "column": 5 diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector-5/_config.js b/packages/svelte/tests/validator/samples/css-invalid-global-selector-5/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector-5/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector-5/errors.json b/packages/svelte/tests/validator/samples/css-invalid-global-selector-5/errors.json index 9efd2be5a2..5ac729aa23 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector-5/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-global-selector-5/errors.json @@ -1,7 +1,7 @@ [ { - "code": "css-invalid-global-selector", - "message": ":global(...) must contain a single selector", + "code": "invalid-css-global-selector", + "message": ":global(...) must contain exactly one selector", "start": { "line": 5, "column": 1 diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector-6/_config.js b/packages/svelte/tests/validator/samples/css-invalid-global-selector-6/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector-6/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector-6/errors.json b/packages/svelte/tests/validator/samples/css-invalid-global-selector-6/errors.json index 9efd2be5a2..5ac729aa23 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector-6/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-global-selector-6/errors.json @@ -1,7 +1,7 @@ [ { - "code": "css-invalid-global-selector", - "message": ":global(...) must contain a single selector", + "code": "invalid-css-global-selector", + "message": ":global(...) must contain exactly one selector", "start": { "line": 5, "column": 1 diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector-6/input.svelte b/packages/svelte/tests/validator/samples/css-invalid-global-selector-6/input.svelte index e0b2ffd597..c43adf881a 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector-6/input.svelte +++ b/packages/svelte/tests/validator/samples/css-invalid-global-selector-6/input.svelte @@ -1,8 +1,8 @@ <style> - :global(.h1\,h2\,h3).foo { + :global(.h1\,h2\,h3)::foo { color: red; } - :global(h1, h2, h3).foo { + :global(h1, h2, h3)::foo { color: red; } </style> diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector/_config.js b/packages/svelte/tests/validator/samples/css-invalid-global-selector/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/css-invalid-global-selector/errors.json b/packages/svelte/tests/validator/samples/css-invalid-global-selector/errors.json index c7ef17faf9..40bae7d4d7 100644 --- a/packages/svelte/tests/validator/samples/css-invalid-global-selector/errors.json +++ b/packages/svelte/tests/validator/samples/css-invalid-global-selector/errors.json @@ -1,7 +1,7 @@ [ { - "code": "css-invalid-global-selector", - "message": ":global(...) must contain a single selector", + "code": "invalid-css-global-selector", + "message": ":global(...) must contain exactly one selector", "start": { "line": 11, "column": 5 diff --git a/packages/svelte/tests/validator/samples/debug-invalid-args/_config.js b/packages/svelte/tests/validator/samples/debug-invalid-args/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/debug-invalid-args/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/debug-invalid-args/errors.json b/packages/svelte/tests/validator/samples/debug-invalid-args/errors.json index 26c0103026..b21af2c438 100644 --- a/packages/svelte/tests/validator/samples/debug-invalid-args/errors.json +++ b/packages/svelte/tests/validator/samples/debug-invalid-args/errors.json @@ -1,6 +1,6 @@ [ { - "code": "invalid-debug-args", + "code": "invalid-debug", "message": "{@debug ...} arguments must be identifiers, not arbitrary expressions", "start": { "line": 2, diff --git a/packages/svelte/tests/validator/samples/default-export-anonymous-class/_config.js b/packages/svelte/tests/validator/samples/default-export-anonymous-class/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/default-export-anonymous-class/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/default-export-anonymous-function/_config.js b/packages/svelte/tests/validator/samples/default-export-anonymous-function/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/default-export-anonymous-function/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/default-export/_config.js b/packages/svelte/tests/validator/samples/default-export/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/default-export/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/dynamic-element-invalid-tag/_config.js b/packages/svelte/tests/validator/samples/dynamic-element-invalid-tag/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/dynamic-element-invalid-tag/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/dynamic-element-invalid-tag/errors.json b/packages/svelte/tests/validator/samples/dynamic-element-invalid-tag/errors.json index 591a1ce540..752d26e1b3 100644 --- a/packages/svelte/tests/validator/samples/dynamic-element-invalid-tag/errors.json +++ b/packages/svelte/tests/validator/samples/dynamic-element-invalid-tag/errors.json @@ -1,7 +1,7 @@ [ { - "message": "Invalid element definition", - "code": "invalid-element-definition", + "code": "invalid-svelte-element-definition", + "message": "Invalid element definition — must be an {expression}", "start": { "line": 2, "column": 17 diff --git a/packages/svelte/tests/validator/samples/dynamic-element-missing-tag/_config.js b/packages/svelte/tests/validator/samples/dynamic-element-missing-tag/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/dynamic-element-missing-tag/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); 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 3b2c446d4e..58c8af5c66 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,6 +1,6 @@ [ { - "code": "missing-element-definition", + "code": "missing-svelte-element-definition", "message": "<svelte:element> must have a 'this' attribute", "start": { "line": 2, diff --git a/packages/svelte/tests/validator/samples/each-block-destructured-object-rest-comma-after/_config.js b/packages/svelte/tests/validator/samples/each-block-destructured-object-rest-comma-after/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/each-block-destructured-object-rest-comma-after/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/each-block-destructured-object-rest-comma-after/errors.json b/packages/svelte/tests/validator/samples/each-block-destructured-object-rest-comma-after/errors.json index 6c1d760ea8..13c3d150db 100644 --- a/packages/svelte/tests/validator/samples/each-block-destructured-object-rest-comma-after/errors.json +++ b/packages/svelte/tests/validator/samples/each-block-destructured-object-rest-comma-after/errors.json @@ -1,6 +1,6 @@ [ { - "code": "parse-error", + "code": "js-parse-error", "message": "Comma is not permitted after the rest element", "start": { "line": 5, diff --git a/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured-object/_config.js b/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured-object/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured-object/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured-object/errors.json b/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured-object/errors.json index 11428e078a..3cb3bbe0db 100644 --- a/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured-object/errors.json +++ b/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured-object/errors.json @@ -1,6 +1,6 @@ [ { - "code": "parse-error", + "code": "js-parse-error", "message": "Unexpected keyword 'case'", "start": { "line": 1, diff --git a/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured/_config.js b/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured/errors.json b/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured/errors.json index 9c80627eac..888bc761ac 100644 --- a/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured/errors.json +++ b/packages/svelte/tests/validator/samples/each-block-invalid-context-destructured/errors.json @@ -1,6 +1,6 @@ [ { - "code": "parse-error", + "code": "js-parse-error", "message": "Unexpected token", "start": { "line": 1, diff --git a/packages/svelte/tests/validator/samples/event-modifiers-invalid-nonpassive/_config.js b/packages/svelte/tests/validator/samples/event-modifiers-invalid-nonpassive/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/event-modifiers-invalid-nonpassive/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/event-modifiers-invalid-nonpassive/errors.json b/packages/svelte/tests/validator/samples/event-modifiers-invalid-nonpassive/errors.json index 08bb48b6df..0230959777 100644 --- a/packages/svelte/tests/validator/samples/event-modifiers-invalid-nonpassive/errors.json +++ b/packages/svelte/tests/validator/samples/event-modifiers-invalid-nonpassive/errors.json @@ -1,7 +1,7 @@ [ { "message": "The 'passive' and 'nonpassive' modifiers cannot be used together", - "code": "invalid-event-modifier", + "code": "invalid-event-modifier-combination", "start": { "line": 1, "column": 5 diff --git a/packages/svelte/tests/validator/samples/event-modifiers-invalid-passive/_config.js b/packages/svelte/tests/validator/samples/event-modifiers-invalid-passive/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/event-modifiers-invalid-passive/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/event-modifiers-invalid-passive/errors.json b/packages/svelte/tests/validator/samples/event-modifiers-invalid-passive/errors.json index 542e507388..db8289791a 100644 --- a/packages/svelte/tests/validator/samples/event-modifiers-invalid-passive/errors.json +++ b/packages/svelte/tests/validator/samples/event-modifiers-invalid-passive/errors.json @@ -1,7 +1,7 @@ [ { "message": "The 'passive' and 'preventDefault' modifiers cannot be used together", - "code": "invalid-event-modifier", + "code": "invalid-event-modifier-combination", "start": { "line": 1, "column": 5 diff --git a/packages/svelte/tests/validator/samples/event-modifiers-invalid/_config.js b/packages/svelte/tests/validator/samples/event-modifiers-invalid/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/event-modifiers-invalid/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/event-modifiers-legacy/_config.js b/packages/svelte/tests/validator/samples/event-modifiers-legacy/_config.js deleted file mode 100644 index 6e402c3273..0000000000 --- a/packages/svelte/tests/validator/samples/event-modifiers-legacy/_config.js +++ /dev/null @@ -1,8 +0,0 @@ -import { test } from '../../test'; - -export default test({ - skip: true, - compileOptions: { - // legacy: true - } -}); diff --git a/packages/svelte/tests/validator/samples/event-modifiers-legacy/errors.json b/packages/svelte/tests/validator/samples/event-modifiers-legacy/errors.json deleted file mode 100644 index 735e7c21fb..0000000000 --- a/packages/svelte/tests/validator/samples/event-modifiers-legacy/errors.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "message": "The 'once' modifier cannot be used in legacy mode", - "code": "invalid-event-modifier", - "start": { - "line": 1, - "column": 8 - }, - "end": { - "line": 1, - "column": 37 - } - } -] diff --git a/packages/svelte/tests/validator/samples/event-modifiers-legacy/input.svelte b/packages/svelte/tests/validator/samples/event-modifiers-legacy/input.svelte deleted file mode 100644 index c53a616fb5..0000000000 --- a/packages/svelte/tests/validator/samples/event-modifiers-legacy/input.svelte +++ /dev/null @@ -1 +0,0 @@ -<button on:click|once="{handleClick}"></button> \ No newline at end of file diff --git a/packages/svelte/tests/validator/samples/html-block-in-attribute/_config.js b/packages/svelte/tests/validator/samples/html-block-in-attribute/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/html-block-in-attribute/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/html-block-in-attribute/errors.json b/packages/svelte/tests/validator/samples/html-block-in-attribute/errors.json index 3e73629dc0..6c7237f030 100644 --- a/packages/svelte/tests/validator/samples/html-block-in-attribute/errors.json +++ b/packages/svelte/tests/validator/samples/html-block-in-attribute/errors.json @@ -1,7 +1,7 @@ [ { "code": "invalid-tag-placement", - "message": "{@html} tag cannot be in attribute value", + "message": "{@html ...} tag cannot be in attribute value", "start": { "line": 1, "column": 12 }, "end": { "line": 1, "column": 12 } } diff --git a/packages/svelte/tests/validator/samples/html-block-in-textarea/_config.js b/packages/svelte/tests/validator/samples/html-block-in-textarea/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/html-block-in-textarea/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/html-block-in-textarea/errors.json b/packages/svelte/tests/validator/samples/html-block-in-textarea/errors.json index ea01211d4a..8d98066d55 100644 --- a/packages/svelte/tests/validator/samples/html-block-in-textarea/errors.json +++ b/packages/svelte/tests/validator/samples/html-block-in-textarea/errors.json @@ -1,7 +1,7 @@ [ { "code": "invalid-tag-placement", - "message": "{@html} tag cannot be inside <textarea>", + "message": "{@html ...} tag cannot be inside <textarea>", "start": { "line": 2, "column": 1 }, "end": { "line": 2, "column": 1 } } diff --git a/packages/svelte/tests/validator/samples/let-directive/errors.json b/packages/svelte/tests/validator/samples/let-directive/errors.json new file mode 100644 index 0000000000..bb239bafa7 --- /dev/null +++ b/packages/svelte/tests/validator/samples/let-directive/errors.json @@ -0,0 +1,8 @@ +[ + { + "code": "invalid-let-directive-placement", + "message": "let directive at invalid position", + "start": { "line": 6, "column": 15 }, + "end": { "line": 6, "column": 20 } + } +] diff --git a/packages/svelte/tests/validator/samples/let-directive/input.svelte b/packages/svelte/tests/validator/samples/let-directive/input.svelte new file mode 100644 index 0000000000..90763028b7 --- /dev/null +++ b/packages/svelte/tests/validator/samples/let-directive/input.svelte @@ -0,0 +1,6 @@ +{#if foo} + <svelte:self let:x></svelte:self> +{/if} +<Component let:x></Component> +<div let:x></div><!-- strictly speaking this is invalid, but it was never checked in Svelte 3/4 either, and is now deprecated, so don't mind --> +<svelte:window let:x></svelte:window> \ No newline at end of file diff --git a/packages/svelte/tests/validator/samples/logic-block-in-attribute/_config.js b/packages/svelte/tests/validator/samples/logic-block-in-attribute/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/logic-block-in-attribute/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/logic-block-in-attribute/errors.json b/packages/svelte/tests/validator/samples/logic-block-in-attribute/errors.json index 43c0fb9416..883fc0e479 100644 --- a/packages/svelte/tests/validator/samples/logic-block-in-attribute/errors.json +++ b/packages/svelte/tests/validator/samples/logic-block-in-attribute/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-logic-block-placement", - "message": "{#if} logic block cannot be in attribute value", + "code": "invalid-block-placement", + "message": "{#if ...} block cannot be in attribute value", "start": { "line": 1, "column": 12 }, "end": { "line": 1, "column": 12 } } diff --git a/packages/svelte/tests/validator/samples/logic-block-in-textarea/_config.js b/packages/svelte/tests/validator/samples/logic-block-in-textarea/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/logic-block-in-textarea/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/logic-block-in-textarea/errors.json b/packages/svelte/tests/validator/samples/logic-block-in-textarea/errors.json index d007089089..a371f9b76b 100644 --- a/packages/svelte/tests/validator/samples/logic-block-in-textarea/errors.json +++ b/packages/svelte/tests/validator/samples/logic-block-in-textarea/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-logic-block-placement", - "message": "{#each} logic block cannot be inside <textarea>", + "code": "invalid-block-placement", + "message": "{#each ...} block cannot be inside <textarea>", "start": { "line": 2, "column": 1 }, "end": { "line": 2, "column": 1 } } diff --git a/packages/svelte/tests/validator/samples/module-script-reactive-declaration/_config.js b/packages/svelte/tests/validator/samples/module-script-reactive-declaration/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/module-script-reactive-declaration/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/module-script-reactive-declaration/warnings.json b/packages/svelte/tests/validator/samples/module-script-reactive-declaration/warnings.json index 81d5bc9664..df53ed6123 100644 --- a/packages/svelte/tests/validator/samples/module-script-reactive-declaration/warnings.json +++ b/packages/svelte/tests/validator/samples/module-script-reactive-declaration/warnings.json @@ -1,7 +1,7 @@ [ { - "message": "$: has no effect in a module script", - "code": "module-script-reactive-declaration", + "message": "Reactive declarations only exist at the top level of the instance script", + "code": "no-reactive-declaration", "start": { "line": 4, "column": 1 }, "end": { "line": 4, "column": 23 } } diff --git a/packages/svelte/tests/validator/samples/multiple-script-default-context/_config.js b/packages/svelte/tests/validator/samples/multiple-script-default-context/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/multiple-script-default-context/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/multiple-script-default-context/errors.json b/packages/svelte/tests/validator/samples/multiple-script-default-context/errors.json index ef79afebdd..58eb092928 100644 --- a/packages/svelte/tests/validator/samples/multiple-script-default-context/errors.json +++ b/packages/svelte/tests/validator/samples/multiple-script-default-context/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-script", - "message": "A component can only have one instance-level <script> element", + "code": "duplicate-script-element", + "message": "A component can have a single top-level <script> element and/or a single top-level <script context=\"module\"> element", "start": { "line": 5, "column": 0 diff --git a/packages/svelte/tests/validator/samples/multiple-script-module-context/_config.js b/packages/svelte/tests/validator/samples/multiple-script-module-context/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/multiple-script-module-context/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/multiple-script-module-context/errors.json b/packages/svelte/tests/validator/samples/multiple-script-module-context/errors.json index 5dc7a90a74..58eb092928 100644 --- a/packages/svelte/tests/validator/samples/multiple-script-module-context/errors.json +++ b/packages/svelte/tests/validator/samples/multiple-script-module-context/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-script", - "message": "A component can only have one <script context=\"module\"> element", + "code": "duplicate-script-element", + "message": "A component can have a single top-level <script> element and/or a single top-level <script context=\"module\"> element", "start": { "line": 5, "column": 0 diff --git a/packages/svelte/tests/validator/samples/namespace-invalid-unguessable/_config.js b/packages/svelte/tests/validator/samples/namespace-invalid-unguessable/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/namespace-invalid-unguessable/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/namespace-invalid-unguessable/errors.json b/packages/svelte/tests/validator/samples/namespace-invalid-unguessable/errors.json deleted file mode 100644 index 880109e320..0000000000 --- a/packages/svelte/tests/validator/samples/namespace-invalid-unguessable/errors.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "code": "invalid-namespace-property", - "message": "Invalid namespace 'lol'", - "start": { - "line": 1, - "column": 16 - }, - "end": { - "line": 1, - "column": 31 - } - } -] diff --git a/packages/svelte/tests/validator/samples/namespace-invalid-unguessable/input.svelte b/packages/svelte/tests/validator/samples/namespace-invalid-unguessable/input.svelte deleted file mode 100644 index fdbd779b5c..0000000000 --- a/packages/svelte/tests/validator/samples/namespace-invalid-unguessable/input.svelte +++ /dev/null @@ -1 +0,0 @@ -<svelte:options namespace="lol"/> diff --git a/packages/svelte/tests/validator/samples/namespace-invalid/_config.js b/packages/svelte/tests/validator/samples/namespace-invalid/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/namespace-invalid/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/namespace-invalid/errors.json b/packages/svelte/tests/validator/samples/namespace-invalid/errors.json index acab9d3fae..7081b9da27 100644 --- a/packages/svelte/tests/validator/samples/namespace-invalid/errors.json +++ b/packages/svelte/tests/validator/samples/namespace-invalid/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-namespace-property", - "message": "Invalid namespace 'http://www.w3.org/1999/svg' (did you mean 'http://www.w3.org/2000/svg'?)", + "code": "invalid-svelte-option-namespace", + "message": "Unsupported <svelte:option> value for \"namespace\". Valid values are \"html\", \"svg\" or \"foreign\".", "start": { "line": 1, "column": 16 diff --git a/packages/svelte/tests/validator/samples/namespace-non-literal/_config.js b/packages/svelte/tests/validator/samples/namespace-non-literal/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/namespace-non-literal/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/namespace-non-literal/errors.json b/packages/svelte/tests/validator/samples/namespace-non-literal/errors.json index 697e9e9327..30c7ea279e 100644 --- a/packages/svelte/tests/validator/samples/namespace-non-literal/errors.json +++ b/packages/svelte/tests/validator/samples/namespace-non-literal/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-namespace-attribute", - "message": "The 'namespace' attribute must be a string literal representing a valid namespace", + "code": "invalid-svelte-option-namespace", + "message": "Unsupported <svelte:option> value for \"namespace\". Valid values are \"html\", \"svg\" or \"foreign\".", "start": { "line": 1, "column": 16 diff --git a/packages/svelte/tests/validator/samples/reactive-declaration-non-top-level/_config.js b/packages/svelte/tests/validator/samples/reactive-declaration-non-top-level/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/reactive-declaration-non-top-level/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/reactive-declaration-non-top-level/warnings.json b/packages/svelte/tests/validator/samples/reactive-declaration-non-top-level/warnings.json index f677ecb28f..f7598524e2 100644 --- a/packages/svelte/tests/validator/samples/reactive-declaration-non-top-level/warnings.json +++ b/packages/svelte/tests/validator/samples/reactive-declaration-non-top-level/warnings.json @@ -1,7 +1,7 @@ [ { - "message": "$: has no effect outside of the top-level", - "code": "non-top-level-reactive-declaration", + "message": "Reactive declarations only exist at the top level of the instance script", + "code": "no-reactive-declaration", "start": { "line": 6, "column": 2 }, "end": { "line": 6, "column": 22 } } diff --git a/packages/svelte/tests/validator/samples/rest-eachblock-binding-2/_config.js b/packages/svelte/tests/validator/samples/rest-eachblock-binding-2/_config.js index 64fdc120d6..7fc1f9f61b 100644 --- a/packages/svelte/tests/validator/samples/rest-eachblock-binding-2/_config.js +++ b/packages/svelte/tests/validator/samples/rest-eachblock-binding-2/_config.js @@ -1,3 +1,4 @@ import { test } from '../../test'; +// TODO this likely works in the new world - remove this warning? export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/rest-eachblock-binding-3/_config.js b/packages/svelte/tests/validator/samples/rest-eachblock-binding-3/_config.js index 64fdc120d6..7fc1f9f61b 100644 --- a/packages/svelte/tests/validator/samples/rest-eachblock-binding-3/_config.js +++ b/packages/svelte/tests/validator/samples/rest-eachblock-binding-3/_config.js @@ -1,3 +1,4 @@ import { test } from '../../test'; +// TODO this likely works in the new world - remove this warning? export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/rest-eachblock-binding-nested-rest/_config.js b/packages/svelte/tests/validator/samples/rest-eachblock-binding-nested-rest/_config.js index 64fdc120d6..a7d521e510 100644 --- a/packages/svelte/tests/validator/samples/rest-eachblock-binding-nested-rest/_config.js +++ b/packages/svelte/tests/validator/samples/rest-eachblock-binding-nested-rest/_config.js @@ -1,3 +1,4 @@ import { test } from '../../test'; +// TODO this maybe works in the new world - remove this warning? export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/rest-eachblock-binding/_config.js b/packages/svelte/tests/validator/samples/rest-eachblock-binding/_config.js index 64fdc120d6..7fc1f9f61b 100644 --- a/packages/svelte/tests/validator/samples/rest-eachblock-binding/_config.js +++ b/packages/svelte/tests/validator/samples/rest-eachblock-binding/_config.js @@ -1,3 +1,4 @@ import { test } from '../../test'; +// TODO this likely works in the new world - remove this warning? export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/script-invalid-context/_config.js b/packages/svelte/tests/validator/samples/script-invalid-context/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/script-invalid-context/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/script-invalid-context/errors.json b/packages/svelte/tests/validator/samples/script-invalid-context/errors.json index 7046bd50ee..d7a502a2f7 100644 --- a/packages/svelte/tests/validator/samples/script-invalid-context/errors.json +++ b/packages/svelte/tests/validator/samples/script-invalid-context/errors.json @@ -1,6 +1,6 @@ [ { - "code": "invalid-script", + "code": "invalid-script-context", "message": "If the context attribute is supplied, its value must be \"module\"", "start": { "line": 1, diff --git a/packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/_config.js b/packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/_config.js deleted file mode 100644 index 6e402c3273..0000000000 --- a/packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/_config.js +++ /dev/null @@ -1,8 +0,0 @@ -import { test } from '../../test'; - -export default test({ - skip: true, - compileOptions: { - // legacy: true - } -}); diff --git a/packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/input.svelte b/packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/input.svelte deleted file mode 100644 index f5361e5cfe..0000000000 --- a/packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/input.svelte +++ /dev/null @@ -1,33 +0,0 @@ -<a href="https://svelte.dev" target="_blank">svelte website (invalid)</a> -<a href="https://svelte.dev" target="_blank" rel="">svelte website (invalid)</a> -<a href="https://svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a> -<a href={'https://svelte.dev'} target="_blank">svelte website (invalid)</a> -<a href={'https://svelte.dev'} target="_blank" rel="">svelte website (invalid)</a> -<a href={'https://svelte.dev'} target="_blank" rel="noopener">svelte website (invalid)</a> -<a href="//svelte.dev" target="_blank">svelte website (invalid)</a> -<a href="//svelte.dev" target="_blank" rel="">svelte website (invalid)</a> -<a href="//svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a> -<a href="http://svelte.dev" target="_blank">svelte website (invalid)</a> -<a href="http://svelte.dev" target="_blank" rel="">svelte website (invalid)</a> -<a href="http://svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a> -<a href="HTTP://svelte.dev" target="_blank">svelte website (invalid)</a> -<a href="HTTP://svelte.dev" target="_blank" rel="">svelte website (invalid)</a> -<a href="HTTP://svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a> -<a href={'HTTPS://svelte.dev'} target="_blank">svelte website (invalid)</a> -<a href={'HTTPS://svelte.dev'} target="_blank" rel="">svelte website (invalid)</a> -<a href={'HTTPS://svelte.dev'} target="_blank" rel="noopener">svelte website (invalid)</a> -<a href="same-host" target="_blank">Same host (valid)</a> -<a href="same-host" target="_blank" rel="">Same host (valid)</a> -<a href="same-host" target="_blank" rel="noopener">Same host (valid)</a> -<a href="http://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a> -<a href="http://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a> -<a href="HTTP://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a> -<a href="HTTP://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a> -<a href="https://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a> -<a href="https://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a> -<a href="HTTPS://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a> -<a href="HTTPS://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a> -<a href="//svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a> -<a href="//svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a> -<!-- dynamic rel value should not warn--> -<a href="//svelte.dev" target="_blank" rel={`${Math.random()}`}>svelte website (valid)</a> diff --git a/packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/warnings.json b/packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/warnings.json deleted file mode 100644 index 2986f137e7..0000000000 --- a/packages/svelte/tests/validator/samples/security-anchor-rel-noreferer-legacy/warnings.json +++ /dev/null @@ -1,218 +0,0 @@ -[ - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 73, - "line": 1 - }, - "start": { - "column": 0, - "line": 1 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 80, - "line": 2 - }, - "start": { - "column": 0, - "line": 2 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 88, - "line": 3 - }, - "start": { - "column": 0, - "line": 3 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 75, - "line": 4 - }, - "start": { - "column": 0, - "line": 4 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 82, - "line": 5 - }, - "start": { - "column": 0, - "line": 5 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 90, - "line": 6 - }, - "start": { - "column": 0, - "line": 6 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 67, - "line": 7 - }, - "start": { - "column": 0, - "line": 7 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 74, - "line": 8 - }, - "start": { - "column": 0, - "line": 8 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 82, - "line": 9 - }, - "start": { - "column": 0, - "line": 9 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 72, - "line": 10 - }, - "start": { - "column": 0, - "line": 10 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 79, - "line": 11 - }, - "start": { - "column": 0, - "line": 11 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 87, - "line": 12 - }, - "start": { - "column": 0, - "line": 12 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 72, - "line": 13 - }, - "start": { - "column": 0, - "line": 13 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 79, - "line": 14 - }, - "start": { - "column": 0, - "line": 14 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 87, - "line": 15 - }, - "start": { - "column": 0, - "line": 15 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 75, - "line": 16 - }, - "start": { - "column": 0, - "line": 16 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 82, - "line": 17 - }, - "start": { - "column": 0, - "line": 17 - } - }, - { - "code": "security-anchor-rel-noreferrer", - "message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"", - "end": { - "column": 90, - "line": 18 - }, - "start": { - "column": 0, - "line": 18 - } - } -] diff --git a/packages/svelte/tests/validator/samples/slot-attribute-invalid/_config.js b/packages/svelte/tests/validator/samples/slot-attribute-invalid/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/slot-attribute-invalid/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/slot-attribute-invalid/errors.json b/packages/svelte/tests/validator/samples/slot-attribute-invalid/errors.json index 643e96359c..a5a3855787 100644 --- a/packages/svelte/tests/validator/samples/slot-attribute-invalid/errors.json +++ b/packages/svelte/tests/validator/samples/slot-attribute-invalid/errors.json @@ -1,6 +1,6 @@ [ { - "code": "invalid-slotted-content", + "code": "invalid-slot-placement", "message": "Element with a slot='...' attribute must be a child of a component or a descendant of a custom element", "start": { "line": 1, diff --git a/packages/svelte/tests/validator/samples/svelte-fragment-placement-2/_config.js b/packages/svelte/tests/validator/samples/svelte-fragment-placement-2/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/svelte-fragment-placement-2/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/svelte-fragment-placement-2/errors.json b/packages/svelte/tests/validator/samples/svelte-fragment-placement-2/errors.json index 871e5f5de0..955d756a6d 100644 --- a/packages/svelte/tests/validator/samples/svelte-fragment-placement-2/errors.json +++ b/packages/svelte/tests/validator/samples/svelte-fragment-placement-2/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-slotted-content", - "message": "<svelte:fragment> must be a child of a component", + "code": "invalid-svelte-fragment-placement", + "message": "<svelte:fragment> must be the direct child of a component", "start": { "line": 5, "column": 0 }, "end": { "line": 7, "column": 18 } } diff --git a/packages/svelte/tests/validator/samples/svelte-fragment-placement/_config.js b/packages/svelte/tests/validator/samples/svelte-fragment-placement/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/svelte-fragment-placement/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/svelte-fragment-placement/errors.json b/packages/svelte/tests/validator/samples/svelte-fragment-placement/errors.json index 6635953209..2ad4c8390f 100644 --- a/packages/svelte/tests/validator/samples/svelte-fragment-placement/errors.json +++ b/packages/svelte/tests/validator/samples/svelte-fragment-placement/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-slotted-content", - "message": "<svelte:fragment> must be a child of a component", + "code": "invalid-svelte-fragment-placement", + "message": "<svelte:fragment> must be the direct child of a component", "start": { "line": 7, "column": 2 }, "end": { "line": 9, "column": 20 } } diff --git a/packages/svelte/tests/validator/samples/svelte-head-attributes/errors.json b/packages/svelte/tests/validator/samples/svelte-head-attributes/errors.json new file mode 100644 index 0000000000..026ba121ab --- /dev/null +++ b/packages/svelte/tests/validator/samples/svelte-head-attributes/errors.json @@ -0,0 +1,8 @@ +[ + { + "code": "illegal-svelte-head-attribute", + "message": "<svelte:head> cannot have attributes nor directives", + "start": { "line": 1, "column": 13 }, + "end": { "line": 1, "column": 14 } + } +] diff --git a/packages/svelte/tests/validator/samples/svelte-head-attributes/input.svelte b/packages/svelte/tests/validator/samples/svelte-head-attributes/input.svelte new file mode 100644 index 0000000000..948ea0435c --- /dev/null +++ b/packages/svelte/tests/validator/samples/svelte-head-attributes/input.svelte @@ -0,0 +1 @@ +<svelte:head x></svelte:head> \ No newline at end of file diff --git a/packages/svelte/tests/validator/samples/textarea-value-children/_config.js b/packages/svelte/tests/validator/samples/textarea-value-children/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/textarea-value-children/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/textarea-value-children/errors.json b/packages/svelte/tests/validator/samples/textarea-value-children/errors.json index 4c9e7e853c..c4aed6b426 100644 --- a/packages/svelte/tests/validator/samples/textarea-value-children/errors.json +++ b/packages/svelte/tests/validator/samples/textarea-value-children/errors.json @@ -1,14 +1,14 @@ [ { - "code": "textarea-duplicate-value", + "code": "invalid-textarea-content", "message": "A <textarea> can have either a value attribute or (equivalently) child content, but not both", "start": { "line": 1, - "column": 10 + "column": 0 }, "end": { - "line": 1, - "column": 23 + "line": 3, + "column": 11 } } ] diff --git a/packages/svelte/tests/validator/samples/title-no-attributes/_config.js b/packages/svelte/tests/validator/samples/title-no-attributes/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/title-no-attributes/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/title-no-attributes/errors.json b/packages/svelte/tests/validator/samples/title-no-attributes/errors.json index a58598d50c..3f0410a6b0 100644 --- a/packages/svelte/tests/validator/samples/title-no-attributes/errors.json +++ b/packages/svelte/tests/validator/samples/title-no-attributes/errors.json @@ -1,7 +1,7 @@ [ { - "code": "illegal-attribute", - "message": "<title> cannot have attributes", + "code": "illegal-title-attribute", + "message": "<title> cannot have attributes nor directives", "start": { "line": 2, "column": 8 diff --git a/packages/svelte/tests/validator/samples/title-no-children/_config.js b/packages/svelte/tests/validator/samples/title-no-children/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/title-no-children/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/title-no-children/errors.json b/packages/svelte/tests/validator/samples/title-no-children/errors.json index fa1c0fdce2..9d7a7667a1 100644 --- a/packages/svelte/tests/validator/samples/title-no-children/errors.json +++ b/packages/svelte/tests/validator/samples/title-no-children/errors.json @@ -1,6 +1,6 @@ [ { - "code": "illegal-structure", + "code": "invalid-title-content", "message": "<title> can only contain text and {tags}", "start": { "line": 2, diff --git a/packages/svelte/tests/validator/samples/transition-duplicate-in-transition/_config.js b/packages/svelte/tests/validator/samples/transition-duplicate-in-transition/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/transition-duplicate-in-transition/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/transition-duplicate-in/_config.js b/packages/svelte/tests/validator/samples/transition-duplicate-in/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/transition-duplicate-in/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/transition-duplicate-out-transition/_config.js b/packages/svelte/tests/validator/samples/transition-duplicate-out-transition/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/transition-duplicate-out-transition/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/transition-duplicate-out/_config.js b/packages/svelte/tests/validator/samples/transition-duplicate-out/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/transition-duplicate-out/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/transition-duplicate-transition-in/_config.js b/packages/svelte/tests/validator/samples/transition-duplicate-transition-in/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/transition-duplicate-transition-in/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/transition-duplicate-transition-out/_config.js b/packages/svelte/tests/validator/samples/transition-duplicate-transition-out/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/transition-duplicate-transition-out/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/transition-duplicate-transition/_config.js b/packages/svelte/tests/validator/samples/transition-duplicate-transition/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/transition-duplicate-transition/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/transition-on-component/_config.js b/packages/svelte/tests/validator/samples/transition-on-component/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/transition-on-component/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/transition-on-component/errors.json b/packages/svelte/tests/validator/samples/transition-on-component/errors.json index 0a08dd3297..7b2403bee6 100644 --- a/packages/svelte/tests/validator/samples/transition-on-component/errors.json +++ b/packages/svelte/tests/validator/samples/transition-on-component/errors.json @@ -1,7 +1,7 @@ [ { - "code": "invalid-transition", - "message": "Transitions can only be applied to DOM elements, not components", + "code": "invalid-component-directive", + "message": "This type of directive is not valid on components", "start": { "line": 7, "column": 8 diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/_config.js b/packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/errors.json b/packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/errors.json index 0baccb2b7f..7f7a7eb6f9 100644 --- a/packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/errors.json +++ b/packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/errors.json @@ -1,13 +1,13 @@ [ { "code": "invalid-binding", - "message": "'innerwidth' is not a valid binding on <svelte:window> (did you mean 'innerWidth'?)", + "message": "'innerwidth' is not a valid binding (did you mean 'innerWidth'?)", "start": { - "line": 1, + "line": 5, "column": 15 }, "end": { - "line": 1, + "line": 5, "column": 34 } } diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/input.svelte b/packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/input.svelte index 72b5e36cf1..03824cbd30 100644 --- a/packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/input.svelte +++ b/packages/svelte/tests/validator/samples/window-binding-invalid-innerwidth/input.svelte @@ -1 +1,5 @@ -<svelte:window bind:innerwidth={w}/> \ No newline at end of file +<script> + let w; +</script> + +<svelte:window bind:innerwidth={w}/> diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid-value/_config.js b/packages/svelte/tests/validator/samples/window-binding-invalid-value/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/window-binding-invalid-value/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid-value/errors.json b/packages/svelte/tests/validator/samples/window-binding-invalid-value/errors.json deleted file mode 100644 index a0029bef4d..0000000000 --- a/packages/svelte/tests/validator/samples/window-binding-invalid-value/errors.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "code": "invalid-binding", - "message": "Bindings on <svelte:window> must be to top-level properties, e.g. 'baz' rather than 'foo.bar.baz'", - "start": { - "line": 1, - "column": 32 - }, - "end": { - "line": 1, - "column": 43 - } - } -] diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid-value/input.svelte b/packages/svelte/tests/validator/samples/window-binding-invalid-value/input.svelte deleted file mode 100644 index 7bfc3d58f1..0000000000 --- a/packages/svelte/tests/validator/samples/window-binding-invalid-value/input.svelte +++ /dev/null @@ -1 +0,0 @@ -<svelte:window bind:innerWidth={foo.bar.baz}/> \ No newline at end of file diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid-width/_config.js b/packages/svelte/tests/validator/samples/window-binding-invalid-width/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/window-binding-invalid-width/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid-width/errors.json b/packages/svelte/tests/validator/samples/window-binding-invalid-width/errors.json deleted file mode 100644 index 031ba52d5c..0000000000 --- a/packages/svelte/tests/validator/samples/window-binding-invalid-width/errors.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "code": "invalid-binding", - "message": "'width' is not a valid binding on <svelte:window> (did you mean 'innerWidth'?)", - "start": { - "line": 1, - "column": 15 - }, - "end": { - "line": 1, - "column": 29 - } - } -] diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid-width/input.svelte b/packages/svelte/tests/validator/samples/window-binding-invalid-width/input.svelte deleted file mode 100644 index 88dcd5aa02..0000000000 --- a/packages/svelte/tests/validator/samples/window-binding-invalid-width/input.svelte +++ /dev/null @@ -1 +0,0 @@ -<svelte:window bind:width={w}/> \ No newline at end of file diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid/_config.js b/packages/svelte/tests/validator/samples/window-binding-invalid/_config.js deleted file mode 100644 index 64fdc120d6..0000000000 --- a/packages/svelte/tests/validator/samples/window-binding-invalid/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { test } from '../../test'; - -export default test({ skip: true }); diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid/errors.json b/packages/svelte/tests/validator/samples/window-binding-invalid/errors.json index 64e6b090a4..dc1fadfc08 100644 --- a/packages/svelte/tests/validator/samples/window-binding-invalid/errors.json +++ b/packages/svelte/tests/validator/samples/window-binding-invalid/errors.json @@ -1,13 +1,13 @@ [ { "code": "invalid-binding", - "message": "'potato' is not a valid binding on <svelte:window> — valid bindings are innerWidth, innerHeight, outerWidth, outerHeight, scrollX, scrollY, devicePixelRatio or online", + "message": "'potato' is not a valid binding", "start": { - "line": 1, + "line": 5, "column": 15 }, "end": { - "line": 1, + "line": 5, "column": 32 } } diff --git a/packages/svelte/tests/validator/samples/window-binding-invalid/input.svelte b/packages/svelte/tests/validator/samples/window-binding-invalid/input.svelte index 6ee989b7f3..2b0f375784 100644 --- a/packages/svelte/tests/validator/samples/window-binding-invalid/input.svelte +++ b/packages/svelte/tests/validator/samples/window-binding-invalid/input.svelte @@ -1 +1,5 @@ -<svelte:window bind:potato={foo}/> \ No newline at end of file +<script> + let foo; +</script> + +<svelte:window bind:potato={foo}/> diff --git a/sites/svelte-5-preview/src/routes/docs/content/03-appendix/02-breaking-changes.md b/sites/svelte-5-preview/src/routes/docs/content/03-appendix/02-breaking-changes.md index 848ac5320f..a92d5d68d4 100644 --- a/sites/svelte-5-preview/src/routes/docs/content/03-appendix/02-breaking-changes.md +++ b/sites/svelte-5-preview/src/routes/docs/content/03-appendix/02-breaking-changes.md @@ -74,10 +74,22 @@ Content inside component tags becomes a [snippet prop](/docs/snippets) called `c Assignments to destructured parts of a `@const` declaration are no longer allowed. It was an oversight that this was ever allowed. +### Stricter CSS `:global` selector validation + +Previously, a selector like `.foo :global(bar).baz` was valid. In Svelte 5, this is a validation error instead. The reason is that in this selector the resulting CSS would be equivalent to one without `:global` - in other words, `:global` is ignored in this case. + ### CSS hash position no longer deterministic Previously Svelte would always insert the CSS hash last. This is no longer guaranteed in Svelte 5. This is only breaking if you [have very weird css selectors](https://stackoverflow.com/questions/15670631/does-the-order-of-classes-listed-on-an-item-affect-the-css). +### Renames of various error/warning codes + +Various error and warning codes have been renamed slightly. + +### Reduced number of namespaces + +The number of valid namespaces you can pass to the compiler option `namespace` has been reduced to `html` (the default), `svg` and `foreign`. + ### beforeUpdate change `beforeUpdate` no longer runs twice on initial render if it modifies a variable referenced in the template.