@lwc/sfdc-lwc-compiler 13.3.9 → 13.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const common_tags_1 = require("common-tags");
4
+ const main_1 = require("../../../main");
5
+ describe('feature flag plugin', () => {
6
+ describe('when featureFlag option is provided', () => {
7
+ it('should transform default class export with feature flag check', async () => {
8
+ const config = {
9
+ bundle: {
10
+ namespace: 'x',
11
+ name: 'foo',
12
+ type: 'platform',
13
+ files: {
14
+ 'foo.js': (0, common_tags_1.stripIndents) `
15
+ import { LightningElement } from 'lwc';
16
+ export default class Foo extends LightningElement {
17
+ connectedCallback() {
18
+ console.log('foo');
19
+ }
20
+ }
21
+ `,
22
+ },
23
+ options: {
24
+ featureFlag: 'my.feature.flag',
25
+ },
26
+ },
27
+ };
28
+ const result = await (0, main_1.compile)(config);
29
+ if (!result.success) {
30
+ console.error('Compilation failed:', JSON.stringify(result.diagnostics, null, 2));
31
+ }
32
+ expect(result.success).toBe(true);
33
+ expect(result.results).toBeDefined();
34
+ expect(result.results[0].code).toMatchSnapshot();
35
+ });
36
+ it('should transform default class export when LightningElement is not imported', async () => {
37
+ const config = {
38
+ bundle: {
39
+ namespace: 'x',
40
+ name: 'foo',
41
+ type: 'platform',
42
+ files: {
43
+ 'foo.js': (0, common_tags_1.stripIndents) `
44
+ export default class Foo {
45
+ connectedCallback() {
46
+ console.log('foo');
47
+ }
48
+ }
49
+ `,
50
+ },
51
+ options: {
52
+ featureFlag: 'my.feature.flag',
53
+ },
54
+ },
55
+ };
56
+ const result = await (0, main_1.compile)(config);
57
+ if (!result.success) {
58
+ console.error('Compilation failed:', JSON.stringify(result.diagnostics, null, 2));
59
+ }
60
+ expect(result.success).toBe(true);
61
+ expect(result.results).toBeDefined();
62
+ expect(result.results[0].code).toMatchSnapshot();
63
+ });
64
+ it('should not add duplicate LightningElement import when already present', async () => {
65
+ const config = {
66
+ bundle: {
67
+ namespace: 'x',
68
+ name: 'foo',
69
+ type: 'platform',
70
+ files: {
71
+ 'foo.js': (0, common_tags_1.stripIndents) `
72
+ import { LightningElement, api } from 'lwc';
73
+ export default class Foo extends LightningElement {
74
+ @api name;
75
+ }
76
+ `,
77
+ },
78
+ options: {
79
+ featureFlag: 'my.feature.flag',
80
+ },
81
+ },
82
+ };
83
+ const result = await (0, main_1.compile)(config);
84
+ if (!result.success) {
85
+ console.error('Compilation failed:', JSON.stringify(result.diagnostics, null, 2));
86
+ }
87
+ expect(result.success).toBe(true);
88
+ expect(result.results).toBeDefined();
89
+ expect(result.results[0].code).toMatchSnapshot();
90
+ });
91
+ it('should handle feature flags with special characters', async () => {
92
+ const config = {
93
+ bundle: {
94
+ namespace: 'x',
95
+ name: 'foo',
96
+ type: 'platform',
97
+ files: {
98
+ 'foo.js': (0, common_tags_1.stripIndents) `
99
+ import { LightningElement } from 'lwc';
100
+ export default class Foo extends LightningElement {}
101
+ `,
102
+ },
103
+ options: {
104
+ featureFlag: 'org.my-feature.flag_name',
105
+ },
106
+ },
107
+ };
108
+ const result = await (0, main_1.compile)(config);
109
+ expect(result.success).toBe(true);
110
+ expect(result.results[0].code).toMatchSnapshot();
111
+ });
112
+ it('should handle named class export pattern', async () => {
113
+ const config = {
114
+ bundle: {
115
+ namespace: 'x',
116
+ name: 'foo',
117
+ type: 'platform',
118
+ files: {
119
+ 'foo.js': (0, common_tags_1.stripIndents) `
120
+ import { LightningElement } from 'lwc';
121
+ class MyComponent extends LightningElement {}
122
+ export default MyComponent;
123
+ `,
124
+ },
125
+ options: {
126
+ featureFlag: 'my.feature.flag',
127
+ },
128
+ },
129
+ };
130
+ const result = await (0, main_1.compile)(config);
131
+ expect(result.success).toBe(true);
132
+ expect(result.results[0].code).toMatchSnapshot();
133
+ });
134
+ it('should include correct error message in FeatureFlagError', async () => {
135
+ const config = {
136
+ bundle: {
137
+ namespace: 'x',
138
+ name: 'foo',
139
+ type: 'platform',
140
+ files: {
141
+ 'foo.js': (0, common_tags_1.stripIndents) `
142
+ import { LightningElement } from 'lwc';
143
+ export default class Foo extends LightningElement {}
144
+ `,
145
+ },
146
+ options: {
147
+ featureFlag: 'my.special.feature',
148
+ },
149
+ },
150
+ };
151
+ const result = await (0, main_1.compile)(config);
152
+ expect(result.success).toBe(true);
153
+ expect(result.results[0].code).toMatchSnapshot();
154
+ });
155
+ it('should not transform when file has no default export', async () => {
156
+ const config = {
157
+ bundle: {
158
+ namespace: 'x',
159
+ name: 'foo',
160
+ type: 'platform',
161
+ files: {
162
+ 'foo.js': (0, common_tags_1.stripIndents) `
163
+ export function helper() {
164
+ return 'help';
165
+ }
166
+ `,
167
+ },
168
+ options: {
169
+ featureFlag: 'my.feature.flag',
170
+ },
171
+ },
172
+ };
173
+ const result = await (0, main_1.compile)(config);
174
+ expect(result.success).toBe(true);
175
+ expect(result.results[0].code).toMatchSnapshot();
176
+ });
177
+ });
178
+ describe('when featureFlag option is not provided', () => {
179
+ it('should not transform code', async () => {
180
+ const config = {
181
+ bundle: {
182
+ namespace: 'x',
183
+ name: 'foo',
184
+ type: 'platform',
185
+ files: {
186
+ 'foo.js': (0, common_tags_1.stripIndents) `
187
+ import { LightningElement } from 'lwc';
188
+ export default class Foo extends LightningElement {
189
+ connectedCallback() {
190
+ console.log('foo');
191
+ }
192
+ }
193
+ `,
194
+ },
195
+ },
196
+ };
197
+ const result = await (0, main_1.compile)(config);
198
+ expect(result.success).toBe(true);
199
+ expect(result.results[0].code).toMatchSnapshot();
200
+ });
201
+ it('should not transform when featureFlag is empty string', async () => {
202
+ const config = {
203
+ bundle: {
204
+ namespace: 'x',
205
+ name: 'foo',
206
+ type: 'platform',
207
+ files: {
208
+ 'foo.js': (0, common_tags_1.stripIndents) `
209
+ import { LightningElement } from 'lwc';
210
+ export default class Foo extends LightningElement {}
211
+ `,
212
+ },
213
+ options: {
214
+ featureFlag: '',
215
+ },
216
+ },
217
+ };
218
+ const result = await (0, main_1.compile)(config);
219
+ expect(result.success).toBe(true);
220
+ expect(result.results[0].code).toMatchSnapshot();
221
+ });
222
+ });
223
+ describe('integration with compilation pipeline', () => {
224
+ it('should work with HTML template files', async () => {
225
+ const config = {
226
+ bundle: {
227
+ namespace: 'x',
228
+ name: 'foo',
229
+ type: 'platform',
230
+ files: {
231
+ 'foo.js': (0, common_tags_1.stripIndents) `
232
+ import { LightningElement } from 'lwc';
233
+ export default class Foo extends LightningElement {}
234
+ `,
235
+ 'foo.html': '<template><div>Hello</div></template>',
236
+ },
237
+ options: {
238
+ featureFlag: 'my.feature.flag',
239
+ },
240
+ },
241
+ };
242
+ const result = await (0, main_1.compile)(config);
243
+ expect(result.success).toBe(true);
244
+ expect(result.results[0].code).toMatchSnapshot();
245
+ });
246
+ it('should work with multiple output configs', async () => {
247
+ const config = {
248
+ bundle: {
249
+ namespace: 'x',
250
+ name: 'foo',
251
+ type: 'platform',
252
+ files: {
253
+ 'foo.js': (0, common_tags_1.stripIndents) `
254
+ import { LightningElement } from 'lwc';
255
+ export default class Foo extends LightningElement {}
256
+ `,
257
+ },
258
+ options: {
259
+ featureFlag: 'my.feature.flag',
260
+ },
261
+ },
262
+ compilerConfigs: [
263
+ { outputConfig: { minify: false } },
264
+ { outputConfig: { minify: true } },
265
+ ],
266
+ };
267
+ const result = await (0, main_1.compile)(config);
268
+ expect(result.success).toBe(true);
269
+ expect(result.results).toHaveLength(2);
270
+ expect(result.results[0].code).toMatchSnapshot();
271
+ expect(result.results[1].code).toMatchSnapshot();
272
+ });
273
+ });
274
+ });
275
+ //# sourceMappingURL=featureFlag.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureFlag.spec.js","sourceRoot":"","sources":["../../../../src/compiler/plugins/__tests__/featureFlag.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from 'rollup';
2
+ import type { CompileConfig } from '../compile';
3
+ export default function (config: CompileConfig): Plugin;
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2024, salesforce.com, inc.
4
+ * All rights reserved.
5
+ * SPDX-License-Identifier: MIT
6
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.default = default_1;
46
+ const path_1 = __importDefault(require("path"));
47
+ const core_1 = require("@babel/core");
48
+ const t = __importStar(require("@babel/types"));
49
+ const errors_1 = require("@lwc/errors");
50
+ /**
51
+ * Checks if a file is a JS script file (the entry point)
52
+ */
53
+ function isScriptFile(filename) {
54
+ const ext = path_1.default.extname(filename);
55
+ return ext === '.js';
56
+ }
57
+ /**
58
+ * Babel plugin that transforms default exports with feature flag checks
59
+ */
60
+ function featureFlagTransformPlugin() {
61
+ return {
62
+ manipulateOptions(_opts, parserOpts) {
63
+ parserOpts.plugins.push(['decorators', { decoratorsBeforeExport: true }]);
64
+ },
65
+ pre() {
66
+ this.defaultExportPath = null;
67
+ this.needsLightningElementImport = true;
68
+ },
69
+ visitor: {
70
+ ImportDeclaration(path, state) {
71
+ // Check if LightningElement is already imported
72
+ if (t.isStringLiteral(path.node.source) &&
73
+ path.node.source.value === 'lwc' &&
74
+ path.node.specifiers.some((spec) => {
75
+ if (t.isImportSpecifier(spec) && t.isIdentifier(spec.imported)) {
76
+ return spec.imported.name === 'LightningElement';
77
+ }
78
+ return false;
79
+ })) {
80
+ state.needsLightningElementImport = false;
81
+ }
82
+ },
83
+ ExportDefaultDeclaration(path, state) {
84
+ // Capture the default export path
85
+ state.defaultExportPath = path;
86
+ },
87
+ Program: {
88
+ exit(path, state) {
89
+ const { featureFlag, featureFlagVar } = state.opts;
90
+ const { needsLightningElementImport, defaultExportPath } = state;
91
+ if (!defaultExportPath) {
92
+ // No default export found, nothing to transform
93
+ return;
94
+ }
95
+ // Create feature flag import declaration
96
+ const featureFlagImport = t.importDeclaration([t.importDefaultSpecifier(t.identifier(featureFlagVar))], t.stringLiteral(`@salesforce/featureFlag/${featureFlag}`));
97
+ // Create FeatureFlagError class
98
+ const featureFlagErrorClass = t.classDeclaration(t.identifier('FeatureFlagError'), t.identifier('LightningElement'), t.classBody([
99
+ t.classMethod('constructor', t.identifier('constructor'), [], t.blockStatement([
100
+ t.throwStatement(t.newExpression(t.identifier('Error'), [
101
+ t.templateLiteral([
102
+ t.templateElement({ raw: `Feature Flag `, cooked: 'Feature Flag ' }),
103
+ t.templateElement({ raw: ` is disabled.`, cooked: ' is disabled.' }, true),
104
+ ], [t.stringLiteral(featureFlag)]),
105
+ ])),
106
+ ])),
107
+ ]));
108
+ // Add imports at the beginning of the program
109
+ const importsToAdd = [];
110
+ if (needsLightningElementImport) {
111
+ const lightningElementImport = t.importDeclaration([t.importSpecifier(t.identifier('LightningElement'), t.identifier('LightningElement'))], t.stringLiteral('lwc'));
112
+ importsToAdd.push(lightningElementImport);
113
+ }
114
+ importsToAdd.push(featureFlagImport);
115
+ importsToAdd.push(featureFlagErrorClass);
116
+ // Insert imports and class at the beginning
117
+ path.node.body.unshift(...importsToAdd);
118
+ // Replace the default export with conditional expression
119
+ const originalDeclaration = defaultExportPath.node.declaration;
120
+ // Convert ClassDeclaration to ClassExpression if needed (ClassExpression can be used in conditional)
121
+ let expressionValue;
122
+ if (t.isClassDeclaration(originalDeclaration)) {
123
+ // Convert ClassDeclaration to ClassExpression for use in conditional
124
+ expressionValue = t.classExpression(originalDeclaration.id, originalDeclaration.superClass, originalDeclaration.body);
125
+ }
126
+ else if (t.isFunctionDeclaration(originalDeclaration)) {
127
+ // Convert FunctionDeclaration to FunctionExpression
128
+ expressionValue = t.functionExpression(originalDeclaration.id, originalDeclaration.params, originalDeclaration.body, originalDeclaration.generator, originalDeclaration.async);
129
+ }
130
+ else {
131
+ // It's already an expression (Identifier, CallExpression, etc.)
132
+ expressionValue = originalDeclaration;
133
+ }
134
+ const conditionalExpression = t.conditionalExpression(t.identifier(featureFlagVar), expressionValue, t.identifier('FeatureFlagError'));
135
+ // Replace the export default declaration
136
+ defaultExportPath.replaceWith(t.exportDefaultDeclaration(conditionalExpression));
137
+ },
138
+ },
139
+ },
140
+ };
141
+ }
142
+ /**
143
+ * Transform function using Babel transformSync
144
+ */
145
+ function transformSync(src, id, featureFlag, sourcemap) {
146
+ const featureFlagVar = `__featureFlag_${featureFlag.replace(/[^a-zA-Z0-9_]/g, '_')}__`;
147
+ const transformOptions = {
148
+ filename: id,
149
+ sourceMaps: sourcemap,
150
+ // Prevent Babel from loading local configuration
151
+ babelrc: false,
152
+ configFile: false,
153
+ plugins: [
154
+ [
155
+ featureFlagTransformPlugin(),
156
+ {
157
+ featureFlag,
158
+ featureFlagVar,
159
+ },
160
+ ],
161
+ ],
162
+ };
163
+ let result;
164
+ try {
165
+ result = (0, core_1.transformSync)(src, transformOptions);
166
+ if (result === null || result.code === null || result.code === undefined) {
167
+ return undefined;
168
+ }
169
+ return {
170
+ code: result.code,
171
+ map: result.map || undefined,
172
+ };
173
+ }
174
+ catch (e) {
175
+ throw (0, errors_1.normalizeToCompilerError)(errors_1.TransformerErrors.JS_TRANSFORMER_ERROR, e, { filename: id });
176
+ }
177
+ }
178
+ function default_1(config) {
179
+ // Get feature flag from compile options
180
+ const featureFlag = config.options?.featureFlag;
181
+ const sourcemap = config.outputConfig?.sourcemap ?? false;
182
+ return {
183
+ name: 'feature-flag',
184
+ transform(code, id) {
185
+ // Only transform if feature flag is provided in options
186
+ if (!featureFlag) {
187
+ return null;
188
+ }
189
+ // Only process JS files
190
+ if (!isScriptFile(id)) {
191
+ return null;
192
+ }
193
+ // Use Babel transformSync
194
+ return transformSync(code, id, featureFlag, sourcemap);
195
+ },
196
+ };
197
+ }
198
+ //# sourceMappingURL=featureFlag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureFlag.js","sourceRoot":"","sources":["../../../src/compiler/plugins/featureFlag.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lwc/sfdc-lwc-compiler",
3
3
  "description": "LWC compiler for SFDC platform",
4
- "version": "13.3.9",
4
+ "version": "13.3.10",
5
5
  "main": "dist/main.js",
6
6
  "typings": "dist/main.d.ts",
7
7
  "files": [
@@ -27,11 +27,11 @@
27
27
  "@babel/traverse": "7.28.5",
28
28
  "@babel/types": "7.28.5",
29
29
  "@komaci/esm-generator": "260.31.0",
30
- "@lwc/dev-server-plugin-lex": "13.3.9",
30
+ "@lwc/dev-server-plugin-lex": "13.3.10",
31
31
  "@lwc/eslint-plugin-lwc": "3.3.0",
32
32
  "@lwc/eslint-plugin-lwc-platform": "6.3.0",
33
- "@lwc/metadata": "13.3.9",
34
- "@lwc/sfdc-compiler-utils": "13.3.9",
33
+ "@lwc/metadata": "13.3.10",
34
+ "@lwc/sfdc-compiler-utils": "13.3.10",
35
35
  "@rollup/plugin-babel": "^6.1.0",
36
36
  "@rollup/plugin-replace": "^6.0.3",
37
37
  "@rollup/wasm-node": "4.52.5",