Skip to content

Commit 99a550d

Browse files
committed
feat(lang-ts): try supporting all lang="ts" blocks as scripts elements
1 parent ea93f60 commit 99a550d

File tree

3 files changed

+32
-19
lines changed

3 files changed

+32
-19
lines changed

src/common/ast-utils.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import type {
1414
* @returns `true` if the node is a `<script>` element.
1515
*/
1616
export function isScriptElement(node: VNode): node is VElement {
17-
return node.type === "VElement" && node.name === "script"
17+
return (
18+
node.type === "VElement" &&
19+
(node.name === "script" || getLang(node) === "ts")
20+
)
1821
}
1922

2023
/**
@@ -44,7 +47,11 @@ export function isTemplateElement(node: VNode): node is VElement {
4447
* @returns `true` if the node is a `<style>` element.
4548
*/
4649
export function isStyleElement(node: VNode): node is VElement {
47-
return node.type === "VElement" && node.name === "style"
50+
return (
51+
node.type === "VElement" &&
52+
node.name === "style" &&
53+
!(getLang(node) !== "ts")
54+
)
4855
}
4956

5057
/**

src/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,12 @@ function parseAsSFC(code: string, options: ParserOptions) {
131131
parser: scriptParser,
132132
})
133133
} else if (
134-
scripts.length === 2 &&
134+
scripts.length >= 2 &&
135135
(scriptSetup = scripts.find(isScriptSetupElement))
136136
) {
137137
result = parseScriptSetupElements(
138138
scriptSetup,
139-
scripts.find((e) => e !== scriptSetup)!,
139+
scripts.filter((e) => e !== scriptSetup)!,
140140
code,
141141
new LinesAndColumns(tokenizer.lineTerminators),
142142
{

src/script-setup/index.ts

+21-15
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ function parseScript(
206206
*/
207207
export function parseScriptSetupElements(
208208
scriptSetupElement: VElement,
209-
scriptElement: VElement,
209+
scriptElements: VElement[],
210210
sfcCode: string,
211211
linesAndColumns: LinesAndColumns,
212212
originalParserOptions: ParserOptions,
@@ -216,7 +216,7 @@ export function parseScriptSetupElements(
216216
)
217217
const scriptSetupModuleCodeBlocks = getScriptSetupModuleCodeBlocks(
218218
scriptSetupElement,
219-
scriptElement,
219+
scriptElements,
220220
sfcCode,
221221
linesAndColumns,
222222
parserOptions,
@@ -283,7 +283,7 @@ export function parseScriptSetupElements(
283283

284284
// Adjust AST and tokens
285285
if (result.ast.tokens != null) {
286-
for (const node of [scriptSetupElement, scriptElement]) {
286+
for (const node of [scriptSetupElement, ...scriptElements]) {
287287
const startTag = node.startTag
288288
const endTag = node.endTag
289289

@@ -314,7 +314,7 @@ export function parseScriptSetupElements(
314314
result.ast.loc.start =
315315
locationCalculator.getLocFromIndex(programStartOffset)
316316
if (result.ast.start != null) {
317-
result.ast.start = [scriptSetupElement, scriptElement].reduce(
317+
result.ast.start = [scriptSetupElement, ...scriptElements].reduce(
318318
(start, node) => {
319319
const textNode = node.children[0]
320320
return Math.min(
@@ -335,7 +335,7 @@ export function parseScriptSetupElements(
335335
result.ast.range[1] = programEndOffset
336336
result.ast.loc.end = locationCalculator.getLocFromIndex(programEndOffset)
337337
if (result.ast.end != null) {
338-
result.ast.end = [scriptSetupElement, scriptElement].reduce(
338+
result.ast.end = [scriptSetupElement, ...scriptElements].reduce(
339339
(end, node) => {
340340
const textNode = node.children[0]
341341
return Math.max(
@@ -447,7 +447,7 @@ export function parseScriptSetupElements(
447447
*/
448448
function getScriptSetupModuleCodeBlocks(
449449
scriptSetupElement: VElement,
450-
scriptElement: VElement,
450+
scriptElements: VElement[],
451451
sfcCode: string,
452452
linesAndColumns: LinesAndColumns,
453453
parserOptions: ParserOptions,
@@ -459,24 +459,30 @@ function getScriptSetupModuleCodeBlocks(
459459
parserOptions,
460460
)
461461

462-
const textNode = scriptElement.children[0]
463-
if (textNode == null || textNode.type !== "VText") {
464-
return scriptSetupCodeBlocks
462+
const codeBlocks = new CodeBlocks()
463+
464+
for (const scriptElement of scriptElements) {
465+
const textNode = scriptElement.children[0]
466+
if (textNode == null || textNode.type !== "VText") {
467+
continue
468+
}
469+
470+
const [scriptStartOffset, scriptEndOffset] = textNode.range
471+
472+
codeBlocks.append(
473+
sfcCode.slice(scriptStartOffset, scriptEndOffset),
474+
scriptStartOffset,
475+
)
465476
}
466477

467-
const [scriptStartOffset, scriptEndOffset] = textNode.range
468-
const codeBlocks = new CodeBlocks()
469-
codeBlocks.append(
470-
sfcCode.slice(scriptStartOffset, scriptEndOffset),
471-
scriptStartOffset,
472-
)
473478
if (scriptSetupCodeBlocks == null) {
474479
return { codeBlocks }
475480
}
476481

477482
codeBlocks.appendSplitPunctuators(";")
478483
const scriptSetupOffset = codeBlocks.length
479484
codeBlocks.appendCodeBlocks(scriptSetupCodeBlocks.codeBlocks)
485+
480486
return {
481487
codeBlocks,
482488
scriptSetupBlockRange: [

0 commit comments

Comments
 (0)