-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathindex.ts
More file actions
105 lines (93 loc) · 3.57 KB
/
Copy pathindex.ts
File metadata and controls
105 lines (93 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
* Copyright 2025, Salesforce, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import process from 'node:process';
import { LWCServer, ServerConfig, startLwcDevServer, Workspace } from '@lwc/lwc-dev-server';
import { Lifecycle, Logger, SfProject } from '@salesforce/core';
import { SSLCertificateData } from '@salesforce/lwc-dev-mobile-core';
import { glob } from 'glob';
import {
ConfigUtils,
LOCAL_DEV_SERVER_DEFAULT_HTTP_PORT,
LOCAL_DEV_SERVER_DEFAULT_WORKSPACE,
} from '../shared/configUtils.js';
async function createLWCServerConfig(
rootDir: string,
token: string,
clientType: string,
serverPorts?: { httpPort: number; httpsPort: number },
certData?: SSLCertificateData,
workspace?: Workspace
): Promise<ServerConfig> {
const project = await SfProject.resolve();
const packageDirs = project.getPackageDirectories();
const projectJson = await project.resolveProjectConfig();
const { namespace } = projectJson;
// e.g. lwc folders in force-app/main/default/lwc, package-dir/lwc
const namespacePaths = (
await Promise.all(packageDirs.map((dir) => glob(`${dir.fullPath}/**/lwc`, { absolute: true })))
).flat();
const ports = serverPorts ??
(await ConfigUtils.getLocalDevServerPorts()) ?? {
httpPort: LOCAL_DEV_SERVER_DEFAULT_HTTP_PORT,
httpsPort: LOCAL_DEV_SERVER_DEFAULT_HTTP_PORT + 1,
};
const serverConfig: ServerConfig = {
rootDir,
// use custom port if any is provided, or fetch from config file (if any), otherwise use the default port
port: ports.httpPort,
paths: namespacePaths,
// use custom workspace if any is provided, or fetch from config file (if any), otherwise use the default workspace
workspace: workspace ?? (await ConfigUtils.getLocalDevServerWorkspace()) ?? LOCAL_DEV_SERVER_DEFAULT_WORKSPACE,
identityToken: token,
lifecycle: Lifecycle.getInstance(),
clientType,
namespace: typeof namespace === 'string' && namespace.trim().length > 0 ? namespace.trim() : undefined,
};
if (certData?.pemCertificate && certData.pemPrivateKey) {
serverConfig.https = {
cert: certData.pemCertificate,
key: certData.pemPrivateKey,
port: ports.httpsPort,
};
}
return serverConfig;
}
export async function startLWCServer(
logger: Logger,
rootDir: string,
token: string,
clientType: string,
serverPorts?: { httpPort: number; httpsPort: number },
certData?: SSLCertificateData,
workspace?: Workspace
): Promise<LWCServer> {
const config = await createLWCServerConfig(rootDir, token, clientType, serverPorts, certData, workspace);
logger.trace(`Starting LWC Dev Server with config: ${JSON.stringify(config)}`);
let lwcDevServer: LWCServer | null = await startLwcDevServer(config, logger);
const cleanup = (): void => {
if (lwcDevServer) {
logger.trace('Stopping LWC Dev Server');
lwcDevServer.stopServer();
lwcDevServer = null;
}
};
[
'exit', // normal exit flow
'SIGINT', // when a user presses ctrl+c
'SIGTERM', // when a user kills the process
].forEach((signal) => process.on(signal, cleanup));
return lwcDevServer;
}