@@ -3,13 +3,15 @@ import {ExtensionDevOptions} from '../../extension.js'
33import { getUIExtensionPayload , isNewExtensionPointsSchema } from '../payload.js'
44import { buildAppURLForMobile , buildAppURLForWeb } from '../../../../utilities/app/app-url.js'
55import { ExtensionInstance } from '../../../../models/extensions/extension-instance.js'
6+ import { AdminConfigType } from '../../../../models/extensions/specifications/admin.js'
7+ import { ExtensionEvent } from '../../app-events/app-event-watcher.js'
8+ import { joinPath } from '@shopify/cli-kit/node/path'
69import { deepMergeObjects } from '@shopify/cli-kit/common/object'
710import { outputDebug , outputContent } from '@shopify/cli-kit/node/output'
811import { EventEmitter } from 'events'
912
1013export interface ExtensionsPayloadStoreOptions extends ExtensionDevOptions {
1114 websocketURL : string
12- appAssets ?: Record < string , string >
1315}
1416
1517export enum ExtensionsPayloadStoreEvent {
@@ -42,27 +44,49 @@ export async function getExtensionsPayloadStoreRawPayload(
4244 extensions : await Promise . all ( options . extensions . map ( ( ext ) => getUIExtensionPayload ( ext , bundlePath , options ) ) ) ,
4345 }
4446
45- if ( options . appAssets ) {
46- const assets : Record < string , { url : string ; lastUpdated : number } > = { }
47- for ( const assetKey of Object . keys ( options . appAssets ) ) {
48- assets [ assetKey ] = {
49- url : new URL ( `/extensions/assets/${ assetKey } /` , options . url ) . toString ( ) ,
50- lastUpdated : Date . now ( ) ,
47+ // Admin extension contributes app-level config to the payload
48+ const adminExtension = options . extensions . find ( ( ext ) => ext . type === 'admin' )
49+ if ( adminExtension ) {
50+ const adminConfig = ( adminExtension . configuration as AdminConfigType ) . admin
51+ if ( adminConfig ?. allowed_domains ) {
52+ payload . app . allowed_domains = adminConfig . allowed_domains
53+ }
54+ if ( adminConfig ?. static_root ) {
55+ const assetKey = 'staticRoot'
56+ payload . app . assets = {
57+ [ assetKey ] : {
58+ url : new URL ( `/extensions/assets/${ assetKey } /` , options . url ) . toString ( ) ,
59+ lastUpdated : Date . now ( ) ,
60+ } ,
5161 }
5262 }
53- payload . app . assets = assets
5463 }
64+
5565 return payload
5666}
5767
5868export class ExtensionsPayloadStore extends EventEmitter {
5969 private readonly options : ExtensionsPayloadStoreOptions
6070 private rawPayload : ExtensionsEndpointPayload
71+ private appAssetDirectories : Record < string , string > | undefined
6172
6273 constructor ( rawPayload : ExtensionsEndpointPayload , options : ExtensionsPayloadStoreOptions ) {
6374 super ( )
6475 this . rawPayload = rawPayload
6576 this . options = options
77+
78+ // Compute asset directory mapping from admin extension config
79+ const adminExtension = options . extensions . find ( ( ext ) => ext . type === 'admin' )
80+ if ( adminExtension ) {
81+ const staticRoot = ( adminExtension . configuration as AdminConfigType ) . admin ?. static_root
82+ if ( staticRoot ) {
83+ this . appAssetDirectories = { staticRoot : joinPath ( options . appDirectory , staticRoot ) }
84+ }
85+ }
86+ }
87+
88+ getAppAssetDirectories ( ) : Record < string , string > | undefined {
89+ return this . appAssetDirectories
6690 }
6791
6892 getConnectedPayload ( ) {
@@ -183,12 +207,20 @@ export class ExtensionsPayloadStore extends EventEmitter {
183207 this . emitUpdate ( [ extension . devUUID ] )
184208 }
185209
186- updateAppAssetTimestamp ( assetKey : string ) {
187- const asset = this . rawPayload . app . assets ?. [ assetKey ]
188- if ( asset ) {
189- asset . lastUpdated = Date . now ( )
190- this . emitUpdate ( [ ] )
210+ updateAdminConfigFromExtensionEvents ( extensionEvents : ExtensionEvent [ ] ) {
211+ const adminEvent = extensionEvents . find ( ( event ) => event . extension . type === 'admin' )
212+ if ( ! adminEvent ) return
213+
214+ const adminConfig = ( adminEvent . extension . configuration as AdminConfigType ) . admin
215+ this . rawPayload . app . allowed_domains = adminConfig ?. allowed_domains
216+
217+ if ( this . rawPayload . app . assets ) {
218+ for ( const key of Object . keys ( this . rawPayload . app . assets ) ) {
219+ this . rawPayload . app . assets [ key ] ! . lastUpdated = Date . now ( )
220+ }
191221 }
222+
223+ this . emitUpdate ( [ ] )
192224 }
193225
194226 private emitUpdate ( extensionIds : string [ ] ) {
0 commit comments