From 147a585963b15d24c8034484c56d62541740f604 Mon Sep 17 00:00:00 2001 From: Charles Lavery Date: Thu, 18 Dec 2025 13:29:06 -0500 Subject: [PATCH 1/2] update env create semantics --- AGENTS.md | 37 +++- .../b2c-cli/src/commands/mrt/env/create.ts | 52 +++++- packages/b2c-cli/src/commands/ods/create.ts | 20 +- .../b2c-tooling-sdk/src/operations/mrt/env.ts | 175 ++++++++++++++++++ .../src/operations/mrt/index.ts | 11 +- 5 files changed, 270 insertions(+), 25 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 50b001de..4c8cb757 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,38 @@ +# B2C CLI -- this is a monorepo project; packages: - - ./packages/b2c-cli - the command line interface built with oclif - - ./packages/b2c-tooling-sdk - the SDK/library for B2C Commerce operations; support the CLI and can be used standalone +This is a monorepo project with the following packages: +- `./packages/b2c-cli` - the command line interface built with oclif +- `./packages/b2c-tooling-sdk` - the SDK/library for B2C Commerce operations; supports the CLI and can be used standalone + +## Common Commands + +```bash +# Install dependencies +pnpm install + +# Build all packages +pnpm run build + +# Build specific package +pnpm --filter @salesforce/b2c-cli run build +pnpm --filter @salesforce/b2c-tooling-sdk run build + +# Run tests (includes linting) +pnpm run test + +# Run tests for specific package +pnpm --filter @salesforce/b2c-cli run test +pnpm --filter @salesforce/b2c-tooling-sdk run test + +# Format code with prettier +pnpm run -r format + +# Lint only (without tests) +pnpm run -r lint + +# Run CLI in development mode +./packages/b2c-cli/bin/dev.js +``` ## Setup/Packaging diff --git a/packages/b2c-cli/src/commands/mrt/env/create.ts b/packages/b2c-cli/src/commands/mrt/env/create.ts index 46f47386..011a6bce 100644 --- a/packages/b2c-cli/src/commands/mrt/env/create.ts +++ b/packages/b2c-cli/src/commands/mrt/env/create.ts @@ -6,7 +6,7 @@ import {Args, Flags, ux} from '@oclif/core'; import cliui from 'cliui'; import {MrtCommand} from '@salesforce/b2c-tooling-sdk/cli'; -import {createEnv, type MrtEnvironment} from '@salesforce/b2c-tooling-sdk/operations/mrt'; +import {createEnv, waitForEnv, type MrtEnvironment} from '@salesforce/b2c-tooling-sdk/operations/mrt'; import {t} from '../../../i18n/index.js'; /** @@ -140,18 +140,19 @@ export default class MrtEnvCreate extends MrtCommand { static enableJsonFlag = true; static examples = [ + '<%= config.bin %> <%= command.id %> staging --project my-storefront', '<%= config.bin %> <%= command.id %> staging --project my-storefront --name "Staging Environment"', - '<%= config.bin %> <%= command.id %> production --project my-storefront --name "Production" --production', - '<%= config.bin %> <%= command.id %> feature-test -p my-storefront -n "Feature Test" --region eu-west-1', - '<%= config.bin %> <%= command.id %> staging -p my-storefront -n "Staging" --proxy api=api.example.com --proxy ocapi=ocapi.example.com', + '<%= config.bin %> <%= command.id %> production --project my-storefront --production', + '<%= config.bin %> <%= command.id %> feature-test -p my-storefront --region eu-west-1', + '<%= config.bin %> <%= command.id %> staging -p my-storefront --proxy api=api.example.com --proxy ocapi=ocapi.example.com', + '<%= config.bin %> <%= command.id %> staging -p my-storefront --wait', ]; static flags = { ...MrtCommand.baseFlags, name: Flags.string({ char: 'n', - description: 'Display name for the environment', - required: true, + description: 'Display name for the environment (defaults to slug)', }), region: Flags.string({ char: 'r', @@ -185,6 +186,11 @@ export default class MrtEnvCreate extends MrtCommand { description: 'Proxy configuration in format path=host (can be specified multiple times)', multiple: true, }), + wait: Flags.boolean({ + char: 'w', + description: 'Wait for the environment to be ready before returning', + default: false, + }), }; async run(): Promise { @@ -200,7 +206,7 @@ export default class MrtEnvCreate extends MrtCommand { } const { - name, + name: nameFlag, region, production: isProduction, hostname, @@ -209,8 +215,12 @@ export default class MrtEnvCreate extends MrtCommand { 'allow-cookies': allowCookies, 'enable-source-maps': enableSourceMaps, proxy: proxyStrings, + wait, } = this.flags; + // Default name to slug if not provided + const name = nameFlag ?? slug; + // Parse proxy configurations const proxyConfigs = proxyStrings?.map((p) => parseProxyString(p)); @@ -219,7 +229,7 @@ export default class MrtEnvCreate extends MrtCommand { ); try { - const result = await createEnv( + let result = await createEnv( { projectSlug: project, slug, @@ -237,6 +247,32 @@ export default class MrtEnvCreate extends MrtCommand { this.getMrtAuth(), ); + // Wait for environment to be ready if requested + if (wait) { + this.log(t('commands.mrt.env.create.waiting', 'Waiting for environment "{{slug}}" to be ready...', {slug})); + + const waitStartTime = Date.now(); + result = await waitForEnv( + { + projectSlug: project, + slug, + origin: this.resolvedConfig.mrtOrigin, + onPoll: (env) => { + if (!this.jsonEnabled()) { + const elapsed = Math.round((Date.now() - waitStartTime) / 1000); + this.log( + t('commands.mrt.env.create.state', '[{{elapsed}}s] State: {{state}}', { + elapsed: String(elapsed), + state: env.state ?? 'unknown', + }), + ); + } + }, + }, + this.getMrtAuth(), + ); + } + if (this.jsonEnabled()) { return result; } diff --git a/packages/b2c-cli/src/commands/ods/create.ts b/packages/b2c-cli/src/commands/ods/create.ts index 31fb3222..4cde1523 100644 --- a/packages/b2c-cli/src/commands/ods/create.ts +++ b/packages/b2c-cli/src/commands/ods/create.ts @@ -253,7 +253,6 @@ export default class OdsCreate extends OdsCommand { const startTime = Date.now(); const pollIntervalMs = pollIntervalSeconds * 1000; const timeoutMs = timeoutSeconds * 1000; - let lastState: SandboxState | undefined; this.log(t('commands.ods.create.waiting', 'Waiting for sandbox to be ready...')); @@ -285,17 +284,14 @@ export default class OdsCreate extends OdsCommand { const sandbox = result.data.data; const currentState = sandbox.state as SandboxState; - // Log state changes - if (currentState !== lastState) { - const elapsed = Math.round((Date.now() - startTime) / 1000); - this.log( - t('commands.ods.create.stateChange', '[{{elapsed}}s] State: {{state}}', { - elapsed: String(elapsed), - state: currentState || 'unknown', - }), - ); - lastState = currentState; - } + // Log current state on each poll + const elapsed = Math.round((Date.now() - startTime) / 1000); + this.log( + t('commands.ods.create.stateChange', '[{{elapsed}}s] State: {{state}}', { + elapsed: String(elapsed), + state: currentState || 'unknown', + }), + ); // Check for terminal states if (currentState && TERMINAL_STATES.has(currentState)) { diff --git a/packages/b2c-tooling-sdk/src/operations/mrt/env.ts b/packages/b2c-tooling-sdk/src/operations/mrt/env.ts index 18603dae..ed1b0228 100644 --- a/packages/b2c-tooling-sdk/src/operations/mrt/env.ts +++ b/packages/b2c-tooling-sdk/src/operations/mrt/env.ts @@ -20,6 +20,11 @@ import {getLogger} from '../../logging/logger.js'; */ export type MrtEnvironment = components['schemas']['APITargetV2Create']; +/** + * Environment state from the MRT API. + */ +export type MrtEnvironmentState = components['schemas']['StateEnum']; + type SsrRegion = components['schemas']['SsrRegionEnum']; type LogLevel = components['schemas']['LogLevelEnum']; @@ -271,3 +276,173 @@ export async function deleteEnv(options: DeleteEnvOptions, auth: AuthStrategy): logger.debug({slug}, '[MRT] Environment deleted successfully'); } + +/** + * Options for getting an MRT environment. + */ +export interface GetEnvOptions { + /** + * The project slug containing the environment. + */ + projectSlug: string; + + /** + * Environment slug/identifier to retrieve. + */ + slug: string; + + /** + * MRT API origin URL. + * @default "https://cloud.mobify.com" + */ + origin?: string; +} + +/** + * Gets an environment (target) from an MRT project. + * + * @param options - Environment retrieval options + * @param auth - Authentication strategy (ApiKeyStrategy) + * @returns The environment object from the API + * @throws Error if retrieval fails + * + * @example + * ```typescript + * import { ApiKeyStrategy } from '@salesforce/b2c-tooling-sdk/auth'; + * import { getEnv } from '@salesforce/b2c-tooling-sdk/operations/mrt'; + * + * const auth = new ApiKeyStrategy(process.env.MRT_API_KEY!, 'Authorization'); + * + * const env = await getEnv({ + * projectSlug: 'my-storefront', + * slug: 'staging' + * }, auth); + * + * console.log(`Environment state: ${env.state}`); + * ``` + */ +export async function getEnv(options: GetEnvOptions, auth: AuthStrategy): Promise { + const logger = getLogger(); + const {projectSlug, slug, origin} = options; + + logger.debug({projectSlug, slug}, '[MRT] Getting environment'); + + const client = createMrtClient({origin: origin || DEFAULT_MRT_ORIGIN}, auth); + + const {data, error} = await client.GET('/api/projects/{project_slug}/target/{target_slug}/', { + params: { + path: {project_slug: projectSlug, target_slug: slug}, + }, + }); + + if (error) { + const errorMessage = + typeof error === 'object' && error !== null && 'message' in error + ? String((error as {message: unknown}).message) + : JSON.stringify(error); + throw new Error(`Failed to get environment: ${errorMessage}`); + } + + logger.debug({slug: data.slug, state: data.state}, '[MRT] Environment retrieved'); + + return data; +} + +/** + * Terminal states for MRT environments (no longer changing). + */ +const TERMINAL_STATES: MrtEnvironmentState[] = ['ACTIVE', 'CREATE_FAILED', 'PUBLISH_FAILED']; + +/** + * Options for waiting for an MRT environment to be ready. + */ +export interface WaitForEnvOptions extends GetEnvOptions { + /** + * Polling interval in milliseconds. + * @default 10000 + */ + pollInterval?: number; + + /** + * Maximum time to wait in milliseconds. + * @default 2700000 (45 minutes) + */ + timeout?: number; + + /** + * Optional callback called on each poll with the current environment state. + */ + onPoll?: (env: MrtEnvironment) => void; +} + +/** + * Waits for an environment to reach a terminal state (ACTIVE or failed). + * + * Polls the environment status until it reaches ACTIVE, CREATE_FAILED, + * or PUBLISH_FAILED state, or until the timeout is reached. + * + * @param options - Wait options including polling interval and timeout + * @param auth - Authentication strategy (ApiKeyStrategy) + * @returns The environment in its terminal state + * @throws Error if timeout is reached or environment fails + * + * @example + * ```typescript + * import { ApiKeyStrategy } from '@salesforce/b2c-tooling-sdk/auth'; + * import { createEnv, waitForEnv } from '@salesforce/b2c-tooling-sdk/operations/mrt'; + * + * const auth = new ApiKeyStrategy(process.env.MRT_API_KEY!, 'Authorization'); + * + * // Create environment + * const env = await createEnv({ + * projectSlug: 'my-storefront', + * slug: 'staging', + * name: 'Staging' + * }, auth); + * + * // Wait for it to be ready + * const readyEnv = await waitForEnv({ + * projectSlug: 'my-storefront', + * slug: 'staging', + * timeout: 60000, // 1 minute + * onPoll: (e) => console.log(`State: ${e.state}`) + * }, auth); + * + * if (readyEnv.state === 'ACTIVE') { + * console.log('Environment is ready!'); + * } + * ``` + */ +export async function waitForEnv(options: WaitForEnvOptions, auth: AuthStrategy): Promise { + const logger = getLogger(); + const {projectSlug, slug, pollInterval = 10000, timeout = 2700000, onPoll, origin} = options; + + logger.debug({projectSlug, slug, pollInterval, timeout}, '[MRT] Waiting for environment'); + + const startTime = Date.now(); + + while (Date.now() - startTime < timeout) { + const env = await getEnv({projectSlug, slug, origin}, auth); + + if (onPoll) { + onPoll(env); + } + + if (env.state && TERMINAL_STATES.includes(env.state as MrtEnvironmentState)) { + if (env.state === 'CREATE_FAILED') { + throw new Error(`Environment creation failed`); + } + if (env.state === 'PUBLISH_FAILED') { + throw new Error(`Environment publish failed`); + } + logger.debug({slug, state: env.state}, '[MRT] Environment reached terminal state'); + return env; + } + + logger.debug({slug, state: env.state, elapsed: Date.now() - startTime}, '[MRT] Environment still in progress'); + + await new Promise((resolve) => setTimeout(resolve, pollInterval)); + } + + throw new Error(`Timeout waiting for environment "${slug}" to be ready after ${timeout}ms`); +} diff --git a/packages/b2c-tooling-sdk/src/operations/mrt/index.ts b/packages/b2c-tooling-sdk/src/operations/mrt/index.ts index 1c3b4d61..117e716e 100644 --- a/packages/b2c-tooling-sdk/src/operations/mrt/index.ts +++ b/packages/b2c-tooling-sdk/src/operations/mrt/index.ts @@ -65,5 +65,12 @@ export type { } from './env-var.js'; // Environment (target) operations -export {createEnv, deleteEnv} from './env.js'; -export type {CreateEnvOptions, DeleteEnvOptions, MrtEnvironment} from './env.js'; +export {createEnv, deleteEnv, getEnv, waitForEnv} from './env.js'; +export type { + CreateEnvOptions, + DeleteEnvOptions, + GetEnvOptions, + WaitForEnvOptions, + MrtEnvironment, + MrtEnvironmentState, +} from './env.js'; From fb628adb9b5a3a556ef791712e0ef1eb146ed131 Mon Sep 17 00:00:00 2001 From: Charles Lavery Date: Thu, 18 Dec 2025 17:20:27 -0500 Subject: [PATCH 2/2] removing demo data --- .gitignore | 1 + b2c_log_center_stream3.png | Bin 47934 -> 0 bytes dw.json.bak | 1 - easy-setup-step-by-step.sh | 39 ----------------- easy-setup.sh | 85 ------------------------------------- 5 files changed, 1 insertion(+), 125 deletions(-) delete mode 100644 b2c_log_center_stream3.png delete mode 120000 dw.json.bak delete mode 100644 easy-setup-step-by-step.sh delete mode 100755 easy-setup.sh diff --git a/.gitignore b/.gitignore index 7cda5356..12cdd3f2 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ docs/.vitepress/cache docs/api/ dw.json +dw.json* diff --git a/b2c_log_center_stream3.png b/b2c_log_center_stream3.png deleted file mode 100644 index a8fb13b8f6ff60627f91852e7e57b1326058db18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47934 zcmeFZcQD+4{6B~gtHly6dP|5dQ6hSeL`^KwgNROu-n-R_DA7w2vIx<;Xdx0Ux)rPv zLa>P5?zJgC-L``*|4RUhs7j?h$BCLyFH#KOWNQMsdV9}5cy z2L25|E`s0Gd52D5VPWf8%gbx3$jdWpIy*kGwzI&(;!JRj7rfX02pTpsnoQL@JNrgn zhCYO|%56o5dsHs$A+L?BkeWFc`{vCE`0U*5_t^!0=$V{2*CjrOprHK=^mr_+`g6W9 zlRBG6x7JaMP4nvkR`)HwL}QoP^y+0%J(Rg?;FHK>4ej5FC;%hE*taetZAqp8vk*w_-$47n)_TjrdRDp#fgCZ0; z2Vcfkt;}7xQM9!W%@O&hhQf1QQ@uZ2x-XD0`_ba^f0i+$xB7

