Skip to content

Commit 476bb41

Browse files
authored
fix(ssr): throw compile-time error on @wire-decorated getter/setter/method (#5175)
* fix(ssr): throw compile-time error on @wire-decorated getter/setter/method * fix(ssr): disallow @wire on computed props
1 parent 1193957 commit 476bb41

File tree

39 files changed

+169
-16
lines changed

39 files changed

+169
-16
lines changed

packages/@lwc/engine-server/src/__tests__/fixtures.spec.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { rollup } from 'rollup';
1111
import lwcRollupPlugin from '@lwc/rollup-plugin';
1212
import { testFixtureDir, formatHTML } from '@lwc/test-utils-lwc-internals';
1313
import { setFeatureFlagForTest } from '../index';
14+
import type { FeatureFlagName } from '@lwc/features/dist/types';
1415
import type { RollupLwcOptions } from '@lwc/rollup-plugin';
1516
import type * as lwc from '../index';
1617

@@ -128,16 +129,17 @@ function testFixtures(options?: RollupLwcOptions) {
128129
// the LightningElement. Therefor the compiled module should also be evaluated in the
129130
// same sandbox registry as the engine.
130131
const lwcEngineServer = await import('../index');
131-
const module = (await import(compiledFixturePath)) as FixtureModule;
132-
133-
const features = module!.features ?? [];
134-
features.forEach((flag) => {
135-
lwcEngineServer!.setFeatureFlagForTest(flag, true);
136-
});
137132

138133
let result;
139134
let err;
135+
let features: FeatureFlagName[] = [];
140136
try {
137+
const module = (await import(compiledFixturePath)) as FixtureModule;
138+
139+
features = module!.features ?? [];
140+
features.forEach((flag) => {
141+
lwcEngineServer!.setFeatureFlagForTest(flag, true);
142+
});
141143
result = formatHTML(
142144
lwcEngineServer!.renderComponent(
143145
module!.tagName,
@@ -146,10 +148,10 @@ function testFixtures(options?: RollupLwcOptions) {
146148
)
147149
);
148150
} catch (_err: any) {
149-
if (_err.name === 'AssertionError') {
151+
if (_err?.name === 'AssertionError') {
150152
throw _err;
151153
}
152-
err = _err.message;
154+
err = _err?.message || 'An empty error occurred?!';
153155
}
154156

155157
features.forEach((flag) => {
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"ssrFiles": {
3+
"error": "error-ssr.txt",
4+
"expected": "expected-ssr.html"
5+
}
6+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Unknown state: property definition has no key

packages/@lwc/engine-server/src/__tests__/fixtures/wire/errors/throws-on-computed-key/expected.html renamed to packages/@lwc/engine-server/src/__tests__/fixtures/wire/errors/computed-prop-updates-incorrectly/error.txt

File renamed without changes.

packages/@lwc/engine-server/src/__tests__/fixtures/wire/errors/computed-prop-updates-incorrectly/expected-ssr.html

Whitespace-only changes.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<x-wire>
2+
<template shadowrootmode="open">
3+
<p>
4+
Prop named symbol that should not be used: wire data
5+
</p>
6+
<p>
7+
Prop with symbol key that should be used: unset
8+
</p>
9+
</template>
10+
</x-wire>

packages/@lwc/engine-server/src/__tests__/fixtures/wire/errors/throws-on-computed-key/index.js renamed to packages/@lwc/engine-server/src/__tests__/fixtures/wire/errors/computed-prop-updates-incorrectly/index.js

File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export class adapter {
2+
constructor(dataCallback) {
3+
this.dc = dataCallback;
4+
}
5+
6+
connect() {}
7+
8+
update(config) {
9+
this.dc(config.value);
10+
}
11+
12+
disconnect() {}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<template>
2+
<p>Prop named symbol that should not be used: {symbol}</p>
3+
<p>Prop with symbol key that should be used: {symbolValue}</p>
4+
</template>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { LightningElement, wire } from 'lwc';
2+
import { adapter } from './adapter';
3+
4+
const symbol = Symbol("I'm a symbol!");
5+
export default class extends LightningElement {
6+
symbol = 'accidentally overwritten';
7+
8+
@wire(adapter, { value: 'wire data' })
9+
[symbol] = 'unset';
10+
11+
get symbolValue() {
12+
return this[symbol] ?? 'unset';
13+
}
14+
}

0 commit comments

Comments
 (0)