diff --git a/.changeset/heavy-lions-brush.md b/.changeset/heavy-lions-brush.md new file mode 100644 index 00000000000..989fa97cac0 --- /dev/null +++ b/.changeset/heavy-lions-brush.md @@ -0,0 +1,5 @@ +--- +'@shopify/app': patch +--- + +adding optional preloads to ui extension targets diff --git a/packages/app/src/cli/models/extensions/schemas.ts b/packages/app/src/cli/models/extensions/schemas.ts index 3eec3e299de..d9e9fbd871d 100644 --- a/packages/app/src/cli/models/extensions/schemas.ts +++ b/packages/app/src/cli/models/extensions/schemas.ts @@ -42,6 +42,11 @@ const NewExtensionPointSchema = zod.object({ metafields: zod.array(MetafieldSchema).optional(), default_placement: zod.string().optional(), capabilities: TargetCapabilitiesSchema.optional(), + preloads: zod + .object({ + chat: zod.string().optional(), + }) + .optional(), }) export const NewExtensionPointsSchema = zod.array(NewExtensionPointSchema) diff --git a/packages/app/src/cli/models/extensions/specifications/ui_extension.test.ts b/packages/app/src/cli/models/extensions/specifications/ui_extension.test.ts index ac15fdea0ea..bd489a84ac3 100644 --- a/packages/app/src/cli/models/extensions/specifications/ui_extension.test.ts +++ b/packages/app/src/cli/models/extensions/specifications/ui_extension.test.ts @@ -120,6 +120,7 @@ describe('ui_extension', async () => { metafields: [{namespace: 'test', key: 'test'}], default_placement_reference: undefined, capabilities: undefined, + preloads: {}, }, ]) }) @@ -170,6 +171,7 @@ describe('ui_extension', async () => { metafields: [], default_placement_reference: 'PLACEMENT_REFERENCE1', capabilities: undefined, + preloads: {}, }, ]) }) @@ -220,6 +222,58 @@ describe('ui_extension', async () => { metafields: [], default_placement_reference: undefined, capabilities: {allow_direct_linking: true}, + preloads: {}, + }, + ]) + }) + + test('targeting object accepts preloads', async () => { + const allSpecs = await loadLocalExtensionsSpecifications() + const specification = allSpecs.find((spec) => spec.identifier === 'ui_extension')! + const configuration = { + targeting: [ + { + target: 'EXTENSION::POINT::A', + module: './src/ExtensionPointA.js', + preloads: {chat: '/chat', not_supported: '/hello'}, + }, + ], + api_version: '2023-01' as const, + name: 'UI Extension', + description: 'This is an ordinary test extension', + type: 'ui_extension', + capabilities: { + block_progress: false, + network_access: false, + api_access: false, + collect_buyer_consent: { + customer_privacy: true, + sms_marketing: false, + }, + iframe: { + sources: [], + }, + }, + settings: {}, + } + + // When + const parsed = specification.parseConfigurationObject(configuration) + if (parsed.state !== 'ok') { + throw new Error("Couldn't parse configuration") + } + + const got = parsed.data + + // Then + expect(got.extension_points).toStrictEqual([ + { + target: 'EXTENSION::POINT::A', + module: './src/ExtensionPointA.js', + metafields: [], + default_placement_reference: undefined, + capabilities: undefined, + preloads: {chat: '/chat'}, }, ]) }) 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 384c0ecf7c5..19bf1626708 100644 --- a/packages/app/src/cli/models/extensions/specifications/ui_extension.ts +++ b/packages/app/src/cli/models/extensions/specifications/ui_extension.ts @@ -31,6 +31,7 @@ export const UIExtensionSchema = BaseSchema.extend({ metafields: targeting.metafields ?? config.metafields ?? [], default_placement_reference: targeting.default_placement, capabilities: targeting.capabilities, + preloads: targeting.preloads ?? {}, } }) return {...config, extension_points: extensionPoints}