Skip to content

Commit 0594400

Browse files
committedNov 10, 2022
fix(sfc): also generate getter for import bindings during dev
1 parent 5a3d45a commit 0594400

6 files changed

+62
-36
lines changed
 

‎packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap

+22-22
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export default {
5252
expose();
5353

5454

55-
return { n, x }
55+
return { n, get x() { return x } }
5656
}
5757

5858
}"
@@ -71,7 +71,7 @@ export default /*#__PURE__*/Object.assign(__default__, {
7171

7272
x()
7373

74-
return { n, x }
74+
return { n, get x() { return x } }
7575
}
7676

7777
})"
@@ -90,7 +90,7 @@ export default /*#__PURE__*/Object.assign(__default__, {
9090

9191
x()
9292

93-
return { n, x }
93+
return { n, get x() { return x } }
9494
}
9595

9696
})"
@@ -112,7 +112,7 @@ export default /*#__PURE__*/_defineComponent({
112112

113113
x()
114114

115-
return { x }
115+
return { get x() { return x } }
116116
}
117117

118118
})"
@@ -134,7 +134,7 @@ export default /*#__PURE__*/Object.assign(__default__, {
134134

135135
x()
136136

137-
return { n, def, x }
137+
return { n, def, get x() { return x } }
138138
}
139139

140140
})"
@@ -154,7 +154,7 @@ export default /*#__PURE__*/Object.assign(__default__, {
154154

155155
x()
156156

157-
return { n, x }
157+
return { n, get x() { return x } }
158158
}
159159

160160
})"
@@ -174,7 +174,7 @@ export default /*#__PURE__*/Object.assign(__default__, {
174174

175175
x()
176176

177-
return { n, x }
177+
return { n, get x() { return x } }
178178
}
179179

180180
})"
@@ -646,7 +646,7 @@ const props = __props;
646646

647647

648648

649-
return { props, propsModel }
649+
return { props, get propsModel() { return propsModel } }
650650
}
651651

652652
}"
@@ -663,7 +663,7 @@ export default {
663663
const props = __props;
664664

665665

666-
return { props, x }
666+
return { props, get x() { return x } }
667667
}
668668

669669
}"
@@ -750,7 +750,7 @@ export default /*#__PURE__*/_defineComponent({
750750
const a = 1
751751
function b() {}
752752

753-
return { a, b, Baz }
753+
return { a, b, get Baz() { return Baz } }
754754
}
755755

756756
})"
@@ -766,7 +766,7 @@ export default /*#__PURE__*/_defineComponent({
766766

767767
const cond = true
768768

769-
return { cond, bar, baz }
769+
return { cond, get bar() { return bar }, get baz() { return baz } }
770770
}
771771

772772
})"
@@ -782,7 +782,7 @@ export default /*#__PURE__*/_defineComponent({
782782

783783
const fooBar: FooBar = 1
784784

785-
return { fooBar, FooBaz, FooQux, foo }
785+
return { fooBar, get FooBaz() { return FooBaz }, get FooQux() { return FooQux }, get foo() { return foo } }
786786
}
787787

788788
})"
@@ -797,7 +797,7 @@ export default /*#__PURE__*/_defineComponent({
797797
expose();
798798

799799

800-
return { vMyDir }
800+
return { get vMyDir() { return vMyDir } }
801801
}
802802

803803
})"
@@ -812,7 +812,7 @@ export default /*#__PURE__*/_defineComponent({
812812
expose();
813813

814814

815-
return { VAR, VAR3 }
815+
return { get VAR() { return VAR }, get VAR3() { return VAR3 } }
816816
}
817817

818818
})"
@@ -827,7 +827,7 @@ export default /*#__PURE__*/_defineComponent({
827827
expose();
828828

829829

830-
return { FooBaz, Last }
830+
return { get FooBaz() { return FooBaz }, get Last() { return Last } }
831831
}
832832

833833
})"
@@ -842,7 +842,7 @@ export default /*#__PURE__*/_defineComponent({
842842
expose();
843843

844844

845-
return { x, z, x$y }
845+
return { get x() { return x }, get z() { return z }, get x$y() { return x$y } }
846846
}
847847

848848
})"
@@ -866,7 +866,7 @@ export default {
866866

867867

868868

869-
return { bar }
869+
return { get bar() { return bar } }
870870
}
871871

