diff --git a/packages/plugin-ai-generation-web/src/ui/common/renderStyleTransferProperty.ts b/packages/plugin-ai-generation-web/src/ui/common/renderStyleTransferProperty.ts index 0766efce..690200a8 100644 --- a/packages/plugin-ai-generation-web/src/ui/common/renderStyleTransferProperty.ts +++ b/packages/plugin-ai-generation-web/src/ui/common/renderStyleTransferProperty.ts @@ -326,6 +326,9 @@ function getDefaultStyles(options: { includeNone?: boolean; cesdk?: CreativeEditorSDK; }): Style[] { + // Normalize: strip trailing slashes to prevent double slashes in URL concatenation + const baseURL = options.baseURL.replace(/\/+$/, ''); + return STYLES.map((style) => { if (style.id === 'none') { if (!options.includeNone) { @@ -339,7 +342,7 @@ function getDefaultStyles(options: { style.labelKey ), prompt: style.prompt, - thumbUri: `${options.baseURL}/thumbnails/None.svg` + thumbUri: `${baseURL}/thumbnails/None.svg` }; } return { @@ -350,7 +353,7 @@ function getDefaultStyles(options: { style.labelKey ), prompt: style.prompt, - thumbUri: `${options.baseURL}/thumbnails/${style.id}.jpeg` + thumbUri: `${baseURL}/thumbnails/${style.id}.jpeg` }; }).filter(isDefined); } diff --git a/packages/plugin-ai-image-generation-web/src/open-ai/GptImage1.styles.ts b/packages/plugin-ai-image-generation-web/src/open-ai/GptImage1.styles.ts index 4c07e92b..59135e7a 100644 --- a/packages/plugin-ai-image-generation-web/src/open-ai/GptImage1.styles.ts +++ b/packages/plugin-ai-image-generation-web/src/open-ai/GptImage1.styles.ts @@ -93,6 +93,9 @@ export const createStyleAssetSource = ( includeNone?: boolean; } ) => { + // Normalize: strip trailing slashes to prevent double slashes in URL concatenation + const baseURL = options.baseURL.replace(/\/+$/, ''); + const styleValues = STYLES.map((style) => { if (style.id === 'none') { if (!options.includeNone) { @@ -101,13 +104,13 @@ export const createStyleAssetSource = ( return { id: style.id, label: style.label, - thumbUri: `${options.baseURL}/thumbnails/None.svg` + thumbUri: `${baseURL}/thumbnails/None.svg` }; } return { id: style.id, label: style.label, - thumbUri: `${options.baseURL}/thumbnails/${style.id}.jpeg` + thumbUri: `${baseURL}/thumbnails/${style.id}.jpeg` }; }).filter(isDefined); diff --git a/packages/plugin-ai-image-generation-web/src/open-ai/quickActions/ChangeStyleLibrary.ts b/packages/plugin-ai-image-generation-web/src/open-ai/quickActions/ChangeStyleLibrary.ts index 4fae09fa..ee995516 100644 --- a/packages/plugin-ai-image-generation-web/src/open-ai/quickActions/ChangeStyleLibrary.ts +++ b/packages/plugin-ai-image-generation-web/src/open-ai/quickActions/ChangeStyleLibrary.ts @@ -127,6 +127,9 @@ const createStyleAssetSource = ( includeNone?: boolean; } ) => { + // Normalize: strip trailing slashes to prevent double slashes in URL concatenation + const baseURL = options.baseURL.replace(/\/+$/, ''); + const styleValues = STYLES.map((style) => { if (style.id === 'none') { if (!options.includeNone) { @@ -135,13 +138,13 @@ const createStyleAssetSource = ( return { id: style.id, label: style.label, - thumbUri: `${options.baseURL}/thumbnails/None.svg` + thumbUri: `${baseURL}/thumbnails/None.svg` }; } return { id: style.id, label: style.label, - thumbUri: `${options.baseURL}/thumbnails/${style.id}.jpeg` + thumbUri: `${baseURL}/thumbnails/${style.id}.jpeg` }; }).filter(isDefined); diff --git a/packages/plugin-cutout-library-web/src/plugin.ts b/packages/plugin-cutout-library-web/src/plugin.ts index e04d55d9..3bc8fb48 100644 --- a/packages/plugin-cutout-library-web/src/plugin.ts +++ b/packages/plugin-cutout-library-web/src/plugin.ts @@ -56,7 +56,9 @@ function addCutoutAssetLibraryEntry( cesdk: CreativeEditorSDK, config: Partial = DEFAULT_PLUGIN_CONFIGURATION ) { - const { assetBaseUri } = getPluginConfiguration(config); + const { assetBaseUri: rawAssetBaseUri } = getPluginConfiguration(config); + // Normalize: strip trailing slashes to prevent double slashes in URL concatenation + const assetBaseUri = rawAssetBaseUri.replace(/\/+$/, ''); cesdk.ui.addAssetLibraryEntry({ id: ENTRY_ID, sourceIds: [ASSET_SOURCE_ID], @@ -72,13 +74,15 @@ function addCutoutAssetLibraryEntry( async function addCutoutAssetSource( cesdk: CreativeEditorSDK, { - assetBaseUri, + assetBaseUri: rawAssetBaseUri, createCutoutFromBlocks }: { assetBaseUri: string; createCutoutFromBlocks: CreateCutoutFromBlocks; } ) { + // Normalize: strip trailing slashes to prevent double slashes in URL concatenation + const assetBaseUri = rawAssetBaseUri.replace(/\/+$/, ''); const contentJSON = await fetch( `${assetBaseUri}/${ASSET_SOURCE_ID}/content.json` ).then((res) => res.json());