diff --git a/src/compiler/parse/read/script.ts b/src/compiler/parse/read/script.ts index cb59dc6d76..e7b5e14cee 100644 --- a/src/compiler/parse/read/script.ts +++ b/src/compiler/parse/read/script.ts @@ -3,7 +3,7 @@ import { Parser } from '../index'; import { Script } from '../../interfaces'; import { Node, Program } from 'estree'; -const script_closing_tag = ''; +// const script_closing_tag = ''; function get_context(parser: Parser, attributes: any[], start: number): string { const context = attributes.find(attribute => attribute.name === 'context'); @@ -28,19 +28,22 @@ function get_context(parser: Parser, attributes: any[], start: number): string { return value; } + +const RE_SCRIPT_END = /<\/script\s*>/; + export default function read_script(parser: Parser, start: number, attributes: Node[]): Script { const script_start = parser.index; - const script_end = parser.template.indexOf(script_closing_tag, script_start); - - if (script_end === -1) parser.error({ + const script_end = RE_SCRIPT_END.exec(parser.template.slice(script_start)); + + if (!script_end) parser.error({ code: `unclosed-script`, message: ` + +

Hello {name}!

\ No newline at end of file diff --git a/test/parser/samples/script-whitespace-after-tagname/output.json b/test/parser/samples/script-whitespace-after-tagname/output.json new file mode 100644 index 0000000000..903c392685 --- /dev/null +++ b/test/parser/samples/script-whitespace-after-tagname/output.json @@ -0,0 +1,150 @@ +{ + "html": { + "start": 51, + "end": 73, + "type": "Fragment", + "children": [ + { + "start": 49, + "end": 51, + "type": "Text", + "raw": "\n\n", + "data": "\n\n" + }, + { + "start": 51, + "end": 73, + "type": "Element", + "name": "h1", + "attributes": [], + "children": [ + { + "start": 55, + "end": 61, + "type": "Text", + "raw": "Hello ", + "data": "Hello " + }, + { + "start": 61, + "end": 67, + "type": "MustacheTag", + "expression": { + "type": "Identifier", + "start": 62, + "end": 66, + "loc": { + "start": { + "line": 10, + "column": 11 + }, + "end": { + "line": 10, + "column": 15 + } + }, + "name": "name" + } + }, + { + "start": 67, + "end": 68, + "type": "Text", + "raw": "!", + "data": "!" + } + ] + } + ] + }, + "instance": { + "type": "Script", + "start": 0, + "end": 49, + "context": "default", + "content": { + "type": "Program", + "start": 8, + "end": 30, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 0 + } + }, + "body": [ + { + "type": "VariableDeclaration", + "start": 10, + "end": 29, + "loc": { + "start": { + "line": 2, + "column": 1 + }, + "end": { + "line": 2, + "column": 20 + } + }, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 14, + "end": 28, + "loc": { + "start": { + "line": 2, + "column": 5 + }, + "end": { + "line": 2, + "column": 19 + } + }, + "id": { + "type": "Identifier", + "start": 14, + "end": 18, + "loc": { + "start": { + "line": 2, + "column": 5 + }, + "end": { + "line": 2, + "column": 9 + } + }, + "name": "name" + }, + "init": { + "type": "Literal", + "start": 21, + "end": 28, + "loc": { + "start": { + "line": 2, + "column": 12 + }, + "end": { + "line": 2, + "column": 19 + } + }, + "value": "world", + "raw": "'world'" + } + } + ], + "kind": "let" + } + ], + "sourceType": "module" + } + } +} \ No newline at end of file