872872
}"
@@ -920,7 +920,7 @@ export default {
920920

921921
x()
922922

923-
return { x }
923+
return { get x() { return x } }
924924
}
925925

926926
}"
@@ -954,7 +954,7 @@ export default {
954954
expose();
955955

956956

957-
return { a, b }
957+
return { get a() { return a }, get b() { return b } }
958958
}
959959

960960
}"
@@ -1280,7 +1280,7 @@ export default {
12801280
function c() {}
12811281
class d {}
12821282

1283-
return { get aa() { return aa }, bb, cc, dd, get a() { return a }, b, c, d, xx, x }
1283+
return { get aa() { return aa }, set aa(v) { aa = v }, bb, cc, dd, get a() { return a }, set a(v) { a = v }, b, c, d, get xx() { return xx }, get x() { return x } }
12841284
}
12851285

12861286
}"
@@ -1668,7 +1668,7 @@ export default /*#__PURE__*/_defineComponent({
16681668
expose();
16691669

16701670

1671-
return { Baz }
1671+
return { get Baz() { return Baz } }
16721672
}
16731673

16741674
})"
@@ -1729,7 +1729,7 @@ const props = __props as {
17291729

17301730

17311731

1732-
return { props, defaults }
1732+
return { props, get defaults() { return defaults } }
17331733
}
17341734

17351735
})"

‎packages/compiler-sfc/__tests__/__snapshots__/compileScriptRefTransform.spec.ts.snap

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export default {
1515
let c = () => {}
1616
let d
1717
18-
return { foo, a, b, get c() { return c }, get d() { return d }, ref, shallowRef }
18+
return { foo, a, b, get c() { return c }, set c(v) { c = v }, get d() { return d }, set d(v) { d = v }, ref, shallowRef }
1919
}
2020
2121
}"
@@ -36,7 +36,7 @@ export default {
3636
let c = () => {}
3737
let d
3838
39-
return { foo, a, b, get c() { return c }, get d() { return d } }
39+
return { foo, a, b, get c() { return c }, set c(v) { c = v }, get d() { return d }, set d(v) { d = v } }
4040
}
4141
4242
}"

‎packages/compiler-sfc/__tests__/__snapshots__/cssVars.spec.ts.snap

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ _useCssVars(_ctx => ({
8484
let b = 200
8585
let foo = 300
8686
87-
return { get a() { return a }, get b() { return b }, get foo() { return foo } }
87+
return { get a() { return a }, set a(v) { a = v }, get b() { return b }, set b(v) { b = v }, get foo() { return foo }, set foo(v) { foo = v } }
8888
}
8989
9090
}"

‎packages/compiler-sfc/__tests__/compileScript.spec.ts

+22-9
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ describe('SFC compile <script setup>', () => {
2121
</script>
2222
`)
2323
expect(content).toMatch(
24-
'return { get aa() { return aa }, bb, cc, dd, get a() { return a }, b, c, d, xx, x }'
24+
`return { get aa() { return aa }, set aa(v) { aa = v }, ` +
25+
`bb, cc, dd, get a() { return a }, set a(v) { a = v }, b, c, d, ` +
26+
`get xx() { return xx }, get x() { return x } }`
2527
)
2628
expect(bindings).toStrictEqual({
2729
x: BindingTypes.SETUP_MAYBE_REF,
@@ -431,7 +433,10 @@ defineExpose({ foo: 123 })
431433
// FooBaz: used as PascalCase component
432434
// FooQux: used as kebab-case component
433435
// foo: lowercase component
434-
expect(content).toMatch(`return { fooBar, FooBaz, FooQux, foo }`)
436+
expect(content).toMatch(
437+
`return { fooBar, get FooBaz() { return FooBaz }, ` +
438+
`get FooQux() { return FooQux }, get foo() { return foo } }`
439+
)
435440
assertCode(content)
436441
})
437442

@@ -444,7 +449,7 @@ defineExpose({ foo: 123 })
444449
<div v-my-dir></div>
445450
</template>
446451
`)
447-
expect(content).toMatch(`return { vMyDir }`)
452+
expect(content).toMatch(`return { get vMyDir() { return vMyDir } }`)
448453
assertCode(content)
449454
})
450455

