Skip to content

Commit b707dea

Browse files
support bundle folder in the bundle ui step config
1 parent ee4d4b5 commit b707dea

4 files changed

Lines changed: 23 additions & 8 deletions

File tree

packages/app/src/cli/models/extensions/specifications/ui_extension.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,17 @@ const uiExtensionSpec = createExtensionSpecification({
8484
dependency,
8585
schema: UIExtensionSchema,
8686
buildConfig: {mode: 'ui'},
87-
getOutputRelativePath: (extension: ExtensionInstance<UIExtensionConfigType>) => `dist/${extension.handle}.js`,
87+
getOutputRelativePath: (extension: ExtensionInstance<UIExtensionConfigType>) => `${extension.handle}.js`,
8888
clientSteps: [
8989
{
9090
lifecycle: 'deploy',
9191
steps: [
92-
{id: 'bundle-ui', name: 'Bundle UI Extension', type: 'bundle_ui', config: {generatesAssetsManifest: true}},
92+
{
93+
id: 'bundle-ui',
94+
name: 'Bundle UI Extension',
95+
type: 'bundle_ui',
96+
config: {generatesAssetsManifest: true, bundleFolder: 'dist/'},
97+
},
9398
{
9499
id: 'include-ui-extension-assets',
95100
name: 'Include UI Extension Assets',

packages/app/src/cli/services/build/client-steps.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export interface BundleUIStep extends BaseStep {
2626
readonly type: 'bundle_ui'
2727
readonly config?: {
2828
readonly generatesAssetsManifest?: boolean
29+
readonly bundleFolder?: string
2930
}
3031
}
3132

packages/app/src/cli/services/build/extension.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,10 @@ export async function buildUIExtension(extension: ExtensionInstance, options: Ex
6767
env.APP_URL = options.appURL
6868
}
6969

70+
const buildDirectory = options.buildDirectory ?? ''
71+
7072
// Always build into the extension's local directory (e.g. ext/dist/handle.js)
71-
const localOutputPath = joinPath(extension.directory, extension.outputRelativePath)
73+
const localOutputPath = joinPath(extension.directory, buildDirectory, extension.outputRelativePath)
7274

7375
const {main, assets} = extension.getBundleExtensionStdinContent()
7476

packages/app/src/cli/services/build/steps/bundle-ui-step.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {createOrUpdateManifestFile} from './include-assets/generate-manifest.js'
22
import {buildUIExtension} from '../extension.js'
33
import {BuildManifest} from '../../../models/extensions/specifications/ui_extension.js'
44
import {copyFile} from '@shopify/cli-kit/node/fs'
5-
import {dirname} from '@shopify/cli-kit/node/path'
5+
import {dirname, joinPath} from '@shopify/cli-kit/node/path'
66
import type {BundleUIStep, BuildContext} from '../client-steps.js'
77

88
interface ExtensionPointWithBuildManifest {
@@ -20,9 +20,13 @@ interface ExtensionPointWithBuildManifest {
2020
*/
2121
export async function executeBundleUIStep(step: BundleUIStep, context: BuildContext): Promise<void> {
2222
const config = context.extension.configuration
23+
context.options.buildDirectory = step.config?.bundleFolder ?? undefined
2324
const localOutputPath = await buildUIExtension(context.extension, context.options)
25+
const bundleOutputDir = step.config?.bundleFolder
26+
? joinPath(dirname(context.extension.outputPath), step.config.bundleFolder)
27+
: dirname(context.extension.outputPath)
2428
// Copy the locally built files into the bundle
25-
await copyFile(dirname(localOutputPath), dirname(context.extension.outputPath))
29+
await copyFile(dirname(localOutputPath), bundleOutputDir)
2630

2731
if (!step.config?.generatesAssetsManifest) return
2832

@@ -32,7 +36,7 @@ export async function executeBundleUIStep(step: BundleUIStep, context: BuildCont
3236
(ep): ep is ExtensionPointWithBuildManifest => typeof ep === 'object' && ep.build_manifest,
3337
)
3438

35-
const entries = extractBuiltAssetEntries(pointsWithManifest)
39+
const entries = extractBuiltAssetEntries(pointsWithManifest, step.config?.bundleFolder)
3640
if (Object.keys(entries).length > 0) {
3741
await createOrUpdateManifestFile(context, entries)
3842
}
@@ -42,15 +46,18 @@ export async function executeBundleUIStep(step: BundleUIStep, context: BuildCont
4246
* Extracts built asset filepaths from `build_manifest` on each extension point,
4347
* grouped by target. Returns a map of target → `{assetName: filepath}`.
4448
*/
45-
function extractBuiltAssetEntries(extensionPoints: {target: string; build_manifest: BuildManifest}[]): {
49+
function extractBuiltAssetEntries(
50+
extensionPoints: {target: string; build_manifest: BuildManifest}[],
51+
bundleFolder?: string,
52+
): {
4653
[target: string]: {[assetName: string]: string}
4754
} {
4855
const entries: {[target: string]: {[assetName: string]: string}} = {}
4956
for (const {target, build_manifest: buildManifest} of extensionPoints) {
5057
if (!buildManifest?.assets) continue
5158
const assets: {[name: string]: string} = {}
5259
for (const [name, asset] of Object.entries(buildManifest.assets)) {
53-
if (asset?.filepath) assets[name] = asset.filepath
60+
if (asset?.filepath) assets[name] = bundleFolder ? joinPath(bundleFolder, asset.filepath) : asset.filepath
5461
}
5562
if (Object.keys(assets).length > 0) entries[target] = assets
5663
}

0 commit comments

Comments
 (0)