dgkxUy_-*FmjkZ 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 F`7Z+tNrwOc diff --git a/dw.json.bak b/dw.json.bak deleted file mode 120000 index c4b894ec..00000000 --- a/dw.json.bak +++ /dev/null @@ -1 +0,0 @@ -/Users/clavery/code/b2c-commerce-industries/dw.json \ No newline at end of file diff --git a/easy-setup-step-by-step.sh b/easy-setup-step-by-step.sh deleted file mode 100644 index 17db539e..00000000 --- a/easy-setup-step-by-step.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -export SFCC_MRT_PROJECT=cli -export REALM="zzpq" -export SFCC_CLIENT_ID="a0a4deb0-5e03-477b-bfdc-e42ccfae6161" - -b2c ods create -r $REALM --wait --ttl 0 - -# create mrt env called chuck in the cli project -b2c mrt env create chuck --name chuck \ - --allow-cookies \ - --proxy api=kv7kzm78.api.commercecloud.salesforce.com \ - --proxy einstein=api.cquotient.com - -# construct redirect-uri from ssr_external_hostname above and don't use localhost:3000 -b2c slas client create \ - --channels MarketStreet \ - --tenant-id zzpq_014 \ - --short-code kv7kzm78 \ - --redirect-uri https://myproject-chuck.sfdc-8tgtt5-ecom1.exp-delivery.com/callback,http://localhost:3000/callback \ - --default-scopes - -# get clientId and COMMERCE_API_SLAS_SECRET from the output of the previous command and callback from the redirect-uri above -b2c mrt env var set -e chuck \ - PUBLIC__app__commerce__api__clientId=5810be72-3b2f-49bc-8ca1-eb88119de2fa \ - PUBLIC__app__commerce__api__organizationId=f_ecom_zzpq_014 \ - PUBLIC__app__commerce__api__siteId=RefArch \ - PUBLIC__app__commerce__api__shortCode= \ - PUBLIC__app__commerce__api__callback=https://myproject-chuck.sfdc-8tgtt5-ecom1.exp-delivery.com/callback \ - PUBLIC__app__commerce__api__privateKeyEnabled=true \ - COMMERCE_API_SLAS_SECRET=sk_kasdjlkjsalkjasd - -# import market street data from storefront-datasets repo -b2c job import --server zzpq-014.dx.commercecloud.salesforce.com ~/code/storefront-datasets/demo_data_marketstreet - -b2c code deploy -b2c mrt push -e headertest -p cli -b ~/code/SFCC-Odyssey/packages/template-retail-rsc-app/build --ssr-only='ssr.js,ssr.mjs,chunk.mjs,server/**/*' - - diff --git a/easy-setup.sh b/easy-setup.sh deleted file mode 100755 index 0a2b88c1..00000000 --- a/easy-setup.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Configuration - modify these values for your setup -ENV_SLUG="demo15" -ENV_NAME="demo15" -SITE_ID="RefArch" -TENANT_ID="zzpq_013" -ORGANIZATION_ID="f_ecom_zzsa_009" -SHORT_CODE="kv7kzm78" -BUILD_PATH="${BUILD_PATH:-$HOME/code/SFCC-Odyssey/packages/template-retail-rsc-app/build}" - -export SFCC_MRT_PROJECT="${SFCC_MRT_PROJECT:-cli}" - -echo "=== Step 1: Creating MRT environment ===" -ENV_JSON=$(b2c mrt env create "$ENV_SLUG" --name "$ENV_NAME" --json) -echo "Environment created." - -# Extract the external hostname for the callback URL -SSR_EXTERNAL_HOSTNAME=$(echo "$ENV_JSON" | jq -r '.ssr_external_hostname // empty') -if [[ -z "$SSR_EXTERNAL_HOSTNAME" ]]; then - # Fall back to hostname if external hostname not set - SSR_EXTERNAL_HOSTNAME=$(echo "$ENV_JSON" | jq -r '.hostname // empty') -fi - -if [[ -z "$SSR_EXTERNAL_HOSTNAME" ]]; then - echo "Warning: Could not determine external hostname from environment. Using localhost." - CALLBACK_URL="http://localhost:3000/callback" -else - CALLBACK_URL="https://${SSR_EXTERNAL_HOSTNAME}/callback" -fi -echo "Callback URL: $CALLBACK_URL" - -echo "" -echo "=== Step 2: Creating SLAS client ===" -SLAS_JSON=$(b2c slas client create --channels "$SITE_ID" \ - --redirect-uri "$CALLBACK_URL" \ - --default-scopes \ - --tenant-id "$TENANT_ID" \ - --json) -echo "SLAS client created." - -# Extract client ID and secret from SLAS response -CLIENT_ID=$(echo "$SLAS_JSON" | jq -r '.clientId') -CLIENT_SECRET=$(echo "$SLAS_JSON" | jq -r '.secret // empty') - -if [[ -z "$CLIENT_ID" ]]; then - echo "Error: Failed to get client ID from SLAS response" - exit 1 -fi - -echo "Client ID: $CLIENT_ID" -if [[ -n "$CLIENT_SECRET" ]]; then - echo "Client Secret: $CLIENT_SECRET (save this - it won't be shown again)" -fi - -echo "" -echo "=== Step 3: Setting environment variables ===" -b2c mrt env var set -e "$ENV_SLUG" \ - "PUBLIC__app__commerce__api__clientId=$CLIENT_ID" \ - "PUBLIC__app__commerce__api__organizationId=$ORGANIZATION_ID" \ - "PUBLIC__app__commerce__api__siteId=$SITE_ID" \ - "PUBLIC__app__commerce__api__shortCode=$SHORT_CODE" \ - "PUBLIC__app__commerce__api__proxy=/mobify/proxy/api" \ - "PUBLIC__app__commerce__api__callback=$CALLBACK_URL" \ - "PUBLIC__app__commerce__api__privateKeyEnabled=true" \ - ${CLIENT_SECRET:+"COMMERCE_API_SLAS_SECRET=$CLIENT_SECRET"} - -echo "" -echo "=== Step 4: Deploying code ===" -b2c code deploy - -echo "" -echo "=== Step 5: Importing job data ===" -b2c job import data/urls - -echo "" -echo "=== Step 6: Pushing to MRT ===" -b2c mrt push -e "$ENV_SLUG" -b "$BUILD_PATH" - -echo "" -echo "=== Setup Complete ===" -echo "Environment: $ENV_SLUG" -echo "Client ID: $CLIENT_ID" -echo "URL: https://${SSR_EXTERNAL_HOSTNAME:-localhost:3000}"