From e120424c744aeebf97729ad0a08ac803e0c0af11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Rold=C3=A1n?= Date: Fri, 10 Apr 2026 19:13:47 +0200 Subject: [PATCH] explore how to pass allowed-domains --- .../src/cli/models/extensions/specifications/admin.ts | 6 +++++- .../src/cli/services/dev/extension/payload/models.ts | 1 + .../cli/services/dev/extension/payload/store.test.ts | 2 +- .../src/cli/services/dev/extension/payload/store.ts | 10 ++++++++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/app/src/cli/models/extensions/specifications/admin.ts b/packages/app/src/cli/models/extensions/specifications/admin.ts index e166eb5d35e..084bfca21a5 100644 --- a/packages/app/src/cli/models/extensions/specifications/admin.ts +++ b/packages/app/src/cli/models/extensions/specifications/admin.ts @@ -7,11 +7,12 @@ const AdminSchema = zod.object({ admin: zod .object({ static_root: zod.string().optional(), + allowed_domains: zod.array(zod.string()).optional(), }) .optional(), }) -type AdminConfigType = zod.infer & BaseConfigType +export type AdminConfigType = zod.infer & BaseConfigType const adminSpecificationSpec = createExtensionSpecification({ identifier: 'admin', @@ -33,6 +34,8 @@ const adminSpecificationSpec = createExtensionSpecification({ admin: { // eslint-disable-next-line @typescript-eslint/no-explicit-any static_root: (remoteContent as any).admin.static_root, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + allowed_domains: (remoteContent as any).admin.allowed_domains, }, } }, @@ -67,6 +70,7 @@ const adminSpecificationSpec = createExtensionSpecification({ if (!dir) return undefined return {assetsKey: 'staticRoot', assetsDir: dir} }, + }) export default adminSpecificationSpec diff --git a/packages/app/src/cli/services/dev/extension/payload/models.ts b/packages/app/src/cli/services/dev/extension/payload/models.ts index 9495c31aab6..487f29e58c6 100644 --- a/packages/app/src/cli/services/dev/extension/payload/models.ts +++ b/packages/app/src/cli/services/dev/extension/payload/models.ts @@ -8,6 +8,7 @@ interface ExtensionsPayloadInterface { url: string mobileUrl: string title: string + allowed_domains?: string[] assets?: { [key: string]: { url: string diff --git a/packages/app/src/cli/services/dev/extension/payload/store.test.ts b/packages/app/src/cli/services/dev/extension/payload/store.test.ts index cd9a5229da8..00d8f5191a4 100644 --- a/packages/app/src/cli/services/dev/extension/payload/store.test.ts +++ b/packages/app/src/cli/services/dev/extension/payload/store.test.ts @@ -21,7 +21,7 @@ describe('getExtensionsPayloadStoreRawPayload()', () => { appName: 'mock-app-name', url: 'https://mock-url.com', websocketURL: 'wss://mock-websocket-url.com', - extensions: [{}, {}, {}], + extensions: [{specification: {}}, {specification: {}}, {specification: {}}], storeFqdn: 'mock-store-fqdn.myshopify.com', manifestVersion: '3', } as unknown as ExtensionsPayloadStoreOptions diff --git a/packages/app/src/cli/services/dev/extension/payload/store.ts b/packages/app/src/cli/services/dev/extension/payload/store.ts index ef2676178ea..3f1beff585a 100644 --- a/packages/app/src/cli/services/dev/extension/payload/store.ts +++ b/packages/app/src/cli/services/dev/extension/payload/store.ts @@ -3,6 +3,7 @@ import {ExtensionDevOptions} from '../../extension.js' import {getUIExtensionPayload, isNewExtensionPointsSchema} from '../payload.js' import {buildAppURLForMobile, buildAppURLForWeb} from '../../../../utilities/app/app-url.js' import {ExtensionInstance} from '../../../../models/extensions/extension-instance.js' +import {AdminConfigType} from '../../../../models/extensions/specifications/admin.js' import {deepMergeObjects} from '@shopify/cli-kit/common/object' import {outputDebug, outputContent} from '@shopify/cli-kit/node/output' import {EventEmitter} from 'events' @@ -42,6 +43,15 @@ export async function getExtensionsPayloadStoreRawPayload( extensions: await Promise.all(options.extensions.map((ext) => getUIExtensionPayload(ext, bundlePath, options))), } + // Admin extension contributes app-level config to the payload + const adminExtension = options.extensions.find((ext) => ext.type === 'admin') + if (adminExtension) { + const adminConfig = (adminExtension.configuration as AdminConfigType).admin + if (adminConfig?.allowed_domains) { + payload.app.allowed_domains = adminConfig.allowed_domains + } + } + if (options.appAssets) { const assets: Record = {} for (const assetKey of Object.keys(options.appAssets)) {