diff --git a/packages/compiler-dom/__tests__/transforms/__snapshots__/stringifyStatic.spec.ts.snap b/packages/compiler-dom/__tests__/transforms/__snapshots__/stringifyStatic.spec.ts.snap index 78b576af5c7..a863eb32e61 100644 --- a/packages/compiler-dom/__tests__/transforms/__snapshots__/stringifyStatic.spec.ts.snap +++ b/packages/compiler-dom/__tests__/transforms/__snapshots__/stringifyStatic.spec.ts.snap @@ -32,6 +32,23 @@ return function render(_ctx, _cache) { }" `; +exports[`stringify static html > should bail for elements with null values 1`] = ` +"const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = Vue + +return function render(_ctx, _cache) { + return (_openBlock(), _createElementBlock("div", null, _cache[0] || (_cache[0] = [ + _createElementVNode("select", null, [ + _createElementVNode("option", { value: null }), + _createElementVNode("option", { value: "1" }), + _createElementVNode("option", { value: "1" }), + _createElementVNode("option", { value: "1" }), + _createElementVNode("option", { value: "1" }), + _createElementVNode("option", { value: "1" }) + ], -1 /* HOISTED */) + ]))) +}" +`; + exports[`stringify static html > should bail for elements with number values 1`] = ` "const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = Vue diff --git a/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts b/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts index a35b5223198..a460cfe68eb 100644 --- a/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts @@ -470,6 +470,17 @@ describe('stringify static html', () => { expect(code).toMatchSnapshot() }) + test('should bail for elements with null values', () => { + const { ast, code } = compileWithStringify( + `${repeat( + ``, + StringifyThresholds.ELEMENT_WITH_BINDING_COUNT, + )}`, + ) + expect(ast.cached).toMatchObject([cachedArrayBailedMatcher()]) + expect(code).toMatchSnapshot() + }) + test('eligible content (elements > 20) + non-eligible content', () => { const { code } = compileWithStringify( `${repeat( diff --git a/packages/compiler-dom/src/transforms/stringifyStatic.ts b/packages/compiler-dom/src/transforms/stringifyStatic.ts index a608ea3c4b3..cd8f1a9d184 100644 --- a/packages/compiler-dom/src/transforms/stringifyStatic.ts +++ b/packages/compiler-dom/src/transforms/stringifyStatic.ts @@ -261,8 +261,7 @@ function analyzeNode(node: StringifiableNode): [number, number] | false { isOptionTag && isStaticArgOf(p.arg, 'value') && p.exp && - p.exp.ast && - p.exp.ast.type !== 'StringLiteral' + !p.exp.isStatic ) { return bail() }