@@ -459,7 +464,9 @@ defineExpose({ foo: 123 })
459464
<div :class="[cond ? '' : bar(), 'default']" :style="baz"></div>
460465
</template>
461466
`)
462-
expect(content).toMatch(`return { cond, bar, baz }`)
467+
expect(content).toMatch(
468+
`return { cond, get bar() { return bar }, get baz() { return baz } }`
469+
)
463470
assertCode(content)
464471
})
465472

@@ -475,7 +482,9 @@ defineExpose({ foo: 123 })
475482
// x: used in interpolation
476483
// y: should not be matched by {{ yy }} or 'y' in binding exps
477484
// x$y: #4274 should escape special chars when creating Regex
478-
expect(content).toMatch(`return { x, z, x$y }`)
485+
expect(content).toMatch(
486+
`return { get x() { return x }, get z() { return z }, get x$y() { return x$y } }`
487+
)
479488
assertCode(content)
480489
})
481490

@@ -490,7 +499,9 @@ defineExpose({ foo: 123 })
490499
</template>
491500
`)
492501
// VAR2 should not be matched
493-
expect(content).toMatch(`return { VAR, VAR3 }`)
502+
expect(content).toMatch(
503+
`return { get VAR() { return VAR }, get VAR3() { return VAR3 } }`
504+
)
494505
assertCode(content)
495506
})
496507

@@ -505,7 +516,9 @@ defineExpose({ foo: 123 })
505516
<Last/>
506517
</template>
507518
`)
508-
expect(content).toMatch(`return { FooBaz, Last }`)
519+
expect(content).toMatch(
520+
`return { get FooBaz() { return FooBaz }, get Last() { return Last } }`
521+
)
509522
assertCode(content)
510523
})
511524

@@ -524,7 +537,7 @@ defineExpose({ foo: 123 })
524537
<div v-for="{ z = x as Qux } in list as Fred"/>
525538
</template>
526539
`)
527-
expect(content).toMatch(`return { a, b, Baz }`)
540+
expect(content).toMatch(`return { a, b, get Baz() { return Baz } }`)
528541
assertCode(content)
529542
})
530543

@@ -1301,7 +1314,7 @@ const emit = defineEmits(['a', 'b'])
13011314
import { type Bar, Baz } from './main.ts'
13021315
</script>`
13031316
)
1304-
expect(content).toMatch(`return { Baz }`)
1317+
expect(content).toMatch(`return { get Baz() { return Baz } }`)
13051318
assertCode(content)
13061319
})
13071320
})

‎packages/compiler-sfc/__tests__/compileScriptRefTransform.spec.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ describe('sfc ref transform', () => {
3333
expect(content).toMatch(`let c = () => {}`)
3434
expect(content).toMatch(`let d`)
3535
expect(content).toMatch(
36-
`return { foo, a, b, get c() { return c }, get d() { return d }, ref, shallowRef }`
36+
`return { foo, a, b, get c() { return c }, set c(v) { c = v }, ` +
37+
`get d() { return d }, set d(v) { d = v }, ref, shallowRef }`
3738
)
3839
assertCode(content)
3940
expect(bindings).toStrictEqual({

‎packages/compiler-sfc/src/compileScript.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -1486,8 +1486,20 @@ export function compileScript(
14861486
}
14871487
returned = `{ `
14881488
for (const key in allBindings) {
1489-
if (bindingMetadata[key] === BindingTypes.SETUP_LET) {
1489+
if (
1490+
allBindings[key] === true &&
1491+
userImports[key].source !== 'vue' &&
1492+
!userImports[key].source.endsWith('.vue')
1493+
) {
1494+
// generate getter for import bindings
1495+
// skip vue imports since we know they will never change
14901496
returned += `get ${key}() { return ${key} }, `
1497+
} else if (bindingMetadata[key] === BindingTypes.SETUP_LET) {
1498+
// local let binding, also add setter
1499+
const setArg = key === 'v' ? `_v` : `v`
1500+
returned +=
1501+
`get ${key}() { return ${key} }, ` +
1502+
`set ${key}(${setArg}) { ${key} = ${setArg} }, `
14911503
} else {
14921504
returned += `${key}, `
14931505
}

0 commit comments

Comments
 (0)
Please sign in to comment.