@kotao/storefront 0.2.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/LICENSE +21 -0
- package/README.md +34 -0
- package/dist/cart-documents-CwwRTvm8.d.ts +21 -0
- package/dist/cart-documents.d.ts +2 -0
- package/dist/cart-documents.js +3 -0
- package/dist/cart-documents.js.map +1 -0
- package/dist/chunk-2IWNUDSZ.js +104 -0
- package/dist/chunk-2IWNUDSZ.js.map +1 -0
- package/dist/chunk-3YQXJNR7.js +70 -0
- package/dist/chunk-3YQXJNR7.js.map +1 -0
- package/dist/chunk-5QOFKGKD.js +51 -0
- package/dist/chunk-5QOFKGKD.js.map +1 -0
- package/dist/chunk-GCQI6OKH.js +239 -0
- package/dist/chunk-GCQI6OKH.js.map +1 -0
- package/dist/chunk-ISAFEOR2.js +214 -0
- package/dist/chunk-ISAFEOR2.js.map +1 -0
- package/dist/chunk-MYDKIJRH.js +81 -0
- package/dist/chunk-MYDKIJRH.js.map +1 -0
- package/dist/chunk-OGWYTYYS.js +72 -0
- package/dist/chunk-OGWYTYYS.js.map +1 -0
- package/dist/chunk-PXZ737N3.js +439 -0
- package/dist/chunk-PXZ737N3.js.map +1 -0
- package/dist/chunk-QOEEUTHQ.js +110 -0
- package/dist/chunk-QOEEUTHQ.js.map +1 -0
- package/dist/chunk-U5677AEA.js +1690 -0
- package/dist/chunk-U5677AEA.js.map +1 -0
- package/dist/chunk-XMTWFJCZ.js +138 -0
- package/dist/chunk-XMTWFJCZ.js.map +1 -0
- package/dist/client-D9YYA2w6.d.ts +159 -0
- package/dist/customer-account-api-types.d.ts +144 -0
- package/dist/customer-account-api-types.js +3 -0
- package/dist/customer-account-api-types.js.map +1 -0
- package/dist/editor.d.ts +112 -0
- package/dist/editor.js +3 -0
- package/dist/editor.js.map +1 -0
- package/dist/image.d.ts +89 -0
- package/dist/image.js +3 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +183 -0
- package/dist/index.js +208 -0
- package/dist/index.js.map +1 -0
- package/dist/pagination-CPgH3fAa.d.ts +77 -0
- package/dist/product.d.ts +105 -0
- package/dist/product.js +4 -0
- package/dist/product.js.map +1 -0
- package/dist/react-router.d.ts +29 -0
- package/dist/react-router.js +33 -0
- package/dist/react-router.js.map +1 -0
- package/dist/react.d.ts +299 -0
- package/dist/react.js +1813 -0
- package/dist/react.js.map +1 -0
- package/dist/routing-BfUp49o8.d.ts +302 -0
- package/dist/seo.d.ts +155 -0
- package/dist/seo.js +4 -0
- package/dist/seo.js.map +1 -0
- package/dist/settings.d.ts +87 -0
- package/dist/settings.js +3 -0
- package/dist/settings.js.map +1 -0
- package/dist/shop-DkQmro-Y.d.ts +202 -0
- package/dist/store-DQK1nhob.d.ts +67 -0
- package/dist/storefront-api-types.d.ts +312 -0
- package/dist/storefront-api-types.js +3 -0
- package/dist/storefront-api-types.js.map +1 -0
- package/dist/types-BDhHWZsP.d.ts +77 -0
- package/dist/types-Df3bGbKU.d.ts +167 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/product/options.ts"],"names":[],"mappings":"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","file":"chunk-QOEEUTHQ.js","sourcesContent":["/**\n * Framework-agnostic variant selection (ADR-0003 §SDK). Mirrors Shopify Hydrogen's MODERN approach —\n * `getProductOptions` as a utility, not the deprecated `<VariantSelector>` component — adapted to the\n * Kotao Storefront API `Product` shape (`options { name values }` + `variants { selectedOptions }`).\n * A theme renders the returned grid however it likes and resolves the chosen variant.\n *\n * Pure logic, no React, so it stays in the SDK core and is reused by SSR and any framework preset.\n */\n\nimport { flattenConnection, type FlattenableConnection } from '../pagination/pagination'\nimport type { Image, ProductOptionValueSwatch } from '../storefront-api-types'\n\n/** One option name + its chosen value on a variant (Storefront API SelectedOption). */\nexport interface SelectedOption {\n readonly name: string\n readonly value: string\n}\n\n/** A product option definition: a name and its distinct values, in display order. */\nexport interface ProductOptionDef {\n readonly name: string\n readonly optionValues?: readonly (\n | string\n | {\n readonly name?: string\n readonly value?: string\n readonly swatch?: ProductOptionValueSwatch | null\n }\n )[]\n readonly values?: readonly string[]\n}\n\n/** The minimal variant shape variant-selection needs. `availableForSale` is optional — the Storefront\n * API does not expose stock yet (inventory deferred), so a missing value is treated as available. */\nexport interface VariantSelectionLike {\n readonly id: string\n readonly availableForSale?: boolean | null\n readonly selectedOptions: readonly SelectedOption[]\n}\n\nexport interface VariantLike extends VariantSelectionLike {\n readonly compareAtPrice?: { readonly amount: string; readonly currencyCode: string } | null\n readonly image?: Pick<Image, 'altText' | 'height' | 'url' | 'width' | 'id'> | null\n readonly price: { readonly amount: string; readonly currencyCode: string }\n readonly product: {\n readonly handle: string\n readonly id?: string | null\n readonly title: string\n }\n readonly selectedOptions: SelectedOption[]\n readonly sku?: string | null\n readonly title?: string\n}\n\nexport interface ProductLike {\n readonly options: readonly ProductOptionDef[]\n readonly handle?: string | null\n readonly variants: readonly VariantSelectionLike[] | FlattenableConnection<VariantSelectionLike>\n readonly selectedOrFirstAvailableVariant?: VariantSelectionLike | null\n}\n\n/** A selection map: option name → chosen value. */\nexport type SelectedOptionsMap = Readonly<Record<string, string>>\n\n/** One value of one option, decorated with selection/availability state for rendering. */\nexport interface ProductOptionValueState {\n readonly name: string\n readonly value: string\n /** This value is the current selection for its option. */\n readonly selected: boolean\n /** A variant exists for this value combined with the other currently-selected options. */\n readonly exists: boolean\n /** That variant is purchasable (availableForSale; true when availability is unknown). */\n readonly available: boolean\n /** The variant choosing this value (holding the other selected options) would land on, if any. */\n readonly variant: VariantSelectionLike | null\n readonly handle: string\n readonly isDifferentProduct: boolean\n readonly swatch?: ProductOptionValueSwatch | null\n readonly variantUriQuery: string\n}\n\nexport interface ProductOptionState {\n readonly name: string\n readonly optionValues: readonly ProductOptionValueState[]\n readonly values: readonly ProductOptionValueState[]\n}\n\nexport type MappedProductOptions = ProductOptionState\n\n/** `[{ name: 'Size', value: 'M' }]` → `{ Size: 'M' }`. Mirrors Hydrogen mapSelectedProductOptionToObject. */\nexport function mapSelectedProductOptionToObject(\n selectedOptions: readonly SelectedOption[],\n): SelectedOptionsMap {\n const map: Record<string, string> = {}\n for (const option of selectedOptions) map[option.name] = option.value\n return map\n}\n\n/** Does a variant satisfy every (name → value) entry in `selection`? (Other options are ignored.) */\nfunction variantMatches(variant: VariantSelectionLike, selection: SelectedOptionsMap): boolean {\n return Object.entries(selection).every((entry) =>\n variant.selectedOptions.some((o) => o.name === entry[0] && o.value === entry[1]),\n )\n}\n\nfunction isVariantArray(\n variants: readonly VariantSelectionLike[] | FlattenableConnection<VariantSelectionLike>,\n): variants is readonly VariantSelectionLike[] {\n return Array.isArray(variants)\n}\n\nfunction productVariants(product: ProductLike): readonly VariantSelectionLike[] {\n return isVariantArray(product.variants) ? product.variants : flattenConnection(product.variants)\n}\n\nfunction optionValueEntries(\n option: ProductOptionDef,\n): readonly { readonly name: string; readonly swatch?: ProductOptionValueSwatch | null }[] {\n if (option.optionValues !== undefined) {\n return option.optionValues.flatMap((value) => {\n if (typeof value === 'string') return [{ name: value }]\n const name = value.name ?? value.value\n return name === undefined ? [] : [{ name, swatch: value.swatch }]\n })\n }\n return (option.values ?? []).map((value) => ({ name: value }))\n}\n\nfunction variantUriQuery(selection: SelectedOptionsMap): string {\n const params = new URLSearchParams()\n for (const [name, value] of Object.entries(selection)) params.set(name, value)\n return params.toString()\n}\n\nfunction variantProductHandle(variant: VariantSelectionLike | null): string | null {\n if (variant == null || !('product' in variant)) return null\n const product = variant.product\n if (product == null || typeof product !== 'object' || !('handle' in product)) return null\n return typeof product.handle === 'string' ? product.handle : null\n}\n\n/**\n * The variant fully matching `selected` (every chosen option name → value), or null. Returns null\n * unless the selection is unambiguous — a partial selection that matches several variants yields null.\n */\nexport function getSelectedVariant(\n variants: readonly VariantSelectionLike[],\n selected: SelectedOptionsMap,\n): VariantSelectionLike | null {\n const matches = variants.filter((v) => variantMatches(v, selected))\n return matches.length === 1 ? matches[0]! : null\n}\n\n/**\n * Decorate each option value with `selected`/`exists`/`available` + the variant it resolves to, given\n * the buyer's current `selected` map. `exists`/`available` hold the OTHER selected options fixed (so a\n * swatch greys out when its combination is unbuyable) — Hydrogen's getProductOptions semantics.\n */\nexport function getProductOptions(\n product: ProductLike,\n selected: SelectedOptionsMap = mapSelectedProductOptionToObject(\n product.selectedOrFirstAvailableVariant?.selectedOptions ?? [],\n ),\n): ProductOptionState[] {\n const variants = productVariants(product)\n return product.options.map((option) => {\n const values = optionValueEntries(option).map((optionValue): ProductOptionValueState => {\n const candidate: SelectedOptionsMap = { ...selected, [option.name]: optionValue.name }\n const variant = variants.find((v) => variantMatches(v, candidate)) ?? null\n const handle = variantProductHandle(variant) ?? product.handle ?? ''\n return {\n name: optionValue.name,\n value: optionValue.name,\n selected: selected[option.name] === optionValue.name,\n exists: variant != null,\n available: variant != null && (variant.availableForSale ?? true),\n variant,\n handle,\n isDifferentProduct:\n product.handle !== undefined && handle !== '' && handle !== product.handle,\n ...(optionValue.swatch !== undefined ? { swatch: optionValue.swatch } : {}),\n variantUriQuery: variantUriQuery(candidate),\n }\n })\n return {\n name: option.name,\n optionValues: values,\n values,\n }\n })\n}\n\nconst NON_OPTION_SEARCH_PARAMS = new Set([\n 'cursor',\n 'direction',\n 'page',\n 'q',\n 'sellingPlan',\n 'selling_plan',\n 'sort',\n 'variant',\n])\n\nfunction searchParamsFrom(input: URL | Request | URLSearchParams | string): URLSearchParams {\n if (input instanceof URLSearchParams) return input\n if (input instanceof URL) return input.searchParams\n if (typeof input === 'string') return new URL(input).searchParams\n return new URL(input.url).searchParams\n}\n\nexport function getSelectedProductOptions(\n input: URL | Request | URLSearchParams | string,\n): SelectedOption[] {\n return [...searchParamsFrom(input).entries()].flatMap(([name, value]) =>\n NON_OPTION_SEARCH_PARAMS.has(name) || value.length === 0 ? [] : [{ name, value }],\n )\n}\n\nexport function getAdjacentAndFirstAvailableVariants(product: {\n readonly variants?: readonly VariantLike[] | FlattenableConnection<VariantLike> | null\n}): VariantLike[] {\n const variants = product.variants\n if (variants == null) return []\n return isVariantArray(variants) ? [...variants] : flattenConnection(variants)\n}\n\nexport function useOptimisticVariant(\n selectedVariant: VariantLike | null | undefined,\n variants: readonly VariantLike[] | FlattenableConnection<VariantLike> = [],\n): VariantLike {\n return (selectedVariant ??\n getAdjacentAndFirstAvailableVariants({ variants }).find(\n (variant) => variant.availableForSale ?? true,\n ) ??\n null) as VariantLike\n}\n\nexport function useSelectedOptionInUrlParam(_selectedOptions: readonly SelectedOption[]): void {\n // Hydrogen mutates the URL on the client for cosmetic selected-option params. Kotao keeps this\n // server-safe in the core SDK; a richer browser preset can layer that behavior on top later.\n}\n"]}
|