[feat] better error message for invalid logic block placement (#7862)

* better error message for invalid logic block placement

* include checking for {@html} tags in invalid location
pull/7918/head
Tan Li Hau 2 years ago committed by GitHub
parent d04b1cca24
commit 8de7931c64
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -107,6 +107,14 @@ export default {
code: `invalid-${slug}-placement`,
message: `<${name}> tags cannot be inside elements or blocks`
}),
invalid_logic_block_placement: (location: string, name: string) => ({
code: 'invalid-logic-block-placement',
message: `{#${name}} logic block cannot be ${location}`
}),
invalid_tag_placement: (location: string, name: string) => ({
code: 'invalid-tag-placement',
message: `{@${name}} tag cannot be ${location}`
}),
invalid_ref_directive: (name: string) => ({
code: 'invalid-ref-directive',
message: `The ref directive is no longer supported — use \`bind:this={${name}}\` instead`

@ -219,7 +219,8 @@ export default function tag(parser: Parser) {
element.children = read_sequence(
parser,
() =>
/^<\/textarea(\s[^>]*)?>/i.test(parser.template.slice(parser.index))
/^<\/textarea(\s[^>]*)?>/i.test(parser.template.slice(parser.index)),
'inside <textarea>'
);
parser.read(/^<\/textarea(\s[^>]*)?>/i);
element.end = parser.index;
@ -473,7 +474,7 @@ function read_attribute_value(parser: Parser) {
let value;
try {
value = read_sequence(parser, () => !!parser.match_regex(regex));
value = read_sequence(parser, () => !!parser.match_regex(regex), 'in attribute value');
} catch (error) {
if (error.code === 'parse-error') {
// if the attribute value didn't close + self-closing tag
@ -495,7 +496,7 @@ function read_attribute_value(parser: Parser) {
return value;
}
function read_sequence(parser: Parser, done: () => boolean): TemplateNode[] {
function read_sequence(parser: Parser, done: () => boolean, location: string): TemplateNode[] {
let current_chunk: Text = {
start: parser.index,
end: null,
@ -521,6 +522,18 @@ function read_sequence(parser: Parser, done: () => boolean): TemplateNode[] {
flush(parser.index);
return chunks;
} else if (parser.eat('{')) {
if (parser.match('#')) {
const index = parser.index - 1;
parser.eat('#');
const name = parser.read_until(/[^a-z]/);
parser.error(parser_errors.invalid_logic_block_placement(location, name), index);
} else if (parser.match('@')) {
const index = parser.index - 1;
parser.eat('@');
const name = parser.read_until(/[^a-z]/);
parser.error(parser_errors.invalid_tag_placement(location, name), index);
}
flush(parser.index - 1);
parser.allow_whitespace();

@ -0,0 +1,9 @@
[
{
"code": "invalid-tag-placement",
"message": "{@html} tag cannot be in attribute value",
"start": { "line": 1, "column": 12, "character": 12 },
"end": { "line": 1, "column": 12, "character": 12 },
"pos": 12
}
]

@ -0,0 +1,9 @@
[
{
"code": "invalid-tag-placement",
"message": "{@html} tag cannot be inside <textarea>",
"start": { "line": 2, "column": 1, "character": 12 },
"end": { "line": 2, "column": 1, "character": 12 },
"pos": 12
}
]

@ -0,0 +1,3 @@
<textarea>
{@html fruit}
</textarea>

@ -0,0 +1,9 @@
[
{
"code": "invalid-logic-block-placement",
"message": "{#if} logic block cannot be in attribute value",
"start": { "line": 1, "column": 12, "character": 12 },
"end": { "line": 1, "column": 12, "character": 12 },
"pos": 12
}
]

@ -0,0 +1 @@
<div style="{#if condition}a{/if}" />

@ -0,0 +1,9 @@
[
{
"code": "invalid-logic-block-placement",
"message": "{#each} logic block cannot be inside <textarea>",
"start": { "line": 2, "column": 1, "character": 12 },
"end": { "line": 2, "column": 1, "character": 12 },
"pos": 12
}
]

@ -0,0 +1,5 @@
<textarea>
{#each fruits as fruit}
{fruit}
{/each}
</textarea>
Loading…
Cancel
Save