Skip to content

Commit be0f614

Browse files
committed
feat(sfc-playground): support lang=ts
1 parent 691d354 commit be0f614

File tree

3 files changed

+74
-9
lines changed

3 files changed

+74
-9
lines changed

packages/sfc-playground/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
},
2323
"dependencies": {
2424
"file-saver": "^2.0.5",
25-
"jszip": "^3.6.0"
25+
"jszip": "^3.6.0",
26+
"sucrase": "^3.19.0"
2627
}
2728
}

packages/sfc-playground/src/sfcCompiler.ts

+21-7
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,24 @@ export async function compileFile({ filename, code, compiled }: File) {
5959
}
6060

6161
if (
62-
(descriptor.script && descriptor.script.lang) ||
63-
(descriptor.scriptSetup && descriptor.scriptSetup.lang) ||
6462
descriptor.styles.some(s => s.lang) ||
6563
(descriptor.template && descriptor.template.lang)
6664
) {
6765
store.errors = [
68-
'lang="x" pre-processors are not supported in the in-browser playground.'
66+
`lang="x" pre-processors for <template> or <style> are currently not ` +
67+
`supported.`
6968
]
7069
return
7170
}
7271

72+
const scriptLang =
73+
(descriptor.script && descriptor.script.lang) ||
74+
(descriptor.scriptSetup && descriptor.scriptSetup.lang)
75+
if (scriptLang && scriptLang !== 'ts') {
76+
store.errors = [`Only lang="ts" is supported for <script> blocks.`]
77+
return
78+
}
79+
7380
const hasScoped = descriptor.styles.some(s => s.scoped)
7481
let clientCode = ''
7582
let ssrCode = ''
@@ -79,7 +86,7 @@ export async function compileFile({ filename, code, compiled }: File) {
7986
ssrCode += code
8087
}
8188

82-
const clientScriptResult = doCompileScript(descriptor, id, false)
89+
const clientScriptResult = await doCompileScript(descriptor, id, false)
8390
if (!clientScriptResult) {
8491
return
8592
}
@@ -89,7 +96,7 @@ export async function compileFile({ filename, code, compiled }: File) {
8996
// script ssr only needs to be performed if using <script setup> where
9097
// the render fn is inlined.
9198
if (descriptor.scriptSetup) {
92-
const ssrScriptResult = doCompileScript(descriptor, id, true)
99+
const ssrScriptResult = await doCompileScript(descriptor, id, true)
93100
if (!ssrScriptResult) {
94101
return
95102
}
@@ -171,11 +178,11 @@ export async function compileFile({ filename, code, compiled }: File) {
171178
store.errors = []
172179
}
173180

174-
function doCompileScript(
181+
async function doCompileScript(
175182
descriptor: SFCDescriptor,
176183
id: string,
177184
ssr: boolean
178-
): [string, BindingMetadata | undefined] | undefined {
185+
): Promise<[string, BindingMetadata | undefined] | undefined> {
179186
if (descriptor.script || descriptor.scriptSetup) {
180187
try {
181188
const compiledScript = SFCCompiler.compileScript(descriptor, {
@@ -198,6 +205,13 @@ function doCompileScript(
198205
code +=
199206
`\n` +
200207
SFCCompiler.rewriteDefault(compiledScript.content, COMP_IDENTIFIER)
208+
209+
if ((descriptor.script || descriptor.scriptSetup)!.lang === 'ts') {
210+
code = (await import('sucrase')).transform(code, {
211+
transforms: ['typescript']
212+
}).code
213+
}
214+
201215
return [code, compiledScript.bindings]
202216
} catch (e) {
203217
store.errors = [e]

yarn.lock

+51-1
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
10661066
dependencies:
10671067
color-convert "^2.0.1"
10681068

1069+
any-promise@^1.0.0:
1070+
version "1.3.0"
1071+
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
1072+
integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
1073+
10691074
anymatch@^2.0.0:
10701075
version "2.0.0"
10711076
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@@ -1804,6 +1809,11 @@ commander@^2.20.0, commander@^2.7.1:
18041809
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
18051810
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
18061811

1812+
commander@^4.0.0:
1813+
version "4.1.1"
1814+
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
1815+
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
1816+
18071817
commander@^6.2.0:
18081818
version "6.2.1"
18091819
resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
@@ -3133,7 +3143,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0:
31333143
dependencies:
31343144
is-glob "^4.0.1"
31353145

3136-
glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
3146+
glob@7.1.6, glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
31373147
version "7.1.6"
31383148
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
31393149
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@@ -4962,6 +4972,15 @@ [email protected]:
49624972
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
49634973
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
49644974

4975+
mz@^2.7.0:
4976+
version "2.7.0"
4977+
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
4978+
integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
4979+
dependencies:
4980+
any-promise "^1.0.0"
4981+
object-assign "^4.0.1"
4982+
thenify-all "^1.0.0"
4983+
49654984
nanoid@^3.1.23:
49664985
version "3.1.23"
49674986
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
@@ -6784,6 +6803,18 @@ strip-json-comments@~2.0.1:
67846803
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
67856804
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
67866805

6806+
sucrase@^3.19.0:
6807+
version "3.19.0"
6808+
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.19.0.tgz#cc9a60f731e7497766a7b710d3362260a8f9ced5"
6809+
integrity sha512-FeMelydANPRMiOo/lxbf7NxN8bQmMVBQmKOa69BifwVhteMJzRoJNHaVBoCYmE/kpnx6VPg9ckaLumwtuAzmEA==
6810+
dependencies:
6811+
commander "^4.0.0"
6812+
glob "7.1.6"
6813+
lines-and-columns "^1.1.6"
6814+
mz "^2.7.0"
6815+
pirates "^4.0.1"
6816+
ts-interface-checker "^0.1.9"
6817+
67876818
supports-color@^5.3.0:
67886819
version "5.5.0"
67896820
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
@@ -6877,6 +6908,20 @@ text-table@^0.2.0:
68776908
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
68786909
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
68796910

6911+
thenify-all@^1.0.0:
6912+
version "1.6.0"
6913+
resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
6914+
integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=
6915+
dependencies:
6916+
thenify ">= 3.1.0 < 4"
6917+
6918+
"thenify@>= 3.1.0 < 4":
6919+
version "3.3.1"
6920+
resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f"
6921+
integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
6922+
dependencies:
6923+
any-promise "^1.0.0"
6924+
68806925
throat@^5.0.0:
68816926
version "5.0.0"
68826927
resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b"
@@ -6998,6 +7043,11 @@ trim-off-newlines@^1.0.0:
69987043
resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
69997044
integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM=
70007045

7046+
ts-interface-checker@^0.1.9:
7047+
version "0.1.13"
7048+
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
7049+
integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
7050+
70017051
ts-jest@^26.2.0:
70027052
version "26.5.5"
70037053
resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.5.tgz#e40481b6ee4dd162626ba481a2be05fa57160ea5"

0 commit comments

Comments
 (0)