55 * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
66 */
77
8- import { existsSync , lstatSync , readFileSync } from 'node:fs' ;
9- import path from 'node:path' ;
108import process from 'node:process' ;
11- import { LWCServer , LogLevel , ServerConfig , startLwcDevServer , Workspace } from '@lwc/lwc-dev-server' ;
12- import { Lifecycle , Logger } from '@salesforce/core' ;
9+ import { LWCServer , ServerConfig , startLwcDevServer , Workspace } from '@lwc/lwc-dev-server' ;
10+ import { Lifecycle , Logger , SfProject } from '@salesforce/core' ;
1311import { SSLCertificateData } from '@salesforce/lwc-dev-mobile-core' ;
12+ import { glob } from 'glob' ;
1413import {
1514 ConfigUtils ,
1615 LOCAL_DEV_SERVER_DEFAULT_HTTP_PORT ,
1716 LOCAL_DEV_SERVER_DEFAULT_WORKSPACE ,
1817} from '../shared/configUtils.js' ;
1918
20- /**
21- * Map sf cli log level to lwc dev server log level
22- * https://github.com/salesforcecli/cli/wiki/Code-Your-Plugin#logging-levels
23- *
24- * @param cliLogLevel
25- * @returns number
26- */
27- function mapLogLevel ( cliLogLevel : number ) : number {
28- switch ( cliLogLevel ) {
29- case 10 :
30- return LogLevel . verbose ;
31- case 20 :
32- return LogLevel . debug ;
33- case 30 :
34- return LogLevel . info ;
35- case 40 :
36- return LogLevel . warn ;
37- case 50 :
38- return LogLevel . error ;
39- case 60 :
40- return LogLevel . silent ;
41- default :
42- return LogLevel . error ;
43- }
44- }
45-
4619async function createLWCServerConfig (
47- logger : Logger ,
4820 rootDir : string ,
4921 token : string ,
5022 clientType : string ,
5123 serverPorts ?: { httpPort : number ; httpsPort : number } ,
5224 certData ?: SSLCertificateData ,
5325 workspace ?: Workspace
5426) : Promise < ServerConfig > {
55- const sfdxConfig = path . resolve ( rootDir , 'sfdx-project.json' ) ;
27+ const project = await SfProject . resolve ( ) ;
28+ const packageDirs = project . getPackageDirectories ( ) ;
29+ const projectJson = await project . resolveProjectConfig ( ) ;
30+ const { namespace } = projectJson ;
5631
57- if ( ! existsSync ( sfdxConfig ) || ! lstatSync ( sfdxConfig ) . isFile ( ) ) {
58- throw new Error ( `sfdx-project.json not found in ${ rootDir } ` ) ;
59- }
60-
61- const sfdxConfigJson = readFileSync ( sfdxConfig , 'utf-8' ) ;
62- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
63- const { packageDirectories } = JSON . parse ( sfdxConfigJson ) ;
64- const namespacePaths : string [ ] = [ ] ;
65-
66- for ( const dir of packageDirectories ) {
67- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
68- if ( dir . path ) {
69- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument
70- const resolvedDir = path . resolve ( rootDir , dir . path , 'main' , 'default' ) ;
71- if ( existsSync ( resolvedDir ) && lstatSync ( resolvedDir ) . isDirectory ( ) ) {
72- logger . debug ( `Adding ${ resolvedDir } to namespace paths` ) ;
73- namespacePaths . push ( resolvedDir ) ;
74- } else {
75- logger . warn ( `Skipping ${ resolvedDir } because it does not exist or is not a directory` ) ;
76- }
77- }
78- }
32+ // e.g. lwc folders in force-app/main/default/lwc, package-dir/lwc
33+ const namespacePaths = ( await Promise . all ( packageDirs . map ( ( dir ) => glob ( `${ dir . fullPath } /**/lwc` ) ) ) ) . flat ( ) ;
7934
8035 const ports = serverPorts ??
8136 ( await ConfigUtils . getLocalDevServerPorts ( ) ) ?? {
@@ -91,9 +46,9 @@ async function createLWCServerConfig(
9146 // use custom workspace if any is provided, or fetch from config file (if any), otherwise use the default workspace
9247 workspace : workspace ?? ( await ConfigUtils . getLocalDevServerWorkspace ( ) ) ?? LOCAL_DEV_SERVER_DEFAULT_WORKSPACE ,
9348 identityToken : token ,
94- logLevel : mapLogLevel ( logger . getLevel ( ) ) ,
9549 lifecycle : Lifecycle . getInstance ( ) ,
9650 clientType,
51+ namespace : typeof namespace === 'string' ? namespace : undefined ,
9752 } ;
9853
9954 if ( certData ?. pemCertificate && certData . pemPrivateKey ) {
@@ -116,10 +71,10 @@ export async function startLWCServer(
11671 certData ?: SSLCertificateData ,
11772 workspace ?: Workspace
11873) : Promise < LWCServer > {
119- const config = await createLWCServerConfig ( logger , rootDir , token , clientType , serverPorts , certData , workspace ) ;
74+ const config = await createLWCServerConfig ( rootDir , token , clientType , serverPorts , certData , workspace ) ;
12075
12176 logger . trace ( `Starting LWC Dev Server with config: ${ JSON . stringify ( config ) } ` ) ;
122- let lwcDevServer : LWCServer | null = await startLwcDevServer ( config ) ;
77+ let lwcDevServer : LWCServer | null = await startLwcDevServer ( config , logger ) ;
12378
12479 const cleanup = ( ) : void => {
12580 if ( lwcDevServer ) {
0 commit comments