From 758ac0065d0b176f81c8cc50f83a1bb41219c2bf Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Wed, 24 Apr 2024 11:27:26 +0200 Subject: [PATCH] if I would get a dollar for every windows bug I fix I would be a millionaire by now --- .../svelte/scripts/process-messages/index.js | 2 +- packages/svelte/src/compiler/errors.js | 1383 +++++++++++++++++ packages/svelte/src/compiler/warnings.js | 603 +++++++ 3 files changed, 1987 insertions(+), 1 deletion(-) diff --git a/packages/svelte/scripts/process-messages/index.js b/packages/svelte/scripts/process-messages/index.js index f445ffab5f..15138c3c53 100644 --- a/packages/svelte/scripts/process-messages/index.js +++ b/packages/svelte/scripts/process-messages/index.js @@ -15,7 +15,7 @@ for (const category of fs.readdirSync('messages')) { const markdown = fs.readFileSync(`messages/${category}/${file}`, 'utf-8'); - for (const match of markdown.matchAll(/## ([\w]+)\n\n([^]+?)(?=$|\n\n## )/g)) { + for (const match of markdown.matchAll(/## ([\w]+)\r?\n\r?\n([^]+?)(?=$|\r?\n\r?\n## )/g)) { const [_, code, text] = match; if (seen.has(code)) { diff --git a/packages/svelte/src/compiler/errors.js b/packages/svelte/src/compiler/errors.js index b98a7148c5..2731555925 100644 --- a/packages/svelte/src/compiler/errors.js +++ b/packages/svelte/src/compiler/errors.js @@ -54,4 +54,1387 @@ function e(node, code, message) { const end = typeof node === 'number' ? node : node?.end; throw new CompileError(code, message, start !== undefined && end !== undefined ? [start, end] : undefined); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function empty_attribute_shorthand(node) { + e(node, "empty_attribute_shorthand", "Attribute shorthand cannot be empty"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function duplicate_attribute(node) { + e(node, "duplicate_attribute", "Attributes need to be unique"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_event_attribute_value(node) { + e(node, "invalid_event_attribute_value", "Event attribute must be a JavaScript expression, not a string"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @param {string} name + * @returns {never} + */ +export function invalid_attribute_name(node, name) { + e(node, "invalid_attribute_name", `'${name}' is not a valid attribute name`); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function animation_invalid_placement(node) { + e(node, "animation_invalid_placement", "An element that uses the `animate:` directive must be the only child of a keyed `{#each ...}` block"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function animation_missing_key(node) { + e(node, "animation_missing_key", "An element that uses the `animate:` directive must be the only child of a keyed `{#each ...}` block. Did you forget to add a key to your each block?"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function animation_duplicate(node) { + e(node, "animation_duplicate", "An element can only have one 'animate' directive"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @param {string} list + * @returns {never} + */ +export function invalid_event_modifier(node, list) { + e(node, "invalid_event_modifier", `Valid event modifiers are ${list}`); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_component_event_modifier(node) { + e(node, "invalid_component_event_modifier", "Event modifiers other than 'once' can only be used on DOM elements"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @param {string} modifier1 + * @param {string} modifier2 + * @returns {never} + */ +export function invalid_event_modifier_combination(node, modifier1, modifier2) { + e(node, "invalid_event_modifier_combination", `The '${modifier1}' and '${modifier2}' modifiers cannot be used together`); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @param {string} type + * @returns {never} + */ +export function transition_duplicate(node, type) { + e(node, "transition_duplicate", `Cannot use multiple \`${type}:\` directives on a single element`); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @param {string} type + * @param {string} existing + * @returns {never} + */ +export function transition_conflict(node, type, existing) { + e(node, "transition_conflict", `Cannot use \`${type}:\` alongside existing \`${existing}:\` directive`); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_let_directive_placement(node) { + e(node, "invalid_let_directive_placement", "`let:` directive at invalid position"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_style_directive_modifier(node) { + e(node, "invalid_style_directive_modifier", "Invalid 'style:' modifier. Valid modifiers are: 'important'"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_sequence_expression(node) { + e(node, "invalid_sequence_expression", "Sequence expressions are not allowed as attribute/directive values in runes mode, unless wrapped in parentheses"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_binding_expression(node) { + e(node, "invalid_binding_expression", "Can only bind to an Identifier or MemberExpression"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_binding_value(node) { + e(node, "invalid_binding_value", "Can only bind to state or props"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @param {string} name + * @param {string} elements + * @returns {never} + */ +export function bind_invalid_target(node, name, elements) { + e(node, "bind_invalid_target", `\`bind:${name}\` can only be used with ${elements}`); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @param {string} name + * @returns {never} + */ +export function bind_invalid(node, name) { + e(node, "bind_invalid", `\`bind:${name}\` is not a valid binding`); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @param {string} name + * @param {string} explanation + * @returns {never} + */ +export function bind_invalid_detailed(node, name, explanation) { + e(node, "bind_invalid_detailed", `\`bind:${name}\` is not a valid binding. ${explanation}`); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_type_attribute(node) { + e(node, "invalid_type_attribute", "'type' attribute must be a static text value if input uses two-way binding"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_multiple_attribute(node) { + e(node, "invalid_multiple_attribute", "'multiple' attribute must be static if select uses two-way binding"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function missing_contenteditable_attribute(node) { + e(node, "missing_contenteditable_attribute", "'contenteditable' attribute is required for textContent, innerHTML and innerText two-way bindings"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function dynamic_contenteditable_attribute(node) { + e(node, "dynamic_contenteditable_attribute", "'contenteditable' attribute cannot be dynamic if element uses two-way binding"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @param {string} msg + * @returns {never} + */ +export function invalid_compiler_option(node, msg) { + e(node, "invalid_compiler_option", `Invalid compiler option: ${msg}`); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @param {string} msg + * @returns {never} + */ +export function removed_compiler_option(node, msg) { + e(node, "removed_compiler_option", `Invalid compiler option: ${msg}`); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_component_directive(node) { + e(node, "invalid_component_directive", "This type of directive is not valid on components"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_const_placement(node) { + e(node, "invalid_const_placement", "{@const} must be the immediate child of {#snippet}, {#if}, {:else if}, {:else}, {#each}, {:then}, {:catch}, or "); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_css_empty_declaration(node) { + e(node, "invalid_css_empty_declaration", "Declaration cannot be empty"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_css_global_block_list(node) { + e(node, "invalid_css_global_block_list", "A :global {...} block cannot be part of a selector list with more than one item"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_css_global_block_modifier(node) { + e(node, "invalid_css_global_block_modifier", "A :global {...} block cannot modify an existing selector"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @param {string} name + * @returns {never} + */ +export function invalid_css_global_block_combinator(node, name) { + e(node, "invalid_css_global_block_combinator", `A :global {...} block cannot follow a ${name} combinator`); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_css_global_block_declaration(node) { + e(node, "invalid_css_global_block_declaration", "A :global {...} block can only contain rules, not declarations"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_css_global_placement(node) { + e(node, "invalid_css_global_placement", ":global(...) can be at the start or end of a selector sequence, but not in the middle"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_css_global_selector(node) { + e(node, "invalid_css_global_selector", ":global(...) must contain exactly one selector"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_css_global_selector_list(node) { + e(node, "invalid_css_global_selector_list", ":global(...) must not contain type or universal selectors when used in a compound selector"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_css_type_selector_placement(node) { + e(node, "invalid_css_type_selector_placement", ":global(...) must not be followed with a type selector"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_css_selector(node) { + e(node, "invalid_css_selector", "Invalid selector"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_css_identifier(node) { + e(node, "invalid_css_identifier", "Expected a valid CSS identifier"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_nesting_selector(node) { + e(node, "invalid_nesting_selector", "Nesting selectors can only be used inside a rule"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_css_declaration(node) { + e(node, "invalid_css_declaration", "Declaration cannot be empty"); +} + +/** + * MESSAGE + * @param {null | number | NodeLike} node + * @returns {never} + */ +export function invalid_textarea_content(node) { + e(node, "invalid_textarea_content", "A `