From 1958314976ff8ca2b8c196ea95649f77d939d52f Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 4 Feb 2020 21:03:16 -0500 Subject: [PATCH] wip(compiler-ssr): v-show --- packages/compiler-core/src/codegen.ts | 2 + .../compiler-ssr/__tests__/ssrVShow.spec.ts | 84 +++++++++++++++++++ .../src/transforms/ssrTransformElement.ts | 11 ++- .../compiler-ssr/src/transforms/ssrVShow.ts | 30 ++++++- 4 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 packages/compiler-ssr/__tests__/ssrVShow.spec.ts diff --git a/packages/compiler-core/src/codegen.ts b/packages/compiler-core/src/codegen.ts index b0acb69da..eba40cb0c 100644 --- a/packages/compiler-core/src/codegen.ts +++ b/packages/compiler-core/src/codegen.ts @@ -699,10 +699,12 @@ function genConditionalExpression( } needNewline && indent() context.indentLevel++ + needNewline || push(` `) push(`? `) genNode(consequent, context) context.indentLevel-- needNewline && newline() + needNewline || push(` `) push(`: `) const isNested = alternate.type === NodeTypes.JS_CONDITIONAL_EXPRESSION if (!isNested) { diff --git a/packages/compiler-ssr/__tests__/ssrVShow.spec.ts b/packages/compiler-ssr/__tests__/ssrVShow.spec.ts new file mode 100644 index 000000000..6f7a0b8d1 --- /dev/null +++ b/packages/compiler-ssr/__tests__/ssrVShow.spec.ts @@ -0,0 +1,84 @@ +import { compile } from '../src' + +describe('ssr: v-show', () => { + test('basic', () => { + expect(compile(`
`).code).toMatchInlineSnapshot(` + "const { _renderStyle } = require(\\"vue\\") + + return function ssrRender(_ctx, _push, _parent) { + _push(\`
\`) + }" + `) + }) + + test('with static style', () => { + expect(compile(`
`).code) + .toMatchInlineSnapshot(` + "const { _renderStyle } = require(\\"vue\\") + + const _hoisted_1 = {\\"color\\":\\"red\\"} + + return function ssrRender(_ctx, _push, _parent) { + _push(\`
\`) + }" + `) + }) + + test('with dynamic style', () => { + expect(compile(`
`).code) + .toMatchInlineSnapshot(` + "const { _renderStyle } = require(\\"vue\\") + + return function ssrRender(_ctx, _push, _parent) { + _push(\`
\`) + }" + `) + }) + + test('with static + dynamic style', () => { + expect( + compile(`
`) + .code + ).toMatchInlineSnapshot(` + "const { _renderStyle } = require(\\"vue\\") + + const _hoisted_1 = {\\"color\\":\\"red\\"} + + return function ssrRender(_ctx, _push, _parent) { + _push(\`
\`) + }" + `) + }) + + test('with v-bind', () => { + expect( + compile( + `
` + ).code + ).toMatchInlineSnapshot(` + "const { mergeProps, _renderAttrs } = require(\\"vue\\") + + const _hoisted_1 = {\\"color\\":\\"red\\"} + + return function ssrRender(_ctx, _push, _parent) { + _push(\`
\`) + }" + `) + }) +}) diff --git a/packages/compiler-ssr/src/transforms/ssrTransformElement.ts b/packages/compiler-ssr/src/transforms/ssrTransformElement.ts index bea23c677..1c1d11574 100644 --- a/packages/compiler-ssr/src/transforms/ssrTransformElement.ts +++ b/packages/compiler-ssr/src/transforms/ssrTransformElement.ts @@ -16,7 +16,8 @@ import { CallExpression, createArrayExpression, ExpressionNode, - JSChildNode + JSChildNode, + ArrayExpression } from '@vue/compiler-dom' import { escapeHtml, isBooleanAttr, isSSRSafeAttrName } from '@vue/shared' import { createSSRCompilerError, SSRErrorCodes } from '../errors' @@ -210,8 +211,12 @@ function isTextareaWithValue( } function mergeCall(call: CallExpression, arg: string | JSChildNode) { - const existing = call.arguments[0] as ExpressionNode - call.arguments[0] = createArrayExpression([existing, arg]) + const existing = call.arguments[0] as ExpressionNode | ArrayExpression + if (existing.type === NodeTypes.JS_ARRAY_EXPRESSION) { + existing.elements.push(arg) + } else { + call.arguments[0] = createArrayExpression([existing, arg]) + } } function removeStaticBinding( diff --git a/packages/compiler-ssr/src/transforms/ssrVShow.ts b/packages/compiler-ssr/src/transforms/ssrVShow.ts index b5671b51a..d46cac737 100644 --- a/packages/compiler-ssr/src/transforms/ssrVShow.ts +++ b/packages/compiler-ssr/src/transforms/ssrVShow.ts @@ -1,7 +1,33 @@ -import { DirectiveTransform } from '@vue/compiler-dom' +import { + DirectiveTransform, + createCompilerError, + DOMErrorCodes, + createObjectProperty, + createSimpleExpression, + createConditionalExpression, + createObjectExpression +} from '@vue/compiler-dom' export const ssrTransformShow: DirectiveTransform = (dir, node, context) => { + if (!dir.exp) { + context.onError(createCompilerError(DOMErrorCodes.X_V_SHOW_NO_EXPRESSION)) + } return { - props: [] + props: [ + createObjectProperty( + createSimpleExpression(`style`, true), + createConditionalExpression( + dir.exp!, + createSimpleExpression(`null`, false), + createObjectExpression([ + createObjectProperty( + createSimpleExpression(`display`, true), + createSimpleExpression(`none`, true) + ) + ]), + false /* no newline */ + ) + ) + ] } }