diff --git a/.changeset/getter-keys-not-computed.md b/.changeset/getter-keys-not-computed.md new file mode 100644 index 000000000..50bbd4238 --- /dev/null +++ b/.changeset/getter-keys-not-computed.md @@ -0,0 +1,6 @@ +--- +"@solidjs/babel-plugin": patch +"@solidjs/compiler": patch +--- + +Emit non-identifier getter keys in compiled props literals as string literals (`get "aria-label"() {}`) instead of computed keys (`get ["aria-label"]() {}`). Same property, but a computed key drops the whole object literal off V8's boilerplate path into per-property runtime definition; on a seven-getter props literal the computed form costs ~45% more to build. Applies to every getter site in both compilers: component props, dynamic element attributes (DOM, SSR, universal). diff --git a/packages/babel-plugin/src/dom/element.ts b/packages/babel-plugin/src/dom/element.ts index e9ef5d85d..48ec5d2cd 100644 --- a/packages/babel-plugin/src/dom/element.ts +++ b/packages/babel-plugin/src/dom/element.ts @@ -1668,7 +1668,7 @@ function processSpreads( id, [], t.blockStatement([t.returnStatement(expression as babelTypes.Expression)]), - !t.isValidIdentifier(normalized) + false // never computed; see shared/component.ts (#3511) ) ); } else { diff --git a/packages/babel-plugin/src/shared/component.ts b/packages/babel-plugin/src/shared/component.ts index 7885fc4fe..7dc3d4ae0 100644 --- a/packages/babel-plugin/src/shared/component.ts +++ b/packages/babel-plugin/src/shared/component.ts @@ -284,13 +284,19 @@ export default function transformComponent( ) { const expr = transformCondition(attribute.get("value").get("expression"), true); + // Getter keys are never computed: `id` is an identifier or a + // string literal (`get "aria-label"()`), the same property as + // `get ["aria-label"]()` but on V8's object-literal boilerplate + // path — a computed key drops the whole literal to per-property + // runtime definition (#3511). Same at every getter site below + // and in dom/ssr/universal element.ts. runningObject.push( t.objectMethod( "get", id, [], t.blockStatement([t.returnStatement(expr.body)]), - !t.isValidIdentifier(key) + false ) ); } else if ( @@ -303,7 +309,7 @@ export default function transformComponent( ? callee.body : t.blockStatement([t.returnStatement(callee.body)]); - runningObject.push(t.objectMethod("get", id, [], body, !t.isValidIdentifier(key))); + runningObject.push(t.objectMethod("get", id, [], body, false)); } else { runningObject.push( t.objectMethod( @@ -311,7 +317,7 @@ export default function transformComponent( id, [], t.blockStatement([t.returnStatement(value.expression as t.Expression)]), - !t.isValidIdentifier(key) + false ) ); } diff --git a/packages/babel-plugin/src/ssr/element.ts b/packages/babel-plugin/src/ssr/element.ts index bcbbcc204..56b08cbfd 100644 --- a/packages/babel-plugin/src/ssr/element.ts +++ b/packages/babel-plugin/src/ssr/element.ts @@ -1038,7 +1038,7 @@ function createElement( id, [], t.blockStatement([t.returnStatement(expression)]), - !t.isValidIdentifier(key) + false // never computed; see shared/component.ts (#3511) ) ); } else runningObject.push(t.objectProperty(id, expression)); diff --git a/packages/babel-plugin/src/universal/element.ts b/packages/babel-plugin/src/universal/element.ts index 121672587..c9f16e98f 100644 --- a/packages/babel-plugin/src/universal/element.ts +++ b/packages/babel-plugin/src/universal/element.ts @@ -454,7 +454,7 @@ function processSpreads( id, [], t.blockStatement([t.returnStatement(expr.body)]), - !t.isValidIdentifier(key) + false // never computed; see shared/component.ts (#3511) ) ); } else { diff --git a/packages/babel-plugin/test/__dom_compatible_fixtures__/attributeExpressions/output.js b/packages/babel-plugin/test/__dom_compatible_fixtures__/attributeExpressions/output.js index f8f9ea16d..1dbd7d46b 100644 --- a/packages/babel-plugin/test/__dom_compatible_fixtures__/attributeExpressions/output.js +++ b/packages/babel-plugin/test/__dom_compatible_fixtures__/attributeExpressions/output.js @@ -126,7 +126,7 @@ _$spread( "margin-right": "40px" }; }, - get ["class"]() { + get class() { return [ "base", { @@ -603,7 +603,7 @@ _$spread( [ propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -620,7 +620,7 @@ _$spread( ...propsSpread }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -641,7 +641,7 @@ _$spread( ...propsSpread3 }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() diff --git a/packages/babel-plugin/test/__dom_fixtures__/attributeExpressions/output.js b/packages/babel-plugin/test/__dom_fixtures__/attributeExpressions/output.js index 1ef8d0208..e4a23d5a6 100644 --- a/packages/babel-plugin/test/__dom_fixtures__/attributeExpressions/output.js +++ b/packages/babel-plugin/test/__dom_fixtures__/attributeExpressions/output.js @@ -121,7 +121,7 @@ _$spread( "margin-right": "40px" }; }, - get ["class"]() { + get class() { return [ "base", { @@ -603,7 +603,7 @@ _$spread( [ propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -620,7 +620,7 @@ _$spread( ...propsSpread }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -641,7 +641,7 @@ _$spread( ...propsSpread3 }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() diff --git a/packages/babel-plugin/test/__dom_fixtures__/components/output.js b/packages/babel-plugin/test/__dom_fixtures__/components/output.js index 974e76325..2f42f82a3 100644 --- a/packages/babel-plugin/test/__dom_fixtures__/components/output.js +++ b/packages/babel-plugin/test/__dom_fixtures__/components/output.js @@ -122,7 +122,7 @@ const template2 = _$createComponent(Child, { }, stale: state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: el => (e = el) @@ -355,7 +355,7 @@ const Template19 = _$createComponent( _$mergeProps(() => s.dynamic()) ); const Template20 = _$createComponent(Component, { - get ["class"]() { + get class() { return prop.red ? "red" : "green"; } }); diff --git a/packages/babel-plugin/test/__dom_hydratable_fixtures__/attributeExpressions/output.js b/packages/babel-plugin/test/__dom_hydratable_fixtures__/attributeExpressions/output.js index c796d200a..2a234dd8e 100644 --- a/packages/babel-plugin/test/__dom_hydratable_fixtures__/attributeExpressions/output.js +++ b/packages/babel-plugin/test/__dom_hydratable_fixtures__/attributeExpressions/output.js @@ -119,7 +119,7 @@ _$spread( "margin-right": "40px" }; }, - get ["class"]() { + get class() { return [ "base", { @@ -622,7 +622,7 @@ _$spread( [ propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -640,7 +640,7 @@ _$spread( ...propsSpread }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -662,7 +662,7 @@ _$spread( ...propsSpread3 }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -808,7 +808,7 @@ _$spread( [ spread, { - get ["stroke-width"]() { + get "stroke-width"() { return cond() ? width() : 2; }, get fill() { diff --git a/packages/babel-plugin/test/__dom_hydratable_fixtures__/components/output.js b/packages/babel-plugin/test/__dom_hydratable_fixtures__/components/output.js index 726997062..ac370beca 100644 --- a/packages/babel-plugin/test/__dom_hydratable_fixtures__/components/output.js +++ b/packages/babel-plugin/test/__dom_hydratable_fixtures__/components/output.js @@ -136,7 +136,7 @@ const template2 = _$createComponent(Child, { }, stale: state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: el => (e = el) @@ -410,7 +410,7 @@ const Template19 = _$createComponent( _$mergeProps(() => s.dynamic()) ); const Template20 = _$createComponent(Component, { - get ["class"]() { + get class() { return prop.red ? "red" : "green"; } }); diff --git a/packages/babel-plugin/test/__dom_wrapperless_fixtures__/components/output.js b/packages/babel-plugin/test/__dom_wrapperless_fixtures__/components/output.js index 6fe4bbbd2..ea7a6ffbb 100644 --- a/packages/babel-plugin/test/__dom_wrapperless_fixtures__/components/output.js +++ b/packages/babel-plugin/test/__dom_wrapperless_fixtures__/components/output.js @@ -117,7 +117,7 @@ const template2 = _$createComponent(Child, { }, stale: state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: el => (e = el) @@ -350,7 +350,7 @@ const Template19 = _$createComponent( _$mergeProps(() => s.dynamic()) ); const Template20 = _$createComponent(Component, { - get ["class"]() { + get class() { return prop.red ? "red" : "green"; } }); diff --git a/packages/babel-plugin/test/__dynamic_fixtures__/attributeExpressions/output.js b/packages/babel-plugin/test/__dynamic_fixtures__/attributeExpressions/output.js index de31ee1f3..5630cf242 100644 --- a/packages/babel-plugin/test/__dynamic_fixtures__/attributeExpressions/output.js +++ b/packages/babel-plugin/test/__dynamic_fixtures__/attributeExpressions/output.js @@ -111,7 +111,7 @@ _$spread( "margin-right": "40px" }; }, - get ["class"]() { + get class() { return [ "base", { @@ -605,7 +605,7 @@ _$spread( [ propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -622,7 +622,7 @@ _$spread( ...propsSpread }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -643,7 +643,7 @@ _$spread( ...propsSpread3 }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() diff --git a/packages/babel-plugin/test/__dynamic_fixtures__/components/output.js b/packages/babel-plugin/test/__dynamic_fixtures__/components/output.js index eee9e9ad6..d611b5e2d 100644 --- a/packages/babel-plugin/test/__dynamic_fixtures__/components/output.js +++ b/packages/babel-plugin/test/__dynamic_fixtures__/components/output.js @@ -118,7 +118,7 @@ const template2 = _$createComponent(Child, { }, stale: state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: el => (e = el) diff --git a/packages/babel-plugin/test/__ssr_fixtures__/attributeExpressions/output.js b/packages/babel-plugin/test/__ssr_fixtures__/attributeExpressions/output.js index 437d87d10..5352cb626 100644 --- a/packages/babel-plugin/test/__ssr_fixtures__/attributeExpressions/output.js +++ b/packages/babel-plugin/test/__ssr_fixtures__/attributeExpressions/output.js @@ -116,7 +116,7 @@ const template = _$ssrElement( "margin-right": "40px" }; }, - get ["class"]() { + get class() { return [ "base", { @@ -446,7 +446,7 @@ const template82 = _$ssrElement( [ propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": color() @@ -460,7 +460,7 @@ const template83 = _$ssrElement( [ propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": color() @@ -476,7 +476,7 @@ const template84 = _$ssrElement( propsSpread2, propsSpread3, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": color() diff --git a/packages/babel-plugin/test/__ssr_fixtures__/components/output.js b/packages/babel-plugin/test/__ssr_fixtures__/components/output.js index 32a8139ea..d7e0625d9 100644 --- a/packages/babel-plugin/test/__ssr_fixtures__/components/output.js +++ b/packages/babel-plugin/test/__ssr_fixtures__/components/output.js @@ -94,7 +94,7 @@ const template2 = Child({ }, stale: state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: el => (e = el) @@ -269,7 +269,7 @@ const Template18 = Pre({ }); const Template19 = Component(_$mergeProps(() => s.dynamic())); const Template20 = Component({ - get ["class"]() { + get class() { return prop.red ? "red" : "green"; } }); diff --git a/packages/babel-plugin/test/__ssr_hydratable_fixtures__/attributeExpressions/output.js b/packages/babel-plugin/test/__ssr_hydratable_fixtures__/attributeExpressions/output.js index f5ec959ef..f31aebcca 100644 --- a/packages/babel-plugin/test/__ssr_hydratable_fixtures__/attributeExpressions/output.js +++ b/packages/babel-plugin/test/__ssr_hydratable_fixtures__/attributeExpressions/output.js @@ -114,7 +114,7 @@ const template = _$ssrElement( "margin-right": "40px" }; }, - get ["class"]() { + get class() { return [ "base", { @@ -541,7 +541,7 @@ const template82 = _$ssrElement( [ propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": color() @@ -555,7 +555,7 @@ const template83 = _$ssrElement( [ propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": color() @@ -571,7 +571,7 @@ const template84 = _$ssrElement( propsSpread2, propsSpread3, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": color() @@ -641,7 +641,7 @@ const template97 = _$ssrElement( [ spread, { - get ["stroke-width"]() { + get "stroke-width"() { return cond() ? width() : 2; }, get fill() { diff --git a/packages/babel-plugin/test/__ssr_hydratable_fixtures__/components/output.js b/packages/babel-plugin/test/__ssr_hydratable_fixtures__/components/output.js index d514cd0e7..91873054e 100644 --- a/packages/babel-plugin/test/__ssr_hydratable_fixtures__/components/output.js +++ b/packages/babel-plugin/test/__ssr_hydratable_fixtures__/components/output.js @@ -124,7 +124,7 @@ const template2 = Child({ }, stale: state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: el => (e = el) @@ -318,7 +318,7 @@ const Template18 = Pre({ }); const Template19 = Component(_$mergeProps(() => s.dynamic())); const Template20 = Component({ - get ["class"]() { + get class() { return prop.red ? "red" : "green"; } }); diff --git a/packages/babel-plugin/test/__universal_fixtures__/attributeExpressions/output.js b/packages/babel-plugin/test/__universal_fixtures__/attributeExpressions/output.js index d36389a63..607c4aa16 100644 --- a/packages/babel-plugin/test/__universal_fixtures__/attributeExpressions/output.js +++ b/packages/babel-plugin/test/__universal_fixtures__/attributeExpressions/output.js @@ -48,7 +48,7 @@ _$spread( "margin-right": "40px" }; }, - get ["class"]() { + get class() { return [ "base", { diff --git a/packages/babel-plugin/test/__universal_fixtures__/components/output.js b/packages/babel-plugin/test/__universal_fixtures__/components/output.js index fadc48b50..5e00c9618 100644 --- a/packages/babel-plugin/test/__universal_fixtures__/components/output.js +++ b/packages/babel-plugin/test/__universal_fixtures__/components/output.js @@ -108,7 +108,7 @@ const template2 = _$createComponent(Child, { }, stale: state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: el => (e = el) @@ -372,7 +372,7 @@ const Template19 = _$createComponent( _$mergeProps(() => s.dynamic()) ); const Template20 = _$createComponent(Component, { - get ["class"]() { + get class() { return prop.red ? "red" : "green"; } }); diff --git a/packages/compiler/__tests__/fixtures/dom-hydratable/attributeExpressions/output.js b/packages/compiler/__tests__/fixtures/dom-hydratable/attributeExpressions/output.js index 56b8deb35..77f4d6b79 100644 --- a/packages/compiler/__tests__/fixtures/dom-hydratable/attributeExpressions/output.js +++ b/packages/compiler/__tests__/fixtures/dom-hydratable/attributeExpressions/output.js @@ -102,7 +102,7 @@ _$spread(_el$2, [ "margin-right": "40px" }; }, - get ["class"]() { + get "class"() { return ["base", { dynamic: dynamic(), selected @@ -522,7 +522,7 @@ _$runHydrationEvents(); const template81 = _el$104; var _el$105 = _$getNextElement(_tmpl$4); _$spread(_el$105, [propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -531,7 +531,7 @@ _$runHydrationEvents(); const template82 = _el$105; var _el$106 = _$getNextElement(_tmpl$4); _$spread(_el$106, [{ ...propsSpread }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -544,7 +544,7 @@ _$spread(_el$107, [ propsSpread2, { ...propsSpread3 }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -655,7 +655,7 @@ _$effect(() => [ const template95 = _el$118; var _el$119 = _$getNextElement(_tmpl$51); _$spread(_el$119, [spread, { - get ["stroke-width"]() { + get "stroke-width"() { return cond() ? width() : 2; }, get fill() { diff --git a/packages/compiler/__tests__/fixtures/dom-hydratable/components/output.js b/packages/compiler/__tests__/fixtures/dom-hydratable/components/output.js index 9e008381c..5e7b5a87f 100644 --- a/packages/compiler/__tests__/fixtures/dom-hydratable/components/output.js +++ b/packages/compiler/__tests__/fixtures/dom-hydratable/components/output.js @@ -95,7 +95,7 @@ const template2 = _$createComponent(Child, { }, stale: /*@static*/ state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: (el) => e = el @@ -251,7 +251,7 @@ const Template18 = _$createComponent(Pre, { get children() { const Template19 = _$createComponent(Component, _$mergeProps(() => { return s.dynamic(); })); -const Template20 = _$createComponent(Component, { get ["class"]() { +const Template20 = _$createComponent(Component, { get "class"() { return prop.red ? "red" : "green"; } }); const template21 = _$createComponent(Component, _$mergeProps(() => { diff --git a/packages/compiler/__tests__/fixtures/dom-wrapperless/components/output.js b/packages/compiler/__tests__/fixtures/dom-wrapperless/components/output.js index e76d297e3..e976d580e 100644 --- a/packages/compiler/__tests__/fixtures/dom-wrapperless/components/output.js +++ b/packages/compiler/__tests__/fixtures/dom-wrapperless/components/output.js @@ -86,7 +86,7 @@ const template2 = _$createComponent(Child, { }, stale: /*@static*/ state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: (el) => e = el @@ -226,7 +226,7 @@ const Template18 = _$createComponent(Pre, { get children() { const Template19 = _$createComponent(Component, _$mergeProps(() => { return s.dynamic(); })); -const Template20 = _$createComponent(Component, { get ["class"]() { +const Template20 = _$createComponent(Component, { get "class"() { return prop.red ? "red" : "green"; } }); const template21 = _$createComponent(Component, _$mergeProps(() => { diff --git a/packages/compiler/__tests__/fixtures/dom/attributeExpressions/output.js b/packages/compiler/__tests__/fixtures/dom/attributeExpressions/output.js index 6b89fb41f..a154dea04 100644 --- a/packages/compiler/__tests__/fixtures/dom/attributeExpressions/output.js +++ b/packages/compiler/__tests__/fixtures/dom/attributeExpressions/output.js @@ -102,7 +102,7 @@ _$spread(_el$2, [ "margin-right": "40px" }; }, - get ["class"]() { + get "class"() { return ["base", { dynamic: dynamic(), selected @@ -503,7 +503,7 @@ _$spread(_el$98, { ...propsSpread }, false); const template81 = _el$98; var _el$99 = _tmpl$4(); _$spread(_el$99, [propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -511,7 +511,7 @@ _$spread(_el$99, [propsSpread, { const template82 = _el$99; var _el$100 = _tmpl$4(); _$spread(_el$100, [{ ...propsSpread }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -523,7 +523,7 @@ _$spread(_el$101, [ propsSpread2, { ...propsSpread3 }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() diff --git a/packages/compiler/__tests__/fixtures/dom/components/output.js b/packages/compiler/__tests__/fixtures/dom/components/output.js index 5375d0c84..bc9486224 100644 --- a/packages/compiler/__tests__/fixtures/dom/components/output.js +++ b/packages/compiler/__tests__/fixtures/dom/components/output.js @@ -91,7 +91,7 @@ const template2 = _$createComponent(Child, { }, stale: /*@static*/ state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: (el) => e = el @@ -231,7 +231,7 @@ const Template18 = _$createComponent(Pre, { get children() { const Template19 = _$createComponent(Component, _$mergeProps(() => { return s.dynamic(); })); -const Template20 = _$createComponent(Component, { get ["class"]() { +const Template20 = _$createComponent(Component, { get "class"() { return prop.red ? "red" : "green"; } }); const template21 = _$createComponent(Component, _$mergeProps(() => { diff --git a/packages/compiler/__tests__/fixtures/dynamic-universal/attributeExpressions/output.js b/packages/compiler/__tests__/fixtures/dynamic-universal/attributeExpressions/output.js index f9f13e1e2..d3a5b9408 100644 --- a/packages/compiler/__tests__/fixtures/dynamic-universal/attributeExpressions/output.js +++ b/packages/compiler/__tests__/fixtures/dynamic-universal/attributeExpressions/output.js @@ -33,7 +33,7 @@ _$spread(_el$2, [results, { "margin-right": "40px" }; }, - get ["class"]() { + get "class"() { return ["base", { dynamic: dynamic(), selected diff --git a/packages/compiler/__tests__/fixtures/dynamic-universal/components/output.js b/packages/compiler/__tests__/fixtures/dynamic-universal/components/output.js index 3e80d57c0..73093de3c 100644 --- a/packages/compiler/__tests__/fixtures/dynamic-universal/components/output.js +++ b/packages/compiler/__tests__/fixtures/dynamic-universal/components/output.js @@ -75,7 +75,7 @@ const template2 = _$createComponent(Child, { }, stale: /*@static*/ state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: (el) => e = el @@ -234,7 +234,7 @@ const Template18 = _$createComponent(Pre, { get children() { const Template19 = _$createComponent(Component, _$mergeProps(() => { return s.dynamic(); })); -const Template20 = _$createComponent(Component, { get ["class"]() { +const Template20 = _$createComponent(Component, { get "class"() { return prop.red ? "red" : "green"; } }); const template21 = _$createComponent(Component, _$mergeProps(() => { diff --git a/packages/compiler/__tests__/fixtures/dynamic/attributeExpressions/output.js b/packages/compiler/__tests__/fixtures/dynamic/attributeExpressions/output.js index e450c4942..8bb0c06bd 100644 --- a/packages/compiler/__tests__/fixtures/dynamic/attributeExpressions/output.js +++ b/packages/compiler/__tests__/fixtures/dynamic/attributeExpressions/output.js @@ -94,7 +94,7 @@ _$spread(_el$2, [ "margin-right": "40px" }; }, - get ["class"]() { + get "class"() { return ["base", { dynamic: dynamic(), selected @@ -505,7 +505,7 @@ _$spread(_el$101, { ...propsSpread }, false); const template81 = _el$101; var _el$102 = _tmpl$4(); _$spread(_el$102, [propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -513,7 +513,7 @@ _$spread(_el$102, [propsSpread, { const template82 = _el$102; var _el$103 = _tmpl$4(); _$spread(_el$103, [{ ...propsSpread }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -525,7 +525,7 @@ _$spread(_el$104, [ propsSpread2, { ...propsSpread3 }, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() diff --git a/packages/compiler/__tests__/fixtures/dynamic/components/output.js b/packages/compiler/__tests__/fixtures/dynamic/components/output.js index 2b99062e9..09dc40f90 100644 --- a/packages/compiler/__tests__/fixtures/dynamic/components/output.js +++ b/packages/compiler/__tests__/fixtures/dynamic/components/output.js @@ -87,7 +87,7 @@ const template2 = _$createComponent(Child, { }, stale: /*@static*/ state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: (el) => e = el diff --git a/packages/compiler/__tests__/fixtures/ssr-hydratable/attributeExpressions/output.js b/packages/compiler/__tests__/fixtures/ssr-hydratable/attributeExpressions/output.js index 888f76ae9..6622de8dd 100644 --- a/packages/compiler/__tests__/fixtures/ssr-hydratable/attributeExpressions/output.js +++ b/packages/compiler/__tests__/fixtures/ssr-hydratable/attributeExpressions/output.js @@ -201,7 +201,7 @@ const template = _$ssrElement("div", [ "margin-right": "40px" }; }, - get ["class"]() { + get "class"() { return ["base", { dynamic: dynamic(), selected @@ -481,13 +481,13 @@ const propsSpread = { const template80 = _$ssrElement("div", propsSpread, undefined, true); const template81 = _$ssrElement("div", propsSpread, undefined, true); const template82 = _$ssrElement("div", [propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() }], undefined, true); const template83 = _$ssrElement("div", [propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -497,7 +497,7 @@ const template84 = _$ssrElement("div", [ propsSpread2, propsSpread3, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -557,7 +557,7 @@ function MyVideo() { // #2959: conditional attribute merged into a spread stays a bare expression // (parity with the dom generate — neither side allocates a hydration id). const template97 = _$ssrElement("svg", [spread, { - get ["stroke-width"]() { + get "stroke-width"() { return cond() ? width() : 2; }, get fill() { diff --git a/packages/compiler/__tests__/fixtures/ssr-hydratable/components/output.js b/packages/compiler/__tests__/fixtures/ssr-hydratable/components/output.js index e8ad61292..dc2917f89 100644 --- a/packages/compiler/__tests__/fixtures/ssr-hydratable/components/output.js +++ b/packages/compiler/__tests__/fixtures/ssr-hydratable/components/output.js @@ -105,7 +105,7 @@ const template2 = Child({ }, stale: /*@static*/ state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: (el) => e = el @@ -209,7 +209,7 @@ const Template18 = Pre({ get children() { const Template19 = Component(_$mergeProps(() => { return s.dynamic(); })); -const Template20 = Component({ get ["class"]() { +const Template20 = Component({ get "class"() { return prop.red ? "red" : "green"; } }); const template21 = Component(_$mergeProps(() => { diff --git a/packages/compiler/__tests__/fixtures/ssr/attributeExpressions/output.js b/packages/compiler/__tests__/fixtures/ssr/attributeExpressions/output.js index fb9add521..57f076ff7 100644 --- a/packages/compiler/__tests__/fixtures/ssr/attributeExpressions/output.js +++ b/packages/compiler/__tests__/fixtures/ssr/attributeExpressions/output.js @@ -150,7 +150,7 @@ const template = _$ssrElement("div", [ "margin-right": "40px" }; }, - get ["class"]() { + get "class"() { return ["base", { dynamic: dynamic(), selected @@ -375,13 +375,13 @@ const propsSpread = { const template80 = _$ssrElement("div", propsSpread, undefined, false); const template81 = _$ssrElement("div", propsSpread, undefined, false); const template82 = _$ssrElement("div", [propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() }], undefined, false); const template83 = _$ssrElement("div", [propsSpread, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() @@ -391,7 +391,7 @@ const template84 = _$ssrElement("div", [ propsSpread2, propsSpread3, { - get ["data-dynamic"]() { + get "data-dynamic"() { return color(); }, "data-static": /* @static */ color() diff --git a/packages/compiler/__tests__/fixtures/ssr/components/output.js b/packages/compiler/__tests__/fixtures/ssr/components/output.js index 8e8c8bbd3..0f945849b 100644 --- a/packages/compiler/__tests__/fixtures/ssr/components/output.js +++ b/packages/compiler/__tests__/fixtures/ssr/components/output.js @@ -92,7 +92,7 @@ const template2 = Child({ }, stale: /*@static*/ state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: (el) => e = el @@ -195,7 +195,7 @@ const Template18 = Pre({ get children() { const Template19 = Component(_$mergeProps(() => { return s.dynamic(); })); -const Template20 = Component({ get ["class"]() { +const Template20 = Component({ get "class"() { return prop.red ? "red" : "green"; } }); const template21 = Component(_$mergeProps(() => { diff --git a/packages/compiler/__tests__/fixtures/universal/attributeExpressions/output.js b/packages/compiler/__tests__/fixtures/universal/attributeExpressions/output.js index f9f13e1e2..d3a5b9408 100644 --- a/packages/compiler/__tests__/fixtures/universal/attributeExpressions/output.js +++ b/packages/compiler/__tests__/fixtures/universal/attributeExpressions/output.js @@ -33,7 +33,7 @@ _$spread(_el$2, [results, { "margin-right": "40px" }; }, - get ["class"]() { + get "class"() { return ["base", { dynamic: dynamic(), selected diff --git a/packages/compiler/__tests__/fixtures/universal/components/output.js b/packages/compiler/__tests__/fixtures/universal/components/output.js index 5c3541de4..b86b1ebf4 100644 --- a/packages/compiler/__tests__/fixtures/universal/components/output.js +++ b/packages/compiler/__tests__/fixtures/universal/components/output.js @@ -76,7 +76,7 @@ const template2 = _$createComponent(Child, { }, stale: /*@static*/ state.data, handleClick: clickHandler, - get ["hyphen-ated"]() { + get "hyphen-ated"() { return state.data; }, ref: (el) => e = el @@ -235,7 +235,7 @@ const Template18 = _$createComponent(Pre, { get children() { const Template19 = _$createComponent(Component, _$mergeProps(() => { return s.dynamic(); })); -const Template20 = _$createComponent(Component, { get ["class"]() { +const Template20 = _$createComponent(Component, { get "class"() { return prop.red ? "red" : "green"; } }); const template21 = _$createComponent(Component, _$mergeProps(() => { diff --git a/packages/compiler/__tests__/parity/expected-cross/ssr-hydratable/universal_fixtures--attributeExpressions.diff b/packages/compiler/__tests__/parity/expected-cross/ssr-hydratable/universal_fixtures--attributeExpressions.diff index 4b5250c9c..830a46a9f 100644 --- a/packages/compiler/__tests__/parity/expected-cross/ssr-hydratable/universal_fixtures--attributeExpressions.diff +++ b/packages/compiler/__tests__/parity/expected-cross/ssr-hydratable/universal_fixtures--attributeExpressions.diff @@ -2,7 +2,7 @@ } }], () => { return _$ssrElement__r_server("h1", [{ -- get ["class"]() { +- get "class"() { - return `base ${_$ssrClassName__r_server(["base", { - dynamic: dynamic(), - selected: selected @@ -17,7 +17,7 @@ "margin-right": "40px" }; + }, -+ get ["class"]() { ++ get "class"() { + return ["base", { + dynamic: dynamic(), + selected: selected diff --git a/packages/compiler/__tests__/parity/expected-cross/ssr/universal_fixtures--attributeExpressions.diff b/packages/compiler/__tests__/parity/expected-cross/ssr/universal_fixtures--attributeExpressions.diff index 0e977abf1..c83ba3055 100644 --- a/packages/compiler/__tests__/parity/expected-cross/ssr/universal_fixtures--attributeExpressions.diff +++ b/packages/compiler/__tests__/parity/expected-cross/ssr/universal_fixtures--attributeExpressions.diff @@ -2,7 +2,7 @@ color: color } }], _$ssrElement__r_server("h1", [{ -- get ["class"]() { +- get "class"() { - return `base ${_$ssrClassName__r_server(["base", { - dynamic: dynamic(), - selected: selected @@ -17,7 +17,7 @@ "margin-right": "40px" }; + }, -+ get ["class"]() { ++ get "class"() { + return ["base", { + dynamic: dynamic(), + selected: selected diff --git a/packages/compiler/__tests__/parity/expected-cross/tsrx-ssr/universal_fixtures--attributeExpressions.diff b/packages/compiler/__tests__/parity/expected-cross/tsrx-ssr/universal_fixtures--attributeExpressions.diff index 0e977abf1..c83ba3055 100644 --- a/packages/compiler/__tests__/parity/expected-cross/tsrx-ssr/universal_fixtures--attributeExpressions.diff +++ b/packages/compiler/__tests__/parity/expected-cross/tsrx-ssr/universal_fixtures--attributeExpressions.diff @@ -2,7 +2,7 @@ color: color } }], _$ssrElement__r_server("h1", [{ -- get ["class"]() { +- get "class"() { - return `base ${_$ssrClassName__r_server(["base", { - dynamic: dynamic(), - selected: selected @@ -17,7 +17,7 @@ "margin-right": "40px" }; + }, -+ get ["class"]() { ++ get "class"() { + return ["base", { + dynamic: dynamic(), + selected: selected diff --git a/packages/compiler/src/shared/ast.rs b/packages/compiler/src/shared/ast.rs index 63e5ddf09..c08219268 100644 --- a/packages/compiler/src/shared/ast.rs +++ b/packages/compiler/src/shared/ast.rs @@ -217,8 +217,10 @@ pub(crate) fn object_getter_property_with_statements<'a>( None, Some(body), ); - // Babel: `t.objectMethod("get", id, [], body, !t.isValidIdentifier(key))` — - // non-identifier getter keys are computed (`get ["hyphen-ated"]()`). + // Never computed. A non-identifier key is a string literal + // (`get "hyphen-ated"()`), the same property as `get ["hyphen-ated"]()` + // but on V8's object-literal boilerplate path; a computed key drops the + // whole literal to per-property runtime definition (#3511). ast.object_property_kind_object_property( span, PropertyKind::Get, @@ -226,7 +228,7 @@ pub(crate) fn object_getter_property_with_statements<'a>( value, false, false, - !is_valid_babel_identifier(name), + false, ) }