fix(compiler-sfc): prohibit src usage for <script setup>
+ do not
process non js/ts blocks in compileScript
This commit is contained in:
parent
4535b1bde8
commit
af4b0c2cf1
@ -53,10 +53,9 @@ export function compileScript(
|
|||||||
|
|
||||||
const hasCssVars = styles.some(s => typeof s.attrs.vars === 'string')
|
const hasCssVars = styles.some(s => typeof s.attrs.vars === 'string')
|
||||||
|
|
||||||
const isTS =
|
const scriptLang = script && script.lang
|
||||||
(script && script.lang === 'ts') ||
|
const scriptSetupLang = scriptSetup && scriptSetup.lang
|
||||||
(scriptSetup && scriptSetup.lang === 'ts')
|
const isTS = scriptLang === 'ts' || scriptSetupLang === 'ts'
|
||||||
|
|
||||||
const plugins: ParserPlugin[] = [
|
const plugins: ParserPlugin[] = [
|
||||||
...(options.babelParserPlugins || []),
|
...(options.babelParserPlugins || []),
|
||||||
...babelParserDefautPlugins,
|
...babelParserDefautPlugins,
|
||||||
@ -67,6 +66,10 @@ export function compileScript(
|
|||||||
if (!script) {
|
if (!script) {
|
||||||
throw new Error(`SFC contains no <script> tags.`)
|
throw new Error(`SFC contains no <script> tags.`)
|
||||||
}
|
}
|
||||||
|
if (scriptLang && scriptLang !== 'ts') {
|
||||||
|
// do not process non js/ts script blocks
|
||||||
|
return script
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
...script,
|
...script,
|
||||||
content: hasCssVars ? injectCssVarsCalls(sfc, plugins) : script.content,
|
content: hasCssVars ? injectCssVarsCalls(sfc, plugins) : script.content,
|
||||||
@ -74,12 +77,17 @@ export function compileScript(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (script && script.lang !== scriptSetup.lang) {
|
if (script && scriptLang !== scriptSetupLang) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`<script> and <script setup> must have the same language type.`
|
`<script> and <script setup> must have the same language type.`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (scriptSetupLang && scriptSetupLang !== 'ts') {
|
||||||
|
// do not process non js/ts script blocks
|
||||||
|
return scriptSetup
|
||||||
|
}
|
||||||
|
|
||||||
const defaultTempVar = `__default__`
|
const defaultTempVar = `__default__`
|
||||||
const bindings: BindingMetadata = {}
|
const bindings: BindingMetadata = {}
|
||||||
const imports: Record<string, string> = {}
|
const imports: Record<string, string> = {}
|
||||||
|
@ -150,15 +150,6 @@ export function parse(
|
|||||||
const block = createBlock(node, source, pad) as SFCScriptBlock
|
const block = createBlock(node, source, pad) as SFCScriptBlock
|
||||||
const isSetup = !!block.attrs.setup
|
const isSetup = !!block.attrs.setup
|
||||||
if (isSetup && !descriptor.scriptSetup) {
|
if (isSetup && !descriptor.scriptSetup) {
|
||||||
if (block.src) {
|
|
||||||
errors.push(
|
|
||||||
new SyntaxError(
|
|
||||||
`<script setup> cannot be used with the "src" attribute since ` +
|
|
||||||
`its syntax will be ambiguous outside of the component.`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
descriptor.scriptSetup = block
|
descriptor.scriptSetup = block
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -177,6 +168,27 @@ export function parse(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if (descriptor.scriptSetup) {
|
||||||
|
if (descriptor.scriptSetup.src) {
|
||||||
|
errors.push(
|
||||||
|
new SyntaxError(
|
||||||
|
`<script setup> cannot use the "src" attribute because ` +
|
||||||
|
`its syntax will be ambiguous outside of the component.`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
delete descriptor.scriptSetup
|
||||||
|
}
|
||||||
|
if (descriptor.script && descriptor.script.src) {
|
||||||
|
errors.push(
|
||||||
|
new SyntaxError(
|
||||||
|
`<script> cannot use the "src" attribute when <script setup> is ` +
|
||||||
|
`also present because they must be processed together.`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
delete descriptor.script
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (sourceMap) {
|
if (sourceMap) {
|
||||||
const genMap = (block: SFCBlock | null) => {
|
const genMap = (block: SFCBlock | null) => {
|
||||||
if (block && !block.src) {
|
if (block && !block.src) {
|
||||||
|
Loading…
Reference in New Issue
Block a user