Skip to content

Commit 2c99090

Browse files
fix: additional coverage, redundant api decorator error
1 parent 059f5cb commit 2c99090

File tree

12 files changed

+30
-65
lines changed

12 files changed

+30
-65
lines changed

packages/@lwc/engine-server/src/__tests__/fixtures/api/setter/error.txt

Whitespace-only changes.

packages/@lwc/engine-server/src/__tests__/fixtures/api/setter/expected.html

Lines changed: 0 additions & 14 deletions
This file was deleted.

packages/@lwc/engine-server/src/__tests__/fixtures/api/setter/index.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

packages/@lwc/engine-server/src/__tests__/fixtures/api/setter/modules/x/child/child.html

Lines changed: 0 additions & 3 deletions
This file was deleted.

packages/@lwc/engine-server/src/__tests__/fixtures/api/setter/modules/x/child/child.js

Lines changed: 0 additions & 11 deletions
This file was deleted.

packages/@lwc/engine-server/src/__tests__/fixtures/api/setter/modules/x/parent/parent.html

Lines changed: 0 additions & 4 deletions
This file was deleted.

packages/@lwc/engine-server/src/__tests__/fixtures/api/setter/modules/x/parent/parent.js

Lines changed: 0 additions & 5 deletions
This file was deleted.

packages/@lwc/engine-server/src/__tests__/fixtures/reserved-keywords/modules/x/cmp/cmp.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { LightningElement } from 'lwc';
22

3-
const privateFields = undefined;
4-
const api = undefined;
3+
const privateProperties = undefined;
4+
const publicProperties = undefined;
55
const stylesheetScopeToken = undefined;
66
const hasScopedStylesheets = undefined;
77
const defaultScopedStylesheets = undefined;
@@ -12,8 +12,8 @@ export default class extends LightningElement {
1212
Object.assign(
1313
{},
1414
{
15-
privateFields,
16-
api,
15+
privateProperties,
16+
publicProperties,
1717
stylesheetScopeToken,
1818
hasScopedStylesheets,
1919
defaultScopedStylesheets,

packages/@lwc/ssr-compiler/src/compile-js/generate-markup.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import type { ComponentMetaState } from './types';
1616

1717
const bGenerateMarkup = esTemplate`
1818
// These variables may mix with component-authored variables, so should be reasonably unique
19-
const __lwcApi__ = new Set(${/*api*/ is.arrayExpression});
20-
const __lwcPrivateFields__ = new Set(${/*private fields*/ is.arrayExpression});
19+
const __lwcPublicProperties__ = new Set(${/*api*/ is.arrayExpression});
20+
const __lwcPrivateProperties__ = new Set(${/*private fields*/ is.arrayExpression});
2121
2222
async function* generateMarkup(
2323
tagName,
@@ -43,8 +43,8 @@ const bGenerateMarkup = esTemplate`
4343
instance[__SYMBOL__SET_INTERNALS](
4444
props,
4545
attrs,
46-
__lwcApi__,
47-
__lwcPrivateFields__,
46+
__lwcPublicProperties__,
47+
__lwcPrivateProperties__,
4848
);
4949
instance.isConnected = true;
5050
if (instance.connectedCallback) {
@@ -101,7 +101,7 @@ export function addGenerateMarkupFunction(
101101
tagName: string,
102102
filename: string
103103
) {
104-
const { privateFields, api, tmplExplicitImports } = state;
104+
const { privateProperties, publicProperties, tmplExplicitImports } = state;
105105

106106
// The default tag name represents the component name that's passed to the transformer.
107107
// This is needed to generate markup for dynamic components which are invoked through
@@ -141,8 +141,8 @@ export function addGenerateMarkupFunction(
141141
);
142142
program.body.push(
143143
...bGenerateMarkup(
144-
b.arrayExpression(api.map(b.literal)),
145-
b.arrayExpression(privateFields.map(b.literal)),
144+
b.arrayExpression(publicProperties.map(b.literal)),
145+
b.arrayExpression(privateProperties.map(b.literal)),
146146
defaultTagName,
147147
classIdentifier,
148148
connectWireAdapterCode

packages/@lwc/ssr-compiler/src/compile-js/index.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,16 @@ const visitors: Visitors = {
101101
validateUniqueDecorator(decorators);
102102
const decoratedExpression = decorators?.[0]?.expression;
103103
if (is.identifier(decoratedExpression) && decoratedExpression.name === 'api') {
104-
state.api.push(node.key.name);
104+
state.publicProperties.push(node.key.name);
105105
} else if (
106106
is.callExpression(decoratedExpression) &&
107107
is.identifier(decoratedExpression.callee) &&
108108
decoratedExpression.callee.name === 'wire'
109109
) {
110110
catalogWireAdapters(path, state);
111-
state.privateFields.push(node.key.name);
111+
state.privateProperties.push(node.key.name);
112112
} else {
113-
state.privateFields.push(node.key.name);
113+
state.privateProperties.push(node.key.name);
114114
}
115115

116116
if (
@@ -165,7 +165,12 @@ const visitors: Visitors = {
165165
catalogWireAdapters(path, state);
166166
}
167167
} else if (is.identifier(decoratedExpression) && decoratedExpression.name === 'api') {
168-
state.api.push(node.key.name);
168+
if (state.publicProperties.includes(node.key.name)) {
169+
throw new Error(
170+
`LWC1112: @api get ${node.key.name} and @api set ${node.key.name} detected in class declaration. Only one of the two needs to be decorated with @api.`
171+
);
172+
}
173+
state.publicProperties.push(node.key.name);
169174
}
170175

171176
switch (node.key.name) {
@@ -271,8 +276,8 @@ export default function compileJS(
271276
tmplExplicitImports: null,
272277
cssExplicitImports: null,
273278
staticStylesheetIds: null,
274-
api: [],
275-
privateFields: [],
279+
publicProperties: [],
280+
privateProperties: [],
276281
wireAdapters: [],
277282
experimentalDynamicComponent: options.experimentalDynamicComponent,
278283
importManager: new ImportManager(),

0 commit comments

Comments
 (0)