? args.map(arg => `${arg}: any`).join(',')
: args.join(', ')
- if (genScopeId) {
- if (isSetupInlined) {
- push(`${PURE_ANNOTATION}${WITH_ID}(`)
- } else {
- push(`const ${functionName} = ${PURE_ANNOTATION}${WITH_ID}(`)
- }
+ if (genScopeId && !isSetupInlined) {
+ // root-level _withId wrapping is no longer necessary after 3.0.8 and is
+ // a noop, it's only kept so that code compiled with 3.0.8+ can run with
+ // runtime < 3.0.8.
+ // TODO: consider removing in 3.1
+ push(`const ${functionName} = ${PURE_ANNOTATION}${WITH_ID}(`)
}
if (isSetupInlined || genScopeId) {
push(`(${signature}) => {`)
deindent()
push(`}`)
- if (genScopeId) {
+ if (genScopeId && !isSetupInlined) {
push(`)`)
}
// we technically don't need this anymore since `withCtx` already sets the
// correct scopeId, but this is necessary for backwards compat
+ // TODO: consider removing in 3.1
if (genScopeId) {
push(
`const ${WITH_ID} = ${PURE_ANNOTATION}${helper(
}"
`;
+exports[`SFC compile <script setup> inlineTemplate mode should not wrap render fn with withId when having scoped styles 1`] = `
+"import { toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock, withScopeId as _withScopeId } from \\"vue\\"
+const _withId = /*#__PURE__*/_withScopeId(\\"data-v-xxxxxxxx\\")
+
+
+export default {
+ expose: [],
+ setup(__props) {
+
+ const msg = 1
+
+return (_ctx, _cache) => {
+ return (_openBlock(), _createBlock(\\"h1\\", null, _toDisplayString(msg)))
+}
+}
+
+}"
+`;
+
exports[`SFC compile <script setup> inlineTemplate mode should work 1`] = `
"import { toDisplayString as _toDisplayString, createVNode as _createVNode, Fragment as _Fragment, openBlock as _openBlock, createBlock as _createBlock } from \\"vue\\"
expect(content).toMatch(`ssrInterpolate`)
assertCode(content)
})
+
+ // _withId is only generated for backwards compat and is a noop when called
+ // in module scope.
+ // when inside setup(), currentInstance will be non-null and _withId will
+ // no longer be noop and cause scopeId errors.
+ // TODO: this test should no longer be necessary if we remove _withId
+ // codegen in 3.1
+ test('should not wrap render fn with withId when having scoped styles', async () => {
+ const { content } = compile(
+ `
+ <script setup>
+ const msg = 1
+ </script>
+ <template><h1>{{ msg }}</h1></template>
+ <style scoped>
+ h1 { color: red; }
+ </style>
+ `,
+ {
+ inlineTemplate: true
+ }
+ )
+ expect(content).toMatch(`return (_ctx, _cache`)
+ expect(content).not.toMatch(`_withId(`)
+ assertCode(content)
+ })
})
describe('with TypeScript', () => {