@@ -10,6 +10,10 @@ import {configureLogger} from '@salesforce/b2c-tooling-sdk/logging';
1010import { findAndDeployCartridges , getActiveCodeVersion } from '@salesforce/b2c-tooling-sdk/operations/code' ;
1111import { getPathKeys , type OpenApiSchemaInput } from '@salesforce/b2c-tooling-sdk/schemas' ;
1212import { randomUUID } from 'node:crypto' ;
13+ import { exec } from 'child_process' ;
14+ import { promisify } from 'util' ;
15+
16+ const execAsync = promisify ( exec ) ;
1317
1418/** Standard B2C Commerce WebDAV root directories. */
1519const WEBDAV_ROOTS : Record < string , string > = {
@@ -27,6 +31,27 @@ import * as fs from 'fs';
2731import * as path from 'path' ;
2832import * as vscode from 'vscode' ;
2933
34+ /**
35+ * Recursively finds all files under dir whose names end with .json (metadata files).
36+ * Returns paths relative to dir.
37+ */
38+ function findJsonFilesUnder ( dir : string , baseDir : string = dir ) : string [ ] {
39+ const results : string [ ] = [ ] ;
40+ if ( ! fs . existsSync ( dir ) || ! fs . statSync ( dir ) . isDirectory ( ) ) {
41+ return results ;
42+ }
43+ for ( const name of fs . readdirSync ( dir ) ) {
44+ const full = path . join ( dir , name ) ;
45+ const rel = path . relative ( baseDir , full ) ;
46+ if ( fs . statSync ( full ) . isDirectory ( ) ) {
47+ results . push ( ...findJsonFilesUnder ( full , baseDir ) ) ;
48+ } else if ( name . endsWith ( '.json' ) ) {
49+ results . push ( rel ) ;
50+ }
51+ }
52+ return results . sort ( ) ;
53+ }
54+
3055function getWebviewContent ( context : vscode . ExtensionContext ) : string {
3156 const htmlPath = path . join ( context . extensionPath , 'src' , 'webview.html' ) ;
3257 return fs . readFileSync ( htmlPath , 'utf-8' ) ;
@@ -1291,15 +1316,47 @@ function activateInner(context: vscode.ExtensionContext, log: vscode.OutputChann
12911316 "B2C DX: This command must be run under a Storefront Next storefront template. No 'cartridges' directory found." ;
12921317 log . appendLine ( `[Storefront Next Cartridge] ${ message } ` ) ;
12931318 vscode . window . showErrorMessage ( message ) ;
1319+ panel . webview . postMessage ( {
1320+ type : 'createCartridgeResult' ,
1321+ generatedFiles : [ ] ,
1322+ error : message ,
1323+ } ) ;
12941324 return ;
12951325 }
12961326 const cmd = 'pnpm sfnext generate-cartridge -d .' ;
1297- const term = vscode . window . createTerminal ( {
1298- name : 'B2C Create Cartridge' ,
1299- cwd : projectDirectory ,
1300- } ) ;
1301- term . show ( ) ;
1302- term . sendText ( cmd ) ;
1327+ log . appendLine ( `[Storefront Next Cartridge] Running: ${ cmd } ` ) ;
1328+ panel . webview . postMessage ( { type : 'createCartridgeResult' , generatedFiles : [ ] , running : true } ) ;
1329+ try {
1330+ await execAsync ( cmd , { cwd : projectDirectory , maxBuffer : 4 * 1024 * 1024 } ) ;
1331+ const generatedFiles = findJsonFilesUnder ( cartridgesDir ) . map ( ( rel ) =>
1332+ path . join ( 'cartridges' , rel ) . split ( path . sep ) . join ( '/' ) ,
1333+ ) ;
1334+ log . appendLine (
1335+ `[Storefront Next Cartridge] Generated ${ generatedFiles . length } metadata file(s):\n${ generatedFiles . join ( '\n' ) } ` ,
1336+ ) ;
1337+ panel . webview . postMessage ( {
1338+ type : 'createCartridgeResult' ,
1339+ generatedFiles,
1340+ error : undefined ,
1341+ running : false ,
1342+ } ) ;
1343+ vscode . window . showInformationMessage (
1344+ `B2C DX: Page Designer metadata generated. ${ generatedFiles . length } file(s) under cartridges/.` ,
1345+ ) ;
1346+ } catch ( err : unknown ) {
1347+ const message = err instanceof Error ? err . message : String ( err ) ;
1348+ const stderr =
1349+ err && typeof err === 'object' && 'stderr' in err ? String ( ( err as { stderr ?: string } ) . stderr ) : '' ;
1350+ const errorText = stderr || message ;
1351+ log . appendLine ( `[Storefront Next Cartridge] Generate failed: ${ errorText } ` ) ;
1352+ panel . webview . postMessage ( {
1353+ type : 'createCartridgeResult' ,
1354+ generatedFiles : [ ] ,
1355+ error : errorText ,
1356+ running : false ,
1357+ } ) ;
1358+ vscode . window . showErrorMessage ( `B2C DX: Generate Page Designer metadata failed. ${ message } ` ) ;
1359+ }
13031360 } else if ( msg . type === 'deployCartridge' ) {
13041361 const cartridgesDir = path . join ( projectDirectory , 'cartridges' ) ;
13051362 if ( ! fs . existsSync ( cartridgesDir ) || ! fs . statSync ( cartridgesDir ) . isDirectory ( ) ) {
@@ -1347,17 +1404,32 @@ function activateInner(context: vscode.ExtensionContext, log: vscode.OutputChann
13471404 log . appendLine (
13481405 `[Storefront Next Cartridge] Deploying cartridges to ${ instance . config . hostname } (${ instance . config . codeVersion } )...` ,
13491406 ) ;
1407+ panel . webview . postMessage ( { type : 'deployResult' , running : true } ) ;
13501408 const result = await findAndDeployCartridges ( instance , cartridgesDir , { } ) ;
1351- console . log ( result ) ;
13521409 log . appendLine (
13531410 `[Storefront Next Cartridge] Deployed ${ result . cartridges . length } cartridge(s) to ${ result . codeVersion } .` ,
13541411 ) ;
1412+ panel . webview . postMessage ( {
1413+ type : 'deployResult' ,
1414+ success : true ,
1415+ running : false ,
1416+ hostname : instance . config . hostname ,
1417+ codeVersion : result . codeVersion ,
1418+ reloaded : result . reloaded ,
1419+ cartridges : result . cartridges . map ( ( c ) => c . name ) ,
1420+ } ) ;
13551421 vscode . window . showInformationMessage (
1356- `B2C DX: Deployed ${ result . cartridges . length } cartridge(s) to ${ result . codeVersion } . ${ result . cartridges . join ( ', ' ) } ` ,
1422+ `B2C DX: Deployed ${ result . cartridges . length } cartridge(s) to ${ result . codeVersion } . ${ result . cartridges . map ( ( c ) => c . name ) . join ( ', ' ) } ` ,
13571423 ) ;
13581424 } catch ( err ) {
13591425 const message = err instanceof Error ? err . message : String ( err ) ;
13601426 log . appendLine ( `[Storefront Next Cartridge] Deploy failed: ${ message } ` ) ;
1427+ panel . webview . postMessage ( {
1428+ type : 'deployResult' ,
1429+ success : false ,
1430+ running : false ,
1431+ error : message ,
1432+ } ) ;
13611433 vscode . window . showErrorMessage ( `B2C DX: Deploy failed. ${ message } ` ) ;
13621434 }
13631435 }
0 commit comments