|
|
|
|
@ -9,7 +9,6 @@ import {
|
|
|
|
|
extract_identifiers,
|
|
|
|
|
get_parent,
|
|
|
|
|
is_expression_attribute,
|
|
|
|
|
is_quoted_attribute,
|
|
|
|
|
is_text_attribute,
|
|
|
|
|
object,
|
|
|
|
|
unwrap_optional
|
|
|
|
|
@ -34,6 +33,17 @@ import { Scope, get_rune } from '../scope.js';
|
|
|
|
|
import { merge } from '../visitors.js';
|
|
|
|
|
import { a11y_validators } from './a11y.js';
|
|
|
|
|
|
|
|
|
|
/** @param {import('#compiler').Attribute} attribute */
|
|
|
|
|
function validate_attribute(attribute) {
|
|
|
|
|
if (attribute.value === true || attribute.value.length === 1) return;
|
|
|
|
|
|
|
|
|
|
const is_quoted = attribute.value.at(-1)?.end !== attribute.end;
|
|
|
|
|
|
|
|
|
|
if (!is_quoted) {
|
|
|
|
|
e.attribute_invalid_expression(attribute);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {import('#compiler').Component | import('#compiler').SvelteComponent | import('#compiler').SvelteSelf} node
|
|
|
|
|
* @param {import('zimmerframe').Context<import('#compiler').SvelteNode, import('./types.js').AnalysisState>} context
|
|
|
|
|
@ -58,16 +68,10 @@ function validate_component(node, context) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (attribute.type === 'Attribute') {
|
|
|
|
|
if (
|
|
|
|
|
context.state.analysis.runes &&
|
|
|
|
|
!is_quoted_attribute(attribute) &&
|
|
|
|
|
Array.isArray(attribute.value) &&
|
|
|
|
|
attribute.value.length > 1
|
|
|
|
|
) {
|
|
|
|
|
e.attribute_invalid_expression(attribute);
|
|
|
|
|
}
|
|
|
|
|
if (context.state.analysis.runes) {
|
|
|
|
|
validate_attribute(attribute);
|
|
|
|
|
|
|
|
|
|
if (context.state.analysis.runes && is_expression_attribute(attribute)) {
|
|
|
|
|
if (is_expression_attribute(attribute)) {
|
|
|
|
|
const expression = attribute.value[0].expression;
|
|
|
|
|
if (expression.type === 'SequenceExpression') {
|
|
|
|
|
let i = /** @type {number} */ (expression.start);
|
|
|
|
|
@ -78,6 +82,7 @@ function validate_component(node, context) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
validate_attribute_name(attribute);
|
|
|
|
|
|
|
|
|
|
@ -116,16 +121,10 @@ function validate_element(node, context) {
|
|
|
|
|
if (attribute.type === 'Attribute') {
|
|
|
|
|
const is_expression = is_expression_attribute(attribute);
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
context.state.analysis.runes &&
|
|
|
|
|
!is_quoted_attribute(attribute) &&
|
|
|
|
|
Array.isArray(attribute.value) &&
|
|
|
|
|
attribute.value.length > 1
|
|
|
|
|
) {
|
|
|
|
|
e.attribute_invalid_expression(attribute);
|
|
|
|
|
}
|
|
|
|
|
if (context.state.analysis.runes) {
|
|
|
|
|
validate_attribute(attribute);
|
|
|
|
|
|
|
|
|
|
if (context.state.analysis.runes && is_expression) {
|
|
|
|
|
if (is_expression) {
|
|
|
|
|
const expression = attribute.value[0].expression;
|
|
|
|
|
if (expression.type === 'SequenceExpression') {
|
|
|
|
|
let i = /** @type {number} */ (expression.start);
|
|
|
|
|
@ -136,6 +135,7 @@ function validate_element(node, context) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (regex_illegal_attribute_character.test(attribute.name)) {
|
|
|
|
|
e.attribute_invalid_name(attribute, attribute.name);
|
|
|
|
|
|