From 73ad94a8f24fe7f5c7e4b08a825c99ac89c8c8ed Mon Sep 17 00:00:00 2001 From: Charles Lavery Date: Thu, 4 Jun 2026 12:27:54 -0400 Subject: [PATCH] feat(vs-extension): remove Page Designer Assistant webview --- .changeset/remove-page-designer-assistant.md | 5 + docs/vscode-extension/configuration.md | 2 +- packages/b2c-vs-extension/.c8rc.json | 4 +- packages/b2c-vs-extension/README.md | 3 +- packages/b2c-vs-extension/package.json | 5 - packages/b2c-vs-extension/src/extension.ts | 140 +---------- packages/b2c-vs-extension/src/telemetry.ts | 1 - .../src/template/_app.pageId.tsx | 66 ------ .../src/test/integration/activation.test.ts | 4 +- packages/b2c-vs-extension/src/webview.html | 218 ------------------ 10 files changed, 11 insertions(+), 437 deletions(-) create mode 100644 .changeset/remove-page-designer-assistant.md delete mode 100644 packages/b2c-vs-extension/src/template/_app.pageId.tsx delete mode 100644 packages/b2c-vs-extension/src/webview.html diff --git a/.changeset/remove-page-designer-assistant.md b/.changeset/remove-page-designer-assistant.md new file mode 100644 index 000000000..721e1706c --- /dev/null +++ b/.changeset/remove-page-designer-assistant.md @@ -0,0 +1,5 @@ +--- +'b2c-vs-extension': minor +--- + +Remove the Page Designer Assistant webview and its "Open Page Designer Assistant UI" command from the VS Code extension. diff --git a/docs/vscode-extension/configuration.md b/docs/vscode-extension/configuration.md index 140f24293..ab1a3fa26 100644 --- a/docs/vscode-extension/configuration.md +++ b/docs/vscode-extension/configuration.md @@ -30,7 +30,7 @@ A summary by feature: | **B2C Script Debugger** | WebDAV (for source-mapping). | | **Log Tailing** | WebDAV (logs are read from `Logs/`). | | **CAP install** | WebDAV; some apps additionally require OAuth client credentials. | -| **Scaffold**, **Page Designer Assistant** | None — local-only. | +| **Scaffold** | None — local-only. | ### Example `dw.json` diff --git a/packages/b2c-vs-extension/.c8rc.json b/packages/b2c-vs-extension/.c8rc.json index eef7427ba..c359085ae 100644 --- a/packages/b2c-vs-extension/.c8rc.json +++ b/packages/b2c-vs-extension/.c8rc.json @@ -5,9 +5,7 @@ "src/test/**", "dist/**", "scripts/**", - "**/*.d.ts", - "src/template/**", - "src/webview.html" + "**/*.d.ts" ], "reporter": ["text", "text-summary", "lcov"], "report-dir": "coverage", diff --git a/packages/b2c-vs-extension/README.md b/packages/b2c-vs-extension/README.md index e3080df22..027276624 100644 --- a/packages/b2c-vs-extension/README.md +++ b/packages/b2c-vs-extension/README.md @@ -1,6 +1,6 @@ # B2C DX - VS Code Extension -VS Code extension for B2C Commerce developer experience: sandbox realm explorer, cartridge code sync, WebDAV browser, content libraries, SCAPI API browser, B2C script debugger, scaffold/CAP install, log tailing, and a Page Designer Assistant. +VS Code extension for B2C Commerce developer experience: sandbox realm explorer, cartridge code sync, WebDAV browser, content libraries, SCAPI API browser, B2C script debugger, scaffold/CAP install, and log tailing. **User-facing documentation:** [B2C DX VS Code Extension](https://salesforcecommercecloud.github.io/b2c-developer-tooling/vscode-extension/) — overview, installation, configuration, and feature tour. @@ -16,7 +16,6 @@ This README is the source of truth for repo-level developer info (build/watch, l - B2C Script Debugger (debug type `b2c-script`). - Scaffold (`New from Scaffold...`) and CAP install. - Log tailing into a dedicated output channel. -- Page Designer Assistant webview (Storefront Next page generation). See the [docs site](https://salesforcecommercecloud.github.io/b2c-developer-tooling/vscode-extension/features) for the full tour. diff --git a/packages/b2c-vs-extension/package.json b/packages/b2c-vs-extension/package.json index 36a86825f..2a6d0f1dc 100644 --- a/packages/b2c-vs-extension/package.json +++ b/packages/b2c-vs-extension/package.json @@ -240,11 +240,6 @@ } ], "commands": [ - { - "command": "b2c-dx.openUI", - "title": "Open Page Designer Assistant UI", - "category": "B2C DX - Page Designer Assistant" - }, { "command": "b2c-dx.promptAgent", "title": "Prompt Agent", diff --git a/packages/b2c-vs-extension/src/extension.ts b/packages/b2c-vs-extension/src/extension.ts index ffce78117..fe0647d97 100644 --- a/packages/b2c-vs-extension/src/extension.ts +++ b/packages/b2c-vs-extension/src/extension.ts @@ -6,7 +6,6 @@ import {DwJsonSource} from '@salesforce/b2c-tooling-sdk/config'; import {configureLogger} from '@salesforce/b2c-tooling-sdk/logging'; -import * as fs from 'fs'; import * as path from 'path'; import * as vscode from 'vscode'; import {B2CExtensionConfig} from './config-provider.js'; @@ -24,70 +23,7 @@ import {registerDebugger} from './debugger/index.js'; import {registerCodeSync} from './code-sync/index.js'; import {registerScriptTypes} from './script-types/index.js'; import {registerWebDavTree} from './webdav-tree/index.js'; -import {disposeTelemetry, initTelemetry, markFeatureUsed, sendEvent, sendException} from './telemetry.js'; - -function getWebviewContent(context: vscode.ExtensionContext): string { - const htmlPath = path.join(context.extensionPath, 'src', 'webview.html'); - return fs.readFileSync(htmlPath, 'utf-8'); -} - -/** PascalCase for use in template content (class names, types, etc.). e.g. "first page" → "FirstPage" */ -function pageNameToPageId(pageName: string): string { - return pageName - .trim() - .split(/\s+/) - .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) - .join(''); -} - -/** camelCase for filename. e.g. "first page" → "firstPage" */ -function pageNameToFileNameId(pageName: string): string { - const pascal = pageNameToPageId(pageName || 'Page'); - return pascal.charAt(0).toLowerCase() + pascal.slice(1); -} - -type RegionForm = {id: string; name: string; description: string; maxComponents: number}; - -type WebviewMessage = - | {type: 'openExternal'} - | { - type: 'submitForm'; - pageType: {name?: string; description?: string; supportedAspectTypes?: string[]}; - regions: RegionForm[]; - }; - -function renderTemplate( - template: string, - pageName: string, - pageDescription: string, - supportedAspectTypes: string[], - regions: RegionForm[], -): string { - const pageId = pageNameToPageId(pageName || 'Page'); - const quoted = (s: string) => `'${String(s).replace(/'/g, "\\'")}'`; - const aspectsStr = `[${supportedAspectTypes.map((a) => quoted(a)).join(', ')}]`; - const regionsBlock = regions - .map( - (r) => - `{ - id: ${quoted(r.id)}, - name: ${quoted(r.name)}, - description: ${quoted(r.description)}, - maxComponents: ${r.maxComponents}, - }`, - ) - .join(',\n '); - const firstRegionId = regions[0]?.id ?? ''; - - return template - .replace(/\$\{pageName\}/g, quoted(pageName || '')) - .replace(/\$\{pageDescription\}/g, quoted(pageDescription || '')) - .replace(/\$\{supportedAspectTypes\}/g, aspectsStr) - .replace('__REGIONS__', regionsBlock) - .replace(/\$\{pageId\}/g, pageId) - .replace(/\$\{pageName\}Data/g, `${pageId}Data`) - .replace(/\$\{regions\[0\]\.id\}/g, firstRegionId); -} +import {disposeTelemetry, initTelemetry, sendEvent, sendException} from './telemetry.js'; function applyLogLevel(log: vscode.OutputChannel): void { const config = vscode.workspace.getConfiguration('b2c-dx'); @@ -140,7 +76,6 @@ export async function activate(context: vscode.ExtensionContext) { vscode.window.showErrorMessage(`B2C DX activation error: ${message}`); }; context.subscriptions.push( - vscode.commands.registerCommand('b2c-dx.openUI', showActivationError), vscode.commands.registerCommand('b2c-dx.promptAgent', showActivationError), vscode.commands.registerCommand('b2c-dx.listWebDav', showActivationError), ); @@ -169,78 +104,6 @@ async function activateInner(context: vscode.ExtensionContext, log: vscode.Outpu const cartridgeService = new CartridgeService(configProvider); context.subscriptions.push(cartridgeService); - const disposable = vscode.commands.registerCommand('b2c-dx.openUI', () => { - markFeatureUsed('pageDesigner'); - vscode.window.showInformationMessage('B2C DX: Opening Page Designer Assistant.'); - - const panel = vscode.window.createWebviewPanel( - 'b2c-dx-page-designer-ui', - 'My Extension UI', - vscode.ViewColumn.One, - {enableScripts: true}, - ); - - panel.webview.html = getWebviewContent(context); - - panel.webview.onDidReceiveMessage(async (msg: WebviewMessage) => { - if (msg.type === 'openExternal') { - await vscode.env.openExternal(vscode.Uri.parse('https://example.com')); - } - if (msg.type === 'submitForm') { - try { - const {pageType, regions} = msg; - const pageName = pageType?.name ?? ''; - const templatePath = path.join(context.extensionPath, 'src', 'template', '_app.pageId.tsx'); - const template = fs.readFileSync(templatePath, 'utf-8'); - const content = renderTemplate( - template, - pageName, - pageType?.description ?? '', - pageType?.supportedAspectTypes ?? [], - regions ?? [], - ); - - const fileNameId = pageNameToFileNameId(pageName); - const fileName = `_app.${fileNameId}.tsx`; - - let targetUri: vscode.Uri; - if (vscode.workspace.workspaceFolders?.length) { - const rootUri = vscode.Uri.file(configProvider.getWorkingDirectory()); - const routesUri = vscode.Uri.joinPath(rootUri, 'routes'); - const routesPath = routesUri.fsPath; - const hasRoutesFolder = fs.existsSync(routesPath) && fs.statSync(routesPath).isDirectory(); - targetUri = hasRoutesFolder - ? vscode.Uri.joinPath(routesUri, fileName) - : vscode.Uri.joinPath(rootUri, fileName); - } else { - const picked = await vscode.window.showSaveDialog({ - defaultUri: vscode.Uri.joinPath(context.globalStorageUri, fileName), - saveLabel: 'Create file', - }); - if (!picked) { - return; - } - targetUri = picked; - } - - vscode.window.showInformationMessage(`Writing file to: ${targetUri.fsPath}`); - - await vscode.workspace.fs.writeFile(targetUri, Buffer.from(content, 'utf-8')); - await vscode.window.showInformationMessage(`Saved to: ${targetUri.fsPath}`, 'Open'); - const doc = await vscode.workspace.openTextDocument(targetUri); - await vscode.window.showTextDocument(doc, { - viewColumn: panel.viewColumn ?? vscode.ViewColumn.One, - preview: false, - preserveFocus: false, - }); - } catch (err) { - const message = err instanceof Error ? err.message : String(err); - vscode.window.showErrorMessage(`Failed to save: ${message}`); - } - } - }); - }); - const promptAgentDisposable = vscode.commands.registerCommand('b2c-dx.promptAgent', async () => { const prompt = await vscode.window.showInputBox({ title: 'Prompt Agent', @@ -445,7 +308,6 @@ async function activateInner(context: vscode.ExtensionContext, log: vscode.Outpu }); context.subscriptions.push( - disposable, promptAgentDisposable, listWebDavDisposable, instanceStatusBar, diff --git a/packages/b2c-vs-extension/src/telemetry.ts b/packages/b2c-vs-extension/src/telemetry.ts index 28e7578d3..2509ce9e5 100644 --- a/packages/b2c-vs-extension/src/telemetry.ts +++ b/packages/b2c-vs-extension/src/telemetry.ts @@ -34,7 +34,6 @@ export type FeatureCategory = | 'debugger' | 'scaffold' | 'cap' - | 'pageDesigner' | 'logs' | 'instance'; diff --git a/packages/b2c-vs-extension/src/template/_app.pageId.tsx b/packages/b2c-vs-extension/src/template/_app.pageId.tsx deleted file mode 100644 index a1c0324ae..000000000 --- a/packages/b2c-vs-extension/src/template/_app.pageId.tsx +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2025, Salesforce, Inc. - * SPDX-License-Identifier: Apache-2 - * For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0 - */ -import { type LoaderFunctionArgs } from 'react-router'; -import { currencyContext } from '@/lib/currency'; -import { Region } from '@/components/region'; -import { PageType } from '@/lib/decorators/page-type'; -import { RegionDefinition } from '@/lib/decorators/region-definition'; -import { fetchPageWithComponentData, type PageWithComponentData } from '@/lib/util/pageLoader'; - -@PageType({ - name: ${pageName}, - description: ${pageDescription}, - supportedAspectTypes: ${supportedAspectTypes}, -}) -@RegionDefinition([ - __REGIONS__ -]) -export class ${pageId}Metadata {} - -export type ${pageId}Data = { - page: Promise; -}; - -/** - * Server-side loader function that fetches home page data. - * This function runs on the server during SSR and prepares data for the home page. - * @returns Promise that resolves to an object containing search result promise - */ -// eslint-disable-next-line react-refresh/only-export-components -export function loader(args: LoaderFunctionArgs): ${pageId}Data { - const currency = args.context.get(currencyContext) as string; - - return { - page: fetchPageWithComponentData(args, { - pageId: '${pageId}', - }), - }; -} - -/** - * Home page component that displays the home page content with granular Suspense boundaries. - * Components within the page handle their own Suspense boundaries for progressive loading. - * @returns JSX element representing the home page layout - */ -export default function ${pageId}({ loaderData }: { loaderData: ${pageId}Data }) { - return ( -
- {/* Header Banner Region - Region component handles its own Suspense internally */} -
- Loading region ${regions[0].id}
- } - errorElement={ -
Error loading region ${regions[0].id}
- } - /> -
- - ); -} \ No newline at end of file diff --git a/packages/b2c-vs-extension/src/test/integration/activation.test.ts b/packages/b2c-vs-extension/src/test/integration/activation.test.ts index 52f175908..7d495c92f 100644 --- a/packages/b2c-vs-extension/src/test/integration/activation.test.ts +++ b/packages/b2c-vs-extension/src/test/integration/activation.test.ts @@ -51,8 +51,8 @@ suite('extension activation', () => { }); // This is the workhorse check. The extension's top-level try/catch - // (extension.ts:117-136) registers only three stub commands on failure - // (openUI, promptAgent, listWebDav), so any swallowed activation error + // (extension.ts:117-136) registers only two stub commands on failure + // (promptAgent, listWebDav), so any swallowed activation error // surfaces here as a flood of missing commands. test('every contributed command is registered', async () => { const registered = new Set(await vscode.commands.getCommands(true)); diff --git a/packages/b2c-vs-extension/src/webview.html b/packages/b2c-vs-extension/src/webview.html deleted file mode 100644 index b3a5ec617..000000000 --- a/packages/b2c-vs-extension/src/webview.html +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - -

Create a new page with page designer annotations

-
-
-

PageType

-
- - -
-
- - -
-
- - -
-
- -
-

Regions

-
- -
- -
- -
-
- - - -