@@ -28,13 +28,18 @@ export default class LightningDevSite extends SfCommand<void> {
2828 char : 'n' ,
2929 } ) ,
3030 'target-org' : Flags . requiredOrg ( ) ,
31+ 'get-latest' : Flags . boolean ( {
32+ summary : messages . getMessage ( 'flags.get-latest.summary' ) ,
33+ char : 'l' ,
34+ } ) ,
3135 } ;
3236
3337 public async run ( ) : Promise < void > {
3438 const { flags } = await this . parse ( LightningDevSite ) ;
3539
3640 try {
3741 const org = flags [ 'target-org' ] ;
42+ const getLatest = flags [ 'get-latest' ] ;
3843 let siteName = flags . name ;
3944
4045 const connection = org . getConnection ( undefined ) ;
@@ -55,26 +60,27 @@ export default class LightningDevSite extends SfCommand<void> {
5560 const selectedSite = new ExperienceSite ( org , siteName ) ;
5661 let siteZip : string | undefined ;
5762
58- if ( ! selectedSite . isSiteSetup ( ) ) {
59- this . log ( `[local-dev] initializing: ${ siteName } ` ) ;
63+ // If the site is not setup / is not based on the current release / or get-latest is requested ->
64+ // generate and download a new site bundle from the org based on latest builder metadata
65+ if ( ! selectedSite . isSiteSetup ( ) || getLatest ) {
66+ const startTime = Date . now ( ) ;
67+ this . log ( `[local-dev] Initializing: ${ siteName } ` ) ;
68+ this . spinner . start ( '[local-dev] Downloading site (this may take a few minutes)' ) ;
6069 siteZip = await selectedSite . downloadSite ( ) ;
61- } else {
62- // If local-dev is already setup, check if an updated site has been published to download
63- const updateAvailable = await selectedSite . isUpdateAvailable ( ) ;
64- if ( updateAvailable ) {
65- const shouldUpdate = await PromptUtils . promptUserToConfirmUpdate ( siteName ) ;
66- if ( shouldUpdate ) {
67- this . log ( `[local-dev] updating: ${ siteName } ` ) ;
68- siteZip = await selectedSite . downloadSite ( ) ;
69- // delete oldSitePath recursive
70- const oldSitePath = selectedSite . getExtractDirectory ( ) ;
71- if ( fs . existsSync ( oldSitePath ) ) {
72- fs . rmdirSync ( oldSitePath , { recursive : true } ) ;
73- }
74- }
70+
71+ // delete oldSitePath recursive
72+ const oldSitePath = selectedSite . getExtractDirectory ( ) ;
73+ if ( fs . existsSync ( oldSitePath ) ) {
74+ fs . rmSync ( oldSitePath , { recursive : true } ) ;
7575 }
76+ const endTime = Date . now ( ) ;
77+ const duration = ( endTime - startTime ) / 1000 ; // Convert to seconds
78+ this . spinner . stop ( 'done.' ) ;
79+ this . log ( `[local-dev] Site setup completed in ${ duration . toFixed ( 2 ) } seconds.` ) ;
7680 }
7781
82+ this . log ( `[local-dev] launching browser preview for: ${ siteName } ` ) ;
83+
7884 // Establish a valid access token for this site
7985 const authToken = await selectedSite . setupAuth ( ) ;
8086
@@ -94,10 +100,13 @@ export default class LightningDevSite extends SfCommand<void> {
94100 // Environment variable used to setup the site rather than setup & start server
95101 if ( process . env . SETUP_ONLY === 'true' ) {
96102 await setupDev ( startupParams ) ;
103+ this . log ( '[local-dev] setup complete!' ) ;
97104 } else {
98105 await expDev ( startupParams ) ;
106+ this . log ( '[local-dev] watching for file changes... (CTRL-C to stop)' ) ;
99107 }
100108 } catch ( e ) {
109+ this . spinner . stop ( 'failed.' ) ;
101110 this . log ( 'Local Development setup failed' , e ) ;
102111 }
103112 }
0 commit comments