@spiffcommerce/theme-bridge 1.28.1-alpha.0 → 1.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/bin.cjs +9 -4
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +40 -35
- package/dist/bin.js.map +1 -1
- package/dist/generateConfiguration-D0O62bWR.cjs.map +1 -1
- package/dist/generateConfiguration-hQnHNgMM.js.map +1 -1
- package/dist/plugin.cjs +1 -1
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateConfiguration-hQnHNgMM.js","sources":["../src/graphql.ts","../src/download.ts","../src/generateConfiguration.ts"],"sourcesContent":["import {\n ThemeConfigurationSchemaCustomSchemaResource,\n ThemeConfigurationSchemaFieldResource,\n ThemeConfigurationSchemaResource,\n ThemeInstallConfigurationFieldResource,\n ThemeInstallConfigurationResource,\n ThemeVersionResource,\n} from \"./resourceTypes\";\nimport type { ThemeInstallConfigurationGraphQl } from \"@repo/types\";\n\nexport type ThemeVersionGraphQl = Omit<ThemeVersionResource, \"configurationSchema\"> & {\n configurationSchema: ThemeConfigurationSchemaGraphQl;\n};\n\nexport type ThemeConfigurationSchemaGraphQl = Omit<ThemeConfigurationSchemaResource, \"fields\" | \"customSchemas\"> & {\n fields: ThemeConfigurationSchemaFieldGraphQl[];\n customSchemas?: ThemeConfigurationSchemaCustomSchemaGraphQl[] | null;\n};\n\nexport type ThemeConfigurationSchemaCustomSchemaGraphQl = Omit<\n ThemeConfigurationSchemaCustomSchemaResource,\n \"fields\"\n> & {\n fields?: number[] | null;\n};\n\nexport type ThemeConfigurationSchemaFieldGraphQl = Omit<ThemeConfigurationSchemaFieldResource, \"items\" | \"fields\"> & {\n /** When this field is type `List`, this is the index of the schema for the entries. */\n items?: number | null;\n /** When this field is type `Object`, this array contains the indices of the schemas for the sub-fields. */\n fields?: number[] | null;\n /** Whether this field is on the root. Otherwise this is a child. */\n root?: boolean | null;\n};\n\nexport type { ThemeInstallConfigurationGraphQl };\n\nexport type ThemeInstallConfigurationFieldGraphQl = Omit<\n ThemeInstallConfigurationFieldResource,\n \"listValues\" | \"objectValues\"\n> & {\n /** When the type is `List`, this will be the indices of the configured values */\n listValues?: number[] | null;\n /** When the type is `Object`, this will be the indices of the configured field values */\n objectValues?: number[] | null;\n /** Whether this field is on the root. Otherwise this is a child. */\n root?: boolean | null;\n};\n\nfunction themeVersionFieldToResource(\n field: ThemeConfigurationSchemaFieldGraphQl,\n allFields: ThemeConfigurationSchemaFieldGraphQl[],\n): ThemeConfigurationSchemaFieldResource {\n const resource: ThemeConfigurationSchemaFieldResource = {\n ...field,\n items: undefined,\n fields: undefined,\n };\n if (field.items !== undefined && field.items !== null) {\n resource.items = themeVersionFieldToResource(allFields[field.items], allFields);\n }\n if (field.fields !== undefined && field.fields !== null) {\n resource.fields = field.fields.map((idx) => themeVersionFieldToResource(allFields[idx], allFields));\n }\n return resource;\n}\n\nexport function themeVersionConfigurationGraphQlToResource(\n gql: ThemeConfigurationSchemaGraphQl,\n): ThemeConfigurationSchemaResource {\n const resource: ThemeConfigurationSchemaResource = {\n ...gql,\n fields: [],\n customSchemas: gql.customSchemas?.map((schema) => ({\n ...schema,\n fields: schema.fields?.map((fieldIdx) => themeVersionFieldToResource(gql.fields[fieldIdx], gql.fields)),\n })),\n };\n const resourceFields: ThemeConfigurationSchemaFieldResource[] = [];\n gql.fields.forEach((field) => {\n if (!field.root) {\n return;\n }\n resourceFields.push(themeVersionFieldToResource(field, gql.fields));\n });\n if (gql.fields.length > 0 && resourceFields.length === 0) {\n throw new Error(\n \"Failed to map ThemeVersionConfiguration GraphQL type to Resource type. Please ensure you've selected the `root` field on ThemeConfigurationSchemaField\",\n );\n }\n resource.fields = resourceFields;\n return resource;\n}\n\nexport function themeVersionGraphQlToResource(gql: ThemeVersionGraphQl): ThemeVersionResource {\n return {\n ...gql,\n configurationSchema: themeVersionConfigurationGraphQlToResource(gql.configurationSchema),\n };\n}\n\nfunction themeInstallFieldToResource(\n field: ThemeInstallConfigurationFieldGraphQl,\n allFields: ThemeInstallConfigurationFieldGraphQl[],\n): ThemeInstallConfigurationFieldResource {\n const resource: ThemeInstallConfigurationFieldResource = {\n ...field,\n listValues: undefined,\n objectValues: undefined,\n };\n if (field.listValues !== undefined && field.listValues !== null) {\n resource.listValues = field.listValues.map((idx) => themeInstallFieldToResource(allFields[idx], allFields));\n }\n if (field.objectValues !== undefined && field.objectValues !== null) {\n resource.objectValues = field.objectValues.map((idx) => themeInstallFieldToResource(allFields[idx], allFields));\n }\n return resource;\n}\n\nexport function themeInstallConfigurationGraphQlToResource(\n gql: ThemeInstallConfigurationGraphQl,\n): ThemeInstallConfigurationResource {\n const resource: ThemeInstallConfigurationResource = {\n ...gql,\n name: gql.name ?? \"\",\n fields: [],\n };\n const resourceFields: ThemeInstallConfigurationFieldResource[] = [];\n gql.fields.forEach((field: ThemeInstallConfigurationFieldGraphQl) => {\n if (!field.root) {\n return;\n }\n resourceFields.push(themeInstallFieldToResource(field, gql.fields));\n });\n if (gql.fields.length > 0 && resourceFields.length === 0) {\n throw new Error(\n \"Failed to map ThemeInstallConfiguration GraphQL type to Resource type. Please ensure you've selected the `root` field on ThemeInstallConfigurationField\",\n );\n }\n resource.fields = resourceFields;\n return resource;\n}\n","import type { ThemeInstallConfigurationResource } from \"./resourceTypes\";\nimport { themeInstallConfigurationGraphQlToResource, themeVersionGraphQlToResource } from \"./graphql\";\n\nexport type MoonlightRegion = \"au\" | \"us\";\nexport const MOONLIGHT_REGIONS: MoonlightRegion[] = [\"au\", \"us\"];\n\n/** The subset of `@repo/core` used to talk to Moonlight. */\nexport interface DownloadCore {\n spiffCoreConfiguration: { setServerUrl(url: string): void };\n setApplicationKey(key: string): void;\n getIntegration(applicationKey: string, themeConfigurationId?: string): Promise<any>;\n getActivation(activationId: string): Promise<any>;\n getOverrideThemeConfiguration(themeConfigurationId: string, themeInstallId: string): Promise<any>;\n}\n\nexport interface DownloadThemeInstallConfigurationOptions {\n /** The application key identifying the integration. Required for every request. */\n applicationKey: string;\n /** Selects `https://moonlight.<region>.spiffcommerce.com`. Defaults to `au`. Ignored when `serverUrl` is set. */\n region?: MoonlightRegion;\n /** Overrides the Moonlight URL entirely. Useful when testing locally against a mock server that returns your own response. */\n serverUrl?: string;\n /** Download via an activation. Cannot be combined with the theme install ids. */\n activationId?: string;\n /** Download a specific install. Must be combined with `themeInstallConfigurationId`. */\n themeInstallId?: string;\n /** Download a specific configuration. Without `themeInstallId` it is looked up on the current integration. */\n themeInstallConfigurationId?: string;\n}\n\n/** Recursively removes the `__typename` fields GraphQL adds to responses. */\nexport function stripTypenames<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map(stripTypenames) as T;\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key !== \"__typename\")\n .map(([key, entry]) => [key, stripTypenames(entry)]),\n ) as T;\n }\n return value;\n}\n\n/**\n * Converts a `ThemeInstallConfigurationGraphQl` into a `ThemeInstallConfigurationResource`, removing `__typename`s.\n * Unlike `themeInstallConfigurationGraphQlToResource`, this also expands the theme version's flattened schema, when it has one.\n */\nexport function expandThemeInstallConfigurationGraphQl(gql: any): ThemeInstallConfigurationResource {\n const clean = stripTypenames(gql);\n const resource = themeInstallConfigurationGraphQlToResource(clean);\n return clean.themeVersion?.configurationSchema\n ? { ...resource, themeVersion: themeVersionGraphQlToResource(clean.themeVersion) }\n : resource;\n}\n\nexport function resolveMoonlightUrl(region: MoonlightRegion = \"au\", serverUrl?: string): string {\n if (serverUrl) return serverUrl;\n if (!MOONLIGHT_REGIONS.includes(region)) {\n throw new Error(`Unknown region \"${region}\". Expected one of: ${MOONLIGHT_REGIONS.join(\", \")}`);\n }\n return `https://moonlight.${region}.spiffcommerce.com`;\n}\n\n/**\n * Downloads a theme install configuration from Moonlight and returns it as a `ThemeInstallConfigurationResource`.\n *\n * The configuration is located in one of three ways:\n * - `themeInstallId` + `themeInstallConfigurationId`: directly.\n * - `activationId`: the configuration linked to the activation.\n * - Neither: the current integration, as identified by the application key\n * (optionally a specific `themeInstallConfigurationId` of it).\n */\nexport async function downloadThemeInstallConfiguration(\n options: DownloadThemeInstallConfigurationOptions,\n core: DownloadCore,\n): Promise<ThemeInstallConfigurationResource> {\n const { applicationKey, activationId, themeInstallId, themeInstallConfigurationId } = options;\n if (!applicationKey) {\n throw new Error(\"An application key is required\");\n }\n if (activationId && (themeInstallId || themeInstallConfigurationId)) {\n throw new Error(\"An activation id can't be combined with a theme install id or theme install configuration id\");\n }\n if (themeInstallId && !themeInstallConfigurationId) {\n throw new Error(\"A theme install id also requires a theme install configuration id\");\n }\n\n core.spiffCoreConfiguration.setServerUrl(resolveMoonlightUrl(options.region, options.serverUrl));\n core.setApplicationKey(applicationKey);\n\n let gql: any;\n let source: string;\n if (themeInstallId && themeInstallConfigurationId) {\n source = `theme install ${themeInstallId} configuration ${themeInstallConfigurationId}`;\n gql = await core.getOverrideThemeConfiguration(themeInstallConfigurationId, themeInstallId);\n } else if (activationId) {\n source = `activation ${activationId}`;\n gql = (await core.getActivation(activationId))?.marketplaceThemeInstallConfiguration;\n } else {\n source = themeInstallConfigurationId\n ? `configuration ${themeInstallConfigurationId} of the current integration`\n : \"the current integration\";\n gql = (await core.getIntegration(applicationKey, themeInstallConfigurationId))\n ?.marketplaceThemeInstallConfiguration;\n }\n if (!gql) {\n throw new Error(\n `Couldn't find a theme install configuration for ${source}. Check the ids, application key and region.`,\n );\n }\n return expandThemeInstallConfigurationGraphQl(gql);\n}\n","import {\n CustomSchemaType,\n FieldType,\n ThemeConfigurationPageSettings,\n ThemeConfigurationSchema,\n ThemeConfigurationSchemaCustomSchema,\n ThemeConfigurationSchemaField,\n} from \"./configurationTypes\";\nimport { expandThemeInstallConfigurationGraphQl } from \"./download\";\nimport {\n ThemeInstallConfigurationFieldResource,\n ThemeInstallConfigurationResource,\n ThemeInstallPageSettings,\n ThemeVersionResource,\n} from \"./resourceTypes\";\n\n/**\n * Values for the fields of a schema, keyed by field `key`.\n * This is the inverse of `themeInstallConfigurationToRecordObject`:\n * - Text, Color and Select: a string\n * - Number: a number (or numeric string)\n * - Boolean: a boolean\n * - DateRange: `{ start, end }` (Date or ISO date string)\n * - Asset, ConversionConfiguration, ProductCollection, MetafieldConfiguration: the resource object\n * - List: an array of values\n * - Object: a record of values. When the field references a `Union` schema, include `schema` to choose the variant.\n */\nexport type ThemeInstallConfigurationValues = Record<string, any>;\n\n/** Overrides for the user-configured state of the theme's pages. Anything not listed keeps its default. */\nexport interface ThemeInstallPageSettingsOverrides {\n /** Keyed by page key. */\n pages?: Record<string, { enabled?: boolean }>;\n /** Keyed by group key. */\n groups?: Record<string, { pageOrder?: string[] }>;\n}\n\n/**\n * The contents of a local development overrides file. Only list what you want to change;\n * everything else is defaulted from the theme's schema.\n */\nexport interface ThemeInstallConfigurationOverrides {\n /** Field values keyed by field `key`. See `ThemeInstallConfigurationValues` for the accepted formats. */\n fields?: ThemeInstallConfigurationValues;\n /** Overrides for page settings. */\n pageSettings?: ThemeInstallPageSettingsOverrides;\n}\n\ntype SchemaFields = ThemeConfigurationSchemaField[];\n\nfunction resolveSchemaFields(\n schemaName: string,\n chosen: string | undefined,\n customSchemas: ThemeConfigurationSchemaCustomSchema[],\n seen: string[] = [],\n): { name: string; fields: SchemaFields } {\n if (seen.includes(schemaName)) {\n throw new Error(`Circular schema reference: ${[...seen, schemaName].join(\" -> \")}`);\n }\n const schema = customSchemas.find((s) => s.name === schemaName);\n if (!schema) {\n throw new Error(`Unknown custom schema \"${schemaName}\"`);\n }\n if (schema.type === CustomSchemaType.Union) {\n if (!chosen || !schema.schemas.includes(chosen)) {\n throw new Error(\n `Union schema \"${schemaName}\" requires a value with \\`schema\\` set to one of: ${schema.schemas.join(\", \")}`,\n );\n }\n return resolveSchemaFields(chosen, undefined, customSchemas, [...seen, schemaName]);\n }\n const inherited = (schema.extends ?? []).flatMap(\n (parent) => resolveSchemaFields(parent, undefined, customSchemas, [...seen, schemaName]).fields,\n );\n return { name: schemaName, fields: [...inherited, ...schema.fields] };\n}\n\nfunction toDateString(value: unknown): string {\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10);\n }\n return String(value);\n}\n\nfunction generateField(\n field: ThemeConfigurationSchemaField,\n value: any,\n customSchemas: ThemeConfigurationSchemaCustomSchema[],\n): ThemeInstallConfigurationFieldResource | undefined {\n if (field.type === FieldType.Heading) {\n return undefined;\n }\n const resource: ThemeInstallConfigurationFieldResource = {\n key: field.key,\n type: field.type,\n fallbackToDefaultConfiguration: false,\n };\n const defaultValue = (field as { defaultValue?: string }).defaultValue;\n const provided = value !== undefined && value !== null;\n\n switch (field.type) {\n case FieldType.Text:\n case FieldType.Color:\n case FieldType.Select:\n case FieldType.Number:\n case FieldType.Boolean:\n resource.value = provided ? String(value) : defaultValue;\n break;\n case FieldType.DateRange:\n resource.value = provided ? `${toDateString(value.start)},${toDateString(value.end)}` : defaultValue;\n break;\n case FieldType.Asset:\n resource.asset = provided ? value : undefined;\n break;\n case FieldType.ConversionConfiguration:\n resource.conversionConfiguration = provided ? value : undefined;\n break;\n case FieldType.ProductCollection:\n resource.productCollection = provided ? value : undefined;\n break;\n case FieldType.MetafieldConfiguration:\n resource.metafieldConfiguration = provided ? value : undefined;\n break;\n case FieldType.List:\n if (provided) {\n if (!Array.isArray(value)) {\n throw new Error(`Field \"${field.key}\" is a List and must be configured with an array`);\n }\n resource.listValues = value.map((entry) => {\n const item = generateField(\n { ...field.items, key: undefined, title: \"\" } as any,\n entry,\n customSchemas,\n );\n return item ?? { type: field.items.type };\n });\n }\n break;\n case FieldType.Object: {\n if (!provided) break;\n let fields: SchemaFields;\n if (field.schema) {\n const resolved = resolveSchemaFields(field.schema, value.schema, customSchemas);\n fields = resolved.fields;\n resource.schema = resolved.name;\n } else {\n fields = \"fields\" in field ? field.fields : [];\n }\n resource.objectValues = generateFields(fields, value, customSchemas);\n break;\n }\n }\n return resource;\n}\n\nfunction generateFields(\n fields: SchemaFields,\n values: ThemeInstallConfigurationValues,\n customSchemas: ThemeConfigurationSchemaCustomSchema[],\n): ThemeInstallConfigurationFieldResource[] {\n const result: ThemeInstallConfigurationFieldResource[] = [];\n for (const field of fields) {\n const resource = generateField(field, \"key\" in field ? values?.[field.key] : undefined, customSchemas);\n if (resource) {\n result.push(resource);\n }\n }\n return result;\n}\n\n/** Unknown keys usually mean a typo, or an overrides file saved from a different version of the theme. */\nfunction warnUnknownKeys(kind: string, provided: string[], known: string[]) {\n const unknown = provided.filter((key) => !known.includes(key));\n if (unknown.length > 0) {\n console.warn(\n `Ignoring unknown ${kind} ${unknown.map((k) => `\"${k}\"`).join(\", \")}. Expected one of: ${known.join(\", \")}`,\n );\n }\n}\n\nfunction generatePageSettings(\n settings: ThemeConfigurationPageSettings,\n overrides?: ThemeInstallPageSettingsOverrides,\n): ThemeInstallPageSettings {\n warnUnknownKeys(\n \"page\",\n Object.keys(overrides?.pages ?? {}),\n settings.pages.map((page) => page.key),\n );\n warnUnknownKeys(\n \"page group\",\n Object.keys(overrides?.groups ?? {}),\n settings.groups.map((group) => group.key),\n );\n return {\n groups: settings.groups.map((group) => {\n const pageOrder = overrides?.groups?.[group.key]?.pageOrder;\n return pageOrder ? { key: group.key, pageOrder } : { key: group.key };\n }),\n pages: settings.pages.map((page) => {\n const enabled = overrides?.pages?.[page.key]?.enabled;\n return enabled !== undefined ? { key: page.key, enabled } : { key: page.key };\n }),\n };\n}\n\nexport interface GenerateThemeInstallConfigurationFromOverridesOptions {\n /** The theme's configuration schema. */\n schema: ThemeConfigurationSchema;\n /** The theme's page settings definition, if it has one. */\n pageSettings?: ThemeConfigurationPageSettings;\n /** The contents of the overrides file. When omitted, the configuration is entirely defaults. */\n overrides?: ThemeInstallConfigurationOverrides;\n}\n\n/**\n * Generates a complete `ThemeInstallConfigurationResource` for local development, from the theme's schema and a\n * small overrides object (typically the contents of a JSON file) which lists only the field values and page\n * settings you want to change. Everything else is defaulted from the schema.\n *\n * Unknown field, page or group keys are ignored with a console warning.\n *\n * @example\n * // overrides.json: { \"fields\": { \"title\": \"Hello\" }, \"pageSettings\": { \"pages\": { \"faq\": { \"enabled\": false } } } }\n * const configuration = generateThemeInstallConfigurationFromOverrides({\n * schema: configurationSchema,\n * pageSettings,\n * overrides: JSON.parse(readFileSync(\"overrides.json\", \"utf-8\")),\n * });\n */\nexport function generateThemeInstallConfigurationFromOverrides(\n options: GenerateThemeInstallConfigurationFromOverridesOptions,\n): ThemeInstallConfigurationResource {\n const { schema, pageSettings, overrides } = options;\n warnUnknownKeys(\n \"field\",\n Object.keys(overrides?.fields ?? {}),\n schema.fields.flatMap((field) => (\"key\" in field ? [field.key] : [])),\n );\n const timestamp = \"2021-01-01T00:00:00Z\";\n const themeVersion: ThemeVersionResource = {\n id: \"local\",\n version: \"1.0.0\",\n createdAt: timestamp,\n updatedAt: timestamp,\n theme: { id: \"local\", name: \"Local Theme\", createdAt: timestamp, updatedAt: timestamp },\n launchData: { targetFiles: [] },\n configurationSchema: schema as unknown as ThemeVersionResource[\"configurationSchema\"],\n pageSettings,\n };\n return {\n id: \"local\",\n themeInstallId: \"local\",\n name: \"Local Configuration\",\n createdAt: timestamp,\n updatedAt: timestamp,\n themeVersion,\n fields: generateFields(schema.fields, overrides?.fields ?? {}, schema.customSchemas ?? []),\n pageSettings: pageSettings ? generatePageSettings(pageSettings, overrides?.pageSettings) : undefined,\n };\n}\n\n/** The inverse of `generateField`: turns an install field back into the value format used in overrides. */\nfunction fieldToValue(field: ThemeInstallConfigurationFieldResource): any {\n switch (field.type) {\n case FieldType.Asset:\n return field.asset ?? undefined;\n case FieldType.ConversionConfiguration:\n return field.conversionConfiguration ?? undefined;\n case FieldType.ProductCollection:\n return field.productCollection ?? undefined;\n case FieldType.MetafieldConfiguration:\n return field.metafieldConfiguration ?? undefined;\n case FieldType.DateRange: {\n const [start, end] = field.value?.split(\",\") ?? [];\n return start && end ? { start, end } : undefined;\n }\n case FieldType.List:\n return field.listValues?.map(fieldToValue);\n case FieldType.Object: {\n if (!field.objectValues) return undefined;\n const record = fieldsToRecord(field.objectValues);\n return field.schema ? { ...record, schema: field.schema } : record;\n }\n case FieldType.Number: {\n const number = Number.parseFloat(field.value ?? \"\");\n return Number.isNaN(number) ? undefined : number;\n }\n case FieldType.Boolean:\n return field.value === null || field.value === undefined ? undefined : field.value === \"true\";\n case FieldType.Heading:\n return undefined;\n default:\n return field.value ?? undefined;\n }\n}\n\nfunction fieldsToRecord(fields: ThemeInstallConfigurationFieldResource[]): ThemeInstallConfigurationValues {\n const record: ThemeInstallConfigurationValues = {};\n for (const field of fields) {\n if (!field.key) continue;\n const value = fieldToValue(field);\n if (value !== undefined) {\n record[field.key] = value;\n }\n }\n return record;\n}\n\n/** JSON.stringify with sorted keys, so structurally equal values compare equal. */\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(value, (_key, v) =>\n v && typeof v === \"object\" && !Array.isArray(v)\n ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => a.localeCompare(b)))\n : v,\n );\n}\n\n/**\n * The inverse of `generateThemeInstallConfigurationFromOverrides`: reduces a complete\n * `ThemeInstallConfigurationResource` (for example one downloaded from Spiff Commerce) to an overrides object that\n * lists only what differs from the defaults of its own schema.\n */\nexport function themeInstallConfigurationToOverrides(\n configuration: ThemeInstallConfigurationResource,\n): ThemeInstallConfigurationOverrides {\n // Without a schema there are no defaults to compare to, so every configured value is kept.\n const schema = (configuration.themeVersion?.configurationSchema ?? {\n fields: [],\n }) as unknown as ThemeConfigurationSchema;\n const customSchemas = schema.customSchemas ?? [];\n const defaults = fieldsToRecord(generateFields(schema.fields, {}, customSchemas));\n const fields: ThemeInstallConfigurationValues = {};\n for (const [key, value] of Object.entries(fieldsToRecord(configuration.fields))) {\n if (stableStringify(value) !== stableStringify(defaults[key])) {\n fields[key] = value;\n }\n }\n\n const pages: ThemeInstallPageSettingsOverrides[\"pages\"] = {};\n for (const page of configuration.pageSettings?.pages ?? []) {\n if (page.enabled !== undefined) pages[page.key] = { enabled: page.enabled };\n }\n const groups: ThemeInstallPageSettingsOverrides[\"groups\"] = {};\n for (const group of configuration.pageSettings?.groups ?? []) {\n if (group.pageOrder) groups[group.key] = { pageOrder: group.pageOrder };\n }\n\n const overrides: ThemeInstallConfigurationOverrides = {};\n if (Object.keys(fields).length > 0) overrides.fields = fields;\n if (Object.keys(pages).length > 0 || Object.keys(groups).length > 0) {\n overrides.pageSettings = {\n ...(Object.keys(pages).length > 0 && { pages }),\n ...(Object.keys(groups).length > 0 && { groups }),\n };\n }\n return overrides;\n}\n\n/**\n * Extracts overrides from a `ThemeInstallConfigurationGraphQl` (the flattened format that themes previously loaded\n * from a local JSON file, with fields marked `root`). If the object has no `themeVersion.configurationSchema`,\n * defaults can't be detected, so every configured value is kept.\n */\nexport function themeInstallConfigurationGraphQlToOverrides(gql: any): ThemeInstallConfigurationOverrides {\n return themeInstallConfigurationToOverrides(expandThemeInstallConfigurationGraphQl(gql));\n}\n"],"names":["themeVersionFieldToResource","field","allFields","resource","idx","themeVersionConfigurationGraphQlToResource","gql","schema","fieldIdx","resourceFields","themeVersionGraphQlToResource","themeInstallFieldToResource","themeInstallConfigurationGraphQlToResource","MOONLIGHT_REGIONS","stripTypenames","value","key","entry","expandThemeInstallConfigurationGraphQl","clean","resolveMoonlightUrl","region","serverUrl","downloadThemeInstallConfiguration","options","core","applicationKey","activationId","themeInstallId","themeInstallConfigurationId","source","resolveSchemaFields","schemaName","chosen","customSchemas","seen","CustomSchemaType","inherited","parent","toDateString","generateField","FieldType","defaultValue","provided","fields","resolved","generateFields","values","result","warnUnknownKeys","kind","known","unknown","k","generatePageSettings","settings","overrides","page","group","pageOrder","enabled","generateThemeInstallConfigurationFromOverrides","pageSettings","timestamp","fieldToValue","start","end","record","fieldsToRecord","number","stableStringify","_key","v","a","b","themeInstallConfigurationToOverrides","configuration","defaults","pages","groups","themeInstallConfigurationGraphQlToOverrides"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generateConfiguration-hQnHNgMM.js","sources":["../src/graphql.ts","../src/download.ts","../src/generateConfiguration.ts"],"sourcesContent":["import {\n ThemeConfigurationSchemaCustomSchemaResource,\n ThemeConfigurationSchemaFieldResource,\n ThemeConfigurationSchemaResource,\n ThemeInstallConfigurationFieldResource,\n ThemeInstallConfigurationResource,\n ThemeVersionResource,\n} from \"./resourceTypes\";\nimport type { ThemeInstallConfigurationGraphQl } from \"@repo/types\";\n\nexport type ThemeVersionGraphQl = Omit<ThemeVersionResource, \"configurationSchema\"> & {\n configurationSchema: ThemeConfigurationSchemaGraphQl;\n};\n\nexport type ThemeConfigurationSchemaGraphQl = Omit<ThemeConfigurationSchemaResource, \"fields\" | \"customSchemas\"> & {\n fields: ThemeConfigurationSchemaFieldGraphQl[];\n customSchemas?: ThemeConfigurationSchemaCustomSchemaGraphQl[] | null;\n};\n\nexport type ThemeConfigurationSchemaCustomSchemaGraphQl = Omit<\n ThemeConfigurationSchemaCustomSchemaResource,\n \"fields\"\n> & {\n fields?: number[] | null;\n};\n\nexport type ThemeConfigurationSchemaFieldGraphQl = Omit<ThemeConfigurationSchemaFieldResource, \"items\" | \"fields\"> & {\n /** When this field is type `List`, this is the index of the schema for the entries. */\n items?: number | null;\n /** When this field is type `Object`, this array contains the indices of the schemas for the sub-fields. */\n fields?: number[] | null;\n /** Whether this field is on the root. Otherwise this is a child. */\n root?: boolean | null;\n};\n\nexport type { ThemeInstallConfigurationGraphQl };\n\nexport type ThemeInstallConfigurationFieldGraphQl = Omit<\n ThemeInstallConfigurationFieldResource,\n \"listValues\" | \"objectValues\"\n> & {\n /** When the type is `List`, this will be the indices of the configured values */\n listValues?: number[] | null;\n /** When the type is `Object`, this will be the indices of the configured field values */\n objectValues?: number[] | null;\n /** Whether this field is on the root. Otherwise this is a child. */\n root?: boolean | null;\n};\n\nfunction themeVersionFieldToResource(\n field: ThemeConfigurationSchemaFieldGraphQl,\n allFields: ThemeConfigurationSchemaFieldGraphQl[],\n): ThemeConfigurationSchemaFieldResource {\n const resource: ThemeConfigurationSchemaFieldResource = {\n ...field,\n items: undefined,\n fields: undefined,\n };\n if (field.items !== undefined && field.items !== null) {\n resource.items = themeVersionFieldToResource(allFields[field.items], allFields);\n }\n if (field.fields !== undefined && field.fields !== null) {\n resource.fields = field.fields.map((idx) => themeVersionFieldToResource(allFields[idx], allFields));\n }\n return resource;\n}\n\nexport function themeVersionConfigurationGraphQlToResource(\n gql: ThemeConfigurationSchemaGraphQl,\n): ThemeConfigurationSchemaResource {\n const resource: ThemeConfigurationSchemaResource = {\n ...gql,\n fields: [],\n customSchemas: gql.customSchemas?.map((schema) => ({\n ...schema,\n fields: schema.fields?.map((fieldIdx) => themeVersionFieldToResource(gql.fields[fieldIdx], gql.fields)),\n })),\n };\n const resourceFields: ThemeConfigurationSchemaFieldResource[] = [];\n gql.fields.forEach((field) => {\n if (!field.root) {\n return;\n }\n resourceFields.push(themeVersionFieldToResource(field, gql.fields));\n });\n if (gql.fields.length > 0 && resourceFields.length === 0) {\n throw new Error(\n \"Failed to map ThemeVersionConfiguration GraphQL type to Resource type. Please ensure you've selected the `root` field on ThemeConfigurationSchemaField\",\n );\n }\n resource.fields = resourceFields;\n return resource;\n}\n\nexport function themeVersionGraphQlToResource(gql: ThemeVersionGraphQl): ThemeVersionResource {\n return {\n ...gql,\n configurationSchema: themeVersionConfigurationGraphQlToResource(gql.configurationSchema),\n };\n}\n\nfunction themeInstallFieldToResource(\n field: ThemeInstallConfigurationFieldGraphQl,\n allFields: ThemeInstallConfigurationFieldGraphQl[],\n): ThemeInstallConfigurationFieldResource {\n const resource: ThemeInstallConfigurationFieldResource = {\n ...field,\n listValues: undefined,\n objectValues: undefined,\n };\n if (field.listValues !== undefined && field.listValues !== null) {\n resource.listValues = field.listValues.map((idx) => themeInstallFieldToResource(allFields[idx], allFields));\n }\n if (field.objectValues !== undefined && field.objectValues !== null) {\n resource.objectValues = field.objectValues.map((idx) => themeInstallFieldToResource(allFields[idx], allFields));\n }\n return resource;\n}\n\nexport function themeInstallConfigurationGraphQlToResource(\n gql: ThemeInstallConfigurationGraphQl,\n): ThemeInstallConfigurationResource {\n const resource: ThemeInstallConfigurationResource = {\n ...gql,\n name: gql.name ?? \"\",\n fields: [],\n };\n const resourceFields: ThemeInstallConfigurationFieldResource[] = [];\n gql.fields.forEach((field: ThemeInstallConfigurationFieldGraphQl) => {\n if (!field.root) {\n return;\n }\n resourceFields.push(themeInstallFieldToResource(field, gql.fields));\n });\n if (gql.fields.length > 0 && resourceFields.length === 0) {\n throw new Error(\n \"Failed to map ThemeInstallConfiguration GraphQL type to Resource type. Please ensure you've selected the `root` field on ThemeInstallConfigurationField\",\n );\n }\n resource.fields = resourceFields;\n return resource;\n}\n","import type { ThemeInstallConfigurationResource } from \"./resourceTypes\";\nimport { themeInstallConfigurationGraphQlToResource, themeVersionGraphQlToResource } from \"./graphql\";\n\nexport type MoonlightRegion = \"au\" | \"us\";\nexport const MOONLIGHT_REGIONS: MoonlightRegion[] = [\"au\", \"us\"];\n\n/** The subset of `@repo/core` used to talk to Moonlight. */\nexport interface DownloadCore {\n spiffCoreConfiguration: { setServerUrl(url: string): void };\n setApplicationKey(key: string): void;\n getIntegration(applicationKey: string, themeConfigurationId?: string): Promise<any>;\n getActivation(activationId: string): Promise<any>;\n getOverrideThemeConfiguration(themeConfigurationId: string, themeInstallId: string): Promise<any>;\n}\n\nexport interface DownloadThemeInstallConfigurationOptions {\n /**\n * The application key identifying the integration. Required for every request.\n * Don't store application keys in your repository; provide one only as needed. If you're concerned about\n * security, create a new application key with no non-default permissions and delete it when you're finished.\n */\n applicationKey: string;\n /** Selects `https://moonlight.<region>.spiffcommerce.com`. Defaults to `au`. Ignored when `serverUrl` is set. */\n region?: MoonlightRegion;\n /** Overrides the Moonlight URL entirely. Useful when testing locally against a mock server that returns your own response. */\n serverUrl?: string;\n /** Download via an activation. Cannot be combined with the theme install ids. */\n activationId?: string;\n /** Download a specific install. Must be combined with `themeInstallConfigurationId`. */\n themeInstallId?: string;\n /** Download a specific configuration. Without `themeInstallId` it is looked up on the current integration. */\n themeInstallConfigurationId?: string;\n}\n\n/** Recursively removes the `__typename` fields GraphQL adds to responses. */\nexport function stripTypenames<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map(stripTypenames) as T;\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key !== \"__typename\")\n .map(([key, entry]) => [key, stripTypenames(entry)]),\n ) as T;\n }\n return value;\n}\n\n/**\n * Converts a `ThemeInstallConfigurationGraphQl` into a `ThemeInstallConfigurationResource`, removing `__typename`s.\n * Unlike `themeInstallConfigurationGraphQlToResource`, this also expands the theme version's flattened schema, when it has one.\n */\nexport function expandThemeInstallConfigurationGraphQl(gql: any): ThemeInstallConfigurationResource {\n const clean = stripTypenames(gql);\n const resource = themeInstallConfigurationGraphQlToResource(clean);\n return clean.themeVersion?.configurationSchema\n ? { ...resource, themeVersion: themeVersionGraphQlToResource(clean.themeVersion) }\n : resource;\n}\n\nexport function resolveMoonlightUrl(region: MoonlightRegion = \"au\", serverUrl?: string): string {\n if (serverUrl) return serverUrl;\n if (!MOONLIGHT_REGIONS.includes(region)) {\n throw new Error(`Unknown region \"${region}\". Expected one of: ${MOONLIGHT_REGIONS.join(\", \")}`);\n }\n return `https://moonlight.${region}.spiffcommerce.com`;\n}\n\n/**\n * Downloads a theme install configuration from Moonlight and returns it as a `ThemeInstallConfigurationResource`.\n *\n * The configuration is located in one of three ways:\n * - `themeInstallId` + `themeInstallConfigurationId`: directly.\n * - `activationId`: the configuration linked to the activation.\n * - Neither: the current integration, as identified by the application key\n * (optionally a specific `themeInstallConfigurationId` of it).\n */\nexport async function downloadThemeInstallConfiguration(\n options: DownloadThemeInstallConfigurationOptions,\n core: DownloadCore,\n): Promise<ThemeInstallConfigurationResource> {\n const { applicationKey, activationId, themeInstallId, themeInstallConfigurationId } = options;\n if (!applicationKey) {\n throw new Error(\"An application key is required\");\n }\n if (activationId && (themeInstallId || themeInstallConfigurationId)) {\n throw new Error(\"An activation id can't be combined with a theme install id or theme install configuration id\");\n }\n if (themeInstallId && !themeInstallConfigurationId) {\n throw new Error(\"A theme install id also requires a theme install configuration id\");\n }\n\n core.spiffCoreConfiguration.setServerUrl(resolveMoonlightUrl(options.region, options.serverUrl));\n core.setApplicationKey(applicationKey);\n\n let gql: any;\n let source: string;\n if (themeInstallId && themeInstallConfigurationId) {\n source = `theme install ${themeInstallId} configuration ${themeInstallConfigurationId}`;\n gql = await core.getOverrideThemeConfiguration(themeInstallConfigurationId, themeInstallId);\n } else if (activationId) {\n source = `activation ${activationId}`;\n gql = (await core.getActivation(activationId))?.marketplaceThemeInstallConfiguration;\n } else {\n source = themeInstallConfigurationId\n ? `configuration ${themeInstallConfigurationId} of the current integration`\n : \"the current integration\";\n gql = (await core.getIntegration(applicationKey, themeInstallConfigurationId))\n ?.marketplaceThemeInstallConfiguration;\n }\n if (!gql) {\n throw new Error(\n `Couldn't find a theme install configuration for ${source}. Check the ids, application key and region.`,\n );\n }\n return expandThemeInstallConfigurationGraphQl(gql);\n}\n","import {\n CustomSchemaType,\n FieldType,\n ThemeConfigurationPageSettings,\n ThemeConfigurationSchema,\n ThemeConfigurationSchemaCustomSchema,\n ThemeConfigurationSchemaField,\n} from \"./configurationTypes\";\nimport { expandThemeInstallConfigurationGraphQl } from \"./download\";\nimport {\n ThemeInstallConfigurationFieldResource,\n ThemeInstallConfigurationResource,\n ThemeInstallPageSettings,\n ThemeVersionResource,\n} from \"./resourceTypes\";\n\n/**\n * Values for the fields of a schema, keyed by field `key`.\n * This is the inverse of `themeInstallConfigurationToRecordObject`:\n * - Text, Color and Select: a string\n * - Number: a number (or numeric string)\n * - Boolean: a boolean\n * - DateRange: `{ start, end }` (Date or ISO date string)\n * - Asset, ConversionConfiguration, ProductCollection, MetafieldConfiguration: the resource object\n * - List: an array of values\n * - Object: a record of values. When the field references a `Union` schema, include `schema` to choose the variant.\n */\nexport type ThemeInstallConfigurationValues = Record<string, any>;\n\n/** Overrides for the user-configured state of the theme's pages. Anything not listed keeps its default. */\nexport interface ThemeInstallPageSettingsOverrides {\n /** Keyed by page key. */\n pages?: Record<string, { enabled?: boolean }>;\n /** Keyed by group key. */\n groups?: Record<string, { pageOrder?: string[] }>;\n}\n\n/**\n * The contents of a local development overrides file. Only list what you want to change;\n * everything else is defaulted from the theme's schema.\n */\nexport interface ThemeInstallConfigurationOverrides {\n /** Field values keyed by field `key`. See `ThemeInstallConfigurationValues` for the accepted formats. */\n fields?: ThemeInstallConfigurationValues;\n /** Overrides for page settings. */\n pageSettings?: ThemeInstallPageSettingsOverrides;\n}\n\ntype SchemaFields = ThemeConfigurationSchemaField[];\n\nfunction resolveSchemaFields(\n schemaName: string,\n chosen: string | undefined,\n customSchemas: ThemeConfigurationSchemaCustomSchema[],\n seen: string[] = [],\n): { name: string; fields: SchemaFields } {\n if (seen.includes(schemaName)) {\n throw new Error(`Circular schema reference: ${[...seen, schemaName].join(\" -> \")}`);\n }\n const schema = customSchemas.find((s) => s.name === schemaName);\n if (!schema) {\n throw new Error(`Unknown custom schema \"${schemaName}\"`);\n }\n if (schema.type === CustomSchemaType.Union) {\n if (!chosen || !schema.schemas.includes(chosen)) {\n throw new Error(\n `Union schema \"${schemaName}\" requires a value with \\`schema\\` set to one of: ${schema.schemas.join(\", \")}`,\n );\n }\n return resolveSchemaFields(chosen, undefined, customSchemas, [...seen, schemaName]);\n }\n const inherited = (schema.extends ?? []).flatMap(\n (parent) => resolveSchemaFields(parent, undefined, customSchemas, [...seen, schemaName]).fields,\n );\n return { name: schemaName, fields: [...inherited, ...schema.fields] };\n}\n\nfunction toDateString(value: unknown): string {\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10);\n }\n return String(value);\n}\n\nfunction generateField(\n field: ThemeConfigurationSchemaField,\n value: any,\n customSchemas: ThemeConfigurationSchemaCustomSchema[],\n): ThemeInstallConfigurationFieldResource | undefined {\n if (field.type === FieldType.Heading) {\n return undefined;\n }\n const resource: ThemeInstallConfigurationFieldResource = {\n key: field.key,\n type: field.type,\n fallbackToDefaultConfiguration: false,\n };\n const defaultValue = (field as { defaultValue?: string }).defaultValue;\n const provided = value !== undefined && value !== null;\n\n switch (field.type) {\n case FieldType.Text:\n case FieldType.Color:\n case FieldType.Select:\n case FieldType.Number:\n case FieldType.Boolean:\n resource.value = provided ? String(value) : defaultValue;\n break;\n case FieldType.DateRange:\n resource.value = provided ? `${toDateString(value.start)},${toDateString(value.end)}` : defaultValue;\n break;\n case FieldType.Asset:\n resource.asset = provided ? value : undefined;\n break;\n case FieldType.ConversionConfiguration:\n resource.conversionConfiguration = provided ? value : undefined;\n break;\n case FieldType.ProductCollection:\n resource.productCollection = provided ? value : undefined;\n break;\n case FieldType.MetafieldConfiguration:\n resource.metafieldConfiguration = provided ? value : undefined;\n break;\n case FieldType.List:\n if (provided) {\n if (!Array.isArray(value)) {\n throw new Error(`Field \"${field.key}\" is a List and must be configured with an array`);\n }\n resource.listValues = value.map((entry) => {\n const item = generateField(\n { ...field.items, key: undefined, title: \"\" } as any,\n entry,\n customSchemas,\n );\n return item ?? { type: field.items.type };\n });\n }\n break;\n case FieldType.Object: {\n if (!provided) break;\n let fields: SchemaFields;\n if (field.schema) {\n const resolved = resolveSchemaFields(field.schema, value.schema, customSchemas);\n fields = resolved.fields;\n resource.schema = resolved.name;\n } else {\n fields = \"fields\" in field ? field.fields : [];\n }\n resource.objectValues = generateFields(fields, value, customSchemas);\n break;\n }\n }\n return resource;\n}\n\nfunction generateFields(\n fields: SchemaFields,\n values: ThemeInstallConfigurationValues,\n customSchemas: ThemeConfigurationSchemaCustomSchema[],\n): ThemeInstallConfigurationFieldResource[] {\n const result: ThemeInstallConfigurationFieldResource[] = [];\n for (const field of fields) {\n const resource = generateField(field, \"key\" in field ? values?.[field.key] : undefined, customSchemas);\n if (resource) {\n result.push(resource);\n }\n }\n return result;\n}\n\n/** Unknown keys usually mean a typo, or an overrides file saved from a different version of the theme. */\nfunction warnUnknownKeys(kind: string, provided: string[], known: string[]) {\n const unknown = provided.filter((key) => !known.includes(key));\n if (unknown.length > 0) {\n console.warn(\n `Ignoring unknown ${kind} ${unknown.map((k) => `\"${k}\"`).join(\", \")}. Expected one of: ${known.join(\", \")}`,\n );\n }\n}\n\nfunction generatePageSettings(\n settings: ThemeConfigurationPageSettings,\n overrides?: ThemeInstallPageSettingsOverrides,\n): ThemeInstallPageSettings {\n warnUnknownKeys(\n \"page\",\n Object.keys(overrides?.pages ?? {}),\n settings.pages.map((page) => page.key),\n );\n warnUnknownKeys(\n \"page group\",\n Object.keys(overrides?.groups ?? {}),\n settings.groups.map((group) => group.key),\n );\n return {\n groups: settings.groups.map((group) => {\n const pageOrder = overrides?.groups?.[group.key]?.pageOrder;\n return pageOrder ? { key: group.key, pageOrder } : { key: group.key };\n }),\n pages: settings.pages.map((page) => {\n const enabled = overrides?.pages?.[page.key]?.enabled;\n return enabled !== undefined ? { key: page.key, enabled } : { key: page.key };\n }),\n };\n}\n\nexport interface GenerateThemeInstallConfigurationFromOverridesOptions {\n /** The theme's configuration schema. */\n schema: ThemeConfigurationSchema;\n /** The theme's page settings definition, if it has one. */\n pageSettings?: ThemeConfigurationPageSettings;\n /** The contents of the overrides file. When omitted, the configuration is entirely defaults. */\n overrides?: ThemeInstallConfigurationOverrides;\n}\n\n/**\n * Generates a complete `ThemeInstallConfigurationResource` for local development, from the theme's schema and a\n * small overrides object (typically the contents of a JSON file) which lists only the field values and page\n * settings you want to change. Everything else is defaulted from the schema.\n *\n * Unknown field, page or group keys are ignored with a console warning.\n *\n * @example\n * // overrides.json: { \"fields\": { \"title\": \"Hello\" }, \"pageSettings\": { \"pages\": { \"faq\": { \"enabled\": false } } } }\n * const configuration = generateThemeInstallConfigurationFromOverrides({\n * schema: configurationSchema,\n * pageSettings,\n * overrides: JSON.parse(readFileSync(\"overrides.json\", \"utf-8\")),\n * });\n */\nexport function generateThemeInstallConfigurationFromOverrides(\n options: GenerateThemeInstallConfigurationFromOverridesOptions,\n): ThemeInstallConfigurationResource {\n const { schema, pageSettings, overrides } = options;\n warnUnknownKeys(\n \"field\",\n Object.keys(overrides?.fields ?? {}),\n schema.fields.flatMap((field) => (\"key\" in field ? [field.key] : [])),\n );\n const timestamp = \"2021-01-01T00:00:00Z\";\n const themeVersion: ThemeVersionResource = {\n id: \"local\",\n version: \"1.0.0\",\n createdAt: timestamp,\n updatedAt: timestamp,\n theme: { id: \"local\", name: \"Local Theme\", createdAt: timestamp, updatedAt: timestamp },\n launchData: { targetFiles: [] },\n configurationSchema: schema as unknown as ThemeVersionResource[\"configurationSchema\"],\n pageSettings,\n };\n return {\n id: \"local\",\n themeInstallId: \"local\",\n name: \"Local Configuration\",\n createdAt: timestamp,\n updatedAt: timestamp,\n themeVersion,\n fields: generateFields(schema.fields, overrides?.fields ?? {}, schema.customSchemas ?? []),\n pageSettings: pageSettings ? generatePageSettings(pageSettings, overrides?.pageSettings) : undefined,\n };\n}\n\n/** The inverse of `generateField`: turns an install field back into the value format used in overrides. */\nfunction fieldToValue(field: ThemeInstallConfigurationFieldResource): any {\n switch (field.type) {\n case FieldType.Asset:\n return field.asset ?? undefined;\n case FieldType.ConversionConfiguration:\n return field.conversionConfiguration ?? undefined;\n case FieldType.ProductCollection:\n return field.productCollection ?? undefined;\n case FieldType.MetafieldConfiguration:\n return field.metafieldConfiguration ?? undefined;\n case FieldType.DateRange: {\n const [start, end] = field.value?.split(\",\") ?? [];\n return start && end ? { start, end } : undefined;\n }\n case FieldType.List:\n return field.listValues?.map(fieldToValue);\n case FieldType.Object: {\n if (!field.objectValues) return undefined;\n const record = fieldsToRecord(field.objectValues);\n return field.schema ? { ...record, schema: field.schema } : record;\n }\n case FieldType.Number: {\n const number = Number.parseFloat(field.value ?? \"\");\n return Number.isNaN(number) ? undefined : number;\n }\n case FieldType.Boolean:\n return field.value === null || field.value === undefined ? undefined : field.value === \"true\";\n case FieldType.Heading:\n return undefined;\n default:\n return field.value ?? undefined;\n }\n}\n\nfunction fieldsToRecord(fields: ThemeInstallConfigurationFieldResource[]): ThemeInstallConfigurationValues {\n const record: ThemeInstallConfigurationValues = {};\n for (const field of fields) {\n if (!field.key) continue;\n const value = fieldToValue(field);\n if (value !== undefined) {\n record[field.key] = value;\n }\n }\n return record;\n}\n\n/** JSON.stringify with sorted keys, so structurally equal values compare equal. */\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(value, (_key, v) =>\n v && typeof v === \"object\" && !Array.isArray(v)\n ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => a.localeCompare(b)))\n : v,\n );\n}\n\n/**\n * The inverse of `generateThemeInstallConfigurationFromOverrides`: reduces a complete\n * `ThemeInstallConfigurationResource` (for example one downloaded from Spiff Commerce) to an overrides object that\n * lists only what differs from the defaults of its own schema.\n */\nexport function themeInstallConfigurationToOverrides(\n configuration: ThemeInstallConfigurationResource,\n): ThemeInstallConfigurationOverrides {\n // Without a schema there are no defaults to compare to, so every configured value is kept.\n const schema = (configuration.themeVersion?.configurationSchema ?? {\n fields: [],\n }) as unknown as ThemeConfigurationSchema;\n const customSchemas = schema.customSchemas ?? [];\n const defaults = fieldsToRecord(generateFields(schema.fields, {}, customSchemas));\n const fields: ThemeInstallConfigurationValues = {};\n for (const [key, value] of Object.entries(fieldsToRecord(configuration.fields))) {\n if (stableStringify(value) !== stableStringify(defaults[key])) {\n fields[key] = value;\n }\n }\n\n const pages: ThemeInstallPageSettingsOverrides[\"pages\"] = {};\n for (const page of configuration.pageSettings?.pages ?? []) {\n if (page.enabled !== undefined) pages[page.key] = { enabled: page.enabled };\n }\n const groups: ThemeInstallPageSettingsOverrides[\"groups\"] = {};\n for (const group of configuration.pageSettings?.groups ?? []) {\n if (group.pageOrder) groups[group.key] = { pageOrder: group.pageOrder };\n }\n\n const overrides: ThemeInstallConfigurationOverrides = {};\n if (Object.keys(fields).length > 0) overrides.fields = fields;\n if (Object.keys(pages).length > 0 || Object.keys(groups).length > 0) {\n overrides.pageSettings = {\n ...(Object.keys(pages).length > 0 && { pages }),\n ...(Object.keys(groups).length > 0 && { groups }),\n };\n }\n return overrides;\n}\n\n/**\n * Extracts overrides from a `ThemeInstallConfigurationGraphQl` (the flattened format that themes previously loaded\n * from a local JSON file, with fields marked `root`). If the object has no `themeVersion.configurationSchema`,\n * defaults can't be detected, so every configured value is kept.\n */\nexport function themeInstallConfigurationGraphQlToOverrides(gql: any): ThemeInstallConfigurationOverrides {\n return themeInstallConfigurationToOverrides(expandThemeInstallConfigurationGraphQl(gql));\n}\n"],"names":["themeVersionFieldToResource","field","allFields","resource","idx","themeVersionConfigurationGraphQlToResource","gql","schema","fieldIdx","resourceFields","themeVersionGraphQlToResource","themeInstallFieldToResource","themeInstallConfigurationGraphQlToResource","MOONLIGHT_REGIONS","stripTypenames","value","key","entry","expandThemeInstallConfigurationGraphQl","clean","resolveMoonlightUrl","region","serverUrl","downloadThemeInstallConfiguration","options","core","applicationKey","activationId","themeInstallId","themeInstallConfigurationId","source","resolveSchemaFields","schemaName","chosen","customSchemas","seen","CustomSchemaType","inherited","parent","toDateString","generateField","FieldType","defaultValue","provided","fields","resolved","generateFields","values","result","warnUnknownKeys","kind","known","unknown","k","generatePageSettings","settings","overrides","page","group","pageOrder","enabled","generateThemeInstallConfigurationFromOverrides","pageSettings","timestamp","fieldToValue","start","end","record","fieldsToRecord","number","stableStringify","_key","v","a","b","themeInstallConfigurationToOverrides","configuration","defaults","pages","groups","themeInstallConfigurationGraphQlToOverrides"],"mappings":"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"}
|