diff --git a/packages/compiler-core/__tests__/transforms/__snapshots__/vSlot.spec.ts.snap b/packages/compiler-core/__tests__/transforms/__snapshots__/vSlot.spec.ts.snap index c7796e24..e7f44eec 100644 --- a/packages/compiler-core/__tests__/transforms/__snapshots__/vSlot.spec.ts.snap +++ b/packages/compiler-core/__tests__/transforms/__snapshots__/vSlot.spec.ts.snap @@ -15,20 +15,6 @@ return function render() { }" `; -exports[`compiler: transform component slots explicit default slot 1`] = ` -"const { toString, resolveComponent, createVNode, createBlock, openBlock } = Vue - -return function render() { - const _ctx = this - const _component_Comp = resolveComponent(\\"Comp\\") - - return (openBlock(), createBlock(_component_Comp, null, { - default: ({ foo }) => [toString(foo), toString(_ctx.bar)], - _compiled: true - })) -}" -`; - exports[`compiler: transform component slots implicit default slot 1`] = ` "const { createVNode, resolveComponent, createBlock, openBlock } = Vue @@ -146,6 +132,27 @@ return function render() { }" `; +exports[`compiler: transform component slots named slots w/ implicit default slot 1`] = ` +"const _Vue = Vue + +return function render() { + with (this) { + const { createVNode: _createVNode, resolveComponent: _resolveComponent, createBlock: _createBlock, openBlock: _openBlock } = _Vue + + const _component_Comp = _resolveComponent(\\"Comp\\") + + return (_openBlock(), _createBlock(_component_Comp, null, { + one: () => [\\"foo\\"], + default: () => [ + \\"bar\\", + _createVNode(\\"span\\") + ], + _compiled: true + })) + } +}" +`; + exports[`compiler: transform component slots nested slots scoping 1`] = ` "const { toString, resolveComponent, createVNode, createBlock, openBlock } = Vue @@ -169,3 +176,17 @@ return function render() { })) }" `; + +exports[`compiler: transform component slots on-component default slot 1`] = ` +"const { toString, resolveComponent, createVNode, createBlock, openBlock } = Vue + +return function render() { + const _ctx = this + const _component_Comp = resolveComponent(\\"Comp\\") + + return (openBlock(), createBlock(_component_Comp, null, { + default: ({ foo }) => [toString(foo), toString(_ctx.bar)], + _compiled: true + })) +}" +`; diff --git a/packages/compiler-core/__tests__/transforms/vSlot.spec.ts b/packages/compiler-core/__tests__/transforms/vSlot.spec.ts index 56be19aa..b313f6e1 100644 --- a/packages/compiler-core/__tests__/transforms/vSlot.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vSlot.spec.ts @@ -95,7 +95,7 @@ describe('compiler: transform component slots', () => { expect(generate(root, { prefixIdentifiers: true }).code).toMatchSnapshot() }) - test('explicit default slot', () => { + test('on-component default slot', () => { const { root, slots } = parseWithSlots( `{{ foo }}{{ bar }}`, { prefixIdentifiers: true } @@ -189,6 +189,43 @@ describe('compiler: transform component slots', () => { expect(generate(root, { prefixIdentifiers: true }).code).toMatchSnapshot() }) + test('named slots w/ implicit default slot', () => { + const { root, slots } = parseWithSlots( + ` + bar + ` + ) + expect(slots).toMatchObject( + createSlotMatcher({ + one: { + type: NodeTypes.JS_FUNCTION_EXPRESSION, + params: undefined, + returns: [ + { + type: NodeTypes.TEXT, + content: `foo` + } + ] + }, + default: { + type: NodeTypes.JS_FUNCTION_EXPRESSION, + params: undefined, + returns: [ + { + type: NodeTypes.TEXT, + content: `bar` + }, + { + type: NodeTypes.ELEMENT, + tag: `span` + } + ] + } + }) + ) + expect(generate(root).code).toMatchSnapshot() + }) + test('dynamically named slots', () => { const { root, slots } = parseWithSlots( ` @@ -608,13 +645,13 @@ describe('compiler: transform component slots', () => { }) describe('errors', () => { - test('error on extraneous children w/ named slots', () => { + test('error on extraneous children w/ named default slot', () => { const onError = jest.fn() const source = `bar` parseWithSlots(source, { onError }) const index = source.indexOf('bar') expect(onError.mock.calls[0][0]).toMatchObject({ - code: ErrorCodes.X_V_SLOT_EXTRANEOUS_NON_SLOT_CHILDREN, + code: ErrorCodes.X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN, loc: { source: `bar`, start: { diff --git a/packages/compiler-core/src/errors.ts b/packages/compiler-core/src/errors.ts index 6fd71521..c62d12b9 100644 --- a/packages/compiler-core/src/errors.ts +++ b/packages/compiler-core/src/errors.ts @@ -76,7 +76,7 @@ export const enum ErrorCodes { X_V_SLOT_NAMED_SLOT_ON_COMPONENT, X_V_SLOT_MIXED_SLOT_USAGE, X_V_SLOT_DUPLICATE_SLOT_NAMES, - X_V_SLOT_EXTRANEOUS_NON_SLOT_CHILDREN, + X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN, X_V_SLOT_MISPLACED, X_V_MODEL_NO_EXPRESSION, X_V_MODEL_MALFORMED_EXPRESSION, @@ -168,9 +168,9 @@ export const errorMessages: { [code: number]: string } = { `The default slot should also use