diff --git a/src/compiler/compile/render_dom/wrappers/Element/Attribute.ts b/src/compiler/compile/render_dom/wrappers/Element/Attribute.ts index f55e731fdb..aff06e4150 100644 --- a/src/compiler/compile/render_dom/wrappers/Element/Attribute.ts +++ b/src/compiler/compile/render_dom/wrappers/Element/Attribute.ts @@ -91,9 +91,16 @@ export default class AttributeWrapper { if (chunk.type === 'Text') { return stringify(chunk.data); } else { - return chunk.get_precedence() <= 13 - ? `(${chunk.render()})` - : chunk.render(); + const renderedChunk = chunk.render(); + if (this.node.name === 'class') { + return chunk.get_precedence() <= 13 + ? `(${renderedChunk})` + : `(${renderedChunk} || '')`; + } else { + return chunk.get_precedence() <= 13 + ? `(${renderedChunk})` + : renderedChunk; + } } }) .join(' + '); diff --git a/test/runtime/samples/attribute-null-classname/_config.js b/test/runtime/samples/attribute-null-classname/_config.js new file mode 100644 index 0000000000..856bd8bcd0 --- /dev/null +++ b/test/runtime/samples/attribute-null-classname/_config.js @@ -0,0 +1,32 @@ +export default { + skip_if_ssr: true, + + props: { + testName: "testClassName" + }, + + html: `
`, + + test({ assert, component, target }) { + const div = target.querySelector('div'); + assert.equal(div.className, 'testClassName svelte-x1o6ra'); + + component.testName = null; + assert.equal(div.className, ' svelte-x1o6ra'); + + component.testName = undefined; + assert.equal(div.className, ' svelte-x1o6ra'); + + component.testName = undefined + ''; + assert.equal(div.className, 'undefined svelte-x1o6ra'); + + component.testName = null + ''; + assert.equal(div.className, 'null svelte-x1o6ra'); + + component.testName = 1; + assert.equal(div.className, '1 svelte-x1o6ra'); + + component.testName = ''; + assert.equal(div.className, ' svelte-x1o6ra'); + } +}; diff --git a/test/runtime/samples/attribute-null-classname/main.svelte b/test/runtime/samples/attribute-null-classname/main.svelte new file mode 100644 index 0000000000..013647952d --- /dev/null +++ b/test/runtime/samples/attribute-null-classname/main.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/test/runtime/samples/attribute-null-classnames/_config.js b/test/runtime/samples/attribute-null-classnames/_config.js new file mode 100644 index 0000000000..6eca569250 --- /dev/null +++ b/test/runtime/samples/attribute-null-classnames/_config.js @@ -0,0 +1,39 @@ +export default { + skip_if_ssr: true, + + props: { + testName1: "test1", + testName2: "test2", + }, + + html: ``, + + test({ assert, component, target }) { + const div = target.querySelector('div'); + assert.equal(div.className, 'test1test2 svelte-x1o6ra'); + + component.testName1 = null; + component.testName2 = null; + assert.equal(div.className, '0 svelte-x1o6ra'); + + component.testName1 = null; + component.testName2 = "test"; + assert.equal(div.className, 'nulltest svelte-x1o6ra'); + + component.testName1 = undefined; + component.testName2 = "test"; + assert.equal(div.className, 'undefinedtest svelte-x1o6ra'); + + component.testName1 = undefined; + component.testName2 = undefined; + assert.equal(div.className, 'NaN svelte-x1o6ra'); + + component.testName1 = null; + component.testName2 = 1; + assert.equal(div.className, '1 svelte-x1o6ra'); + + component.testName1 = undefined; + component.testName2 = 1; + assert.equal(div.className, 'NaN svelte-x1o6ra'); + } +}; diff --git a/test/runtime/samples/attribute-null-classnames/main.svelte b/test/runtime/samples/attribute-null-classnames/main.svelte new file mode 100644 index 0000000000..06098fd50b --- /dev/null +++ b/test/runtime/samples/attribute-null-classnames/main.svelte @@ -0,0 +1,12 @@ + + + + +