Skip to content

Commit 44d3fc1

Browse files
nrkruksvc-cli-bot
andauthored
feat: vscode extension support @W-19820472 (#524)
* chore: update task label and arguments in tasks.json for CLI plugin build * feat: add comprehensive cursor rules documentation for Salesforce CLI plugin * feat: enhance component preview functionality by generating and logging the full preview URL * feat: enhance LightningDevComponent to return json * feat: update command-snapshot.json to include new flags for Lightning Dev commands * chore(release): 4.4.1-alpha.0 [skip ci] * chore: upgrade LWC dependencies to version 13.0.31 * chore(release): 4.4.2-alpha.0 [skip ci] * fix: temp package json changes * fix: lock file * chore(release): 4.4.13-alpha.0 [skip ci] * feat: update local dev server URL handling for CODE_BUILDER_URI environment variable * refactor: change variable declaration for local dev server URL in LightningDevComponent * chore(release): 4.4.13-codebuilder.0 [skip ci] * chore(release): 4.4.13-codebuilder.1 [skip ci] * feat: enhance local dev server URL handling for Code Builder environment * chore(release): 4.4.13-codebuilder.2 [skip ci] * fix: code builder trusted origins * chore(release): 4.4.13-codebuilder.3 [skip ci] * feat: auto close lwc-dev-server window in code builder * chore(release): 4.4.13-codebuilder.4 [skip ci] * fix: code builder domains * chore(release): 4.4.13-codebuilder.5 [skip ci] * fix: new component creation * chore(release): 4.4.13-codebuilder.6 [skip ci] * fix: lockfile * fix: create new modules updates * chore(release): 4.4.14-codebuilder.0 [skip ci] * chore: remove old code --------- Co-authored-by: svc-cli-bot <[email protected]>
1 parent 74871c7 commit 44d3fc1

File tree

6 files changed

+154
-79
lines changed

6 files changed

+154
-79
lines changed

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,14 @@ _See code: [src/commands/lightning/dev/app.ts](https://github.com/salesforcecli/
209209

210210
```
211211
USAGE
212-
$ sf lightning dev component -o <value> [--json] [--flags-dir <value>] [-n <value>] [-c]
212+
$ sf lightning dev component -o <value> [--json] [--flags-dir <value>] [-n <value>] [--api-version <value>] [-c]
213213
214214
FLAGS
215-
-c, --client-select Launch component preview without selecting a component
216-
-n, --name=<value> Name of a component to preview.
217-
-o, --target-org=<value> (required) Username or alias of the target org. Not required if the `target-org`
218-
configuration variable is already set.
215+
-c, --client-select Launch component preview without selecting a component
216+
-n, --name=<value> Name of a component to preview.
217+
-o, --target-org=<value> (required) Username or alias of the target org. Not required if the `target-org`
218+
configuration variable is already set.
219+
--api-version=<value> Override the api version used for api requests made by this command
219220
220221
GLOBAL FLAGS
221222
--flags-dir=<value> Import flag values from a directory.

command-snapshot.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@
1212
"command": "lightning:dev:component",
1313
"flagAliases": [],
1414
"flagChars": ["c", "n", "o"],
15-
"flags": ["client-select", "flags-dir", "json", "name", "target-org"],
15+
"flags": ["api-version", "client-select", "flags-dir", "json", "name", "target-org"],
1616
"plugin": "@salesforce/plugin-lightning-dev"
1717
},
1818
{
1919
"alias": [],
2020
"command": "lightning:dev:site",
2121
"flagAliases": [],
2222
"flagChars": ["l", "n", "o"],
23-
"flags": ["flags-dir", "get-latest", "guest", "name", "target-org", "ssr"],
23+
"flags": ["flags-dir", "get-latest", "guest", "name", "ssr", "target-org"],
2424
"plugin": "@salesforce/plugin-lightning-dev"
2525
}
2626
]

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
"dependencies": {
88
"@inquirer/prompts": "^5.3.8",
99
"@inquirer/select": "^2.4.7",
10-
"@lwc/lwc-dev-server": "~13.1.2",
11-
"@lwc/sfdc-lwc-compiler": "~13.1.2",
10+
"@lwc/lwc-dev-server": "~13.1.5-alpha.3+007b30e",
11+
"@lwc/sfdc-lwc-compiler": "~13.1.5-alpha.3+007b30e",
1212
"@lwrjs/api": "0.18.3",
1313
"@oclif/core": "^4.5.0",
1414
"@salesforce/core": "^8.21.2",
@@ -237,7 +237,7 @@
237237
],
238238
"target": {
239239
"versionNumber": "65.0",
240-
"matchingDevServerVersion": "~13.1.2"
240+
"matchingDevServerVersion": "~13.1.5-alpha.3+007b30e"
241241
},
242242
"versionToTagMappings": [
243243
{
@@ -257,7 +257,7 @@
257257
"tagName": "prerelease"
258258
},
259259
{
260-
"versionNumber": "66.0",
260+
"versionNumber": "65.0",
261261
"tagName": "next"
262262
}
263263
]

src/commands/lightning/dev/component.ts

Lines changed: 84 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,15 @@ Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
1818
const messages = Messages.loadMessages('@salesforce/plugin-lightning-dev', 'lightning.dev.component');
1919
const sharedMessages = Messages.loadMessages('@salesforce/plugin-lightning-dev', 'shared.utils');
2020

21-
export default class LightningDevComponent extends SfCommand<void> {
21+
export type ComponentPreviewResult = {
22+
instanceUrl: string;
23+
ldpServerUrl: string;
24+
ldpServerId: string;
25+
componentName: string;
26+
previewUrl: string;
27+
};
28+
29+
export default class LightningDevComponent extends SfCommand<ComponentPreviewResult> {
2230
public static readonly summary = messages.getMessage('summary');
2331
public static readonly description = messages.getMessage('description');
2432
public static readonly examples = messages.getMessages('examples');
@@ -29,6 +37,7 @@ export default class LightningDevComponent extends SfCommand<void> {
2937
char: 'n',
3038
requiredOrDefaulted: false,
3139
}),
40+
'api-version': Flags.orgApiVersion(),
3241
'client-select': Flags.boolean({
3342
summary: messages.getMessage('flags.client-select.summary'),
3443
char: 'c',
@@ -37,7 +46,7 @@ export default class LightningDevComponent extends SfCommand<void> {
3746
'target-org': Flags.requiredOrg(),
3847
};
3948

40-
public async run(): Promise<void> {
49+
public async run(): Promise<ComponentPreviewResult> {
4150
const { flags } = await this.parse(LightningDevComponent);
4251
const logger = await Logger.child(this.ctor.name);
4352
const project = await SfProject.resolve();
@@ -54,6 +63,7 @@ export default class LightningDevComponent extends SfCommand<void> {
5463
let componentName = flags['name'];
5564
const clientSelect = flags['client-select'];
5665
const targetOrg = flags['target-org'];
66+
const apiVersion = flags['api-version'];
5767

5868
const { ldpServerId, ldpServerToken } = await PreviewUtils.initializePreviewConnection(targetOrg);
5969

@@ -62,44 +72,56 @@ export default class LightningDevComponent extends SfCommand<void> {
6272
logger.debug(`Next available ports are http=${serverPorts.httpPort} , https=${serverPorts.httpsPort}`);
6373

6474
logger.debug('Determining Local Dev Server url');
65-
const ldpServerUrl = PreviewUtils.generateWebSocketUrlForLocalDevServer(Platform.desktop, serverPorts, logger);
75+
let ldpServerUrl;
76+
77+
// In Code Builder, we cannot go to localhost - we need to use a proxy URI to get to the ldpServer
78+
if (process.env.SF_CONTAINER_MODE && process.env.VSCODE_PROXY_URI) {
79+
logger.debug('In Code Builder Mode - using proxy URI');
80+
ldpServerUrl = process.env.VSCODE_PROXY_URI.replace('https://', 'ws://').replace(
81+
'{{port}}',
82+
`${serverPorts.httpPort}`
83+
);
84+
} else {
85+
// Default behavior
86+
ldpServerUrl = PreviewUtils.generateWebSocketUrlForLocalDevServer(Platform.desktop, serverPorts, logger);
87+
}
6688
logger.debug(`Local Dev Server url is ${ldpServerUrl}`);
6789

68-
const namespacePaths = await ComponentUtils.getNamespacePaths(project);
69-
const componentPaths = await ComponentUtils.getAllComponentPaths(namespacePaths);
70-
if (!componentPaths) {
71-
throw new Error(messages.getMessage('error.directory'));
72-
}
90+
if (!clientSelect) {
91+
const namespacePaths = await ComponentUtils.getNamespacePaths(project);
92+
const componentPaths = await ComponentUtils.getAllComponentPaths(namespacePaths);
93+
if (!componentPaths) {
94+
throw new Error(messages.getMessage('error.directory'));
95+
}
7396

74-
const components = (
75-
await Promise.all(
76-
componentPaths.map(async (componentPath) => {
77-
let xml;
78-
79-
try {
80-
xml = await ComponentUtils.getComponentMetadata(componentPath);
81-
} catch (err) {
82-
this.warn(messages.getMessage('error.component-metadata', [componentPath]));
83-
}
84-
85-
// components must have meta xml to be previewed
86-
if (!xml) {
87-
return undefined;
88-
}
89-
90-
const name = path.basename(componentPath);
91-
const label = ComponentUtils.componentNameToTitleCase(name);
92-
93-
return {
94-
name,
95-
label: xml.LightningComponentBundle.masterLabel ?? label,
96-
description: xml.LightningComponentBundle.description ?? '',
97-
};
98-
})
99-
)
100-
).filter((component) => !!component);
97+
const components = (
98+
await Promise.all(
99+
componentPaths.map(async (componentPath) => {
100+
let xml;
101+
102+
try {
103+
xml = await ComponentUtils.getComponentMetadata(componentPath);
104+
} catch (err) {
105+
this.warn(messages.getMessage('error.component-metadata', [componentPath]));
106+
}
107+
108+
// components must have meta xml to be previewed
109+
if (!xml) {
110+
return undefined;
111+
}
112+
113+
const name = path.basename(componentPath);
114+
const label = ComponentUtils.componentNameToTitleCase(name);
115+
116+
return {
117+
name,
118+
label: xml.LightningComponentBundle.masterLabel ?? label,
119+
description: xml.LightningComponentBundle.description ?? '',
120+
};
121+
})
122+
)
123+
).filter((component) => !!component);
101124

102-
if (!clientSelect) {
103125
if (componentName) {
104126
// validate that the component exists before launching the server
105127
const match = components.find(
@@ -129,7 +151,31 @@ export default class LightningDevComponent extends SfCommand<void> {
129151
targetOrgArg
130152
);
131153

132-
// Open the browser and navigate to the right page
133-
await this.config.runCommand('org:open', launchArguments);
154+
// Construct and log the full URL that will be opened
155+
const connection = targetOrg.getConnection(apiVersion);
156+
157+
const previewUrl = PreviewUtils.generateComponentPreviewUrl(
158+
connection.instanceUrl,
159+
ldpServerUrl,
160+
ldpServerId,
161+
componentName,
162+
false
163+
);
164+
165+
// Prepare the result for JSON output
166+
const result: ComponentPreviewResult = {
167+
instanceUrl: connection.instanceUrl,
168+
ldpServerUrl,
169+
ldpServerId,
170+
componentName: componentName ?? '',
171+
previewUrl,
172+
};
173+
174+
// Open the browser and navigate to the right page (unless OPEN_BROWSER is set to true)
175+
if (process.env.OPEN_BROWSER !== 'false') {
176+
await this.config.runCommand('org:open', launchArguments);
177+
}
178+
179+
return result;
134180
}
135181
}

src/shared/previewUtils.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,34 @@ export class PreviewUtils {
246246
return launchArguments;
247247
}
248248

249+
/**
250+
* Generates the full URL for a component preview.
251+
*
252+
* @param instanceUrl The URL of the Salesforce instance
253+
* @param ldpServerUrl The URL for the local dev server
254+
* @param ldpServerId Record ID for the identity token
255+
* @param componentName The name of the component to preview
256+
* @param encodePath Whether to encode the path
257+
* @returns The full URL for the component preview
258+
*/
259+
public static generateComponentPreviewUrl(
260+
instanceUrl: string,
261+
ldpServerUrl: string,
262+
ldpServerId: string,
263+
componentName?: string,
264+
encodePath = false
265+
): string {
266+
let url = `${instanceUrl}/lwr/application/e/devpreview/ai/${
267+
encodePath ? encodeURIComponent('localdev%2Fpreview') : 'localdev%2Fpreview'
268+
}?ldpServerUrl=${ldpServerUrl}&ldpServerId=${ldpServerId}`;
269+
if (componentName) {
270+
// TODO: support other namespaces
271+
url += `&specifier=c/${componentName}`;
272+
}
273+
274+
return url;
275+
}
276+
249277
/**
250278
* Generates the proper set of arguments to be used for launching a mobile app with custom launch arguments.
251279
*

yarn.lock

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2200,10 +2200,10 @@
22002200
"@lwc/style-compiler" "8.20.5"
22012201
"@lwc/template-compiler" "8.20.5"
22022202

2203-
2204-
version "13.1.3"
2205-
resolved "https://registry.yarnpkg.com/@lwc/dev-server-plugin-lex/-/dev-server-plugin-lex-13.1.3.tgz#15e7fc1521da8d6116f915becc2aac85c81fc686"
2206-
integrity sha512-m2LNWrDN7ECerNTLq4yFfDbJo0W+LQpBKv7lNE665fy22DPyRdZiQHJHGgiN9nwNhYyCaBicA5dlGrrYIpDciQ==
2203+
"@lwc/[email protected].5-alpha.3+007b30e":
2204+
version "13.1.5-alpha.3"
2205+
resolved "https://registry.yarnpkg.com/@lwc/dev-server-plugin-lex/-/dev-server-plugin-lex-13.1.5-alpha.3.tgz#b7d25a135f0f66bf4c39c5d973a7ed0d62165b87"
2206+
integrity sha512-9+SvsnahnOyflWpdHGBLht0Z14TEnV0xP0U6D/FS2WTNOMzHMEqWsIqmCBZW2TBFpd2Fa4oHTjBtIyvaxgucew==
22072207
dependencies:
22082208
magic-string "~0.30.17"
22092209

@@ -2253,34 +2253,34 @@
22532253
dependencies:
22542254
"@lwc/shared" "8.20.5"
22552255

2256-
2257-
version "13.1.3"
2258-
resolved "https://registry.yarnpkg.com/@lwc/lwc-dev-server-types/-/lwc-dev-server-types-13.1.3.tgz#5cef8b2bce0f0783cb5f69b8a7327709a07f3844"
2259-
integrity sha512-h04TfJij5t+ThbAURMt1K2PJBNpFSbSYwbrrqLrqH0s8IrucnlX2vorgDSc30f7Tqnrng9lHMhunk4RuEEsH/Q==
2256+
"@lwc/[email protected].5-alpha.3+007b30e":
2257+
version "13.1.5-alpha.3"
2258+
resolved "https://registry.yarnpkg.com/@lwc/lwc-dev-server-types/-/lwc-dev-server-types-13.1.5-alpha.3.tgz#7f606416e9a85e4ecc799924c4b0b167603c3709"
2259+
integrity sha512-bLh0CR77lX9yK/Ttl56ZKqxW13jszaUjVdN7ayidwFRRxJ7ZICr0FaOu3PdX89NFLnyKj81fesSgoXUA0/rsKQ==
22602260

2261-
"@lwc/lwc-dev-server@~13.1.2":
2262-
version "13.1.3"
2263-
resolved "https://registry.yarnpkg.com/@lwc/lwc-dev-server/-/lwc-dev-server-13.1.3.tgz#2bf57c668d6cb5cfb40953a100346f6b832f2c06"
2264-
integrity sha512-XfS+ts2GXDwzpE19pxi6MTk7j4ua/96jBeXCCGNF9Yf5UddDGHKsbyXYhEthvIlFTdhVAjb0rg2AvlChygLUlQ==
2261+
"@lwc/lwc-dev-server@~13.1.5-alpha.3+007b30e":
2262+
version "13.1.5-alpha.3"
2263+
resolved "https://registry.yarnpkg.com/@lwc/lwc-dev-server/-/lwc-dev-server-13.1.5-alpha.3.tgz#899bdf891c4e6a11d287158fd399a1fb568fd436"
2264+
integrity sha512-7HZenCHMItmhLcz5uYDee7hKv0NneQ4vxuEUDCsI7EMOLKSg7ejB95JfcWvB8OnnAo3WiZpDCdz5RdPvA5VmbQ==
22652265
dependencies:
2266-
"@lwc/lwc-dev-server-types" "13.1.3"
2267-
"@lwc/sfdc-lwc-compiler" "13.1.3"
2266+
"@lwc/lwc-dev-server-types" "13.1.5-alpha.3+007b30e"
2267+
"@lwc/sfdc-lwc-compiler" "13.1.5-alpha.3+007b30e"
22682268
chalk "~5.4.1"
22692269
chokidar "~3.6.0"
22702270
commander "~10.0.0"
22712271
fast-xml-parser "^5.2.5"
22722272
glob "^10.4.5"
22732273
ws "^8.18.2"
22742274

2275-
2276-
version "13.1.3"
2277-
resolved "https://registry.yarnpkg.com/@lwc/metadata/-/metadata-13.1.3.tgz#30858424ae13ecf2106f07bfc10100e718e4f936"
2278-
integrity sha512-odev/R+AIYOHmU9ll9zNgbZXnausqC7F/+QjSk1MrT/TNRog4g46g3YNk0QAx33L2cyoIoffIVWFazyyTWQ3fA==
2275+
"@lwc/[email protected].5-alpha.3+007b30e":
2276+
version "13.1.5-alpha.3"
2277+
resolved "https://registry.yarnpkg.com/@lwc/metadata/-/metadata-13.1.5-alpha.3.tgz#fad15b11c1798c7a55f56e8a448a4617fd1000d7"
2278+
integrity sha512-jc/pFN15CpmBOnTHzW2wvINaL+/6l6OwY3KDkorBI6th1UlN6bQFJcoWAjeIxmcbxsqn+qAgxjpOHno+QKkOWA==
22792279
dependencies:
22802280
"@babel/parser" "~7.27.5"
22812281
"@babel/traverse" "~7.27.4"
22822282
"@babel/types" "~7.27.6"
2283-
"@lwc/sfdc-compiler-utils" "13.1.3"
2283+
"@lwc/sfdc-compiler-utils" "13.1.5-alpha.3+007b30e"
22842284
postcss "~8.5.5"
22852285
postcss-selector-parser "~6.1.2"
22862286
postcss-value-parser "~4.2.0"
@@ -2302,15 +2302,15 @@
23022302
"@lwc/shared" "8.20.5"
23032303
"@rollup/pluginutils" "~5.2.0"
23042304

2305-
2306-
version "13.1.3"
2307-
resolved "https://registry.yarnpkg.com/@lwc/sfdc-compiler-utils/-/sfdc-compiler-utils-13.1.3.tgz#5e85b10e7aebd4b34e59d98551a5fd4a74533ea9"
2308-
integrity sha512-VoS4Ggbqt5byK8VKI4KSpmh9rhoQH58vQEbfm+B7vhqL0DQR2/OvUXhr5GkATq6V3bcOfjdSmOxlPz+9gZAvZA==
2305+
"@lwc/[email protected].5-alpha.3+007b30e":
2306+
version "13.1.5-alpha.3"
2307+
resolved "https://registry.yarnpkg.com/@lwc/sfdc-compiler-utils/-/sfdc-compiler-utils-13.1.5-alpha.3.tgz#8ac056199662ce14d4b7caa9f639685c555fca36"
2308+
integrity sha512-iENBGQ2X/lc0x06hT3u2KM+LdHIbVInHKiyDveQU/C+mA5EHU2tQfs1pDlNyUH9gHqzirOtUdiwu8Xtpo45GaA==
23092309

2310-
"@lwc/[email protected].3", "@lwc/sfdc-lwc-compiler@~13.1.2":
2311-
version "13.1.3"
2312-
resolved "https://registry.yarnpkg.com/@lwc/sfdc-lwc-compiler/-/sfdc-lwc-compiler-13.1.3.tgz#9f111ada602bd594179b4d8a3adad106ca5eed4f"
2313-
integrity sha512-rzVZ/rXIyAeEcMwTPAfNvzNLMoBve0YcvGFjx8wbODQ68Bwzbtyne23HPO28SST1qnnSQ+obYX4kaCvoglQ3jA==
2310+
"@lwc/[email protected].5-alpha.3+007b30e", "@lwc/sfdc-lwc-compiler@~13.1.5-alpha.3+007b30e":
2311+
version "13.1.5-alpha.3"
2312+
resolved "https://registry.yarnpkg.com/@lwc/sfdc-lwc-compiler/-/sfdc-lwc-compiler-13.1.5-alpha.3.tgz#70a5ca267d7391b62fac28ac687fe5e67ebfd4e0"
2313+
integrity sha512-S8tmFyAoiY8CE9VpSnuJmpHhFb1UGzlTro2ryIkQMpy03nSSdlP47r2IyJgsa5WYJxU7gf3bquot5mElGlZjMA==
23142314
dependencies:
23152315
"@babel/core" "7.27.4"
23162316
"@babel/parser" "7.27.5"
@@ -2319,11 +2319,11 @@
23192319
"@babel/traverse" "7.27.4"
23202320
"@babel/types" "7.27.6"
23212321
"@komaci/esm-generator" "258.0.0"
2322-
"@lwc/dev-server-plugin-lex" "13.1.3"
2322+
"@lwc/dev-server-plugin-lex" "13.1.5-alpha.3+007b30e"
23232323
"@lwc/eslint-plugin-lwc" "3.0.0-beta.2"
23242324
"@lwc/eslint-plugin-lwc-platform" "6.0.0-beta.7"
2325-
"@lwc/metadata" "13.1.3"
2326-
"@lwc/sfdc-compiler-utils" "13.1.3"
2325+
"@lwc/metadata" "13.1.5-alpha.3+007b30e"
2326+
"@lwc/sfdc-compiler-utils" "13.1.5-alpha.3+007b30e"
23272327
"@rollup/plugin-babel" "^6.0.4"
23282328
"@rollup/plugin-replace" "^6.0.2"
23292329
"@rollup/wasm-node" "4.10.0"

0 commit comments

Comments
 (0)