@kotao/storefront 0.2.5 → 0.2.6
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 +50 -2
- package/dist/bridge-ZKbKqgFd.d.ts +239 -0
- package/dist/cart-documents-BLavRDiu.d.ts +89 -0
- package/dist/cart-documents.d.ts +1 -2
- package/dist/cart-documents.js +1 -1
- package/dist/{chunk-M7BPQ54D.js → chunk-2MRB6SMP.js} +4 -3
- package/dist/chunk-2MRB6SMP.js.map +1 -0
- package/dist/chunk-CKGI3Y7L.js +19 -0
- package/dist/chunk-CKGI3Y7L.js.map +1 -0
- package/dist/{chunk-GGOZELAA.js → chunk-EG34HLSX.js} +209 -162
- package/dist/chunk-EG34HLSX.js.map +1 -0
- package/dist/chunk-O6YZEY7X.js +1382 -0
- package/dist/chunk-O6YZEY7X.js.map +1 -0
- package/dist/{chunk-MCIFKJQK.js → chunk-R4N565GX.js} +5 -2
- package/dist/chunk-R4N565GX.js.map +1 -0
- package/dist/{chunk-XMTWFJCZ.js → chunk-RFM27BKZ.js} +31 -7
- package/dist/chunk-RFM27BKZ.js.map +1 -0
- package/dist/{chunk-MYDKIJRH.js → chunk-SVMYFYIA.js} +2 -2
- package/dist/{chunk-MYDKIJRH.js.map → chunk-SVMYFYIA.js.map} +1 -1
- package/dist/{chunk-H3D7BAOL.js → chunk-VOTBNOWH.js} +21 -3
- package/dist/chunk-VOTBNOWH.js.map +1 -0
- package/dist/{chunk-PXVDVUFX.js → chunk-W74FGUZH.js} +10 -3
- package/dist/chunk-W74FGUZH.js.map +1 -0
- package/dist/{chunk-2IWNUDSZ.js → chunk-WNXI3MPM.js} +2 -2
- package/dist/chunk-WNXI3MPM.js.map +1 -0
- package/dist/chunk-XXNCFWXT.js +2118 -0
- package/dist/chunk-XXNCFWXT.js.map +1 -0
- package/dist/{client-bsiNPHBi.d.ts → client-CwOPPpFF.d.ts} +11 -1
- package/dist/{createCartHandler-C4RrPwSG.d.ts → createCartHandler-7DdKB-GF.d.ts} +1 -1
- package/dist/custom-css-Bl7Ur3-H.d.ts +6 -0
- package/dist/editor.d.ts +57 -104
- package/dist/editor.js +270 -1
- package/dist/editor.js.map +1 -1
- package/dist/events-react.d.ts +1 -1
- package/dist/events-react.js +1 -1
- package/dist/events.d.ts +3 -3
- package/dist/events.js +1 -1
- package/dist/{fetch-M3Y-fQrW.d.ts → fetch-Bq_cc8_G.d.ts} +5 -0
- package/dist/hydrogen-Bu7k0kE4.d.ts +259 -0
- package/dist/index.d.ts +74 -51
- package/dist/index.js +19 -15
- package/dist/index.js.map +1 -1
- package/dist/react-router.d.ts +30 -9
- package/dist/react-router.js +16 -7
- package/dist/react-router.js.map +1 -1
- package/dist/react.d.ts +79 -11
- package/dist/react.js +279 -10
- package/dist/react.js.map +1 -1
- package/dist/{routing-sEonP93J.d.ts → routing-Bz3Cg0BW.d.ts} +36 -6
- package/dist/seo.d.ts +7 -4
- package/dist/seo.js +2 -2
- package/dist/settings.d.ts +14 -4
- package/dist/settings.js +2 -2
- package/dist/{shop-BJSvtmnV.d.ts → shop-CnrnSAJw.d.ts} +33 -6
- package/dist/{store-CtCWHI8H.d.ts → store-DO08fzJi.d.ts} +1 -1
- package/dist/storefront-api-types.d.ts +12 -0
- package/dist/{types-BDhHWZsP.d.ts → types-BkY0yET-.d.ts} +3 -3
- package/dist/{types-bcbQzx87.d.ts → types-DZX8ScsJ.d.ts} +2 -0
- package/package.json +4 -4
- package/dist/cart-documents-CwwRTvm8.d.ts +0 -21
- package/dist/chunk-2IWNUDSZ.js.map +0 -1
- package/dist/chunk-GGOZELAA.js.map +0 -1
- package/dist/chunk-H3D7BAOL.js.map +0 -1
- package/dist/chunk-M7BPQ54D.js.map +0 -1
- package/dist/chunk-MCIFKJQK.js.map +0 -1
- package/dist/chunk-PXVDVUFX.js.map +0 -1
- package/dist/chunk-PXZ737N3.js +0 -439
- package/dist/chunk-PXZ737N3.js.map +0 -1
- package/dist/chunk-XMTWFJCZ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/settings/merge.ts","../src/settings/store.ts","../src/settings/reconcile-synthetic.ts"],"names":["section","block"],"mappings":"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","file":"chunk-VOTBNOWH.js","sourcesContent":["/**\n * The settings-as-data merge engine (ADR-0003 §\"Settings-as-data customizer\", #93). Pure: it resolves\n * a section's effective settings with the universal three-layer order\n *\n * stored value → preset value → input `defaultValue`\n *\n * and composes that over a whole values document (`resolveThemeSettings`). It lives in the SDK (not a\n * commerce module) because it consumes `@kotao/storefront-contracts` types — the storefront layer that\n * may import them (turbo boundaries forbids a module from doing so). The per-shop stored values come from\n * the web module's settings store, read server-side and handed to the SDK as a snapshot.\n */\nimport type {\n Preset,\n SectionInstance,\n SectionSchema,\n SettingInput,\n ValuesDocument,\n} from '@kotao/storefront-contracts/theme'\n\nimport type {\n ResolvedSection,\n ResolvedSettings,\n ResolvedValuesDocument,\n ThemeSettingsSnapshot,\n} from './types'\n\nexport type {\n ResolvedBlock,\n ResolvedSection,\n ResolvedSettings,\n ResolvedValuesDocument,\n ThemeSettingsSnapshot,\n} from './types'\n\n/**\n * Resolve one settings layer: for every input the schema declares, take the stored value, else the\n * preset value, else the input's `defaultValue`. Only declared inputs appear (stray stored keys for\n * removed settings are dropped).\n */\nexport function mergeSettings(\n inputs: readonly SettingInput[],\n stored: Readonly<Record<string, unknown>> | undefined,\n preset: Readonly<Record<string, unknown>> | undefined,\n): ResolvedSettings {\n const out: ResolvedSettings = {}\n for (const input of inputs) {\n const storedValue = stored?.[input.name]\n const presetValue = preset?.[input.name]\n out[input.name] =\n storedValue !== undefined\n ? storedValue\n : presetValue !== undefined\n ? presetValue\n : input.defaultValue\n }\n return out\n}\n\n/**\n * Resolve a full section instance: its settings plus each contained block's settings, all three-layer\n * merged against the section's schema (block instances come from the stored values).\n */\nexport function mergeSection(args: {\n readonly schema: SectionSchema\n readonly preset?: Preset\n readonly instance?: SectionInstance\n}): ResolvedSection {\n const settings = mergeSettings(\n args.schema.settings,\n args.instance?.settings,\n args.preset?.settings,\n )\n if (args.instance?.settings.disabled === true) settings.disabled = true\n const blockDefs = new Map((args.schema.blocks ?? []).map((b) => [b.type, b] as const))\n const blocks = (args.instance?.blocks ?? []).map((b) => ({\n ...(b.id !== undefined ? { id: b.id } : {}),\n type: b.type,\n settings: mergeSettings(blockDefs.get(b.type)?.settings ?? [], b.settings, undefined),\n }))\n return { id: args.instance?.id ?? '', type: args.schema.type, settings, blocks }\n}\n\nexport interface ResolveThemeSettingsArgs {\n /** Section schemas keyed by section `type` (from the deployment manifest). */\n readonly schemas: Readonly<Record<string, SectionSchema>>\n /** Optional default preset per section `type`. */\n readonly presets?: Readonly<Record<string, Preset>>\n /** The per-shop stored values document (from the web module's settings store). */\n readonly values: ValuesDocument\n /** Template-specific values documents, keyed by handles like `index`, `product`, or `cart`. */\n readonly templates?: Partial<Record<string, ValuesDocument>>\n /** Layout section-group values documents, keyed by handles like `header-group`. */\n readonly sectionGroups?: Partial<Record<string, ValuesDocument>>\n /** Global theme-token inputs (logo/colors/fonts), merged the same way. */\n readonly globalInputs?: readonly SettingInput[]\n readonly globalStored?: Readonly<Record<string, unknown>>\n readonly globalPreset?: Readonly<Record<string, unknown>>\n}\n\nfunction resolveValuesDocument(\n args: Pick<ResolveThemeSettingsArgs, 'presets' | 'schemas'>,\n values: ValuesDocument,\n): ResolvedValuesDocument {\n const sections = values.sections.map((instance): ResolvedSection => {\n const schema = args.schemas[instance.type]\n if (schema === undefined) {\n // Unknown section type (theme dropped it) — pass stored values through untouched; nothing to merge.\n return {\n id: instance.id,\n type: instance.type,\n settings: instance.settings,\n blocks: instance.blocks.map((b) => ({\n ...(b.id !== undefined ? { id: b.id } : {}),\n type: b.type,\n settings: b.settings,\n })),\n }\n }\n const preset = args.presets?.[instance.type]\n return mergeSection({ schema, instance, ...(preset !== undefined ? { preset } : {}) })\n })\n return { shopId: values.shopId, sections }\n}\n\nfunction resolveDocumentRecord(\n args: Pick<ResolveThemeSettingsArgs, 'presets' | 'schemas'>,\n documents: Partial<Record<string, ValuesDocument>> | undefined,\n): Readonly<Record<string, ResolvedValuesDocument>> | undefined {\n if (documents === undefined) return undefined\n const resolved: Record<string, ResolvedValuesDocument> = {}\n for (const [handle, document] of Object.entries(documents)) {\n if (document !== undefined) resolved[handle] = resolveValuesDocument(args, document)\n }\n return resolved\n}\n\n/** Compose the merge over an entire values document → the snapshot a theme renders from. */\nexport function resolveThemeSettings(args: ResolveThemeSettingsArgs): ThemeSettingsSnapshot {\n const root = resolveValuesDocument(args, args.values)\n const global = mergeSettings(args.globalInputs ?? [], args.globalStored, args.globalPreset)\n const templates = resolveDocumentRecord(args, args.templates)\n const sectionGroups = resolveDocumentRecord(args, args.sectionGroups)\n return {\n sections: root.sections,\n global,\n ...(templates !== undefined ? { templates } : {}),\n ...(sectionGroups !== undefined ? { sectionGroups } : {}),\n }\n}\n","/**\n * Framework-agnostic theme-settings store (#93). Holds the merged {@link ThemeSettingsSnapshot} and lets\n * subscribers react to live edits. In plain runtime the snapshot is the stable server-provided value and\n * never changes; in the visual editor, postMessage-driven setting patches call `patchSection`/`patchGlobal`\n * so the React binding (useSyncExternalStore) re-renders without a reload. `getSnapshot` returns a stable\n * reference between patches (a new one only on change), as useSyncExternalStore requires.\n */\nimport type {\n ResolvedBlock,\n ResolvedSection,\n ResolvedSettings,\n ResolvedValuesDocument,\n ThemeSettingsSnapshot,\n} from './types'\n\nexport interface ThemeSettingsStore {\n getSnapshot(): ThemeSettingsSnapshot\n subscribe(listener: () => void): () => void\n /** Replace a section instance's resolved settings (editor live-patch); no-op if the id is unknown. */\n patchSection(instanceId: string, settings: ResolvedSettings): void\n /** Insert a fully-resolved section instance (editor live-add); reserved ids are ignored. */\n insertSection(section: ResolvedSection, index?: number): void\n /** Remove one section instance (editor live-delete); no-op if unknown. */\n removeSection(instanceId: string): void\n /** Move one section instance to a new position (editor live-reorder); no-op if unknown. */\n moveSection(instanceId: string, index: number): void\n /** Replace the global theme tokens (editor live-patch). */\n patchGlobal(settings: ResolvedSettings): void\n /** Replace a block instance's resolved settings; no-op if section/block is unknown. */\n patchBlock(sectionId: string, blockId: string, settings: ResolvedSettings): void\n /** Insert a fully-resolved block instance into a section. */\n insertBlock(sectionId: string, block: ResolvedBlock, index?: number): void\n /** Remove one block instance from a section. */\n removeBlock(sectionId: string, blockId: string): void\n /** Move one block instance to a new position inside a section. */\n moveBlock(sectionId: string, blockId: string, index: number): void\n /** Replace all preview sections from a template values document. */\n replaceSections(sections: readonly ResolvedSection[]): void\n /** Replace one layout section group document, such as header or footer. */\n replaceSectionGroup(handle: string, document: ResolvedValuesDocument): void\n}\n\nexport function createThemeSettingsStore(initial: ThemeSettingsSnapshot): ThemeSettingsStore {\n let snapshot = initial\n const listeners = new Set<() => void>()\n const clampIndex = (index: number | undefined, length: number): number => {\n if (index === undefined || Number.isNaN(index)) return length\n return Math.max(0, Math.min(Math.trunc(index), length))\n }\n const emit = (): void => {\n for (const listener of listeners) listener()\n }\n const updateSection = (\n sectionId: string,\n update: (section: ResolvedSection) => ResolvedSection | null,\n ): boolean => {\n if (sectionId.startsWith('theme:')) return false\n let changed = false\n const sections = snapshot.sections.map((section) => {\n if (section.id !== sectionId) return section\n const next = update(section)\n if (next === null || next === section) return section\n changed = true\n return next\n })\n if (!changed) return false\n snapshot = { ...snapshot, sections }\n emit()\n return true\n }\n return {\n getSnapshot: () => snapshot,\n subscribe: (listener) => {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n patchSection: (instanceId, settings) => {\n if (instanceId.startsWith('theme:')) return\n let changed = false\n const sections = snapshot.sections.map((section) => {\n if (section.id !== instanceId) return section\n changed = true\n return { ...section, settings }\n })\n if (!changed) return // unknown instance → no new snapshot, no notify\n snapshot = { ...snapshot, sections }\n emit()\n },\n insertSection: (section, index) => {\n if (section.id.startsWith('theme:')) return\n if (snapshot.sections.some((existing) => existing.id === section.id)) return\n const next = [...snapshot.sections]\n next.splice(clampIndex(index, next.length), 0, section)\n snapshot = { ...snapshot, sections: next }\n emit()\n },\n removeSection: (instanceId) => {\n if (instanceId.startsWith('theme:')) return\n const sections = snapshot.sections.filter((section) => section.id !== instanceId)\n if (sections.length === snapshot.sections.length) return\n snapshot = { ...snapshot, sections }\n emit()\n },\n moveSection: (instanceId, index) => {\n if (instanceId.startsWith('theme:')) return\n const fromIndex = snapshot.sections.findIndex((section) => section.id === instanceId)\n if (fromIndex === -1) return\n const next = [...snapshot.sections]\n const [section] = next.splice(fromIndex, 1)\n if (section === undefined) return\n const toIndex = clampIndex(index, next.length)\n if (fromIndex === toIndex) return\n next.splice(toIndex, 0, section)\n snapshot = { ...snapshot, sections: next }\n emit()\n },\n patchGlobal: (settings) => {\n if (settings === snapshot.global) return // same ref → no-op (symmetric with patchSection)\n snapshot = { ...snapshot, global: settings }\n emit()\n },\n patchBlock: (sectionId, blockId, settings) => {\n updateSection(sectionId, (section) => {\n let changed = false\n const blocks = section.blocks.map((block) => {\n if (block.id !== blockId) return block\n changed = true\n return { ...block, settings }\n })\n return changed ? { ...section, blocks } : null\n })\n },\n insertBlock: (sectionId, block, index) => {\n updateSection(sectionId, (section) => {\n if (block.id !== undefined && section.blocks.some((existing) => existing.id === block.id)) {\n return null\n }\n const blocks = [...section.blocks]\n blocks.splice(clampIndex(index, blocks.length), 0, block)\n return { ...section, blocks }\n })\n },\n removeBlock: (sectionId, blockId) => {\n updateSection(sectionId, (section) => {\n const blocks = section.blocks.filter((block) => block.id !== blockId)\n return blocks.length === section.blocks.length ? null : { ...section, blocks }\n })\n },\n moveBlock: (sectionId, blockId, index) => {\n updateSection(sectionId, (section) => {\n const fromIndex = section.blocks.findIndex((block) => block.id === blockId)\n if (fromIndex === -1) return null\n const blocks = [...section.blocks]\n const [block] = blocks.splice(fromIndex, 1)\n if (block === undefined) return null\n const toIndex = clampIndex(index, blocks.length)\n if (fromIndex === toIndex) return null\n blocks.splice(toIndex, 0, block)\n return { ...section, blocks }\n })\n },\n replaceSections: (sections) => {\n const next = sections.filter((section) => !section.id.startsWith('theme:'))\n if (\n next.length === snapshot.sections.length &&\n next.every((section, index) => section === snapshot.sections[index])\n ) {\n return\n }\n snapshot = { ...snapshot, sections: next }\n emit()\n },\n replaceSectionGroup: (handle, document) => {\n if (handle.trim() === '') return\n const sectionGroups = snapshot.sectionGroups ?? {}\n const nextDocument: ResolvedValuesDocument = {\n ...document,\n sections: document.sections.filter((section) => !section.id.startsWith('theme:')),\n }\n if (sectionGroups[handle] === nextDocument) return\n snapshot = {\n ...snapshot,\n sectionGroups: {\n ...sectionGroups,\n [handle]: nextDocument,\n },\n }\n emit()\n },\n }\n}\n","import type { ValuesDocument } from '@kotao/storefront-contracts/theme'\n\n/**\n * Reconcile a platform-derived layout group with previously published merchant values.\n *\n * Synthetic groups such as `layout-static` are rebuilt from layout/theme.liquid and are not\n * merchant-editable section groups. The current document therefore owns membership and order.\n * Stored values only enrich matching instances, so removed/guarded sections cannot return after a\n * runtime rebuild while saved settings for drawers and other surviving furniture remain intact.\n */\nexport function reconcileSyntheticSectionGroup(\n current: ValuesDocument,\n stored: ValuesDocument | null | undefined,\n): ValuesDocument {\n if (stored === null || stored === undefined) return current\n const storedById = new Map(stored.sections.map((section) => [section.id, section]))\n return {\n shopId: stored.shopId,\n sections: current.sections.map((section) => {\n const saved = storedById.get(section.id)\n if (saved === undefined || saved.type !== section.type) return section\n return {\n ...section,\n ...saved,\n settings: { ...section.settings, ...saved.settings },\n }\n }),\n }\n}\n"]}
|
|
@@ -112,8 +112,14 @@ function escapeXml(value) {
|
|
|
112
112
|
return value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
113
113
|
}
|
|
114
114
|
function buildSitemapXml(entries) {
|
|
115
|
+
const hasAlternates = entries.some((entry) => (entry.alternates?.length ?? 0) > 0);
|
|
115
116
|
const urls = entries.map((entry) => {
|
|
116
117
|
const parts = [` <loc>${escapeXml(entry.loc)}</loc>`];
|
|
118
|
+
for (const alternate of entry.alternates ?? []) {
|
|
119
|
+
parts.push(
|
|
120
|
+
` <xhtml:link rel="alternate" hreflang="${escapeXml(alternate.hreflang)}" href="${escapeXml(alternate.href)}" />`
|
|
121
|
+
);
|
|
122
|
+
}
|
|
117
123
|
if (entry.lastmod !== void 0)
|
|
118
124
|
parts.push(` <lastmod>${escapeXml(entry.lastmod)}</lastmod>`);
|
|
119
125
|
if (entry.changefreq !== void 0)
|
|
@@ -127,8 +133,9 @@ function buildSitemapXml(entries) {
|
|
|
127
133
|
${parts.join("\n")}
|
|
128
134
|
</url>`;
|
|
129
135
|
}).join("\n");
|
|
136
|
+
const alternateNamespace = hasAlternates ? ' xmlns:xhtml="http://www.w3.org/1999/xhtml"' : "";
|
|
130
137
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
131
|
-
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
138
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"${alternateNamespace}>
|
|
132
139
|
${urls}
|
|
133
140
|
</urlset>
|
|
134
141
|
`;
|
|
@@ -211,5 +218,5 @@ async function storefrontRedirect(options) {
|
|
|
211
218
|
}
|
|
212
219
|
|
|
213
220
|
export { URL_REDIRECT_QUERY, breadcrumbListJsonLd, buildRobotsTxt, buildSitemapIndexXml, buildSitemapXml, localBusinessJsonLd, organizationJsonLd, productJsonLd, resolveRedirect, resolveStorefrontRedirect, restaurantJsonLd, robotsResponse, sitemapIndexResponse, sitemapResponse, storefrontRedirect, websiteJsonLd };
|
|
214
|
-
//# sourceMappingURL=chunk-
|
|
215
|
-
//# sourceMappingURL=chunk-
|
|
221
|
+
//# sourceMappingURL=chunk-W74FGUZH.js.map
|
|
222
|
+
//# sourceMappingURL=chunk-W74FGUZH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/seo/json-ld/common.ts","../src/seo/json-ld/product.ts","../src/seo/json-ld/local-business.ts","../src/seo/sitemap.ts","../src/seo/robots.ts","../src/seo/redirects.ts"],"names":[],"mappings":"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","file":"chunk-W74FGUZH.js","sourcesContent":["import type { JsonLd } from '../types'\n\n/** Drop undefined / null / '' / empty-array fields so JSON-LD never renders empty or null values. */\nexport function compact(obj: Record<string, unknown>): JsonLd {\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined || value === null || value === '') continue\n if (Array.isArray(value) && value.length === 0) continue\n out[key] = value\n }\n return out\n}\n\nconst SCHEMA = 'https://schema.org'\n\nexport interface BreadcrumbItem {\n readonly name: string\n readonly url: string\n}\n\nexport function breadcrumbListJsonLd(items: readonly BreadcrumbItem[]): JsonLd {\n return {\n '@context': SCHEMA,\n '@type': 'BreadcrumbList',\n itemListElement: items.map((item, index) => ({\n '@type': 'ListItem',\n position: index + 1,\n name: item.name,\n item: item.url,\n })),\n }\n}\n\nexport interface OrganizationInput {\n readonly name: string\n readonly url?: string\n readonly logo?: string\n readonly sameAs?: readonly string[]\n}\n\nexport function organizationJsonLd(input: OrganizationInput): JsonLd {\n return compact({\n '@context': SCHEMA,\n '@type': 'Organization',\n name: input.name,\n url: input.url,\n logo: input.logo,\n sameAs: input.sameAs,\n })\n}\n\nexport interface WebSiteInput {\n readonly name: string\n readonly url: string\n /** A URL template with `{search_term_string}` to enable the sitelinks search box. */\n readonly searchUrlTemplate?: string\n}\n\nexport function websiteJsonLd(input: WebSiteInput): JsonLd {\n return compact({\n '@context': SCHEMA,\n '@type': 'WebSite',\n name: input.name,\n url: input.url,\n potentialAction:\n input.searchUrlTemplate !== undefined\n ? {\n '@type': 'SearchAction',\n target: { '@type': 'EntryPoint', urlTemplate: input.searchUrlTemplate },\n 'query-input': 'required name=search_term_string',\n }\n : undefined,\n })\n}\n","import type { JsonLd } from '../types'\nimport { compact } from './common'\n\nexport interface OfferInput {\n readonly price: string | number\n readonly currency: string\n /** schema.org ItemAvailability short name, e.g. 'InStock' | 'OutOfStock' | 'PreOrder'. */\n readonly availability?: string\n readonly url?: string\n readonly sku?: string\n}\n\nexport interface ProductJsonLdInput {\n readonly name: string\n readonly description?: string\n readonly sku?: string\n readonly image?: string | readonly string[]\n readonly brand?: string\n readonly url?: string\n readonly offer?: OfferInput\n}\n\nfunction offerJsonLd(offer: OfferInput): JsonLd {\n return compact({\n '@type': 'Offer',\n price: String(offer.price),\n priceCurrency: offer.currency,\n availability:\n offer.availability !== undefined ? `https://schema.org/${offer.availability}` : undefined,\n url: offer.url,\n sku: offer.sku,\n })\n}\n\nexport function productJsonLd(input: ProductJsonLdInput): JsonLd {\n return compact({\n '@context': 'https://schema.org',\n '@type': 'Product',\n name: input.name,\n description: input.description,\n sku: input.sku,\n image: input.image,\n brand: input.brand !== undefined ? { '@type': 'Brand', name: input.brand } : undefined,\n url: input.url,\n offers: input.offer !== undefined ? offerJsonLd(input.offer) : undefined,\n })\n}\n","import type { JsonLd } from '../types'\nimport { compact } from './common'\n\nexport interface AddressInput {\n readonly streetAddress?: string\n readonly locality?: string\n readonly region?: string\n readonly postalCode?: string\n readonly country?: string\n}\n\nexport interface GeoInput {\n readonly latitude: number\n readonly longitude: number\n}\n\nexport interface LocalBusinessInput {\n readonly name: string\n /** schema.org type, e.g. 'LocalBusiness' | 'Restaurant' | 'Store'. Defaults to 'LocalBusiness'. */\n readonly type?: string\n readonly url?: string\n readonly telephone?: string\n readonly priceRange?: string\n readonly image?: string | readonly string[]\n readonly address?: AddressInput\n readonly geo?: GeoInput\n /** schema.org openingHours strings, e.g. ['Mo-Fr 09:00-17:00', 'Sa 10:00-14:00']. */\n readonly openingHours?: readonly string[]\n /** Restaurant fields (used when type is 'Restaurant'). */\n readonly servesCuisine?: string | readonly string[]\n readonly menu?: string\n readonly acceptsReservations?: boolean\n}\n\nfunction addressJsonLd(address: AddressInput): JsonLd {\n return compact({\n '@type': 'PostalAddress',\n streetAddress: address.streetAddress,\n addressLocality: address.locality,\n addressRegion: address.region,\n postalCode: address.postalCode,\n addressCountry: address.country,\n })\n}\n\n/**\n * LocalBusiness JSON-LD — the brick-and-mortar / restaurant differentiator beyond Shopify's defaults\n * (the SDK table calls this out). `restaurantJsonLd` is the same builder pinned to `Restaurant`.\n */\nexport function localBusinessJsonLd(input: LocalBusinessInput): JsonLd {\n return compact({\n '@context': 'https://schema.org',\n '@type': input.type ?? 'LocalBusiness',\n name: input.name,\n url: input.url,\n telephone: input.telephone,\n priceRange: input.priceRange,\n image: input.image,\n address: input.address !== undefined ? addressJsonLd(input.address) : undefined,\n geo:\n input.geo !== undefined\n ? {\n '@type': 'GeoCoordinates',\n latitude: input.geo.latitude,\n longitude: input.geo.longitude,\n }\n : undefined,\n openingHours: input.openingHours,\n servesCuisine: input.servesCuisine,\n hasMenu: input.menu,\n acceptsReservations: input.acceptsReservations,\n })\n}\n\nexport function restaurantJsonLd(input: Omit<LocalBusinessInput, 'type'>): JsonLd {\n return localBusinessJsonLd({ ...input, type: 'Restaurant' })\n}\n","/**\n * sitemap.xml + sitemap-index factories. The entry source is injected (the caller resolves it from the\n * Storefront API or a search index — an open question, NOT decided here): build the entry list, then call\n * these. The index shape exists so large catalogs split into child sitemaps rather than one document.\n */\n\nimport type { Alternate } from './types'\n\nexport type ChangeFreq = 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n\nexport interface SitemapEntry {\n readonly loc: string\n readonly lastmod?: string\n readonly changefreq?: ChangeFreq\n /** 0.0–1.0 (clamped). */\n readonly priority?: number\n /** Reciprocal language variants for this URL, including x-default when applicable. */\n readonly alternates?: readonly Alternate[]\n}\n\nexport interface SitemapIndexEntry {\n readonly loc: string\n readonly lastmod?: string\n}\n\nconst XML_CONTENT_TYPE = 'application/xml; charset=utf-8'\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n}\n\nexport function buildSitemapXml(entries: readonly SitemapEntry[]): string {\n const hasAlternates = entries.some((entry) => (entry.alternates?.length ?? 0) > 0)\n const urls = entries\n .map((entry) => {\n const parts = [` <loc>${escapeXml(entry.loc)}</loc>`]\n for (const alternate of entry.alternates ?? []) {\n parts.push(\n ` <xhtml:link rel=\"alternate\" hreflang=\"${escapeXml(alternate.hreflang)}\" href=\"${escapeXml(alternate.href)}\" />`,\n )\n }\n if (entry.lastmod !== undefined)\n parts.push(` <lastmod>${escapeXml(entry.lastmod)}</lastmod>`)\n if (entry.changefreq !== undefined)\n parts.push(` <changefreq>${entry.changefreq}</changefreq>`)\n if (entry.priority !== undefined) {\n parts.push(\n ` <priority>${Math.max(0, Math.min(1, entry.priority)).toFixed(1)}</priority>`,\n )\n }\n return ` <url>\\n${parts.join('\\n')}\\n </url>`\n })\n .join('\\n')\n const alternateNamespace = hasAlternates ? ' xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"' : ''\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"${alternateNamespace}>\\n${urls}\\n</urlset>\\n`\n}\n\nexport function buildSitemapIndexXml(sitemaps: readonly SitemapIndexEntry[]): string {\n const items = sitemaps\n .map((sitemap) => {\n const parts = [` <loc>${escapeXml(sitemap.loc)}</loc>`]\n if (sitemap.lastmod !== undefined)\n parts.push(` <lastmod>${escapeXml(sitemap.lastmod)}</lastmod>`)\n return ` <sitemap>\\n${parts.join('\\n')}\\n </sitemap>`\n })\n .join('\\n')\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${items}\\n</sitemapindex>\\n`\n}\n\nexport function sitemapResponse(entries: readonly SitemapEntry[]): Response {\n return new Response(buildSitemapXml(entries), { headers: { 'content-type': XML_CONTENT_TYPE } })\n}\n\nexport function sitemapIndexResponse(sitemaps: readonly SitemapIndexEntry[]): Response {\n return new Response(buildSitemapIndexXml(sitemaps), {\n headers: { 'content-type': XML_CONTENT_TYPE },\n })\n}\n","/**\n * robots.txt factory. Non-production / preview deployments auto-disallow ALL crawling; production allows\n * and references the sitemap. `production` comes from the SDK's stage signal (context.env), NEVER the\n * request Host/URL (stage-pinned-config rule, AGENTS.md §Environments).\n */\nexport interface RobotsOptions {\n readonly production: boolean\n readonly sitemapUrl?: string\n /** Path prefixes to Disallow in production (e.g. /cart, /checkout — Shopify parity). */\n readonly disallow?: readonly string[]\n}\n\nexport function buildRobotsTxt(options: RobotsOptions): string {\n if (!options.production) {\n return 'User-agent: *\\nDisallow: /\\n'\n }\n const lines = ['User-agent: *', 'Allow: /']\n for (const path of options.disallow ?? []) lines.push(`Disallow: ${path}`)\n if (options.sitemapUrl !== undefined) lines.push(`Sitemap: ${options.sitemapUrl}`)\n return `${lines.join('\\n')}\\n`\n}\n\nexport function robotsResponse(options: RobotsOptions): Response {\n return new Response(buildRobotsTxt(options), {\n headers: { 'content-type': 'text/plain; charset=utf-8' },\n })\n}\n","import type { StorefrontClient } from '../storefront-client/client'\n\n/**\n * Slug-change 301 handler. The redirect store is owned elsewhere (catalog/storefront-API work); this\n * owns only the request-handling shape. The lookup is injected: given the current path, it returns the\n * canonical target (or null). A self-redirect (target === path) returns null to avoid an immediate loop.\n */\nexport type RedirectLookup = (path: string) => Promise<string | null> | string | null\n\nexport interface RedirectOptions {\n /** 301 (permanent, default) or 302 (temporary). */\n readonly status?: 301 | 302\n}\n\nexport interface StorefrontRedirectOptions extends RedirectOptions {\n readonly request: Request\n readonly response: Response\n readonly storefront: StorefrontClient\n}\n\nexport async function resolveRedirect(\n lookup: RedirectLookup,\n path: string,\n options: RedirectOptions = {},\n): Promise<Response | null> {\n const target = await lookup(path)\n if (target === null || target === '' || target === path) return null\n return new Response(null, {\n status: options.status ?? 301,\n headers: { location: target },\n })\n}\n\nexport const URL_REDIRECT_QUERY = `#graphql\n query UrlRedirect($path: String!) {\n urlRedirect(path: $path) {\n target\n }\n }\n`\n\n/**\n * Look up `path` in the storefront-api's url_redirects and, if found, return a 301 Response.\n * Returns null when there is no redirect, a self-redirect, or the lookup query fails (so the caller\n * falls through to its normal 404 — a lookup failure must never become a 500).\n */\nexport async function resolveStorefrontRedirect(\n storefront: StorefrontClient,\n path: string,\n options: RedirectOptions = {},\n): Promise<Response | null> {\n let target: string | null = null\n try {\n const data = await storefront.query<{ urlRedirect: { target: string } | null }>(\n URL_REDIRECT_QUERY,\n { variables: { path } },\n )\n target = data.urlRedirect?.target ?? null\n } catch {\n return null\n }\n return resolveRedirect(() => target, path, options)\n}\n\n/**\n * Hydrogen-compatible 404 redirect helper. It preserves the original response when there is no\n * matching URL redirect, mirroring the server.ts pattern used by Hydrogen demo stores.\n */\nexport async function storefrontRedirect(options: StorefrontRedirectOptions): Promise<Response> {\n if (options.response.status !== 404) return options.response\n const path = new URL(options.request.url).pathname\n const redirectOptions = options.status === undefined ? {} : { status: options.status }\n return (\n (await resolveStorefrontRedirect(options.storefront, path, redirectOptions)) ?? options.response\n )\n}\n"]}
|
|
@@ -100,5 +100,5 @@ function createStorefrontApiCartAdapter(opts) {
|
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
export { REACT_SEAM_CART_DOCUMENTS, createStorefrontApiCartAdapter };
|
|
103
|
-
//# sourceMappingURL=chunk-
|
|
104
|
-
//# sourceMappingURL=chunk-
|
|
103
|
+
//# sourceMappingURL=chunk-WNXI3MPM.js.map
|
|
104
|
+
//# sourceMappingURL=chunk-WNXI3MPM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/storefront-cart-adapter.ts"],"names":[],"mappings":"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","file":"chunk-WNXI3MPM.js","sourcesContent":["import type { CartAdapter, SmartCartLine, SmartCartState } from './smart-cart-types'\n\ninterface GqlMoney {\n amount: string\n currencyCode: string\n}\ninterface GqlCartLine {\n id: string\n quantity: number\n attributes: { key: string; value: string | null }[] | null\n cost: { totalAmount: GqlMoney }\n merchandise: {\n id: string\n title: string | null\n image: { url: string } | null\n product: { title: string }\n }\n}\ninterface GqlCart {\n checkoutUrl: string\n cost: { subtotalAmount: GqlMoney; discountTotal?: GqlMoney }\n discountCodes?: string[]\n lines: { nodes: GqlCartLine[] }\n}\n\n// GraphQL Money is a decimal string (\"216.00\"); SmartCartState money is integer minor units.\nconst toMinorUnits = (m: GqlMoney): number => Math.round(parseFloat(m.amount) * 100)\n\nconst CART_FIELDS = `\n checkoutUrl\n cost { subtotalAmount { amount currencyCode } discountTotal { amount currencyCode } }\n discountCodes\n lines(first: 250) { nodes {\n id quantity\n attributes { key value }\n cost { totalAmount { amount currencyCode } }\n merchandise { ... on ProductVariant { id title image { url } product { title } } }\n } }`\nconst CART_QUERY = `query KotaoSmartCart($cartId: ID!) { cart(id: $cartId) { ${CART_FIELDS} } }`\nconst LINES_ADD = `mutation KotaoSmartCartAdd($cartId: ID!, $lines: [CartLineInput!]!) { cartLinesAdd(cartId: $cartId, lines: $lines) { cart { ${CART_FIELDS} } } }`\nconst LINES_UPDATE = `mutation KotaoSmartCartUpdate($cartId: ID!, $lines: [CartLineUpdateInput!]!) { cartLinesUpdate(cartId: $cartId, lines: $lines) { cart { ${CART_FIELDS} } } }`\nconst LINES_REMOVE = `mutation KotaoSmartCartRemove($cartId: ID!, $lineIds: [ID!]!) { cartLinesRemove(cartId: $cartId, lineIds: $lineIds) { cart { ${CART_FIELDS} } } }`\nconst DISCOUNT_CODES_UPDATE = `mutation KotaoSmartCartDiscountCodes($cartId: ID!, $discountCodes: [String!]!) { cartDiscountCodesUpdate(cartId: $cartId, discountCodes: $discountCodes) { cart { ${CART_FIELDS} } } }`\n\n/**\n * All fully-resolved cart GraphQL document strings from the react seam adapter.\n * Exported for schema-validation tests (apps/storefront-api/test/cart-graphql-documents.test.ts)\n * that submit each document to a real graphql-yoga instance and assert zero validation errors,\n * catching invalid field selections (e.g. subfields on a scalar) at test time rather than runtime.\n */\nexport const REACT_SEAM_CART_DOCUMENTS: readonly string[] = [\n CART_QUERY,\n LINES_ADD,\n LINES_UPDATE,\n LINES_REMOVE,\n DISCOUNT_CODES_UPDATE,\n]\n\nfunction mapCart(c: GqlCart): SmartCartState {\n const currency = c.cost.subtotalAmount.currencyCode\n const lines: SmartCartLine[] = c.lines.nodes.map((l) => {\n const attributes: Record<string, string> = {}\n for (const a of l.attributes ?? []) {\n if (a.value !== null) attributes[a.key] = a.value\n }\n const hasAttributes = Object.keys(attributes).length > 0\n return {\n id: l.id,\n title: l.merchandise.product.title,\n variantTitle: l.merchandise.title,\n variantId: l.merchandise.id ?? null,\n quantity: l.quantity,\n imageUrl: l.merchandise.image?.url ?? null,\n linePrice: { amount: toMinorUnits(l.cost.totalAmount), currency },\n ...(hasAttributes && { attributes }),\n }\n })\n const discountMinorUnits = c.cost.discountTotal != null ? toMinorUnits(c.cost.discountTotal) : 0\n const appliedCodes = c.discountCodes?.filter((code) => code.length > 0)\n return {\n lines,\n subtotal: { amount: toMinorUnits(c.cost.subtotalAmount), currency },\n checkoutUrl: c.checkoutUrl,\n currency,\n ...(discountMinorUnits > 0 && {\n discountTotal: { amount: discountMinorUnits, currency },\n }),\n ...(appliedCodes != null && appliedCodes.length > 0 && { appliedCodes }),\n }\n}\n\n/**\n * A CartAdapter that drives the storefront-api cart over the same-origin /api/storefront GraphQL proxy\n * (the proxy injects the read token + resolves the shop server-side). The theme supplies the cart id\n * (from its loader's cart cookie/session) and renders <CartDrawerOverlay adapter={this} />.\n */\nexport function createStorefrontApiCartAdapter(opts: {\n readonly cartId: string\n readonly apiPath?: string\n readonly fetchImpl?: typeof fetch\n}): CartAdapter {\n const fetchImpl = opts.fetchImpl ?? fetch\n const apiPath = opts.apiPath ?? '/api/storefront'\n const run = async (\n query: string,\n variables: Record<string, unknown>,\n key: string,\n ): Promise<SmartCartState> => {\n const res = await fetchImpl(apiPath, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ query, variables }),\n })\n if (!res.ok) {\n throw new Error(`storefront cart request failed: ${res.status} ${res.statusText}`)\n }\n const json = (await res.json()) as { data?: Record<string, unknown> }\n const payload = json.data?.[key] as GqlCart | { cart: GqlCart } | undefined\n const cart = payload && 'cart' in payload ? payload.cart : (payload as GqlCart)\n return mapCart(cart)\n }\n return {\n getCart: () => run(CART_QUERY, { cartId: opts.cartId }, 'cart'),\n addLine: (merchandiseId, quantity, attributes) =>\n run(\n LINES_ADD,\n {\n cartId: opts.cartId,\n lines: [\n {\n merchandiseId,\n quantity,\n ...(attributes !== undefined && {\n attributes: Object.entries(attributes).map(([key, value]) => ({ key, value })),\n }),\n },\n ],\n },\n 'cartLinesAdd',\n ),\n updateLine: (id, quantity) =>\n run(LINES_UPDATE, { cartId: opts.cartId, lines: [{ id, quantity }] }, 'cartLinesUpdate'),\n removeLine: (id) =>\n run(LINES_REMOVE, { cartId: opts.cartId, lineIds: [id] }, 'cartLinesRemove'),\n updateDiscountCodes: (codes) =>\n run(\n DISCOUNT_CODES_UPDATE,\n { cartId: opts.cartId, discountCodes: codes },\n 'cartDiscountCodesUpdate',\n ),\n }\n}\n"]}
|