From 8791cd8e8bcb4b3d51f7e593a85daac20e1030b3 Mon Sep 17 00:00:00 2001 From: Mitch Lillie Date: Fri, 8 May 2026 14:42:56 -0700 Subject: [PATCH] fix(dev): Register static assets at target path for relative src paths Static assets were registered at target/identifier/file (e.g., target/assets/file), but relative paths like src='./cat.png' resolve to target/file. Changes: 1. Dev server: Register assets at target/file instead of target/identifier/file 2. Deploy: Add destination: 'assets' so assets copy to assets/ subdirectory Fixes https://github.com/Shopify/cli/issues/5285 --- .../cli/models/extensions/specifications/ui_extension.ts | 1 + .../app/src/cli/services/dev/extension/payload.test.ts | 8 ++++---- packages/app/src/cli/services/dev/extension/payload.ts | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/app/src/cli/models/extensions/specifications/ui_extension.ts b/packages/app/src/cli/models/extensions/specifications/ui_extension.ts index 50fc1212d2a..7e49ffd8356 100644 --- a/packages/app/src/cli/models/extensions/specifications/ui_extension.ts +++ b/packages/app/src/cli/models/extensions/specifications/ui_extension.ts @@ -113,6 +113,7 @@ const uiExtensionSpec = createExtensionSpecification({ anchor: 'extension_points[]', groupBy: 'target', key: 'extension_points[].assets', + destination: 'assets', }, { type: 'configKey', diff --git a/packages/app/src/cli/services/dev/extension/payload.test.ts b/packages/app/src/cli/services/dev/extension/payload.test.ts index c0196f49729..08c3e7c81eb 100644 --- a/packages/app/src/cli/services/dev/extension/payload.test.ts +++ b/packages/app/src/cli/services/dev/extension/payload.test.ts @@ -418,8 +418,8 @@ describe('getUIExtensionPayload', () => { }, }, ]) - expect(resolver.get('CUSTOM_EXTENSION_POINT/assets/foo.json')).toBe('foo.json') - expect(resolver.get('CUSTOM_EXTENSION_POINT/assets/subdir/bar.png')).toBe('subdir/bar.png') + expect(resolver.get('CUSTOM_EXTENSION_POINT/foo.json')).toBe('foo.json') + expect(resolver.get('CUSTOM_EXTENSION_POINT/subdir/bar.png')).toBe('subdir/bar.png') }) }) @@ -473,8 +473,8 @@ describe('getUIExtensionPayload', () => { }, ]) // Both targets' resolver entries point at the same output-relative file. - expect(resolver.get('TARGET_A/assets/foo.json')).toBe('foo.json') - expect(resolver.get('TARGET_B/assets/foo.json')).toBe('foo.json') + expect(resolver.get('TARGET_A/foo.json')).toBe('foo.json') + expect(resolver.get('TARGET_B/foo.json')).toBe('foo.json') }) }) diff --git a/packages/app/src/cli/services/dev/extension/payload.ts b/packages/app/src/cli/services/dev/extension/payload.ts index fd6cfface92..7e161430256 100644 --- a/packages/app/src/cli/services/dev/extension/payload.ts +++ b/packages/app/src/cli/services/dev/extension/payload.ts @@ -252,7 +252,7 @@ async function staticAssetsMapper( if (files.length === 0) return {} const urlSubpath = `${target}/${identifier}` for (const file of files) { - resolver?.set(`${urlSubpath}/${file}`, file) + resolver?.set(`${target}/${file}`, file) } const updatedTimestamps = await Promise.all( files.map(async (file) => (await fileLastUpdatedTimestamp(joinPath(buildDirectory, file))) ?? 0),