@misiki/gocommerce-connector 0.2.0 → 0.3.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 +65 -18
- package/dist/{index-CJ836ZI3.d.cts → index-BfbB3jQb.d.cts} +1032 -4
- package/dist/{index-CJ836ZI3.d.ts → index-BfbB3jQb.d.ts} +1032 -4
- package/dist/index.cjs +582 -86
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +576 -87
- package/dist/index.js.map +1 -1
- package/dist/services/index.cjs +582 -86
- package/dist/services/index.cjs.map +1 -1
- package/dist/services/index.d.cts +1 -1
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.js +576 -87
- package/dist/services/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/money.ts","../src/static-store.ts","../src/rest-guard.ts","../src/cache.ts","../src/map.ts","../src/browser.ts","../src/services/base.service.ts","../src/services/facts.ts","../src/services/catalog.ts","../src/services/product-service.ts","../src/services/search-service.ts","../src/services/meilisearch-service.ts","../src/services/category-service.ts","../src/services/collection-service.ts","../src/services/cart-service.ts","../src/services/checkout-service.ts","../src/services/payment-method-service.ts","../src/services/coupon-service.ts","../src/services/order-service.ts","../src/services/user-service.ts","../src/services/address-service.ts","../src/services/wishlist-service.ts","../src/services/review-service.ts","../src/services/menu-service.ts","../src/services/store-service.ts","../src/services/page-service.ts","../src/services/vendor-service.ts","../src/services/misc-services.ts"],"names":["c","env","quote","reported","clean","enc"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * The two ways a call through this connector fails.\n *\n * Both carry `message`, because the storefront shows `err.message` in a toast\n * and has no other field it reliably reads.\n */\n\n/**\n * What the engine refused, in a shape the storefront can show a shopper.\n *\n * `status` travels because the difference between 404 and 409 is the\n * difference between \"that product is gone\" and \"somebody just bought the last\n * one\", and a storefront renders those differently. `code` is the engine's own\n * taxonomy (`not_found`, `validation`, `conflict`, `unauthorized`, …).\n */\nexport class GoCommerceError extends Error {\n\treadonly status: number\n\treadonly code: string | undefined\n\treadonly details: unknown\n\n\tconstructor(message: string, status: number, code?: string, details?: unknown) {\n\t\tsuper(message)\n\t\tthis.name = 'GoCommerceError'\n\t\tthis.status = status\n\t\tthis.code = code\n\t\tthis.details = details\n\t}\n}\n\n/**\n * A storefront feature this engine has no model for — reels, chat, a vendor's\n * commission statement — or one that lives in a module this particular build\n * did not compile in.\n *\n * The name is the one every connector in the family throws, so a storefront\n * that branches on `err.name === 'NotSupportedError'` treats GoCommerce the same\n * as the rest.\n */\nexport class NotSupportedError extends Error {\n\treadonly service: string\n\treadonly method: string\n\n\tconstructor(service: string, method: string, detail?: string) {\n\t\tsuper(`${service}.${method}() is not supported by GoCommerce${detail ? `: ${detail}` : '.'}`)\n\t\tthis.name = 'NotSupportedError'\n\t\tthis.service = service\n\t\tthis.method = method\n\t}\n}\n","/**\n * Money, across the one boundary in this connector where it changes shape.\n *\n * The engine speaks minor units and a currency code, always, and never sends a\n * formatted string (AGENTS.md rule 6). Svelte Commerce's types say `price:\n * number`, and every backend it already talks to means \"19.99\" by that. So the\n * conversion happens here, once, in the only file allowed to divide money.\n *\n * The exponent is per currency, not a constant 100: the yen writes no decimals\n * and the dinar writes three. Dividing 2500 JPY by 100 would price a ¥2,500\n * item at ¥25. The table mirrors `currencyExponent` in core/transfer_shopify.go\n * — the same list, because a second opinion about the yen is a bug.\n */\n\nconst ZERO_DECIMAL = new Set([\n\t'BIF',\n\t'CLP',\n\t'DJF',\n\t'GNF',\n\t'ISK',\n\t'JPY',\n\t'KMF',\n\t'KRW',\n\t'PYG',\n\t'RWF',\n\t'UGX',\n\t'VND',\n\t'VUV',\n\t'XAF',\n\t'XOF',\n\t'XPF',\n])\n\nconst THREE_DECIMAL = new Set(['BHD', 'IQD', 'JOD', 'KWD', 'LYD', 'OMR', 'TND'])\n\nexport function currencyExponent(code: string | null | undefined): number {\n\tconst c = (code ?? '').toUpperCase()\n\tif (ZERO_DECIMAL.has(c)) return 0\n\tif (THREE_DECIMAL.has(c)) return 3\n\treturn 2\n}\n\n/** The engine's money object. */\nexport type Money = { amount_minor: number; currency: string }\n\n/**\n * Minor units to the major-unit number the storefront renders.\n *\n * Rounded to the currency's own precision rather than left as raw float\n * division: 1999/100 is 19.99 exactly, but 1 / 1000 for a three-decimal\n * currency is not, and a price that renders as 0.0010000000000000002 is the\n * kind of thing nobody notices until a customer screenshots it.\n */\nexport function toMajor(money: Money | null | undefined): number {\n\tif (!money) return 0\n\treturn minorToMajor(money.amount_minor, money.currency)\n}\n\n/** The same, for the routes that send a bare `*_minor` integer beside a currency. */\nexport function minorToMajor(minor: number | null | undefined, currency: string | null | undefined): number {\n\tif (minor === null || minor === undefined || !Number.isFinite(minor)) return 0\n\tconst exp = currencyExponent(currency)\n\tif (exp === 0) return minor\n\treturn Number((minor / 10 ** exp).toFixed(exp))\n}\n\n/**\n * Back the other way, for the few places the storefront hands us a number —\n * a price filter, mostly.\n *\n * Rounded, not truncated: 19.99 * 100 is 1998.9999999999998 in binary floating\n * point, and truncating that filters out the item priced exactly 19.99.\n */\nexport function toMinor(amount: number, currency: string | null | undefined): number {\n\tconst exp = currencyExponent(currency)\n\treturn Math.round(amount * 10 ** exp)\n}\n","/**\n * Store identity — name, logo, favicon, menus, theme variables.\n *\n * Some of that the engine has (the settlement currency, the payment methods,\n * the switched-on plugins) and most of it it does not: a logo and a hero banner\n * are the storefront's own business. The storefront registers its static store\n * record here at boot — `default-store.json` merged under the project's\n * `kitcommerce.config.ts` — and `storeService` lays the engine's live facts\n * over it, so the engine wins wherever it has an opinion.\n */\nexport type StaticStoreProvider = () => Promise<Record<string, any>> | Record<string, any>\n\nlet provider: StaticStoreProvider | undefined\n\nexport const setStaticStore = (fn: StaticStoreProvider) => {\n\tprovider = fn\n}\n\nexport const hasStaticStore = () => Boolean(provider)\n\nexport const readStaticStore = async (): Promise<Record<string, any>> => {\n\tif (!provider) return {}\n\treturn (await provider()) ?? {}\n}\n\n/** The marker the storefront reads to tell which backend is active. */\nexport const connectorName = 'gocommerce'\n","/**\n * Litekart REST paths, intercepted.\n *\n * Every connector in the family exposes `get/post/put/patch/delete(path)` on\n * its BaseService because Litekart's does, and a little storefront code still\n * calls them with a Litekart path — `storeService.post('/api/…')`. Those paths\n * are relative, so they would land on the storefront's own origin, where\n * nothing answers.\n *\n * GoCommerce's own routes also start with `/api/`, which is why this connector\n * never sends an engine request through those verbs: every engine call goes\n * through `BaseService.engine()` with an absolute URL, and the storefront's own\n * guard (which patches the same verbs) cannot reach it either. What arrives\n * here is only ever an inherited Litekart path.\n *\n * Reads for a collection resolve empty (a store legitimately has none); reads\n * for one record and every write throw, because a blank detail page reads as\n * broken and a silent success would tell a shopper their enquiry was saved when\n * nothing left the browser. Each distinct path is reported once.\n */\n\nconst COLLECTION_SEGMENTS = new Set([\n\t'all',\n\t'list',\n\t'list-by-parent',\n\t'list-public',\n\t'latest',\n\t'search',\n\t'public',\n\t'public-details',\n\t'me',\n\t'multiple',\n])\n\nconst emptyResult = () => ({ data: [], count: 0, pageSize: 0, noOfPage: 0, page: 1 })\n\nconst addressesOneRecord = (url: string) => {\n\tconst segments = url.split('?')[0].split('/').filter(Boolean)\n\tif (segments.length < 3) return false\n\treturn !COLLECTION_SEGMENTS.has(segments[segments.length - 1].toLowerCase())\n}\n\nconst reported = new Set<string>()\n\nconst report = (method: string, url: string) => {\n\tconst key = `${method} ${url.split('?')[0]}`\n\tif (reported.has(key)) return\n\treported.add(key)\n\tconsole.warn(\n\t\t`[gocommerce] no native implementation for \\`${key}\\` — that is a Litekart REST path, and it was not called.`,\n\t)\n}\n\n/**\n * Answers a Litekart REST path from data the storefront holds (menus,\n * countries, plugin toggles…). Return `undefined` to fall through.\n */\nexport type RestResolver = (url: string) => Promise<unknown> | unknown | undefined\n\nlet localResolver: RestResolver | undefined\n\nexport const serveRestLocally = (resolver: RestResolver) => {\n\tlocalResolver = resolver\n}\n\nexport const resolveRestLocally = async (method: string, url: string) => {\n\tif (method === 'get') {\n\t\tconst local = await localResolver?.(url)\n\t\tif (local !== undefined) return local\n\t}\n\treport(method, url)\n\tif (method !== 'get' || addressesOneRecord(url)) {\n\t\tthrow new Error(`This feature is not available on this store (gocommerce).`)\n\t}\n\treturn emptyResult()\n}\n","/**\n * A short memory for store-level facts: which plugins are on, the settlement\n * currency, the category tree.\n *\n * The storefront asks for the store record on every server request, and a\n * category page needs the whole tree to draw one breadcrumb. Asking the engine\n * each time would multiply its load by the page count for answers that change\n * when a merchant edits something, not when a shopper clicks.\n *\n * Only facts that are the same for every shopper may go in here — this module\n * is shared by every request a server process handles. Keyed by engine URL, so\n * a platform storefront talking to several stores keeps them apart.\n */\nconst TTL_MS = 60_000\n\ntype Entry = { at: number; value: Promise<unknown> }\n\nconst entries = new Map<string, Entry>()\n\nexport function remember<T>(key: string, load: () => Promise<T>, ttl = TTL_MS): Promise<T> {\n\tconst hit = entries.get(key)\n\tif (hit && Date.now() - hit.at < ttl) return hit.value as Promise<T>\n\tconst value = load()\n\tentries.set(key, { at: Date.now(), value })\n\t// A failure is not remembered: the next caller tries again.\n\tvalue.catch(() => {\n\t\tif (entries.get(key)?.value === value) entries.delete(key)\n\t})\n\treturn value\n}\n\n/** For tests, and for a storefront that has just changed something itself. */\nexport function forgetAll(): void {\n\tentries.clear()\n}\n","/**\n * Engine shapes to storefront shapes.\n *\n * Svelte Commerce's types were drawn around Litekart's API, so every connector\n * is a translation and this file is most of ours. Four rules run through it:\n *\n * 1. Ids cross as strings. The storefront matches variants and cart lines\n * with `===` against ids it read from a URL.\n * 2. Money crosses as a major-unit number, through money.ts and nowhere else.\n * 3. A field the engine does not have is empty, never invented. There is no\n * popularity score, so none is made up; there is no compare-at price, so\n * `mrp` equals the price rather than 0, which would render as a 100%\n * discount on everything in the shop.\n * 4. Lists are always arrays. Product cards read `variants[0]` unguarded.\n */\nimport type {\n\tAddress,\n\tCart,\n\tCartLine,\n\tCategory,\n\tCmsPage,\n\tCollection,\n\tCustomer,\n\tIdentityAddress,\n\tOrder,\n\tOrderLine,\n\tProduct,\n\tReview,\n\tSearchDoc,\n\tVariant,\n\tVendor,\n} from './engine'\nimport { minorToMajor, toMajor, type Money } from './money'\nimport type { CartExtras, StorefrontAddress } from './browser'\n\nconst str = (v: number | string | null | undefined): string => (v === null || v === undefined ? '' : String(v))\n\nconst arr = <T>(v: T[] | null | undefined): T[] => v ?? []\n\n// ---------------------------------------------------------------- products\n\n/** Variants a shopper can see: inactive ones are the merchant's business. */\nconst liveVariants = (p: Product): Variant[] => arr(p.variants).filter((v) => v.active)\n\nfunction variantImages(v: Variant): string[] {\n\tconst out: string[] = []\n\tfor (const img of [v.image, ...arr(v.images)]) {\n\t\tif (img?.url && (img.kind ?? 'image') === 'image' && !out.includes(img.url)) out.push(img.url)\n\t}\n\treturn out\n}\n\n/**\n * Every picture the public API offers for a product: the lead image, then each\n * variant's. The engine keeps the full gallery on admin routes only, so this\n * is the honest union rather than the whole media library.\n */\nexport function productImages(p: Product): string[] {\n\tconst out: string[] = []\n\tconst push = (url?: string) => {\n\t\tif (url && !out.includes(url)) out.push(url)\n\t}\n\tpush(p.image_url)\n\tfor (const v of arr(p.variants)) for (const url of variantImages(v)) push(url)\n\treturn out\n}\n\nexport function toVariant(v: Variant, p: Product, optionless: boolean) {\n\tconst images = variantImages(v)\n\tconst options = arr(p.options)\n\treturn {\n\t\tid: str(v.id),\n\t\tproductId: str(v.product_id),\n\t\t// The storefront picks the default variant of an optionless product by\n\t\t// this exact title, and hides the variant name when it sees it.\n\t\ttitle: optionless ? 'default' : v.label || v.sku,\n\t\tsku: v.sku,\n\t\tbarcode: v.barcode ?? null,\n\t\tprice: toMajor(v.price),\n\t\tmrp: toMajor(v.compare_at_price ?? v.price),\n\t\t// The engine's own vocabulary, unchanged: `available` is on hand minus\n\t\t// reserved; an untracked variant is never managed, so its count is moot.\n\t\tstock: v.active ? v.available : 0,\n\t\tmanageInventory: v.active ? v.track_inventory : true,\n\t\tallowBackorder: v.active && v.continue_selling,\n\t\tactive: v.active,\n\t\tweight: v.weight_grams ?? null,\n\t\tlength: v.dimensions?.length_mm ?? null,\n\t\twidth: v.dimensions?.width_mm ?? null,\n\t\theight: v.dimensions?.height_mm ?? null,\n\t\timages: images.join(','),\n\t\timg: images[0] ?? null,\n\t\timage: images[0] ?? null,\n\t\tthumbnail: images[0] ?? null,\n\t\t// Values in option order — `options[i]` answers `p.options[i]`.\n\t\toptions: arr(v.options).map((value, i) => ({ optionId: str(options[i]?.id), value })),\n\t\tmetadata: v.metadata ?? null,\n\t}\n}\n\nexport type StorefrontProduct = ReturnType<typeof toProduct>\n\nexport function toProduct(p: Product, extra: { categoryHierarchy?: { name: string; slug: string }[] } = {}) {\n\tconst live = liveVariants(p)\n\tconst lead = live[0] ?? arr(p.variants)[0]\n\tconst optionless = arr(p.options).length === 0\n\tconst images = productImages(p)\n\tconst prices = live.map((v) => toMajor(v.price))\n\tconst tracked = live.filter((v) => v.track_inventory)\n\tconst category = p.category\n\tconst tags = arr(p.tags)\n\n\treturn {\n\t\tid: str(p.id),\n\t\tslug: p.slug,\n\t\ttitle: p.title,\n\t\tname: p.title,\n\t\tsubtitle: null,\n\t\tdescription: p.description ?? '',\n\t\tstatus: p.status === 'active' ? 'published' : p.status,\n\t\tactive: p.status === 'active',\n\t\ttype: p.product_type ?? '',\n\t\tcurrency: p.currency,\n\t\tcurrencyCode: p.currency,\n\t\tprice: lead ? toMajor(lead.price) : 0,\n\t\tmrp: lead ? toMajor(lead.compare_at_price ?? lead.price) : 0,\n\t\tminPrice: prices.length ? Math.min(...prices) : 0,\n\t\tmaxPrice: prices.length ? Math.max(...prices) : 0,\n\t\tsku: lead?.sku ?? null,\n\t\tbarcode: lead?.barcode ?? null,\n\t\tweight: lead?.weight_grams ?? null,\n\t\toriginCountry: lead?.origin_country ?? null,\n\t\tthumbnail: images[0] ?? null,\n\t\timage_url: images[0] ?? null,\n\t\timages: images.join(','),\n\t\timageList: images,\n\t\t// Product-level stock is what a card shows before a variant is picked:\n\t\t// buyable when any live variant is, counted only where counting means\n\t\t// something.\n\t\tmanageInventory: live.length > 0 && tracked.length === live.length,\n\t\tallowBackorder: live.some((v) => v.continue_selling),\n\t\tstock: tracked.reduce((n, v) => n + Math.max(0, v.available), 0),\n\t\thasStock: live.some((v) => !v.track_inventory || v.continue_selling || v.available > 0),\n\t\tcategoryId: category ? str(category.id) : null,\n\t\tcategory: category ? { id: str(category.id), name: category.title, slug: category.slug } : null,\n\t\tcategories: category ? [{ category: { id: str(category.id), name: category.title, slug: category.slug } }] : [],\n\t\tcategoryHierarchy: extra.categoryHierarchy ?? (category ? [{ name: category.title, slug: category.slug }] : []),\n\t\tcollections: arr(p.collections).map((c) => ({ id: str(c.id), name: c.title, slug: c.slug })),\n\t\t// Free text on the engine's product, not a vendor record.\n\t\tvendor: p.vendor ? { businessName: p.vendor } : null,\n\t\tproductTags: tags.join(','),\n\t\tkeywords: tags.join(','),\n\t\tmetaTitle: p.seo_title || p.title,\n\t\tmetaDescription: p.seo_description || null,\n\t\tlink: `/products/${p.slug}`,\n\t\toptions: arr(p.options).map((o) => ({\n\t\t\tid: str(o.id),\n\t\t\ttitle: o.name,\n\t\t\tname: o.name,\n\t\t\ttype: 'text',\n\t\t\tvalues: arr(o.values).map((val) => ({ id: str(val.id), value: val.value })),\n\t\t})),\n\t\tvariants: live.map((v) => toVariant(v, p, optionless)),\n\t\t// Filled by the product page from ext/reviews when it is installed.\n\t\tratings: [] as ReturnType<typeof toRating>[],\n\t\trating: null as number | null,\n\t\tratingCount: 0,\n\t\treviewCount: 0,\n\t\tattributes: [] as { name: string; value: string }[],\n\t\tmetadata: p.metadata ?? null,\n\t\tcreatedAt: p.created_at,\n\t\tupdatedAt: p.updated_at,\n\t}\n}\n\n/** A Meilisearch hit — the search index's document, which is thinner than a product. */\nexport function fromSearchDoc(d: SearchDoc) {\n\tconst price = minorToMajor(d.price_minor, d.currency)\n\treturn {\n\t\tid: str(d.id),\n\t\tslug: d.slug,\n\t\ttitle: d.title,\n\t\tname: d.title,\n\t\tdescription: d.description,\n\t\tcurrency: d.currency,\n\t\tprice,\n\t\tmrp: price,\n\t\tminPrice: price,\n\t\tmaxPrice: minorToMajor(d.price_max_minor, d.currency),\n\t\tthumbnail: d.image ?? null,\n\t\timage_url: d.image ?? null,\n\t\timages: d.image ?? '',\n\t\tstock: d.in_stock ? 1 : 0,\n\t\thasStock: d.in_stock,\n\t\t// The index cannot say how much is left, only whether any is; a card\n\t\t// built from it must not claim to count.\n\t\tmanageInventory: false,\n\t\tallowBackorder: false,\n\t\tproductTags: arr(d.tags).join(','),\n\t\tcategory: d.category ? { name: d.category.split(' / ').pop() ?? d.category, slug: '' } : null,\n\t\tvendor: d.vendor ? { businessName: d.vendor } : null,\n\t\tvariants: [] as ReturnType<typeof toVariant>[],\n\t\toptions: [],\n\t\tratings: [],\n\t\tlink: `/products/${d.slug}`,\n\t\tupdatedAt: new Date(d.updated_at * 1000).toISOString(),\n\t}\n}\n\n// ---------------------------------------------------------------- taxonomy\n\nexport type StorefrontCategory = {\n\tid: string\n\tname: string\n\ttitle: string\n\tslug: string\n\tlink: string\n\tparentCategoryId: string | null\n\tpath: string\n\tlevel: number\n\trank: number\n\tchildCount: number\n\tthumbnail: string | null\n\tdescription: string | null\n\tisActive: boolean\n\tisFeatured: boolean\n\tisMegamenu: boolean\n\tmetaTitle: string\n\tchildren: StorefrontCategory[]\n\tcreatedAt: string\n\tupdatedAt: string\n}\n\nexport function toCategory(c: Category): StorefrontCategory {\n\treturn {\n\t\tid: str(c.id),\n\t\tname: c.title,\n\t\ttitle: c.title,\n\t\tslug: c.slug,\n\t\tlink: `/${c.slug}`,\n\t\tparentCategoryId: c.parent_id === null || c.parent_id === undefined ? null : str(c.parent_id),\n\t\tpath: c.full_name,\n\t\tlevel: c.depth,\n\t\trank: c.position,\n\t\tchildCount: c.child_count,\n\t\tthumbnail: (c.metadata?.image as string | undefined) ?? null,\n\t\tdescription: (c.metadata?.description as string | undefined) ?? null,\n\t\tisActive: true,\n\t\tisFeatured: false,\n\t\tisMegamenu: false,\n\t\tmetaTitle: c.title,\n\t\tchildren: arr(c.children).map(toCategory),\n\t\tcreatedAt: c.created_at,\n\t\tupdatedAt: c.updated_at,\n\t}\n}\n\nexport function toCollection(c: Collection) {\n\treturn {\n\t\tid: str(c.id),\n\t\tname: c.title,\n\t\ttitle: c.title,\n\t\tslug: c.slug,\n\t\tdescription: c.description || null,\n\t\tsubTitle: null,\n\t\trank: str(c.position),\n\t\tthumbnail: (c.metadata?.image as string | undefined) ?? null,\n\t\tisActive: true,\n\t\tmetaTitle: c.title,\n\t\tmetaDescription: c.description || null,\n\t\tcreatedAt: c.created_at,\n\t\tupdatedAt: c.updated_at,\n\t}\n}\n\n// ---------------------------------------------------------------- addresses\n\n/** The engine's address — on a checkout or an order — to the storefront's form shape. */\nexport function fromEngineAddress(a: Address | undefined, email?: string) {\n\tif (!a) return null\n\tconst [firstName, ...rest] = (a.name ?? '').trim().split(/\\s+/)\n\treturn {\n\t\tfirstName: firstName || '',\n\t\tlastName: rest.join(' '),\n\t\temail: email ?? null,\n\t\tphone: a.phone ?? null,\n\t\taddress_1: a.line1,\n\t\taddress_2: a.line2 ?? '',\n\t\tcity: a.city,\n\t\tstate: a.state ?? '',\n\t\tzip: a.postal_code,\n\t\tcountry: a.country,\n\t\tcountryCode: a.country,\n\t}\n}\n\n/** The storefront's form shape to the engine's checkout address. */\nexport function toEngineAddress(a: StorefrontAddress): Address {\n\tconst name = [a.firstName, a.lastName].filter(Boolean).join(' ').trim()\n\treturn {\n\t\t...(name ? { name } : {}),\n\t\t...(a.phone ? { phone: String(a.phone) } : {}),\n\t\tline1: String(a.address_1 ?? '').trim(),\n\t\t...(a.address_2 || a.locality ? { line2: [a.address_2, a.locality].filter(Boolean).join(', ') } : {}),\n\t\tcity: String(a.city ?? '').trim(),\n\t\t...(a.state ? { state: String(a.state) } : {}),\n\t\tpostal_code: String(a.zip ?? '').trim(),\n\t\tcountry: String(a.countryCode || a.country || '')\n\t\t\t.trim()\n\t\t\t.toUpperCase(),\n\t}\n}\n\n/** An address-book entry (ext/identity) to the storefront's Address. */\nexport function fromIdentityAddress(a: IdentityAddress, email?: string) {\n\tconst [firstName, ...rest] = (a.name ?? '').trim().split(/\\s+/)\n\treturn {\n\t\tid: str(a.id),\n\t\tfirstName: firstName || '',\n\t\tlastName: rest.join(' '),\n\t\temail: email ?? null,\n\t\tphone: a.phone || null,\n\t\taddress_1: a.line1,\n\t\taddress_2: a.line2,\n\t\tcity: a.city,\n\t\tstate: a.state,\n\t\tzip: a.postal_code,\n\t\tcountry: a.country,\n\t\tcountryCode: a.country,\n\t\tlabel: a.label,\n\t\tisPrimary: a.is_default,\n\t\tcreatedAt: a.created_at,\n\t\tupdatedAt: a.updated_at,\n\t}\n}\n\n/** The storefront's Address to ext/identity's AddressInput. Only declared fields: the engine refuses others. */\nexport function toIdentityAddress(a: StorefrontAddress & { isPrimary?: boolean; label?: string }) {\n\tconst e = toEngineAddress(a)\n\treturn {\n\t\tname: e.name ?? '',\n\t\tphone: e.phone ?? '',\n\t\tline1: e.line1,\n\t\tline2: e.line2 ?? '',\n\t\tcity: e.city,\n\t\tstate: e.state ?? '',\n\t\tpostal_code: e.postal_code,\n\t\tcountry: e.country,\n\t\t...(a.label ? { label: String(a.label) } : {}),\n\t\t...(a.isPrimary ? { is_default: true } : {}),\n\t}\n}\n\n// ---------------------------------------------------------------- cart\n\nexport function toCartLine(l: CartLine, extra: { slug?: string; thumbnail?: string | null } = {}) {\n\treturn {\n\t\tid: str(l.id),\n\t\tproductId: str(l.product_id),\n\t\tvariantId: str(l.variant_id),\n\t\tsku: l.sku,\n\t\ttitle: l.title,\n\t\tname: l.title,\n\t\tslug: extra.slug ?? '',\n\t\tthumbnail: extra.thumbnail ?? null,\n\t\tvariantTitle: l.variant_label ?? '',\n\t\tqty: l.quantity,\n\t\tprice: toMajor(l.unit_price),\n\t\tmrp: toMajor(l.unit_price),\n\t\tsubtotal: toMajor(l.total),\n\t\ttotal: toMajor(l.total),\n\t\tinStock: l.in_stock,\n\t\tpriceChanged: l.price_changed,\n\t\tcurrentPrice: toMajor(l.current_price),\n\t\t// The storefront's review step lists only lines marked for checkout. The\n\t\t// engine checks a cart out whole, so every line is.\n\t\tisSelectedForCheckout: true,\n\t\tvariant: {\n\t\t\tid: str(l.variant_id),\n\t\t\toptions: l.variant_label ? l.variant_label.split(' / ').map((value) => ({ option: { title: '' }, value })) : [],\n\t\t},\n\t\tproduct: { id: str(l.product_id), categories: [] as unknown[] },\n\t}\n}\n\n/**\n * A cart, with what the engine does not keep laid over it: the coupon and its\n * previewed saving, the delivery choice and the addresses. Totals here are an\n * estimate the engine settles at checkout — tax in particular exists only on\n * the order — and the storefront is told so by `taxIncluded: false`.\n */\nexport function toCart(\n\tc: Cart,\n\textras: CartExtras = {},\n\tlineExtra: (l: CartLine) => { slug?: string; thumbnail?: string | null } = () => ({}),\n) {\n\tconst lines = c.status === 'converted' ? [] : arr(c.line_items)\n\tconst currency = c.currency\n\tconst subtotalMinor = lines.reduce((n, l) => n + l.total.amount_minor, 0)\n\tconst discountMinor = extras.discount && !extras.discount.free_shipping ? extras.discount.amount_minor : 0\n\tconst shippingMinor = extras.discount?.free_shipping ? 0 : (extras.shippingRate?.minor ?? 0)\n\tconst totalMinor = Math.max(0, subtotalMinor - discountMinor) + shippingMinor\n\tconst money = (minor: number) => minorToMajor(minor, currency)\n\tconst ship = extras.shippingAddress ?? null\n\n\treturn {\n\t\tid: c.id,\n\t\tstatus: c.status,\n\t\temail: c.email ?? ship?.email ?? null,\n\t\tphone: extras.phone ?? ship?.phone ?? null,\n\t\tname: ship ? [ship.firstName, ship.lastName].filter(Boolean).join(' ') : null,\n\t\tlineItems: lines.map((l) => toCartLine(l, lineExtra(l))),\n\t\tqty: lines.reduce((n, l) => n + l.quantity, 0),\n\t\tcurrencyCode: currency,\n\t\tcurrency,\n\t\tsubtotal: money(subtotalMinor),\n\t\tdiscountAmount: money(discountMinor),\n\t\tsavingAmount: money(discountMinor),\n\t\tcouponCode: extras.discount?.code ?? null,\n\t\tdiscount: extras.discount ?? null,\n\t\tshippingCharges: money(shippingMinor),\n\t\tshippingRateId: extras.shippingRateId ?? null,\n\t\tshippingMethod: extras.shippingRate?.name ?? null,\n\t\ttax: 0,\n\t\ttaxIncluded: false,\n\t\tcodCharges: 0,\n\t\ttotal: money(totalMinor),\n\t\tshippingAddress: ship,\n\t\tshippingAddressId: ship ? (ship.id && ship.id !== 'new' ? String(ship.id) : 'cart') : null,\n\t\tbillingAddress: extras.billingAddress ?? ship,\n\t\tbillingAddressId: extras.billingAddress\n\t\t\t? extras.billingAddress.id && extras.billingAddress.id !== 'new'\n\t\t\t\t? String(extras.billingAddress.id)\n\t\t\t\t: 'cart-billing'\n\t\t\t: ship\n\t\t\t\t? ship.id && ship.id !== 'new'\n\t\t\t\t\t? String(ship.id)\n\t\t\t\t\t: 'cart'\n\t\t\t\t: null,\n\t\tpaymentMethod: null,\n\t\tneedAddress: lines.length > 0,\n\t\tcompletedAt: c.status === 'converted' ? c.updated_at : null,\n\t\tcreatedAt: c.created_at,\n\t\tupdatedAt: c.updated_at,\n\t\texpiresAt: c.expires_at,\n\t}\n}\n\n/** What the storefront shows for \"no bag yet\": its own initial cart, field for field. */\nexport function emptyCart(currency = 'USD') {\n\treturn {\n\t\tid: '',\n\t\tstatus: 'open',\n\t\temail: null,\n\t\tphone: null,\n\t\tlineItems: [] as ReturnType<typeof toCartLine>[],\n\t\tqty: 0,\n\t\tcurrencyCode: currency,\n\t\tsubtotal: 0,\n\t\tdiscountAmount: 0,\n\t\tsavingAmount: 0,\n\t\tcouponCode: null,\n\t\tshippingCharges: 0,\n\t\ttax: 0,\n\t\ttotal: 0,\n\t\tshippingAddress: null,\n\t\tshippingAddressId: null,\n\t\tbillingAddress: null,\n\t\tbillingAddressId: null,\n\t}\n}\n\n// ---------------------------------------------------------------- orders\n\nconst STATUS: Record<string, string> = {\n\tpending: 'Pending',\n\tconfirmed: 'Confirmed',\n\tpartial: 'Partially shipped',\n\tshipped: 'Shipped',\n\tdelivered: 'Delivered',\n\tcancelled: 'Cancelled',\n}\n\nconst PAYMENT_STATUS: Record<string, string> = {\n\tpending: 'Pending',\n\tpaid: 'Paid',\n\tfailed: 'Failed',\n\trefunded: 'Refunded',\n}\n\nfunction toOrderLine(l: OrderLine, currency: string) {\n\treturn {\n\t\tid: str(l.id),\n\t\tproductId: str(l.product_id),\n\t\tvariantId: str(l.variant_id),\n\t\tsku: l.sku,\n\t\ttitle: l.title,\n\t\tname: l.title,\n\t\tslug: '',\n\t\tthumbnail: l.image_url ?? null,\n\t\timg: l.image_url ?? null,\n\t\tvariantTitle: l.variant_label ?? '',\n\t\tqty: l.quantity,\n\t\tshippedQty: l.shipped_quantity,\n\t\tprice: toMajor(l.unit_price),\n\t\tmrp: toMajor(l.unit_price),\n\t\tsubtotal: toMajor(l.total),\n\t\ttotal: toMajor(l.total),\n\t\tcurrencyCode: currency,\n\t\tstatus: l.shipped_quantity >= l.quantity ? 'Shipped' : 'Pending',\n\t\tfiles: [],\n\t\tusedOptions: [],\n\t}\n}\n\nexport type StorefrontOrder = ReturnType<typeof toOrder>\n\nexport function toOrder(o: Order) {\n\tconst address = fromEngineAddress(o.address, o.email)\n\tconst code = (o.discounts ?? []).find((d) => d.code)?.code\n\treturn {\n\t\tid: str(o.id),\n\t\torderNo: o.number,\n\t\torderNumber: o.number,\n\t\tnumber: o.number,\n\t\t// The storefront links an order by this; the engine has no sub-orders,\n\t\t// so an order is its own parent.\n\t\tparentOrderNo: o.number,\n\t\tstatus: STATUS[o.status] ?? o.status,\n\t\tengineStatus: o.status,\n\t\tpaymentStatus: PAYMENT_STATUS[o.payment_status] ?? o.payment_status,\n\t\tpaymentMethod: o.payment_provider.toUpperCase(),\n\t\tcurrencyCode: o.currency,\n\t\tsubtotal: toMajor(o.subtotal),\n\t\tshippingCharges: toMajor(o.shipping),\n\t\tdiscount: toMajor(o.discount),\n\t\ttax: toMajor(o.tax),\n\t\ttaxIncluded: o.tax_inclusive,\n\t\ttotal: toMajor(o.total),\n\t\trefunded: toMajor(o.refunded),\n\t\tcodCharges: 0,\n\t\tcoupon: code ? { code } : null,\n\t\tuserEmail: o.email,\n\t\temail: o.email,\n\t\tphone: o.phone ?? null,\n\t\tshippingAddress: address,\n\t\tbillingAddress: address,\n\t\tshippingMethod: o.shipping_method ?? null,\n\t\tshippingRate: o.shipping_method ? { name: o.shipping_method } : null,\n\t\tlineItems: arr(o.line_items).map((l) => toOrderLine(l, o.currency)),\n\t\tfulfillments: arr(o.fulfillments).map((f) => ({\n\t\t\tid: str(f.id),\n\t\t\tstatus: f.status,\n\t\t\tcarrier: f.carrier_name || f.carrier || f.provider,\n\t\t\ttrackingNumber: f.tracking ?? null,\n\t\t\ttrackingUrl: f.tracking_url ?? null,\n\t\t\tlineItems: arr(f.lines).map((l) => ({ id: str(l.order_line_id), title: l.title, qty: l.quantity })),\n\t\t\tcreatedAt: f.created_at,\n\t\t})),\n\t\ttracking: [],\n\t\torderHistory: [],\n\t\tisReplaceOrReturn: false,\n\t\tcreatedAt: o.created_at,\n\t\tupdatedAt: o.updated_at,\n\t}\n}\n\n// ---------------------------------------------------------------- the rest\n\nexport function toRating(r: Review) {\n\treturn {\n\t\tid: str(r.id),\n\t\trating: r.rating,\n\t\tname: r.name,\n\t\ttitle: r.title ?? '',\n\t\treview: r.body,\n\t\tmessage: r.body,\n\t\treply: r.reply ?? null,\n\t\tverified: r.verified,\n\t\timg: '',\n\t\tcreatedAt: r.created_at,\n\t}\n}\n\nexport function toCmsPage(p: CmsPage) {\n\treturn {\n\t\tid: str(p.id),\n\t\tslug: p.slug,\n\t\tname: p.title,\n\t\ttitle: p.title,\n\t\tcontent: p.body,\n\t\texcerpt: p.excerpt ?? null,\n\t\tlayouts: [],\n\t\tlanguage: p.language,\n\t\tmetaTitle: p.seo?.title || p.title,\n\t\tmetaDescription: p.seo?.description || p.excerpt || null,\n\t\tmetaKeywords: p.seo?.keywords || null,\n\t\tpublishedAt: p.published_at ?? null,\n\t\tcreatedAt: p.created_at,\n\t\tupdatedAt: p.updated_at,\n\t}\n}\n\nexport function toVendor(v: Vendor) {\n\treturn {\n\t\tid: str(v.id),\n\t\tslug: v.slug,\n\t\tname: v.name,\n\t\tbusinessName: v.name,\n\t\tabout: v.about,\n\t\tdescription: v.about,\n\t\twebsite: v.website,\n\t\taddress: v.address,\n\t\tbanners: [],\n\t\trating: null,\n\t}\n}\n\nexport function toUser(c: Customer) {\n\tconst [firstName, ...rest] = (c.name ?? '').trim().split(/\\s+/)\n\treturn {\n\t\tid: str(c.id),\n\t\tuserId: str(c.id),\n\t\temail: c.email,\n\t\temailVerified: c.email_verified,\n\t\tphone: c.phone || null,\n\t\tfirstName: firstName || '',\n\t\tlastName: rest.join(' '),\n\t\tname: c.name,\n\t\tfullName: c.name,\n\t\tavatar: null,\n\t\trole: 'USER',\n\t\tcreatedAt: c.created_at,\n\t\tupdatedAt: c.updated_at,\n\t}\n}\n\nexport const priceOf = (m: Money | undefined) => (m ? toMajor(m) : 0)\n","/**\n * The state this connector keeps in the shopper's browser, and only there.\n *\n * The storefront renders some services from a server singleton shared by every\n * shopper, so nothing about one shopper may live in module scope: a token held\n * in a static field would be served to the next request. Everything here is\n * read from `localStorage` or `document.cookie` at the moment it is needed, and\n * on the server every reader answers \"nothing\".\n *\n * What lives here, and why the engine does not hold it:\n *\n * - the account session token — ext/identity is bearer-only and sets no cookie;\n * - the `me` and `connect.sid` cookies — the storefront's own idea of who is\n * signed in, which every connector in the family writes itself;\n * - `cart_id` — the storefront reads it, the connector writes it;\n * - per-cart checkout details — the engine's cart holds lines and an email, and\n * takes the address, phone and delivery choice only in the checkout request,\n * so they are kept here until then;\n * - order access tokens — returned once, at checkout, and the only way a guest\n * can read an order back;\n * - the wishlist token — ext/wishlist keys a list by its own token.\n */\nimport type { AppliedDiscount, AuthResponse, Customer } from './engine'\n\nexport const inBrowser = (): boolean => typeof window !== 'undefined' && typeof document !== 'undefined'\n\nexport function readLocal(key: string): string | null {\n\tif (!inBrowser()) return null\n\ttry {\n\t\treturn window.localStorage.getItem(key)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nexport function writeLocal(key: string, value: string): void {\n\tif (!inBrowser()) return\n\ttry {\n\t\twindow.localStorage.setItem(key, value)\n\t} catch {\n\t\t// Private mode or a full quota. The call it belongs to still succeeds;\n\t\t// only the memory of it is lost.\n\t}\n}\n\nexport function removeLocal(key: string): void {\n\tif (!inBrowser()) return\n\ttry {\n\t\twindow.localStorage.removeItem(key)\n\t} catch {\n\t\t// see writeLocal\n\t}\n}\n\nfunction readJSON<T>(key: string): T | null {\n\tconst raw = readLocal(key)\n\tif (!raw) return null\n\ttry {\n\t\treturn JSON.parse(raw) as T\n\t} catch {\n\t\treturn null\n\t}\n}\n\nconst YEAR = 60 * 60 * 24 * 365\n\nfunction setCookie(name: string, value: string, maxAge = YEAR): void {\n\tif (!inBrowser()) return\n\tdocument.cookie = `${name}=${value}; path=/; max-age=${maxAge}; samesite=lax`\n}\n\nfunction clearCookie(name: string): void {\n\tif (!inBrowser()) return\n\tdocument.cookie = `${name}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`\n}\n\nexport function readCookie(name: string): string | null {\n\tif (!inBrowser()) return null\n\tfor (const pair of document.cookie.split(';')) {\n\t\tconst at = pair.indexOf('=')\n\t\tif (at < 0) continue\n\t\tif (pair.slice(0, at).trim() === name) return pair.slice(at + 1).trim()\n\t}\n\treturn null\n}\n\n// ---------------------------------------------------------------- session\n\nconst TOKEN = 'gocommerce_token'\n\n/** The ext/identity bearer token, when a shopper is signed in in this browser. */\nexport const sessionToken = (): string | null => readLocal(TOKEN)\n\n/**\n * The user object the storefront keeps in its `me` cookie. `userId` is its\n * signed-in test and `role: 'USER'` its shopper test; the rest fills forms.\n */\nexport function toMe(c: Customer) {\n\tconst [firstName, ...rest] = (c.name ?? '').trim().split(/\\s+/)\n\treturn {\n\t\tid: String(c.id),\n\t\tuserId: String(c.id),\n\t\temail: c.email,\n\t\tphone: c.phone || null,\n\t\tfirstName: firstName || '',\n\t\tlastName: rest.join(' '),\n\t\tname: c.name ?? '',\n\t\tfullName: c.name ?? '',\n\t\tavatar: null,\n\t\trole: 'USER',\n\t\temailVerified: c.email_verified,\n\t\tstoreId: null,\n\t}\n}\n\nexport type Me = ReturnType<typeof toMe>\n\n/**\n * Signs this browser in: the token for the engine, the two cookies for the\n * storefront. `connect.sid` carries no secret — the storefront's server only\n * checks that it exists — so it holds a marker rather than the token, which\n * would otherwise ride along on every request to the storefront's origin.\n */\nexport function startSession(auth: AuthResponse): Me {\n\twriteLocal(TOKEN, auth.token)\n\tconst me = toMe(auth.record)\n\tconst expires = Math.max(60, Math.floor((Date.parse(auth.expires_at) - Date.now()) / 1000)) || YEAR\n\tsetCookie('me', encodeURIComponent(JSON.stringify(me)), expires)\n\tsetCookie('connect.sid', 'gocommerce', expires)\n\treturn me\n}\n\n/** Refreshes the `me` cookie after a profile change, keeping the session. */\nexport function updateMe(c: Customer): Me {\n\tconst me = toMe(c)\n\tsetCookie('me', encodeURIComponent(JSON.stringify(me)))\n\treturn me\n}\n\nexport function endSession(): void {\n\tremoveLocal(TOKEN)\n\tclearCookie('me')\n\tclearCookie('connect.sid')\n}\n\n/** The `me` cookie, decoded — the name and email a review is signed with. */\nexport function currentMe(): Partial<Me> | null {\n\tconst raw = readCookie('me')\n\tif (!raw) return null\n\ttry {\n\t\treturn JSON.parse(decodeURIComponent(raw))\n\t} catch {\n\t\treturn null\n\t}\n}\n\n// ---------------------------------------------------------------- cart\n\n/** `localStorage.cart_id`, the storefront's own key, with its stale spellings refused. */\nexport function storedCartId(): string | null {\n\tconst v = readLocal('cart_id')\n\tif (!v || v === 'undefined' || v === 'null') return null\n\treturn v\n}\n\nexport const rememberCartId = (id: string): void => writeLocal('cart_id', id)\n\n/** The storefront's address shape, as its checkout form builds it. */\nexport type StorefrontAddress = {\n\tid?: string\n\tfirstName?: string\n\tlastName?: string\n\temail?: string\n\tphone?: string\n\taddress_1?: string\n\taddress_2?: string\n\tlocality?: string\n\tcity?: string\n\tstate?: string\n\tzip?: string\n\tcountry?: string\n\tcountryCode?: string\n\t[key: string]: unknown\n}\n\nexport type CartExtras = {\n\tphone?: string\n\tshippingAddress?: StorefrontAddress | null\n\tbillingAddress?: StorefrontAddress | null\n\tshippingRateId?: string | null\n\tshippingRate?: { id: string; name: string; minor: number; currency: string } | null\n\tdiscount?: AppliedDiscount | null\n\t/** The Idempotency-Key of the last checkout attempt, and the body it was sent with. */\n\tattempt?: { key: string; body: string } | null\n}\n\nconst extrasKey = (cartId: string) => `gocommerce_cart_${cartId}`\n\nexport const cartExtras = (cartId: string): CartExtras => readJSON<CartExtras>(extrasKey(cartId)) ?? {}\n\nexport function saveCartExtras(cartId: string, patch: CartExtras): CartExtras {\n\tconst next = { ...cartExtras(cartId), ...patch }\n\twriteLocal(extrasKey(cartId), JSON.stringify(next))\n\treturn next\n}\n\nexport const forgetCartExtras = (cartId: string): void => removeLocal(extrasKey(cartId))\n\n// ---------------------------------------------------------------- orders\n\ntype PlacedOrder = { number: string; token: string; cartId: string; reference?: string }\n\nconst ORDERS = 'gocommerce_orders'\n\nconst placedOrders = (): PlacedOrder[] => readJSON<PlacedOrder[]>(ORDERS) ?? []\n\n/**\n * Keeps an order's access token. The engine returns it exactly once — a\n * replayed checkout leaves it out — and without it a guest cannot read the\n * order back, so losing it here loses the order.\n */\nexport function rememberOrder(o: PlacedOrder): void {\n\tconst kept = placedOrders().filter((p) => p.number !== o.number)\n\t// Bounded: a shared computer should not accumulate a history forever.\n\twriteLocal(ORDERS, JSON.stringify([o, ...kept].slice(0, 50)))\n}\n\nexport const placedOrder = (number: string): PlacedOrder | undefined => placedOrders().find((p) => p.number === number)\n\nexport const placedOrderForCart = (cartId: string): PlacedOrder | undefined =>\n\tplacedOrders().find((p) => p.cartId === cartId)\n\nexport const placedOrderByReference = (reference: string): PlacedOrder | undefined =>\n\tplacedOrders().find((p) => p.reference === reference)\n\n// ---------------------------------------------------------------- wishlist\n\nconst WISHLIST = 'gocommerce_wishlist'\nexport const wishlistToken = (): string | null => readLocal(WISHLIST)\nexport const rememberWishlistToken = (token: string): void => writeLocal(WISHLIST, token)\nexport const forgetWishlistToken = (): void => removeLocal(WISHLIST)\n","import type { Credentials } from '../config'\nimport type { Envelope } from '../engine'\nimport { GoCommerceError } from '../errors'\nimport { resolveRestLocally } from '../rest-guard'\nimport { sessionToken } from '../browser'\n\ntype Query = Record<string, string | number | boolean | null | undefined | (string | number)[]>\n\nexport type EngineRequest = {\n\tmethod?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\tquery?: Query\n\tbody?: unknown\n\theaders?: Record<string, string>\n\t/** Send the signed-in shopper's bearer token. Only ext/identity reads it. */\n\tauth?: boolean\n}\n\n/**\n * BaseService — the one place this connector talks to the engine.\n *\n * - Credentials arrive through the static `setCredentials` (both hooks), never\n * a constructor, and merge: the storefront drops unset variables rather than\n * sending `undefined`, so a second call must not erase the first.\n * - Server-side, a service is built with SvelteKit's `fetch`; client-side, the\n * prebuilt singletons use the global one. Either way it is called with the\n * global object as receiver, because the browser's native fetch throws\n * \"Illegal invocation\" when called as a method of anything else.\n * - Every engine call goes through `engine()`, with an absolute URL. The\n * engine's own routes start with `/api/`, and the storefront patches this\n * class's `get/post/put/patch/delete` to swallow any relative `/api/` path\n * (see rest-guard.ts), so those verbs are kept for the Litekart paths the\n * storefront still sends and never used for the engine.\n * - Failures throw a `GoCommerceError`: an `Error` with the engine's message,\n * status and code, which is what the storefront toasts.\n */\nexport class BaseService {\n\tprivate static _credentials: Credentials = { apiUrl: '' }\n\tprotected _fetch: typeof fetch\n\n\tconstructor(fetchFn?: typeof fetch) {\n\t\tthis._fetch = fetchFn ?? ((input, init) => globalThis.fetch(input, init))\n\t}\n\n\tstatic setCredentials(creds: Partial<Credentials>): void {\n\t\tBaseService._credentials = { ...BaseService._credentials, ...creds }\n\t}\n\n\tstatic getCredentials(): Credentials {\n\t\treturn BaseService._credentials\n\t}\n\n\tprotected get creds(): Credentials {\n\t\treturn BaseService._credentials\n\t}\n\n\t/**\n\t * The engine's base URL from wherever this code runs. In the browser a\n\t * configured proxy path wins, because the engine answers no CORS preflight.\n\t */\n\tprotected engineBase(): string {\n\t\tconst { apiUrl, proxyPath } = this.creds\n\t\tif (proxyPath && typeof window !== 'undefined' && window.location) {\n\t\t\treturn new URL(proxyPath, window.location.origin).href.replace(/\\/+$/, '')\n\t\t}\n\t\tconst url = (apiUrl ?? '').trim()\n\t\tif (!url) {\n\t\t\tthrow new GoCommerceError(\n\t\t\t\t'PUBLIC_GOCOMMERCE_API_URL is not set, so this storefront does not know where its commerce ' +\n\t\t\t\t\t'engine is. Point it at a running GoCommerce, e.g. http://127.0.0.1:8080.',\n\t\t\t\t0,\n\t\t\t)\n\t\t}\n\t\treturn url.replace(/\\/+$/, '')\n\t}\n\n\t/** An absolute engine URL for a path and query, without sending anything. */\n\tprotected engineURL(path: string, query?: Query): string {\n\t\treturn this.engineBase() + path + qs(query)\n\t}\n\n\t/**\n\t * One request to the engine, envelope and all.\n\t *\n\t * The body is read as text first, so a proxy's HTML error page is reported\n\t * as what it is rather than as a JSON parse error three frames away.\n\t */\n\tprotected async engine<T>(path: string, req: EngineRequest = {}): Promise<Envelope<T>> {\n\t\tconst url = this.engineURL(path, req.query)\n\t\tconst headers: Record<string, string> = { Accept: 'application/json', ...req.headers }\n\t\tif (req.body !== undefined) headers['Content-Type'] = 'application/json'\n\t\tif (this.creds.store) headers['X-Store'] = this.creds.store\n\t\tif (req.auth) {\n\t\t\tconst token = sessionToken()\n\t\t\tif (!token) throw new GoCommerceError('Please sign in to continue.', 401, 'unauthorized')\n\t\t\theaders.Authorization = `Bearer ${token}`\n\t\t}\n\n\t\tconst init: RequestInit = {\n\t\t\tmethod: req.method ?? 'GET',\n\t\t\theaders,\n\t\t\tbody: req.body === undefined ? undefined : JSON.stringify(req.body),\n\t\t}\n\t\tlet res: Response\n\t\ttry {\n\t\t\tres = await this._fetch.call(globalThis, url, init)\n\t\t} catch (cause) {\n\t\t\t// SvelteKit's server-side fetch applies the browser's CORS rule to a\n\t\t\t// universal load, and the engine sends no CORS headers. On the server\n\t\t\t// there is no browser to protect, so ask again with Node's own fetch;\n\t\t\t// in the browser the same call goes through PUBLIC_GOCOMMERCE_PROXY_PATH.\n\t\t\tif (typeof window === 'undefined' && /CORS/i.test(String((cause as Error)?.message))) {\n\t\t\t\ttry {\n\t\t\t\t\tres = await globalThis.fetch(url, init)\n\t\t\t\t} catch (again) {\n\t\t\t\t\tthrow unreachable(this.engineBase(), again)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow unreachable(this.engineBase(), cause)\n\t\t\t}\n\t\t}\n\t\treturn this.unwrap<T>(res)\n\t}\n\n\t/** The envelope opened: the payload, or the engine's error as a GoCommerceError. */\n\tprivate async unwrap<T>(res: Response): Promise<Envelope<T>> {\n\t\tconst text = await res.text()\n\t\tlet parsed: any = null\n\t\tif (text) {\n\t\t\ttry {\n\t\t\t\tparsed = JSON.parse(text)\n\t\t\t} catch {\n\t\t\t\tthrow new GoCommerceError(\n\t\t\t\t\t`The commerce engine answered ${res.status} with something that is not JSON: ${text.slice(0, 120)}`,\n\t\t\t\t\tres.status,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tif (!res.ok) {\n\t\t\tconst err = parsed?.error ?? {}\n\t\t\tthrow new GoCommerceError(\n\t\t\t\terr.message ?? `The commerce engine answered ${res.status}.`,\n\t\t\t\tres.status,\n\t\t\t\terr.code,\n\t\t\t\terr.details,\n\t\t\t)\n\t\t}\n\t\t// 204 is a success with nothing to say; the caller decides what that means.\n\t\treturn (parsed ?? { data: null }) as Envelope<T>\n\t}\n\n\t/** The bare payload, for the many callers that never look at `meta`. */\n\tprotected async data<T>(path: string, req: EngineRequest = {}): Promise<T> {\n\t\treturn (await this.engine<T>(path, req)).data\n\t}\n\n\t/**\n\t * Prices a cart at the signed-in shopper's customer-group prices. The\n\t * engine does this only for an account whose email is confirmed (403\n\t * otherwise), and the cart stays the shopper's either way — so a refusal\n\t * is not an error, and neither is a build without ext/identity.\n\t */\n\tprotected async claimCartForAccount(cartId: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.engine('/x/identity/me/carts', { method: 'POST', body: { cart_id: cartId }, auth: true })\n\t\t} catch {\n\t\t\t// Unconfirmed email, no identity module, or a cart already checked out.\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------ Litekart verbs\n\n\t/**\n\t * The family's path-addressed verbs. An absolute URL is fetched as-is; a\n\t * relative one is a Litekart REST path, answered from the storefront's own\n\t * data where it has some and refused otherwise (rest-guard.ts).\n\t */\n\tget<T = any>(path: string): Promise<T> {\n\t\treturn this.raw<T>('get', path)\n\t}\n\tpost<T = any>(path: string, data?: unknown): Promise<T> {\n\t\treturn this.raw<T>('post', path, data)\n\t}\n\tput<T = any>(path: string, data?: unknown): Promise<T> {\n\t\treturn this.raw<T>('put', path, data)\n\t}\n\tpatch<T = any>(path: string, data?: unknown): Promise<T> {\n\t\treturn this.raw<T>('patch', path, data)\n\t}\n\tdelete<T = any>(path: string): Promise<T> {\n\t\treturn this.raw<T>('delete', path)\n\t}\n\n\tprivate async raw<T>(method: string, path: string, data?: unknown): Promise<T> {\n\t\tif (!/^https?:\\/\\//i.test(path)) return (await resolveRestLocally(method, path)) as T\n\t\tconst res = await this._fetch.call(globalThis, path, {\n\t\t\tmethod: method.toUpperCase(),\n\t\t\theaders: { Accept: 'application/json', ...(data === undefined ? {} : { 'Content-Type': 'application/json' }) },\n\t\t\tbody: data === undefined ? undefined : JSON.stringify(data),\n\t\t})\n\t\tconst body = await res.json().catch(() => ({}))\n\t\tif (!res.ok)\n\t\t\tthrow new GoCommerceError(body?.error?.message ?? `Request failed with status ${res.status}`, res.status)\n\t\treturn body as T\n\t}\n}\n\n/** A refused connection is the commonest failure in development; it says which address did not answer. */\nconst unreachable = (base: string, cause: unknown) =>\n\tnew GoCommerceError(`Could not reach the commerce engine at ${base}: ${(cause as Error)?.message ?? cause}`, 0)\n\n/** `?a=1&b=2`, dropping what was not asked for. Arrays repeat the key. */\nexport function qs(query?: Query): string {\n\tif (!query) return ''\n\tconst sp = new URLSearchParams()\n\tfor (const [key, value] of Object.entries(query)) {\n\t\t// Undefined, null and '' are \"did not ask\", not \"asked for nothing\":\n\t\t// `?q=` would filter to the empty string.\n\t\tif (value === undefined || value === null || value === '') continue\n\t\tif (Array.isArray(value)) for (const v of value) sp.append(key, String(v))\n\t\telse sp.append(key, String(value))\n\t}\n\tconst s = sp.toString()\n\treturn s ? `?${s}` : ''\n}\n\n/** The family's list shape, from the engine's `{data, meta}`. Totals are the engine's, never invented. */\nexport function toPage<T, U>(env: Envelope<T[] | null>, map: (row: T) => U) {\n\tconst rows = env.data ?? []\n\tconst meta = env.meta\n\treturn {\n\t\tdata: rows.map(map),\n\t\tcount: meta?.total ?? rows.length,\n\t\tpageSize: meta?.limit ?? rows.length,\n\t\tnoOfPage: meta?.total_pages ?? 1,\n\t\tpage: meta?.page ?? 1,\n\t}\n}\n\nexport const emptyPage = <T = never>() => ({ data: [] as T[], count: 0, pageSize: 0, noOfPage: 0, page: 1 })\n","import { remember } from '../cache'\nimport type { Category, CheckoutOptions, Plugin } from '../engine'\nimport { BaseService } from './base.service'\n\n/**\n * Store-level questions several services ask, answered once a minute.\n *\n * Not exported from the package: it is plumbing the other services share.\n */\nexport class StoreFacts extends BaseService {\n\tprivate key(name: string) {\n\t\treturn `${this.engineBase()}|${this.creds.store ?? ''}|${name}`\n\t}\n\n\t/** Enabled plugins by key. A module that is not installed has no key here. */\n\tplugins(): Promise<Map<string, Plugin>> {\n\t\treturn remember(this.key('plugins'), async () => {\n\t\t\tconst list = (await this.data<Plugin[] | null>('/api/plugins')) ?? []\n\t\t\treturn new Map(list.map((p) => [p.key, p]))\n\t\t})\n\t}\n\n\tasync pluginOn(key: string): Promise<boolean> {\n\t\ttry {\n\t\t\treturn (await this.plugins()).has(key)\n\t\t} catch {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/** The store's settlement currency and default language. */\n\tready(): Promise<{ currency: string; language: string; version: string }> {\n\t\treturn remember(this.key('ready'), () => this.data('/health/ready'))\n\t}\n\n\tcheckoutOptions(): Promise<CheckoutOptions> {\n\t\treturn remember(this.key('checkout'), () => this.data<CheckoutOptions>('/api/checkout'))\n\t}\n\n\t/**\n\t * The whole tree, flat and depth-first. Past 500 categories the engine\n\t * answers a truncated list; the tree then serves what it has, and a\n\t * breadcrumb for a category outside it falls back to the category alone.\n\t */\n\tcategories(): Promise<Category[]> {\n\t\treturn remember(\n\t\t\tthis.key('categories'),\n\t\t\tasync () => (await this.data<Category[] | null>('/api/categories', { query: { flat: 1 } })) ?? [],\n\t\t)\n\t}\n\n\t/** Root → `slug`, by walking parents in the flat tree. */\n\tasync hierarchy(slug: string): Promise<{ name: string; slug: string }[]> {\n\t\tconst all = await this.categories().catch(() => [] as Category[])\n\t\tconst byId = new Map(all.map((c) => [c.id, c]))\n\t\tconst out: { name: string; slug: string }[] = []\n\t\tlet c = all.find((x) => x.slug === slug)\n\t\twhile (c) {\n\t\t\tout.unshift({ name: c.title, slug: c.slug })\n\t\t\tc = c.parent_id === null ? undefined : byId.get(c.parent_id)\n\t\t}\n\t\treturn out\n\t}\n\n\t/** `slug` and every category under it — what a category page sells. */\n\tasync subtree(slug: string): Promise<Category[]> {\n\t\tconst all = await this.categories()\n\t\tconst root = all.find((c) => c.slug === slug)\n\t\tif (!root) return []\n\t\tconst ids = new Set([root.id])\n\t\tconst out = [root]\n\t\t// Depth-first and flat, so a parent always precedes its children.\n\t\tfor (const c of all) {\n\t\t\tif (c.parent_id !== null && ids.has(c.parent_id) && !ids.has(c.id)) {\n\t\t\t\tids.add(c.id)\n\t\t\t\tout.push(c)\n\t\t\t}\n\t\t}\n\t\treturn out\n\t}\n}\n","import type { Category, Product, SearchResult } from '../engine'\nimport { fromSearchDoc, toProduct } from '../map'\nimport { toMinor } from '../money'\nimport { BaseService, toPage } from './base.service'\nimport { StoreFacts } from './facts'\n\nexport const PAGE_SIZE = 24\n\nexport type CatalogQuery = {\n\tpage?: number\n\tlimit?: number\n\tsearch?: string\n\t/** The family's sort spellings: `-createdAt`, `price`, `price:asc`, `updatedAt:desc`, `-popularity`… */\n\tsort?: string\n\t/** A category slug: the page sells it and everything under it. */\n\tcategory?: string\n\tpriceFrom?: number\n\tpriceTo?: number\n}\n\nexport type CatalogPage = {\n\tdata: ReturnType<typeof toProduct>[] | ReturnType<typeof fromSearchDoc>[]\n\tcount: number\n\tpageSize: number\n\tnoOfPage: number\n\tpage: number\n\tcategoryHierarchy: { name: string; slug: string }[]\n\t/** Whether the answer honoured `sort` and the price range, or had to drop them. */\n\tsorted: boolean\n}\n\n/**\n * The family's sort names, in the search index's terms. The engine's own\n * listing has one order — newest first — so anything else needs the index.\n * Popularity has no answer anywhere: the engine keeps no such score, and\n * inventing one would sort the shop into a plausible-looking lie.\n */\nfunction indexSort(sort?: string): string | undefined {\n\tif (!sort) return undefined\n\tconst s = sort.trim()\n\tconst [field, dir] = s.startsWith('-') ? [s.slice(1), 'desc'] : s.includes(':') ? s.split(':') : [s, 'asc']\n\tconst d = dir === 'desc' ? 'desc' : 'asc'\n\tswitch (field) {\n\t\tcase 'price':\n\t\t\treturn `price_minor:${d}`\n\t\tcase 'updatedAt':\n\t\tcase 'updated_at':\n\t\tcase 'createdAt':\n\t\tcase 'created_at':\n\t\t\treturn `updated_at:${d}`\n\t\tcase 'title':\n\t\tcase 'name':\n\t\t\treturn `title:${d}`\n\t\tdefault:\n\t\t\treturn undefined\n\t}\n}\n\n/** Newest first is the engine's own order, so these need no index. */\nconst NATURAL = new Set([\n\t'-createdAt',\n\t'createdAt:desc',\n\t'-updatedAt',\n\t'updatedAt:desc',\n\t'-popularity',\n\t'popularity:desc',\n])\n\nconst quote = (s: string) => `\"${s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`\n\n/**\n * One shelf of products, from whichever engine route can answer the question.\n *\n * - A category, no reordering: `GET /api/categories/{slug}`, which sells the\n * category and its descendants.\n * - A search or the whole shop, no reordering: `GET /api/products?q=`.\n * - Any sort but newest, or a price range: the Meilisearch module, when it is\n * installed and configured. Without it the shelf comes back in the engine's\n * order with `sorted: false`, rather than failing or pretending.\n */\nexport class CatalogService extends BaseService {\n\tprotected readonly facts = new StoreFacts(this._fetch)\n\n\tprotected async queryCatalog(q: CatalogQuery): Promise<CatalogPage> {\n\t\tconst page = Math.max(1, Number(q.page) || 1)\n\t\tconst limit = Math.min(100, Math.max(1, Number(q.limit) || PAGE_SIZE))\n\t\tconst search = q.search?.trim() || undefined\n\t\tconst wantsRange = Number.isFinite(q.priceFrom) || Number.isFinite(q.priceTo)\n\t\tconst sortKey = q.sort && !NATURAL.has(q.sort) ? indexSort(q.sort) : undefined\n\t\tconst hierarchy = q.category ? await this.facts.hierarchy(q.category) : []\n\n\t\tif ((sortKey || wantsRange) && (await this.facts.pluginOn('meilisearch'))) {\n\t\t\tconst filters: string[] = []\n\t\t\tif (q.category) {\n\t\t\t\tconst names = (await this.facts.subtree(q.category).catch(() => [] as Category[])).map((c) =>\n\t\t\t\t\tquote(c.full_name),\n\t\t\t\t)\n\t\t\t\t// A slug the tree does not know sells nothing — say so, don't widen to the shop.\n\t\t\t\tif (!names.length) return { ...emptyCatalog(limit), categoryHierarchy: hierarchy, sorted: true }\n\t\t\t\tfilters.push(`category IN [${names.join(', ')}]`)\n\t\t\t}\n\t\t\tif (wantsRange) {\n\t\t\t\tconst { currency } = await this.facts.ready()\n\t\t\t\tif (Number.isFinite(q.priceFrom)) filters.push(`price_minor >= ${toMinor(q.priceFrom as number, currency)}`)\n\t\t\t\tif (Number.isFinite(q.priceTo)) filters.push(`price_minor <= ${toMinor(q.priceTo as number, currency)}`)\n\t\t\t}\n\t\t\tconst res = await this.data<SearchResult>('/x/meilisearch/search', {\n\t\t\t\tquery: {\n\t\t\t\t\tq: search ?? '',\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset: (page - 1) * limit,\n\t\t\t\t\tfilter: filters.join(' AND ') || undefined,\n\t\t\t\t\tsort: sortKey,\n\t\t\t\t},\n\t\t\t})\n\t\t\tconst total = res.total ?? 0\n\t\t\treturn {\n\t\t\t\tdata: (res.hits ?? []).map(fromSearchDoc),\n\t\t\t\tcount: total,\n\t\t\t\tpageSize: limit,\n\t\t\t\tnoOfPage: Math.max(1, Math.ceil(total / limit)),\n\t\t\t\tpage,\n\t\t\t\tcategoryHierarchy: hierarchy,\n\t\t\t\tsorted: true,\n\t\t\t}\n\t\t}\n\n\t\tconst sorted = !sortKey && !wantsRange\n\t\tif (q.category && !search) {\n\t\t\tconst env = await this.engine<{ products: Product[] | null }>(\n\t\t\t\t`/api/categories/${encodeURIComponent(q.category)}`,\n\t\t\t\t{ query: { page, limit } },\n\t\t\t)\n\t\t\tconst products = env.data?.products ?? []\n\t\t\treturn {\n\t\t\t\t...toPage({ data: products, meta: env.meta }, (p: Product) => toProduct(p)),\n\t\t\t\tcategoryHierarchy: hierarchy,\n\t\t\t\tsorted,\n\t\t\t}\n\t\t}\n\t\t// A search inside a category, without the index, searches the whole shop:\n\t\t// the engine's category route takes no query and its search takes no\n\t\t// category, and filtering one page client-side would make the count a lie.\n\t\tconst env = await this.engine<Product[] | null>('/api/products', {\n\t\t\tquery: { q: search, page, limit, channel: this.creds.channel },\n\t\t})\n\t\treturn { ...toPage(env, (p: Product) => toProduct(p)), categoryHierarchy: hierarchy, sorted }\n\t}\n}\n\nexport function emptyCatalog(limit = PAGE_SIZE) {\n\treturn { data: [], count: 0, pageSize: limit, noOfPage: 0, page: 1 }\n}\n","import type { Product, ReviewPage } from '../engine'\nimport { GoCommerceError, NotSupportedError } from '../errors'\nimport { toProduct, toRating } from '../map'\nimport { currentMe } from '../browser'\nimport { CatalogService, PAGE_SIZE, type CatalogQuery } from './catalog'\n\n/**\n * Products: one by slug, and the shelves the homepage and listings draw.\n *\n * \"Featured\" and \"trending\" are curated rather than computed — the engine\n * keeps no sales or view counts to rank by. A collection with the slug\n * `featured` (or `trending`) is that shelf, so a merchant curates it in the\n * panel; without one, the shelf is the newest products, and says nothing more\n * about them than that.\n */\nexport class ProductService extends CatalogService {\n\t/**\n\t * A product page. `slug` may also be a numeric id or a variant SKU, which is\n\t * how an old link or a search hit sometimes arrives.\n\t *\n\t * Reviews ride along when ext/reviews is installed and switched on; a review\n\t * failure never costs the shopper the product page.\n\t */\n\tasync getOne(slug: string) {\n\t\tconst p = await this.findProduct(String(slug))\n\t\tconst product = toProduct(p, {\n\t\t\tcategoryHierarchy: p.category ? await this.facts.hierarchy(p.category.slug) : [],\n\t\t})\n\t\tif (await this.facts.pluginOn('product-reviews')) {\n\t\t\ttry {\n\t\t\t\tconst res = await this.data<ReviewPage>('/x/reviews', { query: { product_id: p.id, limit: 50 } })\n\t\t\t\tproduct.ratings = (res.reviews ?? []).map(toRating)\n\t\t\t\tproduct.rating = res.summary?.count ? res.summary.average : null\n\t\t\t\tproduct.ratingCount = res.summary?.count ?? 0\n\t\t\t\tproduct.reviewCount = res.summary?.count ?? 0\n\t\t\t} catch {\n\t\t\t\t// The page renders without stars rather than not at all.\n\t\t\t}\n\t\t}\n\t\treturn product\n\t}\n\n\tprivate async findProduct(slug: string): Promise<Product> {\n\t\ttry {\n\t\t\treturn await this.data<Product>(`/api/products/slug/${encodeURIComponent(slug)}`)\n\t\t} catch (err) {\n\t\t\tif (!(err instanceof GoCommerceError) || err.status !== 404) throw err\n\t\t\t// Not a slug. An id or a SKU is worth one more question each, and a\n\t\t\t// miss on all three is the product's 404, not theirs.\n\t\t\tconst fallback = /^\\d+$/.test(slug) ? `/api/products/${slug}` : `/api/products/sku/${encodeURIComponent(slug)}`\n\t\t\ttry {\n\t\t\t\treturn await this.data<Product>(fallback)\n\t\t\t} catch {\n\t\t\t\tthrow err\n\t\t\t}\n\t\t}\n\t}\n\n\t/** The shop's listing: `{ page, search, sort }`, newest first unless the index can reorder it. */\n\tasync list({\n\t\tpage = 1,\n\t\tsearch,\n\t\tq,\n\t\tsort,\n\t\tlimit,\n\t\tcategories,\n\t}: CatalogQuery & { q?: string; categories?: string } = {}) {\n\t\tconst res = await this.queryCatalog({ page, search: search ?? q, sort, limit, category: categories || undefined })\n\t\treturn { data: res.data, count: res.count, pageSize: res.pageSize, noOfPage: res.noOfPage, page: res.page }\n\t}\n\n\tasync listFeaturedProducts({ page = 1, sort, limit }: { page?: number; sort?: string; limit?: number } = {}) {\n\t\treturn this.shelf('featured', { page, sort, limit })\n\t}\n\n\tasync listTrendingProducts({ page = 1, limit }: { page?: number; limit?: number } = {}) {\n\t\treturn this.shelf('trending', { page, limit })\n\t}\n\n\t/** More from this product's category. */\n\tasync listRelatedProducts({\n\t\tpage = 1,\n\t\tcategoryId,\n\t\tlimit,\n\t}: { page?: number; categoryId?: string; limit?: number } = {}) {\n\t\tif (!categoryId) return this.list({ page, limit })\n\t\tconst category = (await this.facts.categories()).find((c) => String(c.id) === String(categoryId))\n\t\tif (!category) return this.list({ page, limit })\n\t\treturn this.list({ page, limit, categories: category.slug })\n\t}\n\n\tprivate async shelf(slug: string, { page, sort, limit }: { page: number; sort?: string; limit?: number }) {\n\t\tconst size = Math.min(100, Math.max(1, Number(limit) || PAGE_SIZE))\n\t\ttry {\n\t\t\tconst env = await this.engine<{ products: Product[] | null }>(`/api/collections/${slug}`, {\n\t\t\t\tquery: { page, limit: size },\n\t\t\t})\n\t\t\tconst rows = env.data?.products ?? []\n\t\t\treturn {\n\t\t\t\tdata: rows.map((p) => toProduct(p)),\n\t\t\t\tcount: env.meta?.total ?? rows.length,\n\t\t\t\tpageSize: env.meta?.limit ?? size,\n\t\t\t\tnoOfPage: env.meta?.total_pages ?? 1,\n\t\t\t\tpage: env.meta?.page ?? page,\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tif (!(err instanceof GoCommerceError) || err.status !== 404) throw err\n\t\t\treturn this.list({ page, sort, limit: size })\n\t\t}\n\t}\n\n\t/**\n\t * A review, through ext/reviews. The engine asks for a name and an email\n\t * with every review, so a signed-out shopper is asked to sign in rather\n\t * than having one made up for them. Uploaded photos have nowhere to go: the\n\t * module stores text.\n\t */\n\tasync addReview({\n\t\tproductId,\n\t\trating,\n\t\treview,\n\t\ttitle,\n\t}: {\n\t\tproductId: string\n\t\tvariantId?: string\n\t\trating: number\n\t\treview: string\n\t\ttitle?: string\n\t}) {\n\t\tconst me = currentMe()\n\t\tif (!me?.email) throw new GoCommerceError('Please sign in to write a review.', 401, 'unauthorized')\n\t\tconst name = [me.firstName, me.lastName].filter(Boolean).join(' ') || me.email.split('@')[0]\n\t\treturn this.data<{ status: string; verified: boolean }>('/x/reviews', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: {\n\t\t\t\tproduct_id: Number(productId),\n\t\t\t\tname,\n\t\t\t\temail: me.email,\n\t\t\t\trating: Math.round(Number(rating)),\n\t\t\t\t...(title ? { title } : {}),\n\t\t\t\tbody: String(review ?? ''),\n\t\t\t},\n\t\t})\n\t}\n\n\tasync fetchReels(): Promise<never> {\n\t\tthrow new NotSupportedError('ProductService', 'fetchReels', 'the engine has no reels')\n\t}\n}\n\nexport const productService = new ProductService()\n","import { CatalogService } from './catalog'\n\nconst num = (v: string | null): number | undefined => {\n\tif (v === null || v.trim() === '') return undefined\n\tconst n = Number(v)\n\treturn Number.isFinite(n) ? n : undefined\n}\n\n/**\n * The listing pages' search: `/products?search=&sort=&page=` and the category\n * catch-all `/{slug}`.\n *\n * Facets are empty. The engine's search route returns hits and a total, not\n * distributions, and a facet list made from one page of hits would count that\n * page, not the shop. An empty `priceStat` hides the price slider rather than\n * drawing one with a made-up range.\n */\nexport class SearchService extends CatalogService {\n\temptyResult() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\tcount: 0,\n\t\t\ttotalPages: 0,\n\t\t\tcategoryHierarchy: [] as { name: string; slug: string }[],\n\t\t\tfacets: { priceStat: {}, categories: [], tags: [], allFilters: {} },\n\t\t}\n\t}\n\n\tasync searchWithUrl(url: URL | string, slug?: string) {\n\t\ttry {\n\t\t\tconst u = typeof url === 'string' ? new URL(url, 'http://localhost') : url\n\t\t\tconst p = u.searchParams\n\t\t\t// `?price=10,50` is the chip form; priceFrom/priceTo the slider's.\n\t\t\tconst [from, to] = (p.get('price') ?? '').split(/[,-]/)\n\t\t\tconst res = await this.queryCatalog({\n\t\t\t\tpage: num(p.get('page')),\n\t\t\t\tsearch: p.get('search') ?? p.get('q') ?? undefined,\n\t\t\t\tsort: p.get('sort') ?? undefined,\n\t\t\t\tcategory: slug || p.get('categories')?.split(',')[0] || undefined,\n\t\t\t\tpriceFrom: num(p.get('priceFrom')) ?? num(from ?? null),\n\t\t\t\tpriceTo: num(p.get('priceTo')) ?? num(to ?? null),\n\t\t\t})\n\t\t\treturn {\n\t\t\t\tdata: res.data,\n\t\t\t\tcount: res.count,\n\t\t\t\ttotalPages: res.noOfPage,\n\t\t\t\tpage: res.page,\n\t\t\t\tcategoryHierarchy: res.categoryHierarchy,\n\t\t\t\tfacets: { priceStat: {}, categories: [], tags: [], allFilters: {} },\n\t\t\t}\n\t\t} catch (err) {\n\t\t\t// A missing category is an empty result — the route turns that into\n\t\t\t// its 404 — but an engine that cannot be reached is not, and says so.\n\t\t\tif ((err as { status?: number })?.status === 404) return this.emptyResult()\n\t\t\tthrow err\n\t\t}\n\t}\n}\n\nexport const searchService = new SearchService()\n","import type { Product, SearchResult } from '../engine'\nimport { fromSearchDoc, toProduct } from '../map'\nimport { CatalogService } from './catalog'\n\n/**\n * The two places the storefront asks for raw search hits: \"more from this\n * category\" on a product page, and the header's type-ahead.\n *\n * Both go through ext/search-meilisearch when it is installed, and through the\n * engine's own listing when it is not — a type-ahead backed by a LIKE query is\n * slower and unranked, but it is not empty.\n */\nexport class MeilisearchService extends CatalogService {\n\t/** `{ query, categories, page }` → a Meilisearch-shaped answer: `hits`, `totalHits`, `totalPages`. */\n\tasync search({\n\t\tquery,\n\t\tsearch,\n\t\tcategories,\n\t\tpage = 1,\n\t\tlimit,\n\t}: { query?: string; search?: string; categories?: string; page?: number; limit?: number } = {}) {\n\t\tconst res = await this.queryCatalog({ page, limit, search: query ?? search, category: categories || undefined })\n\t\treturn {\n\t\t\thits: res.data,\n\t\t\ttotalHits: res.count,\n\t\t\testimatedTotalHits: res.count,\n\t\t\ttotalPages: res.noOfPage,\n\t\t\tpage: res.page,\n\t\t\tcategories: res.categoryHierarchy,\n\t\t\tfacetDistribution: {},\n\t\t}\n\t}\n\n\t/** The header's type-ahead: `{ data: [{ slug, title, thumbnail, price }] }`. */\n\tasync searchAutoComplete({ query, search, limit = 8 }: { query?: string; search?: string; limit?: number } = {}) {\n\t\tconst q = (query ?? search ?? '').trim()\n\t\tif (!q) return { data: [] }\n\t\tif (await this.facts.pluginOn('meilisearch')) {\n\t\t\tconst res = await this.data<SearchResult>('/x/meilisearch/search', { query: { q, limit } })\n\t\t\treturn { data: (res.hits ?? []).map(fromSearchDoc) }\n\t\t}\n\t\tconst rows =\n\t\t\t(await this.data<Product[] | null>('/api/products', { query: { q, limit, channel: this.creds.channel } })) ?? []\n\t\treturn { data: rows.map((p) => toProduct(p)) }\n\t}\n}\n\nexport const meilisearchService = new MeilisearchService()\n","import type { Category } from '../engine'\nimport { toCategory } from '../map'\nimport { BaseService } from './base.service'\nimport { StoreFacts } from './facts'\n\nconst asList = (rows: ReturnType<typeof toCategory>[]) => ({\n\tdata: rows,\n\tcount: rows.length,\n\tpageSize: rows.length,\n\tnoOfPage: 1,\n\tpage: 1,\n})\n\n/**\n * The category tree. The engine has no \"featured\" flag on a category, so the\n * featured row is the top level of the tree, in the merchant's order — which\n * is what a shop's first row of category tiles usually is anyway.\n */\nexport class CategoryService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\n\t/** Every category, flat, each naming its parent. The storefront builds the tree. */\n\tasync fetchAllCategories(_args: Record<string, unknown> = {}) {\n\t\tconst all = await this.facts.categories()\n\t\treturn asList(all.map(flat))\n\t}\n\n\tasync fetchFeaturedCategories({ limit = 18 }: { limit?: number } = {}) {\n\t\tconst roots = (await this.facts.categories()).filter((c) => c.parent_id === null)\n\t\treturn asList(roots.slice(0, Math.max(0, Number(limit) || 18)).map(flat))\n\t}\n\n\tasync fetchFooterCategories(args: { limit?: number } = {}) {\n\t\treturn this.fetchFeaturedCategories(args)\n\t}\n\n\t/** The nested tree, roots first. */\n\tasync getMegamenu(_args: Record<string, unknown> = {}) {\n\t\tconst tree = (await this.data<Category[] | null>('/api/categories')) ?? []\n\t\treturn tree.map(toCategory)\n\t}\n\n\tasync fetchCategory(slug: string) {\n\t\tconst c = await this.data<Category>(`/api/categories/${encodeURIComponent(slug)}`, { query: { limit: 1 } })\n\t\treturn toCategory(c)\n\t}\n\n\t/**\n\t * kitcommerce-core's category filter asks for `/api/categories/all` by path,\n\t * through the family's raw `get`. That is a Litekart path the rest-guard\n\t * would swallow, so it is answered here, from the engine's tree.\n\t */\n\toverride async get<T = any>(path: string): Promise<T> {\n\t\tif (path.split('?')[0] === '/api/categories/all') return (await this.fetchAllCategories()) as T\n\t\treturn super.get<T>(path)\n\t}\n}\n\n/** One row of the flat tree: no `children`, so the storefront's builder is the only one. */\nconst flat = (c: Category) => ({ ...toCategory(c), children: [] })\n\nexport const categoryService = new CategoryService()\n","import type { Collection, Product } from '../engine'\nimport { toCollection, toProduct } from '../map'\nimport { BaseService, toPage } from './base.service'\n\n/** Curated lists. Only collections holding at least one product on sale are listed. */\nexport class CollectionService extends BaseService {\n\tasync list({ page = 1, limit = 24 }: { page?: number; limit?: number; sort?: string; q?: string } = {}) {\n\t\tconst env = await this.engine<Collection[] | null>('/api/collections', { query: { page, limit } })\n\t\treturn toPage(env, toCollection)\n\t}\n\n\t/** A collection page: the collection, and its products in the merchant's order. */\n\tasync getOne(slug: string, { page = 1, limit = 48 }: { page?: number; limit?: number } = {}) {\n\t\tconst env = await this.engine<Collection & { products: Product[] | null }>(\n\t\t\t`/api/collections/${encodeURIComponent(slug)}`,\n\t\t\t{ query: { page, limit } },\n\t\t)\n\t\tconst products = (env.data.products ?? []).map((p) => toProduct(p))\n\t\treturn {\n\t\t\t...toCollection(env.data),\n\t\t\tproducts,\n\t\t\t// The family's shape for a collection's members.\n\t\t\tcollectionvalues: products.map((p) => ({ products: p })),\n\t\t\tcount: env.meta?.total ?? products.length,\n\t\t\tnoOfPage: env.meta?.total_pages ?? 1,\n\t\t\tpage: env.meta?.page ?? page,\n\t\t}\n\t}\n\n\t/** Collection-level ratings are a Litekart aggregate; the engine has none to report. */\n\tasync getAllRatings() {\n\t\treturn { data: [] as unknown[] }\n\t}\n}\n\nexport const collectionService = new CollectionService()\n","import type { AppliedDiscount, Cart, CartLine, Product } from '../engine'\nimport { GoCommerceError, NotSupportedError } from '../errors'\nimport { emptyCart, toCart } from '../map'\nimport { remember } from '../cache'\nimport {\n\tcartExtras,\n\tforgetCartExtras,\n\trememberCartId,\n\tsaveCartExtras,\n\tsessionToken,\n\tstoredCartId,\n\ttype StorefrontAddress,\n} from '../browser'\nimport { BaseService } from './base.service'\nimport { StoreFacts } from './facts'\n\n/** The storefront's \"take this line out\" sentinel, sent when − is pressed on a quantity of one. */\nconst REMOVE = -9999999\n\n/**\n * The bag.\n *\n * The engine's cart is addressed by an opaque token it mints, held by the\n * storefront in `localStorage.cart_id`. It keeps lines and an email; the\n * coupon, the address and the delivery choice the storefront collects before\n * checkout are kept beside it in the browser (browser.ts) and sent with the\n * checkout request, which is the only place the engine takes them.\n *\n * Every method answers the whole cart, as the storefront assigns it whole.\n */\nexport class CartService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\n\tasync getCartByCartId(cartId?: string | null) {\n\t\tconst id = clean(cartId)\n\t\tif (!id) return emptyCart(await this.currency())\n\t\ttry {\n\t\t\treturn await this.present(await this.data<Cart>(`/api/carts/${encodeURIComponent(id)}`))\n\t\t} catch (err) {\n\t\t\t// A cart expires after a month untouched. A shopper coming back to a\n\t\t\t// dead token sees an empty bag, not an error.\n\t\t\tif (err instanceof GoCommerceError && err.status === 404) return emptyCart(await this.currency())\n\t\t\tthrow err\n\t\t}\n\t}\n\n\tasync fetchCartData(cartId?: string | null) {\n\t\treturn this.getCartByCartId(cartId ?? storedCartId())\n\t}\n\n\t/**\n\t * The cart after an order: the engine marks it `converted` and keeps its\n\t * lines, and this answers it with none — which is how the storefront knows\n\t * to clear the bag on the success page.\n\t */\n\tasync refereshCart() {\n\t\tconst id = storedCartId()\n\t\tconst cart = await this.getCartByCartId(id)\n\t\tif (id && (cart as { status?: string }).status === 'converted') forgetCartExtras(id)\n\t\treturn cart\n\t}\n\n\t/**\n\t * `qty` is a change, not a total: +1 from a product page, −1 from a card's\n\t * minus button. With no cart yet, one is opened and remembered.\n\t */\n\tasync addToCart({\n\t\tcartId,\n\t\tlineId,\n\t\tqty = 1,\n\t\tvariantId,\n\t}: {\n\t\tcartId?: string | null\n\t\tlineId?: string | null\n\t\tqty?: number\n\t\tproductId?: string\n\t\tvariantId?: string\n\t}) {\n\t\tlet id = clean(cartId) ?? storedCartId()\n\t\tif (lineId && id) {\n\t\t\tconst cart = await this.data<Cart>(`/api/carts/${encodeURIComponent(id)}`)\n\t\t\tconst line = (cart.line_items ?? []).find((l) => String(l.id) === String(lineId))\n\t\t\tif (line) {\n\t\t\t\tconst next = qty === REMOVE ? 0 : line.quantity + Number(qty)\n\t\t\t\treturn this.setQuantity(id, line.id, next)\n\t\t\t}\n\t\t}\n\t\tif (qty === REMOVE || Number(qty) <= 0) return this.getCartByCartId(id)\n\t\tif (!variantId) throw new GoCommerceError('Please choose an option before adding this to your bag.', 400)\n\t\tif (!id) id = await this.open()\n\t\ttry {\n\t\t\treturn await this.present(\n\t\t\t\tawait this.data<Cart>(`/api/carts/${encodeURIComponent(id)}/line-items`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: { variant_id: Number(variantId), quantity: Number(qty) },\n\t\t\t\t}),\n\t\t\t)\n\t\t} catch (err) {\n\t\t\t// The remembered cart was checked out in another tab, or expired.\n\t\t\t// Start a new one rather than refusing the shopper's click.\n\t\t\tif (err instanceof GoCommerceError && (err.status === 404 || /checked out/.test(err.message))) {\n\t\t\t\tconst fresh = await this.open()\n\t\t\t\treturn this.present(\n\t\t\t\t\tawait this.data<Cart>(`/api/carts/${encodeURIComponent(fresh)}/line-items`, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\tbody: { variant_id: Number(variantId), quantity: Number(qty) },\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tthrow err\n\t\t}\n\t}\n\n\t/** `qty` is the new total; 0 takes the line out. */\n\tasync updateCart({\n\t\tcartId,\n\t\tlineId,\n\t\tqty,\n\t}: {\n\t\tcartId?: string\n\t\tlineId: string\n\t\tqty: number\n\t\tisSelectedForCheckout?: boolean\n\t}) {\n\t\tconst id = clean(cartId) ?? storedCartId()\n\t\tif (!id) return emptyCart(await this.currency())\n\t\treturn this.setQuantity(id, lineId, Number(qty))\n\t}\n\n\tasync removeCart({ cartId, lineId }: { cartId?: string; lineId: string }) {\n\t\tconst id = clean(cartId) ?? storedCartId()\n\t\tif (!id) return emptyCart(await this.currency())\n\t\treturn this.present(\n\t\t\tawait this.data<Cart>(`/api/carts/${encodeURIComponent(id)}/line-items/${encodeURIComponent(String(lineId))}`, {\n\t\t\t\tmethod: 'DELETE',\n\t\t\t}),\n\t\t)\n\t}\n\n\t/**\n\t * Contact details and addresses, from the checkout's address step. The\n\t * email goes to the engine — it is how an abandoned cart is followed up —\n\t * and the rest is kept for the checkout request.\n\t */\n\tasync updateCart2(args: {\n\t\tcartId?: string\n\t\temail?: string\n\t\tphone?: string\n\t\tshippingAddress?: StorefrontAddress | null\n\t\tbillingAddress?: StorefrontAddress | null\n\t\tisBillingAddressSameAsShipping?: boolean\n\t}) {\n\t\tconst id = clean(args.cartId) ?? storedCartId()\n\t\tif (!id) return emptyCart(await this.currency())\n\n\t\tconst patch: Parameters<typeof saveCartExtras>[1] = {}\n\t\tif (args.phone !== undefined) patch.phone = args.phone || undefined\n\t\tif (args.shippingAddress !== undefined) {\n\t\t\tpatch.shippingAddress = args.shippingAddress\n\t\t\tif (args.shippingAddress?.phone && !patch.phone) patch.phone = String(args.shippingAddress.phone)\n\t\t}\n\t\tif (args.billingAddress !== undefined || args.isBillingAddressSameAsShipping) {\n\t\t\tpatch.billingAddress = args.isBillingAddressSameAsShipping ? null : (args.billingAddress ?? null)\n\t\t}\n\t\t// A new destination may not be served by the rate chosen for the old one.\n\t\tconst before = cartExtras(id)\n\t\tconst country = (a?: StorefrontAddress | null) => String(a?.countryCode || a?.country || '').toUpperCase()\n\t\tif (args.shippingAddress !== undefined && country(args.shippingAddress) !== country(before.shippingAddress)) {\n\t\t\tpatch.shippingRateId = null\n\t\t\tpatch.shippingRate = null\n\t\t}\n\t\tsaveCartExtras(id, patch)\n\n\t\tconst email = args.email ?? (args.shippingAddress?.email ? String(args.shippingAddress.email) : undefined)\n\t\tif (email !== undefined) {\n\t\t\treturn this.present(\n\t\t\t\tawait this.data<Cart>(`/api/carts/${encodeURIComponent(id)}/email`, { method: 'PUT', body: { email } }),\n\t\t\t)\n\t\t}\n\t\treturn this.getCartByCartId(id)\n\t}\n\n\t/**\n\t * A discount code. The engine prices it against the basket now and decides\n\t * it again at checkout; what it answers is kept so the bag can show it,\n\t * because the cart itself does not carry the code.\n\t */\n\tasync applyCoupon({ cartId, couponCode }: { cartId?: string; couponCode: string }) {\n\t\tconst id = clean(cartId) ?? storedCartId()\n\t\tif (!id) throw new GoCommerceError('Add something to your bag before applying a code.', 400)\n\t\tconst cart = await this.data<Cart>(`/api/carts/${encodeURIComponent(id)}`)\n\t\tconst discount = await this.data<AppliedDiscount>(`/api/carts/${encodeURIComponent(id)}/discount`, {\n\t\t\tmethod: 'PUT',\n\t\t\tbody: { code: String(couponCode ?? '').trim(), ...(cart.email ? { email: cart.email } : {}) },\n\t\t})\n\t\tsaveCartExtras(id, { discount: { ...discount, code: discount.code || String(couponCode).trim() } })\n\t\treturn this.present(cart)\n\t}\n\n\tasync removeCoupon(cartId?: string) {\n\t\tconst id = clean(cartId) ?? storedCartId()\n\t\tif (!id) return emptyCart(await this.currency())\n\t\tawait this.engine(`/api/carts/${encodeURIComponent(id)}/discount`, { method: 'DELETE' })\n\t\tsaveCartExtras(id, { discount: null })\n\t\treturn this.getCartByCartId(id)\n\t}\n\n\t/** The delivery option the shopper picked, priced from the engine's own quote. */\n\tasync updateShippingRate({ cartId, shippingRateId }: { cartId?: string; shippingRateId: string }) {\n\t\tconst id = clean(cartId) ?? storedCartId()\n\t\tif (!id) return emptyCart(await this.currency())\n\t\tconst ship = cartExtras(id).shippingAddress\n\t\tconst country = String(ship?.countryCode || ship?.country || '').toUpperCase()\n\t\tif (!country) throw new GoCommerceError('Add a delivery address first.', 400)\n\t\tconst quote = await this.data<{\n\t\t\trates: { rate_id: number; name: string; price: { amount_minor: number; currency: string } }[] | null\n\t\t\tcurrency: string\n\t\t}>('/api/checkout/rates', { query: { cart: id, country, state: ship?.state ? String(ship.state) : undefined } })\n\t\tconst rate = (quote.rates ?? []).find((r) => String(r.rate_id) === String(shippingRateId))\n\t\tif (!rate) throw new GoCommerceError('That delivery option is not available for this address any more.', 409)\n\t\tsaveCartExtras(id, {\n\t\t\tshippingRateId: String(rate.rate_id),\n\t\t\tshippingRate: {\n\t\t\t\tid: String(rate.rate_id),\n\t\t\t\tname: rate.name,\n\t\t\t\tminor: rate.price.amount_minor,\n\t\t\t\tcurrency: rate.price.currency,\n\t\t\t},\n\t\t})\n\t\treturn this.getCartByCartId(id)\n\t}\n\n\t/** The payment method is chosen at checkout, by which checkout route is called. */\n\tasync updateCartPaymentMethod({ cartId }: { cartId?: string; paymentMethod?: string }) {\n\t\treturn this.getCartByCartId(clean(cartId) ?? storedCartId())\n\t}\n\n\tasync completeCart(): Promise<never> {\n\t\tthrow new NotSupportedError('CartService', 'completeCart', 'an order is placed through checkoutService')\n\t}\n\n\t// ------------------------------------------------------------ internals\n\n\tprivate async setQuantity(cartId: string, lineId: string | number, qty: number) {\n\t\tconst path = `/api/carts/${encodeURIComponent(cartId)}/line-items/${encodeURIComponent(String(lineId))}`\n\t\t// Zero is a removal: the engine accepts it on PATCH, and DELETE says it plainly.\n\t\tif (qty <= 0) return this.present(await this.data<Cart>(path, { method: 'DELETE' }))\n\t\treturn this.present(await this.data<Cart>(path, { method: 'PATCH', body: { quantity: qty } }))\n\t}\n\n\t/** A new cart, remembered — and priced for the signed-in shopper's group when the engine allows it. */\n\tprivate async open(): Promise<string> {\n\t\tconst channel = this.creds.channel\n\t\tconst cart = await this.data<Cart>('/api/carts', { method: 'POST', ...(channel ? { body: { channel } } : {}) })\n\t\trememberCartId(cart.id)\n\t\tif (sessionToken()) await this.claimCartForAccount(cart.id)\n\t\treturn cart.id\n\t}\n\n\tprivate async currency(): Promise<string> {\n\t\ttry {\n\t\t\treturn (await this.facts.ready()).currency\n\t\t} catch {\n\t\t\treturn 'USD'\n\t\t}\n\t}\n\n\t/** The engine's cart with the browser-held extras and each line's picture and link. */\n\tprivate async present(cart: Cart) {\n\t\tconst ids = [...new Set((cart.line_items ?? []).map((l) => l.product_id))]\n\t\tconst products = new Map<number, Product | null>()\n\t\tawait Promise.all(\n\t\t\tids.map(async (pid) => {\n\t\t\t\tproducts.set(pid, await this.productFor(pid))\n\t\t\t}),\n\t\t)\n\t\treturn toCart(cart, cartExtras(cart.id), (l: CartLine) => {\n\t\t\tconst p = products.get(l.product_id)\n\t\t\tif (!p) return {}\n\t\t\tconst v = (p.variants ?? []).find((x) => x.id === l.variant_id)\n\t\t\treturn { slug: p.slug, thumbnail: v?.image?.url ?? p.image_url ?? null }\n\t\t})\n\t}\n\n\tprivate productFor(id: number): Promise<Product | null> {\n\t\treturn remember(`${this.engineBase()}|product|${id}`, () =>\n\t\t\tthis.data<Product>(`/api/products/${id}`).catch(() => null),\n\t\t)\n\t}\n}\n\nconst clean = (id?: string | null): string | null => (id && id !== 'undefined' && id !== 'null' ? id : null)\n\nexport const cartService = new CartService()\n","import type { Cart, CheckoutResult } from '../engine'\nimport { GoCommerceError, NotSupportedError } from '../errors'\nimport { toEngineAddress } from '../map'\nimport { minorToMajor } from '../money'\nimport {\n\tcartExtras,\n\tplacedOrderByReference,\n\trememberOrder,\n\tsaveCartExtras,\n\tsessionToken,\n\tstoredCartId,\n} from '../browser'\nimport { BaseService } from './base.service'\n\n/**\n * Placing an order.\n *\n * The engine turns a cart into an order in one call, `POST /api/checkout/{code}`,\n * and that call is the only thing that moves stock and asks for money. It takes\n * the address, phone and delivery choice in its body — the cart keeps none of\n * them — so they are read back from what the address step stored (browser.ts).\n *\n * Payment is confirmed by the gateway's webhook to the engine, never by the\n * storefront. So the \"capture\" calls the storefront makes after a gateway's\n * modal closes do not capture anything: they hand back the order number, and\n * the order page shows `payment_status` once the webhook has landed.\n */\nexport class CheckoutService extends BaseService {\n\t/** Delivery options for the address on the cart: `{ data: [{ id, name, base_rate }] }`. */\n\tasync getShippingRates({ cartId }: { cartId?: string } = {}) {\n\t\tconst id = cartId || storedCartId()\n\t\tconst ship = id ? cartExtras(id).shippingAddress : null\n\t\tconst country = String(ship?.countryCode || ship?.country || '').toUpperCase()\n\t\tif (!id || !country) return { data: [] }\n\t\tconst quote = await this.data<{\n\t\t\trates: { rate_id: number; name: string; price: { amount_minor: number; currency: string } }[] | null\n\t\t\tcurrency: string\n\t\t}>('/api/checkout/rates', { query: { cart: id, country, state: ship?.state ? String(ship.state) : undefined } })\n\t\treturn {\n\t\t\tdata: (quote.rates ?? []).map((r) => ({\n\t\t\t\tid: String(r.rate_id),\n\t\t\t\tname: r.name,\n\t\t\t\tdescription: null,\n\t\t\t\tbase_rate: minorToMajor(r.price.amount_minor, r.price.currency),\n\t\t\t\tprice: minorToMajor(r.price.amount_minor, r.price.currency),\n\t\t\t\tcurrencyCode: r.price.currency,\n\t\t\t\t// The engine's rates carry no delivery estimate; none is made up.\n\t\t\t\testimated_min_days: null,\n\t\t\t\testimated_max_days: null,\n\t\t\t})),\n\t\t}\n\t}\n\n\t/** Cash on delivery: the order is confirmed at once and paid on the doorstep. */\n\tasync checkoutCOD({ cartId }: { cartId?: string; origin?: string } = {}) {\n\t\tconst result = await this.place('cod', cartId)\n\t\treturn {\n\t\t\torder_no: result.order.number,\n\t\t\torderNo: result.order.number,\n\t\t\tid: String(result.order.id),\n\t\t\tstatus: result.order.status,\n\t\t}\n\t}\n\n\t/**\n\t * Razorpay's modal. The engine has already created the Razorpay order; this\n\t * hands the storefront what the modal needs. A store running Razorpay's\n\t * hosted (redirect) mode cannot be driven from this storefront's modal flow,\n\t * and says so rather than opening a modal on an order it cannot pay.\n\t */\n\tasync checkoutRazorpay({ cartId }: { cartId?: string; origin?: string } = {}) {\n\t\tconst result = await this.place('razorpay', cartId)\n\t\tconst data = result.payment.client_data ?? {}\n\t\tif (result.payment.kind !== 'client_action' || !data.razorpay_order_id) {\n\t\t\tthrow new GoCommerceError(\n\t\t\t\t'This store takes Razorpay payments on Razorpay’s own page, which this storefront does not support yet.',\n\t\t\t\t0,\n\t\t\t)\n\t\t}\n\t\treturn {\n\t\t\torder_no: result.order.number,\n\t\t\tid: data.razorpay_order_id,\n\t\t\tkey_id: data.key_id,\n\t\t\tamount: Number(data.amount),\n\t\t\tcurrency: data.currency,\n\t\t}\n\t}\n\n\t/** The modal closed with a payment. The engine learns of it from Razorpay itself. */\n\tasync captureRazorpayPayment({ razorpay_order_id }: { razorpay_order_id: string; razorpay_payment_id?: string }) {\n\t\tconst order = placedOrderByReference(razorpay_order_id)\n\t\tif (!order) throw new GoCommerceError('That payment does not belong to an order placed from this browser.', 404)\n\t\treturn { order_no: order.number, status: 'processing' }\n\t}\n\n\t// The family's other gateways. GoCommerce's Stripe is a Payment Element\n\t// (a client secret, not a hosted page), and PayPal, Cashfree, PhonePe and\n\t// Affirm are not engine gateways at all; paymentMethodService never lists\n\t// them, so these are reached only by a storefront that hard-codes one.\n\tasync checkoutStripe(): Promise<never> {\n\t\tthrow unsupported(\n\t\t\t'checkoutStripe',\n\t\t\t'GoCommerce’s Stripe gateway uses the Payment Element, not a hosted checkout page',\n\t\t)\n\t}\n\tasync checkoutStripeCapture(): Promise<never> {\n\t\tthrow unsupported('checkoutStripeCapture', 'Stripe confirms payments to the engine by webhook')\n\t}\n\tasync checkoutPaypal(): Promise<never> {\n\t\tthrow unsupported('checkoutPaypal', 'the engine has no PayPal gateway')\n\t}\n\tasync capturePaypalPayment(): Promise<never> {\n\t\tthrow unsupported('capturePaypalPayment', 'the engine has no PayPal gateway')\n\t}\n\tasync checkoutCashfree(): Promise<never> {\n\t\tthrow unsupported('checkoutCashfree', 'the engine has no Cashfree gateway')\n\t}\n\tasync captureCashfreePayment(): Promise<never> {\n\t\tthrow unsupported('captureCashfreePayment', 'the engine has no Cashfree gateway')\n\t}\n\tasync checkoutPhonepe(): Promise<never> {\n\t\tthrow unsupported('checkoutPhonepe', 'the engine has no PhonePe gateway')\n\t}\n\tasync createAffirmPayOrder(): Promise<never> {\n\t\tthrow unsupported('createAffirmPayOrder', 'the engine has no Affirm gateway')\n\t}\n\tasync confirmAffirmOrder(): Promise<never> {\n\t\tthrow unsupported('confirmAffirmOrder', 'the engine has no Affirm gateway')\n\t}\n\tasync cancelAffirmOrder(): Promise<never> {\n\t\tthrow unsupported('cancelAffirmOrder', 'the engine has no Affirm gateway')\n\t}\n\tasync checkoutPOS(): Promise<never> {\n\t\tthrow unsupported('checkoutPOS', 'point-of-sale orders are placed from the admin panel')\n\t}\n\n\t/**\n\t * One checkout attempt.\n\t *\n\t * The Idempotency-Key is kept with the cart and reused while the request is\n\t * the same, because a payment gateway that fails after the engine has\n\t * created the order leaves the cart converted: only a retry under the same\n\t * key resumes that order, and without one the shopper is stuck. A changed\n\t * request — a different address, a different method — gets a new key, since\n\t * the engine refuses a key replayed with a different body.\n\t */\n\tprivate async place(code: string, cartId?: string): Promise<CheckoutResult> {\n\t\tconst id = cartId || storedCartId()\n\t\tif (!id) throw new GoCommerceError('Your bag is empty.', 400)\n\t\tconst extras = cartExtras(id)\n\t\tconst ship = extras.shippingAddress\n\t\tif (!ship) throw new GoCommerceError('Add a delivery address first.', 400)\n\n\t\tconst cart = await this.data<Cart>(`/api/carts/${encodeURIComponent(id)}`)\n\t\tconst email = cart.email || (ship.email ? String(ship.email) : '')\n\t\tif (!email) throw new GoCommerceError('Add an email address so we can send your receipt.', 400)\n\t\tconst address = toEngineAddress(ship)\n\t\tconst body = {\n\t\t\tcart_id: id,\n\t\t\temail,\n\t\t\t...(extras.phone || address.phone ? { phone: String(extras.phone || address.phone) } : {}),\n\t\t\t...(address.name ? { name: address.name } : {}),\n\t\t\taddress,\n\t\t\t...(extras.shippingRateId ? { shipping_rate_id: Number(extras.shippingRateId) } : {}),\n\t\t}\n\t\tconst serialised = JSON.stringify(body)\n\t\tconst key = extras.attempt?.body === `${code}:${serialised}` ? extras.attempt.key : newKey()\n\t\tsaveCartExtras(id, { attempt: { key, body: `${code}:${serialised}` } })\n\n\t\tconst result = await this.data<CheckoutResult>(`/api/checkout/${encodeURIComponent(code)}`, {\n\t\t\tmethod: 'POST',\n\t\t\tbody,\n\t\t\theaders: { 'Idempotency-Key': key },\n\t\t})\n\n\t\t// The access token is returned once; a replayed response leaves it out,\n\t\t// so a replay must not overwrite the one already kept.\n\t\tif (result.order.access_token) {\n\t\t\trememberOrder({\n\t\t\t\tnumber: result.order.number,\n\t\t\t\ttoken: result.order.access_token,\n\t\t\t\tcartId: id,\n\t\t\t\treference: result.payment.client_data?.razorpay_order_id ?? result.payment.reference,\n\t\t\t})\n\t\t\t// A signed-in shopper's order joins their account. The engine never\n\t\t\t// links an order by email, so this call is the only way it appears\n\t\t\t// under \"My orders\".\n\t\t\tif (sessionToken()) {\n\t\t\t\tawait this.engine('/x/identity/me/orders', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: { number: result.order.number, token: result.order.access_token },\n\t\t\t\t\tauth: true,\n\t\t\t\t}).catch(() => undefined)\n\t\t\t}\n\t\t}\n\t\tsaveCartExtras(id, { attempt: null })\n\t\treturn result\n\t}\n}\n\nconst unsupported = (method: string, why: string) => new NotSupportedError('CheckoutService', method, why)\n\nfunction newKey(): string {\n\tconst c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto\n\tif (c?.randomUUID) return c.randomUUID()\n\treturn `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}-${Math.random().toString(36).slice(2)}`\n}\n\nexport const checkoutService = new CheckoutService()\n","import { BaseService } from './base.service'\nimport { StoreFacts } from './facts'\n\n/**\n * The engine's payment methods this storefront can actually drive.\n *\n * The storefront dispatches on an upper-cased code from a fixed list, and two\n * of the engine's gateways have a flow it can complete: cash on delivery, and\n * Razorpay's modal. The rest are left off rather than shown as a button that\n * fails at the last step — Stripe here is a Payment Element and the other\n * gateways are hosted pages this storefront has no route for. Each one left\n * off is reported once, so a merchant who switched one on can see why it is\n * missing.\n */\nconst DRIVABLE: Record<string, { code: string; img?: string }> = {\n\tcod: { code: 'COD', img: '/payment/cod.svg' },\n\trazorpay: { code: 'RAZORPAY' },\n}\n\nconst reported = new Set<string>()\n\nexport class PaymentMethodService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\tconst options = await this.facts.checkoutOptions()\n\t\tconst methods = options.methods ?? []\n\t\tconst data = methods\n\t\t\t.filter((m) => {\n\t\t\t\tif (DRIVABLE[m.code]) return true\n\t\t\t\tif (!reported.has(m.code)) {\n\t\t\t\t\treported.add(m.code)\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[gocommerce] payment method \"${m.code}\" is switched on but this storefront cannot drive its flow, so it is not offered.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.map((m, i) => ({\n\t\t\t\tid: m.code,\n\t\t\t\tcode: DRIVABLE[m.code].code,\n\t\t\t\tengineCode: m.code,\n\t\t\t\tname: m.name,\n\t\t\t\ttitle: m.name,\n\t\t\t\tdescription: '',\n\t\t\t\timg: DRIVABLE[m.code].img ?? null,\n\t\t\t\trank: i,\n\t\t\t\tactive: true,\n\t\t\t\tisActive: true,\n\t\t\t}))\n\t\treturn { data, count: data.length, pageSize: data.length, noOfPage: 1, page: 1 }\n\t}\n}\n\nexport const paymentMethodService = new PaymentMethodService()\n","import { emptyPage } from './base.service'\nimport { BaseService } from './base.service'\n\n/**\n * Discount codes are typed, not browsed: the engine has no public list of\n * them, by design — a list would hand every shopper every code. An empty list\n * hides the storefront's coupon drawer, and the code box still works through\n * `cartService.applyCoupon`.\n */\nexport class CouponService extends BaseService {\n\tasync listCoupons(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport const couponService = new CouponService()\n","import type { Order, Product } from '../engine'\nimport { GoCommerceError, NotSupportedError } from '../errors'\nimport { toOrder } from '../map'\nimport { toMajor } from '../money'\nimport { inBrowser, placedOrder, placedOrderForCart, sessionToken } from '../browser'\nimport { BaseService, emptyPage, toPage } from './base.service'\n\n/**\n * Orders, read back two ways.\n *\n * A guest's order is read with the access token checkout returned, which this\n * connector kept in the browser that placed it (`GET /api/orders/{n}?token=`).\n * A signed-in shopper's orders are the ones joined to their account\n * (ext/identity's `/me/orders`). There is no third way: an order list that\n * answered without either would be every order in the shop.\n */\nexport class OrderService extends BaseService {\n\t/**\n\t * The order-success page's lookup, by the number and cart in its URL.\n\t *\n\t * It runs on the server, where neither the token nor the session exists —\n\t * they live in the shopper's browser — so there it answers nothing and the\n\t * page says the details are not available yet. In the browser it answers\n\t * the order. Inventing a server-side credential from the cart token in the\n\t * URL would make that URL, which lands in history and referrers, a key to\n\t * the shopper's address.\n\t */\n\tasync listOrdersByParent({ orderNo, cartId }: { orderNo?: string; cartId?: string } = {}) {\n\t\tconst number = clean(orderNo) ?? (clean(cartId) ? placedOrderForCart(clean(cartId) as string)?.number : undefined)\n\t\tif (!number) return { data: [] }\n\t\ttry {\n\t\t\treturn { data: [await this.getOrder(number)] }\n\t\t} catch (err) {\n\t\t\tif (err instanceof GoCommerceError && (err.status === 404 || err.status === 401)) return { data: [] }\n\t\t\tthrow err\n\t\t}\n\t}\n\n\t/** The signed-in shopper's orders, newest claim first. */\n\tasync list({ page = 1, limit = 20 }: { page?: number; limit?: number; q?: string; sort?: string } = {}) {\n\t\tconst env = await this.engine<Order[] | null>('/x/identity/me/orders', { query: { page, limit }, auth: true })\n\t\treturn toPage(env, toOrder)\n\t}\n\n\t/** One order by number: the account's when signed in, otherwise one this browser placed. */\n\tasync getOrder(number: string) {\n\t\tconst kept = placedOrder(number)\n\t\tif (kept) {\n\t\t\treturn toOrder(\n\t\t\t\tawait this.data<Order>(`/api/orders/${encodeURIComponent(number)}`, { query: { token: kept.token } }),\n\t\t\t)\n\t\t}\n\t\tif (sessionToken()) {\n\t\t\treturn toOrder(await this.data<Order>(`/x/identity/me/orders/${encodeURIComponent(number)}`, { auth: true }))\n\t\t}\n\t\tthrow new GoCommerceError(\n\t\t\tinBrowser() ? 'Sign in to see this order, or open it from the browser that placed it.' : 'order not found',\n\t\t\t404,\n\t\t\t'not_found',\n\t\t)\n\t}\n\n\t/** Everything the signed-in shopper has bought, once each, most recent first. */\n\tasync buyAgain() {\n\t\tconst orders =\n\t\t\t(await this.data<Order[] | null>('/x/identity/me/orders', { query: { limit: 20 }, auth: true })) ?? []\n\t\tconst seen = new Set<number>()\n\t\tconst lines: {\n\t\t\tproductId: number\n\t\t\tvariantId: number\n\t\t\ttitle: string\n\t\t\timg: string | null\n\t\t\tprice: number\n\t\t\tqty: number\n\t\t}[] = []\n\t\tfor (const o of orders) {\n\t\t\tfor (const l of o.line_items ?? []) {\n\t\t\t\tif (!l.product_id || !l.variant_id || seen.has(l.variant_id)) continue\n\t\t\t\tseen.add(l.variant_id)\n\t\t\t\tlines.push({\n\t\t\t\t\tproductId: l.product_id,\n\t\t\t\t\tvariantId: l.variant_id,\n\t\t\t\t\ttitle: l.title,\n\t\t\t\t\timg: l.image_url ?? null,\n\t\t\t\t\tprice: toMajor(l.unit_price),\n\t\t\t\t\tqty: l.quantity,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\t// A product taken off sale is no longer something to buy again.\n\t\tconst live = await Promise.all(\n\t\t\tlines.map((l) => this.data<Product>(`/api/products/${l.productId}`).catch(() => null)),\n\t\t)\n\t\treturn lines.flatMap((l, i) => {\n\t\t\tconst p = live[i]\n\t\t\tif (!p) return []\n\t\t\treturn [{ ...l, productId: String(l.productId), variantId: String(l.variantId), slug: p.slug }]\n\t\t})\n\t}\n\n\t/** The \"someone just bought\" popup would publish other shoppers' purchases; the engine offers none. */\n\tasync listPublic(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n\n\tasync getOrderByEmailAndOTP(): Promise<never> {\n\t\tthrow new NotSupportedError(\n\t\t\t'OrderService',\n\t\t\t'getOrderByEmailAndOTP',\n\t\t\t'the engine sends no one-time codes; a guest reads an order with its access token',\n\t\t)\n\t}\n}\n\nconst clean = (v?: string | null) => (v && v !== 'undefined' && v !== 'null' ? v : undefined)\n\nexport const orderService = new OrderService()\n","import type { AuthResponse, Customer } from '../engine'\nimport { GoCommerceError, NotSupportedError } from '../errors'\nimport { toUser } from '../map'\nimport { endSession, startSession, storedCartId, updateMe } from '../browser'\nimport { BaseService } from './base.service'\n\n/**\n * Shopper accounts, through ext/identity.\n *\n * Guest checkout stays the engine's default (D22): an account is a place to\n * keep addresses and see past orders, never a requirement to buy. A store\n * built without `-identity` answers every call here with a 404, which arrives\n * as \"Accounts are not available on this store\" rather than as a route error.\n */\nexport class UserService extends BaseService {\n\t/** Email and password. The answer is the user object the storefront keeps in its `me` cookie. */\n\tasync login({ email, password }: { email: string; password: string; cartId?: string | null }) {\n\t\tconst auth = await this.account<AuthResponse>('/x/identity/login', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: { email: String(email ?? '').trim(), password: String(password ?? '') },\n\t\t})\n\t\treturn this.signedIn(auth)\n\t}\n\n\tasync signup({\n\t\temail,\n\t\tpassword,\n\t\tfirstName,\n\t\tlastName,\n\t\tphone,\n\t}: {\n\t\temail: string\n\t\tpassword: string\n\t\tfirstName?: string\n\t\tlastName?: string\n\t\tphone?: string\n\t\tcartId?: string | null\n\t\torigin?: string\n\t}) {\n\t\tconst name = [firstName, lastName].filter(Boolean).join(' ').trim()\n\t\tconst auth = await this.account<AuthResponse>('/x/identity/register', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: {\n\t\t\t\temail: String(email ?? '').trim(),\n\t\t\t\tpassword: String(password ?? ''),\n\t\t\t\t...(name ? { name } : {}),\n\t\t\t\t...(phone ? { phone: String(phone) } : {}),\n\t\t\t},\n\t\t})\n\t\treturn this.signedIn(auth)\n\t}\n\n\t/** Signs out here and on the engine. The storefront assigns the answer to its user: `null`. */\n\tasync logout() {\n\t\tawait this.engine('/x/identity/logout', { method: 'POST', auth: true }).catch(() => undefined)\n\t\tendSession()\n\t\treturn null\n\t}\n\n\tasync getMe() {\n\t\treturn toUser(await this.account<Customer>('/x/identity/me', { auth: true }))\n\t}\n\n\tasync updateProfile(user: { firstName?: string; lastName?: string; name?: string; email?: string; phone?: string }) {\n\t\tconst name =\n\t\t\tuser.name ??\n\t\t\t[user.firstName, user.lastName]\n\t\t\t\t.filter((v) => v !== undefined)\n\t\t\t\t.join(' ')\n\t\t\t\t.trim()\n\t\tconst c = await this.account<Customer>('/x/identity/me', {\n\t\t\tmethod: 'PATCH',\n\t\t\tauth: true,\n\t\t\tbody: {\n\t\t\t\t...(name !== undefined ? { name } : {}),\n\t\t\t\t...(user.email ? { email: String(user.email).trim() } : {}),\n\t\t\t\t...(user.phone !== undefined && user.phone !== null ? { phone: String(user.phone) } : {}),\n\t\t\t},\n\t\t})\n\t\tupdateMe(c)\n\t\treturn toUser(c)\n\t}\n\n\t/**\n\t * A password change ends every session the account had, this one included,\n\t * and the engine answers a fresh one — which is kept, so the shopper stays\n\t * signed in here and nowhere else.\n\t */\n\tasync changePassword({ old, oldPassword, password }: { old?: string; oldPassword?: string; password: string }) {\n\t\tconst auth = await this.account<AuthResponse>('/x/identity/me/password', {\n\t\t\tmethod: 'PUT',\n\t\t\tauth: true,\n\t\t\tbody: { current_password: String(old ?? oldPassword ?? ''), password: String(password ?? '') },\n\t\t})\n\t\tstartSession(auth)\n\t\treturn toUser(auth.record)\n\t}\n\n\tasync deleteUser(): Promise<never> {\n\t\tthrow new NotSupportedError('UserService', 'deleteUser', 'an account is closed by the store, on request')\n\t}\n\n\tasync checkEmail(): Promise<never> {\n\t\tthrow new NotSupportedError('UserService', 'checkEmail', 'the engine does not say which addresses have accounts')\n\t}\n\n\tasync joinAsVendor(): Promise<never> {\n\t\tthrow new NotSupportedError('UserService', 'joinAsVendor', 'sellers are invited by the store')\n\t}\n\n\tprivate async signedIn(auth: AuthResponse) {\n\t\tconst me = startSession(auth)\n\t\tconst cartId = storedCartId()\n\t\tif (cartId) await this.claimCartForAccount(cartId)\n\t\treturn me\n\t}\n\n\t/** An identity call, with a 404 from a build without the module said in words. */\n\tprotected async account<T>(path: string, req: Parameters<BaseService['engine']>[1] = {}): Promise<T> {\n\t\ttry {\n\t\t\treturn await this.data<T>(path, req)\n\t\t} catch (err) {\n\t\t\tif (err instanceof GoCommerceError && err.status === 404 && /no route/i.test(err.message)) {\n\t\t\t\tthrow new GoCommerceError('Accounts are not available on this store.', 404, 'not_found')\n\t\t\t}\n\t\t\tif (err instanceof GoCommerceError && err.status === 401 && req.auth) endSession()\n\t\t\tthrow err\n\t\t}\n\t}\n}\n\n/**\n * Password resets and email confirmation. Phone sign-in by one-time code is a\n * Litekart flow; the engine has no such thing and says so.\n */\nexport class AuthService extends UserService {\n\tasync forgotPassword({ email }: { email: string; referrer?: string }) {\n\t\treturn this.account<{ accepted: boolean }>('/x/identity/password-reset', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: { email: String(email ?? '').trim() },\n\t\t})\n\t}\n\n\t/** The token arrives in the link the engine emailed (`GOCOMMERCE_IDENTITY_RESET_URL`). */\n\tasync resetPassword({ token, password }: { userId?: string; token: string; password: string }) {\n\t\tconst auth = await this.account<AuthResponse>('/x/identity/password-reset/confirm', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: { token: String(token ?? ''), password: String(password ?? '') },\n\t\t})\n\t\treturn startSession(auth)\n\t}\n\n\t/** Answers `{ errorCode, message }` on failure rather than throwing: that is how the page reads it. */\n\tasync verifyEmail(_email: string | undefined, token: string) {\n\t\ttry {\n\t\t\tconst c = await this.account<Customer>('/x/identity/email-verification/confirm', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: { token: String(token ?? '') },\n\t\t\t})\n\t\t\treturn { ...toUser(c), message: 'Your email address is confirmed.' }\n\t\t} catch (err) {\n\t\t\treturn { errorCode: (err as GoCommerceError).code ?? 'invalid_token', message: (err as Error).message }\n\t\t}\n\t}\n\n\tasync getOtp(): Promise<never> {\n\t\tthrow new NotSupportedError('AuthService', 'getOtp', 'sign in with an email and password')\n\t}\n\n\tasync verifyOtp(): Promise<never> {\n\t\tthrow new NotSupportedError('AuthService', 'verifyOtp', 'sign in with an email and password')\n\t}\n\n\tasync joinAsAdmin(): Promise<never> {\n\t\tthrow new NotSupportedError('AuthService', 'joinAsAdmin', 'operators are invited from the admin panel')\n\t}\n}\n\n/** The `/my/profile` form: the same account, read and saved. */\nexport class ProfileService extends UserService {\n\tasync getOne() {\n\t\treturn this.getMe()\n\t}\n\n\tasync save(profile: { firstName?: string; lastName?: string; email?: string; phone?: string }) {\n\t\treturn this.updateProfile(profile)\n\t}\n}\n\nexport const userService = new UserService()\nexport const authService = new AuthService()\nexport const profileService = new ProfileService()\n","import type { IdentityAddress } from '../engine'\nimport { fromIdentityAddress, toIdentityAddress } from '../map'\nimport { currentMe, type StorefrontAddress } from '../browser'\nimport { BaseService } from './base.service'\n\ntype AddressArg = StorefrontAddress & { isPrimary?: boolean; label?: string }\n\n/** The signed-in shopper's address book (ext/identity). A guest's address lives on the cart. */\nexport class AddressService extends BaseService {\n\tasync list({\n\t\tpage = 1,\n\t\tlimit = 20,\n\t}: { page?: number; limit?: number; user?: string; q?: string; sort?: string } = {}) {\n\t\tconst env = await this.engine<IdentityAddress[] | null>('/x/identity/me/addresses', {\n\t\t\tquery: { page, limit },\n\t\t\tauth: true,\n\t\t})\n\t\tconst email = currentMe()?.email\n\t\tconst rows = env.data ?? []\n\t\treturn {\n\t\t\tdata: rows.map((a) => fromIdentityAddress(a, email)),\n\t\t\tcount: env.meta?.total ?? rows.length,\n\t\t\tpageSize: env.meta?.limit ?? limit,\n\t\t\tnoOfPage: env.meta?.total_pages ?? 1,\n\t\t\tpage: env.meta?.page ?? page,\n\t\t}\n\t}\n\n\tasync fetchAddress(id: string) {\n\t\treturn fromIdentityAddress(\n\t\t\tawait this.data<IdentityAddress>(`/x/identity/me/addresses/${enc(id)}`, { auth: true }),\n\t\t\tcurrentMe()?.email,\n\t\t)\n\t}\n\n\t/** New when it has no id (or the form's `'new'`), an edit when it has one — the storefront saves both here. */\n\tasync saveAddress(address: AddressArg) {\n\t\tconst id = address?.id && address.id !== 'new' ? String(address.id) : null\n\t\tif (id) return this.editAddress(id, address)\n\t\tconst a = await this.data<IdentityAddress>('/x/identity/me/addresses', {\n\t\t\tmethod: 'POST',\n\t\t\tauth: true,\n\t\t\tbody: toIdentityAddress(address),\n\t\t})\n\t\treturn fromIdentityAddress(a, currentMe()?.email)\n\t}\n\n\tasync editAddress(id: string, address: AddressArg) {\n\t\tconst a = await this.data<IdentityAddress>(`/x/identity/me/addresses/${enc(id)}`, {\n\t\t\tmethod: 'PATCH',\n\t\t\tauth: true,\n\t\t\tbody: toIdentityAddress(address),\n\t\t})\n\t\treturn fromIdentityAddress(a, currentMe()?.email)\n\t}\n\n\tasync deleteAddress(id: string) {\n\t\tawait this.engine(`/x/identity/me/addresses/${enc(id)}`, { method: 'DELETE', auth: true })\n\t\treturn { id: String(id), deleted: true }\n\t}\n}\n\nconst enc = (id: string) => encodeURIComponent(String(id))\n\nexport const addressService = new AddressService()\n","import type { Product, Wishlist } from '../engine'\nimport { GoCommerceError } from '../errors'\nimport { toProduct } from '../map'\nimport { currentMe, forgetWishlistToken, rememberWishlistToken, wishlistToken } from '../browser'\nimport { BaseService } from './base.service'\n\n/**\n * Saved products, through ext/wishlist.\n *\n * The module keys a list by a token of its own rather than by an account, so\n * a guest can save things too; this connector keeps that token in the browser.\n * The signed-in shopper's email is attached so the store can tell them when a\n * saved product comes back in stock.\n */\nexport class WishlistService extends BaseService {\n\tasync fetchWishlist(_args: Record<string, unknown> = {}) {\n\t\tconst list = await this.current()\n\t\tif (!list) return { data: [], count: 0 }\n\t\tconst items = (list.items ?? []).filter((i) => !i.deleted)\n\t\tconst products = await Promise.all(\n\t\t\titems.map((i) => this.data<Product>(`/api/products/${i.product_id}`).catch(() => null)),\n\t\t)\n\t\tconst data = items.flatMap((item, n) => {\n\t\t\tconst p = products[n]\n\t\t\tif (!p) return []\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: String(item.id),\n\t\t\t\t\tproductId: String(item.product_id),\n\t\t\t\t\tvariantId: item.variant_id ? String(item.variant_id) : null,\n\t\t\t\t\tproduct: toProduct(p),\n\t\t\t\t\tvariant: { id: item.variant_id ? String(item.variant_id) : null },\n\t\t\t\t\tcreatedAt: item.created_at,\n\t\t\t\t},\n\t\t\t]\n\t\t})\n\t\treturn { data, count: data.length }\n\t}\n\n\t/** Saved → removed, removed → saved. `{ active }` is the state after the click. */\n\tasync toggleWishlist({ productId, variantId }: { productId: string; variantId?: string | null }) {\n\t\tconst list = (await this.current()) ?? (await this.create())\n\t\tconst item = (list.items ?? []).find((i) => String(i.product_id) === String(productId))\n\t\tif (item) {\n\t\t\tawait this.data<Wishlist>(`/x/wishlist/${enc(list.token!)}/items/${item.id}`, { method: 'DELETE' })\n\t\t\treturn { active: false, id: String(item.id) }\n\t\t}\n\t\tconst next = await this.data<Wishlist>(`/x/wishlist/${enc(list.token!)}/items`, {\n\t\t\tmethod: 'POST',\n\t\t\tbody: { product_id: Number(productId), ...(variantId ? { variant_id: Number(variantId) } : {}) },\n\t\t})\n\t\tconst added = (next.items ?? []).find((i) => String(i.product_id) === String(productId))\n\t\treturn { active: true, id: added ? String(added.id) : null }\n\t}\n\n\tasync checkWishlist({ productId }: { productId: string; variantId?: string | null }) {\n\t\tconst list = await this.current()\n\t\treturn !!list && (list.items ?? []).some((i) => String(i.product_id) === String(productId))\n\t}\n\n\tasync checkWishlistInBulk(pairs: { productId: string; variantId?: string | null }[]) {\n\t\tconst list = await this.current()\n\t\tconst saved = new Set((list?.items ?? []).map((i) => String(i.product_id)))\n\t\treturn (pairs ?? []).map((p) => ({ ...p, exists: saved.has(String(p.productId)) }))\n\t}\n\n\tprivate async current(): Promise<(Wishlist & { token: string }) | null> {\n\t\tconst token = wishlistToken()\n\t\tif (!token) return null\n\t\ttry {\n\t\t\treturn { ...(await this.data<Wishlist>(`/x/wishlist/${enc(token)}`)), token }\n\t\t} catch (err) {\n\t\t\tif (err instanceof GoCommerceError && err.status === 404 && !/no wishlist|no route/i.test(err.message)) {\n\t\t\t\tforgetWishlistToken()\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tthrow err\n\t\t}\n\t}\n\n\tprivate async create(): Promise<Wishlist & { token: string }> {\n\t\tconst email = currentMe()?.email\n\t\tconst list = await this.data<Wishlist>('/x/wishlist', { method: 'POST', ...(email ? { body: { email } } : {}) })\n\t\tif (!list.token) throw new GoCommerceError('The store did not return a wishlist token.', 500)\n\t\trememberWishlistToken(list.token)\n\t\treturn { ...list, token: list.token }\n\t}\n}\n\nconst enc = (s: string) => encodeURIComponent(s)\n\nexport const wishlistService = new WishlistService()\n","import type { ReviewPage } from '../engine'\nimport { toRating } from '../map'\nimport { BaseService } from './base.service'\n\n/**\n * Product reviews (ext/reviews). Approved reviews only, newest first. The\n * product page gets them with the product; this is the paged form, and\n * `productService.addReview` writes one.\n */\nexport class ReviewService extends BaseService {\n\tasync fetchReviews({\n\t\tproductId,\n\t\tcurrentPage = 1,\n\t\tpage,\n\t\tlimit = 20,\n\t}: { productId?: string; currentPage?: number; page?: number; limit?: number; search?: string; sort?: string } = {}) {\n\t\t// A vendor's \"all my reviews\" page has no product to ask about.\n\t\tif (!productId) return { data: [], count: 0, pageSize: limit, noOfPage: 0, page: 1 }\n\t\tconst p = Math.max(1, Number(page ?? currentPage) || 1)\n\t\tconst res = await this.data<ReviewPage>('/x/reviews', { query: { product_id: productId, page: p, limit } })\n\t\tconst total = res.meta?.total ?? res.summary?.count ?? 0\n\t\treturn {\n\t\t\tdata: (res.reviews ?? []).map(toRating),\n\t\t\tcount: total,\n\t\t\tpageSize: limit,\n\t\t\tnoOfPage: Math.max(1, Math.ceil(total / limit)),\n\t\t\tpage: p,\n\t\t\tsummary: res.summary ?? null,\n\t\t}\n\t}\n\n\tasync allReviews(args: { productId?: string; page?: number } = {}) {\n\t\treturn this.fetchReviews(args)\n\t}\n}\n\nexport const reviewService = new ReviewService()\n","import type { Menu, MenuItem } from '../engine'\nimport { resolveRestLocally } from '../rest-guard'\nimport { BaseService } from './base.service'\nimport { StoreFacts } from './facts'\nimport { remember } from '../cache'\n\nexport type StorefrontMenu = { menuId: string; name: string; items: StorefrontMenuItem[] }\ntype StorefrontMenuItem = { id: string; name: string; link: string; items: StorefrontMenuItem[] }\n\n/**\n * A link where this storefront serves it. The navigation module resolves URLs\n * from its own patterns, whose defaults suit a different storefront; the\n * targets it names are slugs, so they are re-pointed at this one's routes.\n */\nfunction linkFor(item: MenuItem): string {\n\tconst t = item.target ?? ''\n\tswitch (item.kind) {\n\t\tcase 'home':\n\t\t\treturn '/'\n\t\tcase 'product':\n\t\t\treturn t ? `/products/${t}` : item.url\n\t\tcase 'collection':\n\t\t\treturn t ? `/collections/${t}` : item.url\n\t\tcase 'category':\n\t\t\treturn t ? `/${t}` : item.url\n\t\tcase 'page':\n\t\t\treturn t ? `/p/${t}` : item.url\n\t\tdefault:\n\t\t\treturn item.url\n\t}\n}\n\nconst toItem = (item: MenuItem, i: number): StorefrontMenuItem => ({\n\tid: String(item.id ?? i),\n\tname: item.title,\n\tlink: linkFor(item),\n\titems: (item.children ?? []).map(toItem),\n})\n\n/**\n * Menus from ext/navigation, when it is installed and switched on; otherwise\n * the storefront's own `store.menu`, which is what it shows anyway.\n */\nexport class MenuService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\tconst menus = await this.engineMenus()\n\t\tif (menus) return { data: menus }\n\t\treturn resolveRestLocally('get', '/api/menu')\n\t}\n\n\t/** The header and footer menus, or `null` when the module is not there. Cached: a menu is store-level. */\n\tasync engineMenus(): Promise<StorefrontMenu[] | null> {\n\t\tif (!(await this.facts.pluginOn('navigation'))) return null\n\t\treturn remember(`${this.engineBase()}|${this.creds.store ?? ''}|menus`, async () => {\n\t\t\tconst out: StorefrontMenu[] = []\n\t\t\tfor (const handle of ['header', 'footer']) {\n\t\t\t\ttry {\n\t\t\t\t\tconst m = await this.data<Menu>(`/x/navigation/menus/${handle}`)\n\t\t\t\t\tout.push({ menuId: handle, name: m.title, items: (m.items ?? []).map(toItem) })\n\t\t\t\t} catch {\n\t\t\t\t\t// A store may have deleted one of the two.\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out\n\t\t}).catch(() => null)\n\t}\n}\n\nexport const menuService = new MenuService()\n","import { readStaticStore } from '../static-store'\nimport { BaseService } from './base.service'\nimport { StoreFacts } from './facts'\nimport { MenuService } from './menu-service'\n\n/** `$`, `€`, `₹` — from the platform's own tables rather than a list kept here. */\nfunction symbolFor(code: string): string {\n\ttry {\n\t\tconst part = new Intl.NumberFormat('en', { style: 'currency', currency: code })\n\t\t\t.formatToParts(0)\n\t\t\t.find((p) => p.type === 'currency')\n\t\treturn part?.value ?? code\n\t} catch {\n\t\treturn code\n\t}\n}\n\n/**\n * The store record every page renders from.\n *\n * Name, logo, theme and the rest are the storefront's own (its static store,\n * registered through `setStaticStore`); the engine has no opinion on them.\n * Where the engine does have one, it wins: the settlement currency — every\n * price on the site is formatted with it, and a store record saying USD over\n * an engine charging INR would print the wrong symbol on every price — the\n * modules that back a storefront feature, and the menus.\n *\n * This runs on every request and a throw here takes every page down, so the\n * engine's half is best-effort: unreachable, the storefront still renders\n * from its own record, and the failure shows up where a price is fetched.\n */\nexport class StoreService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\n\tasync getStoreByIdOrDomain(_args: { storeId?: string; domain?: string } = {}) {\n\t\tconst base = await readStaticStore()\n\t\tconst live = await this.live().catch(() => ({}))\n\t\t// `id` must be truthy and stable: the storefront keys a cookie on it.\n\t\treturn { ...base, ...live, id: base.id || 'gocommerce' }\n\t}\n\n\tasync getStore(storeId?: string) {\n\t\treturn this.getStoreByIdOrDomain({ storeId })\n\t}\n\n\t/**\n\t * The storefront's sitemap route asks for `/api/stores/<id>` and serves the\n\t * `sitemap` path it gets back from `PUBLIC_SITEMAP_URL`. With ext/sitemaps\n\t * installed, `/sitemaps/sitemap.xml` under `PUBLIC_SITEMAP_URL=<engine>/x`\n\t * is the engine's own sitemap; without it, an empty path is the route's\n\t * clean 404 rather than a crash.\n\t */\n\toverride async get<T = any>(path: string): Promise<T> {\n\t\tif (path.split('?')[0].startsWith('/api/stores/')) {\n\t\t\tconst on = await this.facts.pluginOn('sitemap')\n\t\t\treturn { sitemap: on ? '/sitemaps/sitemap.xml' : '' } as T\n\t\t}\n\t\treturn super.get<T>(path)\n\t}\n\n\tprivate async live(): Promise<Record<string, unknown>> {\n\t\tconst [ready, plugins, menus, base] = await Promise.all([\n\t\t\tthis.facts.ready(),\n\t\t\tthis.facts.plugins().catch(() => new Map()),\n\t\t\tnew MenuService(this._fetch).engineMenus(),\n\t\t\treadStaticStore(),\n\t\t])\n\t\tconst code = ready.currency\n\t\tconst sameCurrency = (base.currency?.code ?? base.currencyCode) === code\n\t\tconst flag = (on: boolean) => ({ ...(on ? { active: true } : { active: false }) })\n\t\tconst basePlugins = (base.plugins ?? {}) as Record<string, Record<string, unknown>>\n\t\treturn {\n\t\t\tcurrencyCode: code,\n\t\t\tcurrencySymbol: sameCurrency ? (base.currencySymbol ?? symbolFor(code)) : symbolFor(code),\n\t\t\tcurrency: {\n\t\t\t\t...(base.currency ?? {}),\n\t\t\t\tcode,\n\t\t\t\tsymbol: sameCurrency ? (base.currency?.symbol ?? symbolFor(code)) : symbolFor(code),\n\t\t\t},\n\t\t\tlanguage: ready.language,\n\t\t\tplugins: {\n\t\t\t\t...basePlugins,\n\t\t\t\t// Features this connector serves from a module: on exactly when the\n\t\t\t\t// module is installed and switched on, whatever the static record says.\n\t\t\t\tisWishlist: { ...basePlugins.isWishlist, ...flag(plugins.has('wishlist')) },\n\t\t\t\tisProductReviewsAndRatings: {\n\t\t\t\t\t...basePlugins.isProductReviewsAndRatings,\n\t\t\t\t\t...flag(plugins.has('product-reviews')),\n\t\t\t\t},\n\t\t\t},\n\t\t\t...(menus?.length ? { menu: menus } : {}),\n\t\t}\n\t}\n}\n\nexport const storeService = new StoreService()\n","import type { CmsPage, Faq } from '../engine'\nimport { toCmsPage as toStorefrontPage } from '../map'\nimport { BaseService, toPage } from './base.service'\n\n/**\n * Content pages from ext/cms, in the shopper's language with the store's\n * default as the fallback. A slug with no page is the page's 404.\n */\nexport class PageService extends BaseService {\n\tasync getOne(slug: string) {\n\t\treturn toStorefrontPage(await this.data<CmsPage>(`/x/cms/pages/${encodeURIComponent(String(slug))}`))\n\t}\n\n\tasync list({ page = 1, limit = 50 }: { page?: number; limit?: number; search?: string; sort?: string } = {}) {\n\t\tconst env = await this.engine<CmsPage[] | null>('/x/cms/pages', { query: { page, limit } })\n\t\treturn toPage(env, toStorefrontPage)\n\t}\n}\n\n/** The shop's questions and answers (ext/faq), flattened in the shop's own order. */\nexport class FaqService extends BaseService {\n\tasync listFaqs(_args: Record<string, unknown> = {}) {\n\t\tconst faq = await this.data<Faq>('/x/faq')\n\t\tconst data = (faq.sections ?? []).flatMap((s) =>\n\t\t\t(s.entries ?? []).map((e) => ({\n\t\t\t\tid: String(e.id),\n\t\t\t\tquestion: e.question,\n\t\t\t\tanswer: e.answer,\n\t\t\t\tcategory: s.section || null,\n\t\t\t})),\n\t\t)\n\t\treturn { data, count: data.length, heading: faq.heading, blurb: faq.blurb }\n\t}\n\n\tasync list(args: Record<string, unknown> = {}) {\n\t\treturn this.listFaqs(args)\n\t}\n}\n\nexport const pageService = new PageService()\nexport const faqService = new FaqService()\n","import type { Vendor } from '../engine'\nimport { toVendor } from '../map'\nimport { BaseService, emptyPage, toPage } from './base.service'\n\n/** The marketplace's sellers: approved vendors only. */\nexport class VendorService extends BaseService {\n\tasync list({\n\t\tpage = 1,\n\t\tlimit = 24,\n\t\tq,\n\t\tsearch,\n\t}: { page?: number; limit?: number; q?: string; search?: string; sort?: string } = {}) {\n\t\tconst env = await this.engine<Vendor[] | null>('/api/vendors', { query: { page, limit, q: q ?? search } })\n\t\treturn toPage(env, toVendor)\n\t}\n\n\tasync getVendor(slug: string) {\n\t\treturn toVendor(await this.data<Vendor>(`/api/vendors/${encodeURIComponent(String(slug))}`))\n\t}\n\n\t/**\n\t * A seller's shelf. The engine's vendors sell through offers on the shop's\n\t * own variants and the public API lists no products by seller, so the shelf\n\t * is empty — the seller's page still renders, with their details.\n\t */\n\tasync fetchProductsOfVendor(_vendorId?: string) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport const vendorService = new VendorService()\n","/**\n * The rest of the family's service surface.\n *\n * Svelte Commerce imports some four dozen services by name because Litekart\n * has them, and an export that is missing is a TypeError at import. Each one\n * is here. Where the engine has the thing, it is wired; where it does not, a\n * read of a list answers empty (a shop legitimately has no reels) and anything\n * that would write, or that names one record, throws `NotSupportedError` —\n * a silent success would tell a shopper their message was sent when nothing\n * left the browser.\n */\nimport type { Plugin } from '../engine'\nimport { NotSupportedError } from '../errors'\nimport { readStaticStore } from '../static-store'\nimport { resolveRestLocally } from '../rest-guard'\nimport { BaseService, emptyPage } from './base.service'\nimport { StoreFacts } from './facts'\nimport { MeilisearchService } from './meilisearch-service'\nimport { StoreService } from './store-service'\n\nconst refuse = (service: string, method: string, why: string) => new NotSupportedError(service, method, why)\n\n/** The storefront's contact form and product enquiries, through ext/contact's inbox. */\nexport class ContactService extends BaseService {\n\tasync submitContactUsForm({\n\t\tname,\n\t\temail,\n\t\tphone,\n\t\tmessage,\n\t\tsubject,\n\t}: {\n\t\tname: string\n\t\temail: string\n\t\tphone?: string\n\t\tmessage: string\n\t\tsubject?: string\n\t}) {\n\t\treturn this.data<{ status: string }>('/x/contact/messages', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: {\n\t\t\t\tname: String(name ?? ''),\n\t\t\t\temail: String(email ?? ''),\n\t\t\t\t...(phone ? { phone: String(phone) } : {}),\n\t\t\t\t...(subject ? { subject: String(subject) } : {}),\n\t\t\t\tbody: String(message ?? ''),\n\t\t\t},\n\t\t})\n\t}\n}\n\nexport class EnquiryService extends ContactService {\n\tasync create({\n\t\tname,\n\t\temail,\n\t\tphone,\n\t\tmessage,\n\t\tproductId,\n\t}: {\n\t\tname: string\n\t\temail: string\n\t\tphone?: string\n\t\tmessage: string\n\t\tproductId?: string\n\t}) {\n\t\treturn this.submitContactUsForm({\n\t\t\tname,\n\t\t\temail,\n\t\t\tphone,\n\t\t\tsubject: productId ? `Enquiry about product ${productId}` : 'Enquiry',\n\t\t\tmessage,\n\t\t})\n\t}\n}\n\n/** Enabled plugins and their public settings, `{ key, title, settings }`. */\nexport class PluginService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\tconst data: Plugin[] = [...(await this.facts.plugins()).values()]\n\t\treturn { data, count: data.length, pageSize: data.length, noOfPage: 1, page: 1 }\n\t}\n}\n\n/** The store record again, for the callers that ask for it as \"settings\" or \"init\". */\nexport class SettingService extends BaseService {\n\tasync fetchSettings(_args: Record<string, unknown> = {}) {\n\t\treturn new StoreService(this._fetch).getStoreByIdOrDomain()\n\t}\n\tasync list(args: Record<string, unknown> = {}) {\n\t\treturn this.fetchSettings(args)\n\t}\n}\n\nexport class InitService extends SettingService {\n\tasync fetchInit(_args: Record<string, unknown> = {}) {\n\t\tconst store = await this.fetchSettings()\n\t\treturn { storeOne: store, store, settings: store }\n\t}\n}\n\nexport class HomeService extends BaseService {\n\t/** A homepage is assembled by the storefront from shelves; the engine has no page of its own for it. */\n\tasync getHome(_args: Record<string, unknown> = {}) {\n\t\treturn { banners: [], groupByBanner: [], categories: [], products: [] }\n\t}\n}\n\n/** Countries for the address form: the storefront's own list, which is what it offers anyway. */\nexport class CountryService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn resolveRestLocally('get', '/api/countries')\n\t}\n}\n\n/** The one currency an engine store settles in. */\nexport class CurrencyService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\tasync listCurrencies(_args: Record<string, unknown> = {}) {\n\t\tconst { currency } = await this.facts.ready()\n\t\tconst data = [{ code: currency, name: currency, isDefault: true }]\n\t\treturn { data, count: 1, pageSize: 1, noOfPage: 1, page: 1 }\n\t}\n\tasync list(args: Record<string, unknown> = {}) {\n\t\treturn this.listCurrencies(args)\n\t}\n}\n\n/** States are free text on a GoCommerce address; there is no list to offer. */\nexport class StateService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport class RegionService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\n/** The header's type-ahead, under the name some storefront builds still call it by. */\nexport class AutocompleteService extends MeilisearchService {\n\tasync list({ q, search }: { q?: string; search?: string } = {}) {\n\t\treturn this.searchAutoComplete({ query: q ?? search })\n\t}\n}\n\nexport class PopularSearchService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\n/** The engine keeps no popularity score; a page view is not recorded. */\nexport class PopularityService extends BaseService {\n\tasync updatePopularity(_args: Record<string, unknown> = {}) {\n\t\treturn undefined\n\t}\n}\n\nexport class BlogService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n\tasync getOne(_slug: string): Promise<never> {\n\t\tthrow refuse('BlogService', 'getOne', 'the engine has no blog; publish articles as pages')\n\t}\n}\n\nexport class BannerService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n\tasync listBanners(args: Record<string, unknown> = {}) {\n\t\treturn this.list(args)\n\t}\n\tasync fetchBanners(args: Record<string, unknown> = {}) {\n\t\treturn this.list(args)\n\t}\n}\n\nexport class ReelsService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport class DealService extends BaseService {\n\tasync fetchDeals(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport class GalleryService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport class ChatService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n\tasync chats(): Promise<never> {\n\t\tthrow refuse('ChatService', 'chats', 'the engine has no shopper chat')\n\t}\n\tasync save(): Promise<never> {\n\t\tthrow refuse('ChatService', 'save', 'the engine has no shopper chat')\n\t}\n}\n\nexport class FeedbackService extends BaseService {\n\tasync save(): Promise<never> {\n\t\tthrow refuse('FeedbackService', 'save', 'use the contact form')\n\t}\n}\n\nexport class DemoRequestService extends BaseService {\n\tasync save(): Promise<never> {\n\t\tthrow refuse('DemoRequestService', 'save', 'use the contact form')\n\t}\n}\n\nexport class UploadService extends BaseService {\n\tasync uploadMultipleToS3(): Promise<never> {\n\t\tthrow refuse('UploadService', 'uploadMultipleToS3', 'shoppers cannot upload files to the engine')\n\t}\n\tasync upload(): Promise<never> {\n\t\tthrow refuse('UploadService', 'upload', 'shoppers cannot upload files to the engine')\n\t}\n}\n\nexport class WarrantyService extends BaseService {\n\tasync submitWarrantyRegistration(): Promise<never> {\n\t\tthrow refuse('WarrantyService', 'submitWarrantyRegistration', 'the engine has no warranty registrations')\n\t}\n}\n\nexport class VarniCustomDesignService extends BaseService {\n\tasync submitForm(): Promise<never> {\n\t\tthrow refuse('VarniCustomDesignService', 'submitForm', 'custom design requests are a Litekart feature')\n\t}\n}\n\nexport class VarniCustomProductService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\n/** The storefront's static store record, for code that wants the raw config. */\nexport const staticStore = () => readStaticStore()\n\nexport const contactService = new ContactService()\nexport const enquiryService = new EnquiryService()\nexport const pluginService = new PluginService()\nexport const settingService = new SettingService()\nexport const initService = new InitService()\nexport const homeService = new HomeService()\nexport const countryService = new CountryService()\nexport const currencyService = new CurrencyService()\nexport const stateService = new StateService()\nexport const regionService = new RegionService()\nexport const autocompleteService = new AutocompleteService()\nexport const popularSearchService = new PopularSearchService()\nexport const popularityService = new PopularityService()\nexport const blogService = new BlogService()\nexport const bannerService = new BannerService()\nexport const reelsService = new ReelsService()\nexport const dealService = new DealService()\nexport const galleryService = new GalleryService()\nexport const chatService = new ChatService()\nexport const feedbackService = new FeedbackService()\nexport const demoRequestService = new DemoRequestService()\nexport const uploadService = new UploadService()\nexport const warrantyService = new WarrantyService()\nexport const varniCustomDesignService = new VarniCustomDesignService()\nexport const varniCustomProductService = new VarniCustomProductService()\n\n// kitcommerce-core reads the plural spellings; the family exports the singular. Both, then.\nexport { PluginService as PluginsService, SettingService as SettingsService }\nexport const pluginsService = pluginService\nexport const settingsService = settingService\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/money.ts","../src/static-store.ts","../src/rest-guard.ts","../src/cache.ts","../src/map.ts","../src/browser.ts","../src/services/base.service.ts","../src/services/facts.ts","../src/services/catalog.ts","../src/services/product-service.ts","../src/services/search-service.ts","../src/services/meilisearch-service.ts","../src/services/category-service.ts","../src/services/collection-service.ts","../src/services/cart-service.ts","../src/services/checkout-service.ts","../src/services/payment-method-service.ts","../src/services/coupon-service.ts","../src/services/order-service.ts","../src/services/user-service.ts","../src/services/address-service.ts","../src/services/wishlist-service.ts","../src/services/review-service.ts","../src/services/menu-service.ts","../src/services/newsletter-service.ts","../src/services/store-service.ts","../src/services/page-service.ts","../src/services/vendor-service.ts","../src/services/misc-services.ts","../src/services/variant-service.ts","../src/services/b2b-service.ts"],"names":["id","c","env","quote","reported","clean","enc"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * The two ways a call through this connector fails.\n *\n * Both carry `message`, because the storefront shows `err.message` in a toast\n * and has no other field it reliably reads.\n */\n\n/**\n * What the engine refused, in a shape the storefront can show a shopper.\n *\n * `status` travels because the difference between 404 and 409 is the\n * difference between \"that product is gone\" and \"somebody just bought the last\n * one\", and a storefront renders those differently. `code` is the engine's own\n * taxonomy (`not_found`, `validation`, `conflict`, `unauthorized`, …).\n */\nexport class GoCommerceError extends Error {\n\treadonly status: number\n\treadonly code: string | undefined\n\treadonly details: unknown\n\n\tconstructor(message: string, status: number, code?: string, details?: unknown) {\n\t\tsuper(message)\n\t\tthis.name = 'GoCommerceError'\n\t\tthis.status = status\n\t\tthis.code = code\n\t\tthis.details = details\n\t}\n}\n\n/**\n * A storefront feature this engine has no model for — reels, chat, a vendor's\n * commission statement — or one that lives in a module this particular build\n * did not compile in.\n *\n * The name is the one every connector in the family throws, so a storefront\n * that branches on `err.name === 'NotSupportedError'` treats GoCommerce the same\n * as the rest.\n */\nexport class NotSupportedError extends Error {\n\treadonly service: string\n\treadonly method: string\n\n\tconstructor(service: string, method: string, detail?: string) {\n\t\tsuper(`${service}.${method}() is not supported by GoCommerce${detail ? `: ${detail}` : '.'}`)\n\t\tthis.name = 'NotSupportedError'\n\t\tthis.service = service\n\t\tthis.method = method\n\t}\n}\n","/**\n * Money, across the one boundary in this connector where it changes shape.\n *\n * The engine speaks minor units and a currency code, always, and never sends a\n * formatted string (AGENTS.md rule 6). Svelte Commerce's types say `price:\n * number`, and every backend it already talks to means \"19.99\" by that. So the\n * conversion happens here, once, in the only file allowed to divide money.\n *\n * The exponent is per currency, not a constant 100: the yen writes no decimals\n * and the dinar writes three. Dividing 2500 JPY by 100 would price a ¥2,500\n * item at ¥25. The table mirrors `currencyExponent` in core/transfer_shopify.go\n * — the same list, because a second opinion about the yen is a bug.\n */\n\nconst ZERO_DECIMAL = new Set([\n\t'BIF',\n\t'CLP',\n\t'DJF',\n\t'GNF',\n\t'ISK',\n\t'JPY',\n\t'KMF',\n\t'KRW',\n\t'PYG',\n\t'RWF',\n\t'UGX',\n\t'VND',\n\t'VUV',\n\t'XAF',\n\t'XOF',\n\t'XPF',\n])\n\nconst THREE_DECIMAL = new Set(['BHD', 'IQD', 'JOD', 'KWD', 'LYD', 'OMR', 'TND'])\n\nexport function currencyExponent(code: string | null | undefined): number {\n\tconst c = (code ?? '').toUpperCase()\n\tif (ZERO_DECIMAL.has(c)) return 0\n\tif (THREE_DECIMAL.has(c)) return 3\n\treturn 2\n}\n\n/** The engine's money object. */\nexport type Money = { amount_minor: number; currency: string }\n\n/**\n * Minor units to the major-unit number the storefront renders.\n *\n * Rounded to the currency's own precision rather than left as raw float\n * division: 1999/100 is 19.99 exactly, but 1 / 1000 for a three-decimal\n * currency is not, and a price that renders as 0.0010000000000000002 is the\n * kind of thing nobody notices until a customer screenshots it.\n */\nexport function toMajor(money: Money | null | undefined): number {\n\tif (!money) return 0\n\treturn minorToMajor(money.amount_minor, money.currency)\n}\n\n/** The same, for the routes that send a bare `*_minor` integer beside a currency. */\nexport function minorToMajor(minor: number | null | undefined, currency: string | null | undefined): number {\n\tif (minor === null || minor === undefined || !Number.isFinite(minor)) return 0\n\tconst exp = currencyExponent(currency)\n\tif (exp === 0) return minor\n\treturn Number((minor / 10 ** exp).toFixed(exp))\n}\n\n/**\n * Back the other way, for the few places the storefront hands us a number —\n * a price filter, mostly.\n *\n * Rounded, not truncated: 19.99 * 100 is 1998.9999999999998 in binary floating\n * point, and truncating that filters out the item priced exactly 19.99.\n */\nexport function toMinor(amount: number, currency: string | null | undefined): number {\n\tconst exp = currencyExponent(currency)\n\treturn Math.round(amount * 10 ** exp)\n}\n","/**\n * Store identity — name, logo, favicon, menus, theme variables.\n *\n * Some of that the engine has (the settlement currency, the payment methods,\n * the switched-on plugins) and most of it it does not: a logo and a hero banner\n * are the storefront's own business. The storefront registers its static store\n * record here at boot — `default-store.json` merged under the project's\n * `kitcommerce.config.ts` — and `storeService` lays the engine's live facts\n * over it, so the engine wins wherever it has an opinion.\n */\nexport type StaticStoreProvider = () => Promise<Record<string, any>> | Record<string, any>\n\nlet provider: StaticStoreProvider | undefined\n\nexport const setStaticStore = (fn: StaticStoreProvider) => {\n\tprovider = fn\n}\n\nexport const hasStaticStore = () => Boolean(provider)\n\nexport const readStaticStore = async (): Promise<Record<string, any>> => {\n\tif (!provider) return {}\n\treturn (await provider()) ?? {}\n}\n\n/** The marker the storefront reads to tell which backend is active. */\nexport const connectorName = 'gocommerce'\n","/**\n * Litekart REST paths, intercepted.\n *\n * Every connector in the family exposes `get/post/put/patch/delete(path)` on\n * its BaseService because Litekart's does, and a little storefront code still\n * calls them with a Litekart path — `storeService.post('/api/…')`. Those paths\n * are relative, so they would land on the storefront's own origin, where\n * nothing answers.\n *\n * GoCommerce's own routes also start with `/api/`, which is why this connector\n * never sends an engine request through those verbs: every engine call goes\n * through `BaseService.engine()` with an absolute URL, and the storefront's own\n * guard (which patches the same verbs) cannot reach it either. What arrives\n * here is only ever an inherited Litekart path.\n *\n * Reads for a collection resolve empty (a store legitimately has none); reads\n * for one record and every write throw, because a blank detail page reads as\n * broken and a silent success would tell a shopper their enquiry was saved when\n * nothing left the browser. Each distinct path is reported once.\n */\n\nconst COLLECTION_SEGMENTS = new Set([\n\t'all',\n\t'list',\n\t'list-by-parent',\n\t'list-public',\n\t'latest',\n\t'search',\n\t'public',\n\t'public-details',\n\t'me',\n\t'multiple',\n])\n\nconst emptyResult = () => ({ data: [], count: 0, pageSize: 0, noOfPage: 0, page: 1 })\n\nconst addressesOneRecord = (url: string) => {\n\tconst segments = url.split('?')[0].split('/').filter(Boolean)\n\tif (segments.length < 3) return false\n\treturn !COLLECTION_SEGMENTS.has(segments[segments.length - 1].toLowerCase())\n}\n\nconst reported = new Set<string>()\n\nconst report = (method: string, url: string) => {\n\tconst key = `${method} ${url.split('?')[0]}`\n\tif (reported.has(key)) return\n\treported.add(key)\n\tconsole.warn(\n\t\t`[gocommerce] no native implementation for \\`${key}\\` — that is a Litekart REST path, and it was not called.`,\n\t)\n}\n\n/**\n * Answers a Litekart REST path from data the storefront holds (menus,\n * countries, plugin toggles…). Return `undefined` to fall through.\n */\nexport type RestResolver = (url: string) => Promise<unknown> | unknown | undefined\n\nlet localResolver: RestResolver | undefined\n\nexport const serveRestLocally = (resolver: RestResolver) => {\n\tlocalResolver = resolver\n}\n\nexport const resolveRestLocally = async (method: string, url: string) => {\n\tif (method === 'get') {\n\t\tconst local = await localResolver?.(url)\n\t\tif (local !== undefined) return local\n\t}\n\treport(method, url)\n\tif (method !== 'get' || addressesOneRecord(url)) {\n\t\tthrow new Error(`This feature is not available on this store (gocommerce).`)\n\t}\n\treturn emptyResult()\n}\n","/**\n * A short memory for store-level facts: which plugins are on, the settlement\n * currency, the category tree.\n *\n * The storefront asks for the store record on every server request, and a\n * category page needs the whole tree to draw one breadcrumb. Asking the engine\n * each time would multiply its load by the page count for answers that change\n * when a merchant edits something, not when a shopper clicks.\n *\n * Only facts that are the same for every shopper may go in here — this module\n * is shared by every request a server process handles. Keyed by engine URL, so\n * a platform storefront talking to several stores keeps them apart.\n */\nconst TTL_MS = 60_000\n\ntype Entry = { at: number; value: Promise<unknown> }\n\nconst entries = new Map<string, Entry>()\n\nexport function remember<T>(key: string, load: () => Promise<T>, ttl = TTL_MS): Promise<T> {\n\tconst hit = entries.get(key)\n\tif (hit && Date.now() - hit.at < ttl) return hit.value as Promise<T>\n\tconst value = load()\n\tentries.set(key, { at: Date.now(), value })\n\t// A failure is not remembered: the next caller tries again.\n\tvalue.catch(() => {\n\t\tif (entries.get(key)?.value === value) entries.delete(key)\n\t})\n\treturn value\n}\n\n/** For tests, and for a storefront that has just changed something itself. */\nexport function forgetAll(): void {\n\tentries.clear()\n}\n","/**\n * Engine shapes to storefront shapes.\n *\n * Svelte Commerce's types were drawn around Litekart's API, so every connector\n * is a translation and this file is most of ours. Four rules run through it:\n *\n * 1. Ids cross as strings. The storefront matches variants and cart lines\n * with `===` against ids it read from a URL.\n * 2. Money crosses as a major-unit number, through money.ts and nowhere else.\n * 3. A field the engine does not have is empty, never invented. There is no\n * popularity score, so none is made up; there is no compare-at price, so\n * `mrp` equals the price rather than 0, which would render as a 100%\n * discount on everything in the shop.\n * 4. Lists are always arrays. Product cards read `variants[0]` unguarded.\n */\nimport type {\n\tAddress,\n\tCart,\n\tCartLine,\n\tCategory,\n\tCmsPage,\n\tCollection,\n\tCustomer,\n\tIdentityAddress,\n\tOrder,\n\tOrderLine,\n\tProduct,\n\tReview,\n\tSearchDoc,\n\tVariant,\n\tVendor,\n} from './engine'\nimport { minorToMajor, toMajor, type Money } from './money'\nimport type { CartExtras, StorefrontAddress } from './browser'\n\nconst str = (v: number | string | null | undefined): string => (v === null || v === undefined ? '' : String(v))\n\nconst arr = <T>(v: T[] | null | undefined): T[] => v ?? []\n\n// ---------------------------------------------------------------- products\n\n/** Variants a shopper can see: inactive ones are the merchant's business. */\nconst liveVariants = (p: Product): Variant[] => arr(p.variants).filter((v) => v.active)\n\nfunction variantImages(v: Variant): string[] {\n\tconst out: string[] = []\n\tfor (const img of [v.image, ...arr(v.images)]) {\n\t\tif (img?.url && (img.kind ?? 'image') === 'image' && !out.includes(img.url)) out.push(img.url)\n\t}\n\treturn out\n}\n\n/**\n * Every picture the public API offers for a product: the lead image, then each\n * variant's. The engine keeps the full gallery on admin routes only, so this\n * is the honest union rather than the whole media library.\n */\nexport function productImages(p: Product): string[] {\n\tconst out: string[] = []\n\tconst push = (url?: string) => {\n\t\tif (url && !out.includes(url)) out.push(url)\n\t}\n\tpush(p.image_url)\n\tfor (const v of arr(p.variants)) for (const url of variantImages(v)) push(url)\n\treturn out\n}\n\nexport function toVariant(v: Variant, p: Product, optionless: boolean) {\n\tconst images = variantImages(v)\n\tconst options = arr(p.options)\n\treturn {\n\t\tid: str(v.id),\n\t\tproductId: str(v.product_id),\n\t\t// The storefront picks the default variant of an optionless product by\n\t\t// this exact title, and hides the variant name when it sees it.\n\t\ttitle: optionless ? 'default' : v.label || v.sku,\n\t\tsku: v.sku,\n\t\tbarcode: v.barcode ?? null,\n\t\tprice: toMajor(v.price),\n\t\tmrp: toMajor(v.compare_at_price ?? v.price),\n\t\t// The engine's own vocabulary, unchanged: `available` is on hand minus\n\t\t// reserved; an untracked variant is never managed, so its count is moot.\n\t\tstock: v.active ? v.available : 0,\n\t\tmanageInventory: v.active ? v.track_inventory : true,\n\t\tallowBackorder: v.active && v.continue_selling,\n\t\tactive: v.active,\n\t\tweight: v.weight_grams ?? null,\n\t\tlength: v.dimensions?.length_mm ?? null,\n\t\twidth: v.dimensions?.width_mm ?? null,\n\t\theight: v.dimensions?.height_mm ?? null,\n\t\timages: images.join(','),\n\t\timg: images[0] ?? null,\n\t\timage: images[0] ?? null,\n\t\tthumbnail: images[0] ?? null,\n\t\t// Values in option order — `options[i]` answers `p.options[i]`.\n\t\toptions: arr(v.options).map((value, i) => ({ optionId: str(options[i]?.id), value })),\n\t\tmetadata: v.metadata ?? null,\n\t}\n}\n\n/**\n * The product's category attribute answers — `metadata.category`, keyed by the\n * attribute's handle — as the specs table's rows. The handle is the only name\n * the public API carries, so it is shown humanised rather than looked up.\n */\nfunction attributesOf(p: Product): { name: string; value: string; handle: string }[] {\n\tconst answers = p.metadata?.category\n\tif (!answers || typeof answers !== 'object' || Array.isArray(answers)) return []\n\treturn Object.entries(answers as Record<string, unknown>).flatMap(([handle, raw]) => {\n\t\tconst values = (Array.isArray(raw) ? raw : [raw]).map((v) => String(v ?? '').trim()).filter(Boolean)\n\t\tif (!values.length) return []\n\t\tconst name = handle.replace(/[-_]+/g, ' ').replace(/^./, (c) => c.toUpperCase())\n\t\treturn [{ name, value: values.join(', '), handle }]\n\t})\n}\n\nexport type StorefrontProduct = ReturnType<typeof toProduct>\n\nexport function toProduct(p: Product, extra: { categoryHierarchy?: { name: string; slug: string }[] } = {}) {\n\tconst live = liveVariants(p)\n\tconst lead = live[0] ?? arr(p.variants)[0]\n\tconst optionless = arr(p.options).length === 0\n\tconst images = productImages(p)\n\tconst prices = live.map((v) => toMajor(v.price))\n\tconst tracked = live.filter((v) => v.track_inventory)\n\tconst category = p.category\n\tconst tags = arr(p.tags)\n\n\treturn {\n\t\tid: str(p.id),\n\t\tslug: p.slug,\n\t\ttitle: p.title,\n\t\tname: p.title,\n\t\tsubtitle: null,\n\t\tdescription: p.description ?? '',\n\t\tstatus: p.status === 'active' ? 'published' : p.status,\n\t\tactive: p.status === 'active',\n\t\ttype: p.product_type ?? '',\n\t\tcurrency: p.currency,\n\t\tcurrencyCode: p.currency,\n\t\tprice: lead ? toMajor(lead.price) : 0,\n\t\tmrp: lead ? toMajor(lead.compare_at_price ?? lead.price) : 0,\n\t\tminPrice: prices.length ? Math.min(...prices) : 0,\n\t\tmaxPrice: prices.length ? Math.max(...prices) : 0,\n\t\tsku: lead?.sku ?? null,\n\t\tbarcode: lead?.barcode ?? null,\n\t\tweight: lead?.weight_grams ?? null,\n\t\toriginCountry: lead?.origin_country ?? null,\n\t\tthumbnail: images[0] ?? null,\n\t\timage_url: images[0] ?? null,\n\t\timages: images.join(','),\n\t\timageList: images,\n\t\t// Product-level stock is what a card shows before a variant is picked:\n\t\t// buyable when any live variant is, counted only where counting means\n\t\t// something.\n\t\tmanageInventory: live.length > 0 && tracked.length === live.length,\n\t\tallowBackorder: live.some((v) => v.continue_selling),\n\t\tstock: tracked.reduce((n, v) => n + Math.max(0, v.available), 0),\n\t\thasStock: live.some((v) => !v.track_inventory || v.continue_selling || v.available > 0),\n\t\tcategoryId: category ? str(category.id) : null,\n\t\tcategory: category ? { id: str(category.id), name: category.title, slug: category.slug } : null,\n\t\tcategories: category ? [{ category: { id: str(category.id), name: category.title, slug: category.slug } }] : [],\n\t\tcategoryHierarchy: extra.categoryHierarchy ?? (category ? [{ name: category.title, slug: category.slug }] : []),\n\t\tcollections: arr(p.collections).map((c) => ({ id: str(c.id), name: c.title, slug: c.slug })),\n\t\t// Free text on the engine's product, not a vendor record.\n\t\tvendor: p.vendor ? { businessName: p.vendor } : null,\n\t\tproductTags: tags.join(','),\n\t\tkeywords: tags.join(','),\n\t\tmetaTitle: p.seo_title || p.title,\n\t\tmetaDescription: p.seo_description || null,\n\t\tlink: `/products/${p.slug}`,\n\t\toptions: arr(p.options).map((o) => ({\n\t\t\tid: str(o.id),\n\t\t\ttitle: o.name,\n\t\t\tname: o.name,\n\t\t\ttype: 'text',\n\t\t\tvalues: arr(o.values).map((val) => ({ id: str(val.id), value: val.value })),\n\t\t})),\n\t\tvariants: live.map((v) => toVariant(v, p, optionless)),\n\t\t// Filled by the product page from ext/reviews when it is installed.\n\t\tratings: [] as ReturnType<typeof toRating>[],\n\t\trating: null as number | null,\n\t\tratingCount: 0,\n\t\treviewCount: 0,\n\t\tattributes: attributesOf(p),\n\t\tmetadata: p.metadata ?? null,\n\t\tcreatedAt: p.created_at,\n\t\tupdatedAt: p.updated_at,\n\t}\n}\n\n/** A Meilisearch hit — the search index's document, which is thinner than a product. */\nexport function fromSearchDoc(d: SearchDoc) {\n\tconst price = minorToMajor(d.price_minor, d.currency)\n\treturn {\n\t\tid: str(d.id),\n\t\tslug: d.slug,\n\t\ttitle: d.title,\n\t\tname: d.title,\n\t\tdescription: d.description,\n\t\tcurrency: d.currency,\n\t\tprice,\n\t\tmrp: price,\n\t\tminPrice: price,\n\t\tmaxPrice: minorToMajor(d.price_max_minor, d.currency),\n\t\tthumbnail: d.image ?? null,\n\t\timage_url: d.image ?? null,\n\t\timages: d.image ?? '',\n\t\tstock: d.in_stock ? 1 : 0,\n\t\thasStock: d.in_stock,\n\t\t// The index cannot say how much is left, only whether any is; a card\n\t\t// built from it must not claim to count.\n\t\tmanageInventory: false,\n\t\tallowBackorder: false,\n\t\tproductTags: arr(d.tags).join(','),\n\t\tcategory: d.category ? { name: d.category.split(' / ').pop() ?? d.category, slug: '' } : null,\n\t\tvendor: d.vendor ? { businessName: d.vendor } : null,\n\t\tvariants: [] as ReturnType<typeof toVariant>[],\n\t\toptions: [],\n\t\tratings: [],\n\t\tlink: `/products/${d.slug}`,\n\t\tupdatedAt: new Date(d.updated_at * 1000).toISOString(),\n\t}\n}\n\n// ---------------------------------------------------------------- taxonomy\n\nexport type StorefrontCategory = {\n\tid: string\n\tname: string\n\ttitle: string\n\tslug: string\n\tlink: string\n\tparentCategoryId: string | null\n\tpath: string\n\tlevel: number\n\trank: number\n\tchildCount: number\n\tthumbnail: string | null\n\tdescription: string | null\n\tisActive: boolean\n\tisFeatured: boolean\n\tisMegamenu: boolean\n\tmetaTitle: string\n\tchildren: StorefrontCategory[]\n\tcreatedAt: string\n\tupdatedAt: string\n}\n\nexport function toCategory(c: Category): StorefrontCategory {\n\treturn {\n\t\tid: str(c.id),\n\t\tname: c.title,\n\t\ttitle: c.title,\n\t\tslug: c.slug,\n\t\tlink: `/${c.slug}`,\n\t\tparentCategoryId: c.parent_id === null || c.parent_id === undefined ? null : str(c.parent_id),\n\t\tpath: c.full_name,\n\t\tlevel: c.depth,\n\t\trank: c.position,\n\t\tchildCount: c.child_count,\n\t\tthumbnail: (c.metadata?.image as string | undefined) ?? null,\n\t\tdescription: (c.metadata?.description as string | undefined) ?? null,\n\t\tisActive: true,\n\t\tisFeatured: false,\n\t\tisMegamenu: false,\n\t\tmetaTitle: c.title,\n\t\tchildren: arr(c.children).map(toCategory),\n\t\tcreatedAt: c.created_at,\n\t\tupdatedAt: c.updated_at,\n\t}\n}\n\nexport function toCollection(c: Collection) {\n\treturn {\n\t\tid: str(c.id),\n\t\tname: c.title,\n\t\ttitle: c.title,\n\t\tslug: c.slug,\n\t\tdescription: c.description || null,\n\t\tsubTitle: null,\n\t\trank: str(c.position),\n\t\tthumbnail: (c.metadata?.image as string | undefined) ?? null,\n\t\tisActive: true,\n\t\tmetaTitle: c.title,\n\t\tmetaDescription: c.description || null,\n\t\tcreatedAt: c.created_at,\n\t\tupdatedAt: c.updated_at,\n\t}\n}\n\n// ---------------------------------------------------------------- addresses\n\n/** The engine's address — on a checkout or an order — to the storefront's form shape. */\nexport function fromEngineAddress(a: Address | undefined, email?: string) {\n\tif (!a) return null\n\tconst [firstName, ...rest] = (a.name ?? '').trim().split(/\\s+/)\n\treturn {\n\t\tfirstName: firstName || '',\n\t\tlastName: rest.join(' '),\n\t\temail: email ?? null,\n\t\tphone: a.phone ?? null,\n\t\taddress_1: a.line1,\n\t\taddress_2: a.line2 ?? '',\n\t\tcity: a.city,\n\t\tstate: a.state ?? '',\n\t\tzip: a.postal_code,\n\t\tcountry: a.country,\n\t\tcountryCode: a.country,\n\t}\n}\n\n/** The storefront's form shape to the engine's checkout address. */\nexport function toEngineAddress(a: StorefrontAddress): Address {\n\tconst name = [a.firstName, a.lastName].filter(Boolean).join(' ').trim()\n\treturn {\n\t\t...(name ? { name } : {}),\n\t\t...(a.phone ? { phone: String(a.phone) } : {}),\n\t\tline1: String(a.address_1 ?? '').trim(),\n\t\t...(a.address_2 || a.locality ? { line2: [a.address_2, a.locality].filter(Boolean).join(', ') } : {}),\n\t\tcity: String(a.city ?? '').trim(),\n\t\t...(a.state ? { state: String(a.state) } : {}),\n\t\tpostal_code: String(a.zip ?? '').trim(),\n\t\tcountry: String(a.countryCode || a.country || '')\n\t\t\t.trim()\n\t\t\t.toUpperCase(),\n\t}\n}\n\n/** An address-book entry (ext/identity) to the storefront's Address. */\nexport function fromIdentityAddress(a: IdentityAddress, email?: string) {\n\tconst [firstName, ...rest] = (a.name ?? '').trim().split(/\\s+/)\n\treturn {\n\t\tid: str(a.id),\n\t\tfirstName: firstName || '',\n\t\tlastName: rest.join(' '),\n\t\temail: email ?? null,\n\t\tphone: a.phone || null,\n\t\taddress_1: a.line1,\n\t\taddress_2: a.line2,\n\t\tcity: a.city,\n\t\tstate: a.state,\n\t\tzip: a.postal_code,\n\t\tcountry: a.country,\n\t\tcountryCode: a.country,\n\t\tlabel: a.label,\n\t\tisPrimary: a.is_default,\n\t\tcreatedAt: a.created_at,\n\t\tupdatedAt: a.updated_at,\n\t}\n}\n\n/** The storefront's Address to ext/identity's AddressInput. Only declared fields: the engine refuses others. */\nexport function toIdentityAddress(a: StorefrontAddress & { isPrimary?: boolean; label?: string }) {\n\tconst e = toEngineAddress(a)\n\treturn {\n\t\tname: e.name ?? '',\n\t\tphone: e.phone ?? '',\n\t\tline1: e.line1,\n\t\tline2: e.line2 ?? '',\n\t\tcity: e.city,\n\t\tstate: e.state ?? '',\n\t\tpostal_code: e.postal_code,\n\t\tcountry: e.country,\n\t\t...(a.label ? { label: String(a.label) } : {}),\n\t\t...(a.isPrimary ? { is_default: true } : {}),\n\t}\n}\n\n// ---------------------------------------------------------------- cart\n\nexport function toCartLine(l: CartLine, extra: { slug?: string; thumbnail?: string | null } = {}) {\n\treturn {\n\t\tid: str(l.id),\n\t\tproductId: str(l.product_id),\n\t\tvariantId: str(l.variant_id),\n\t\tsku: l.sku,\n\t\ttitle: l.title,\n\t\tname: l.title,\n\t\tslug: extra.slug ?? '',\n\t\tthumbnail: extra.thumbnail ?? null,\n\t\tvariantTitle: l.variant_label ?? '',\n\t\tqty: l.quantity,\n\t\tprice: toMajor(l.unit_price),\n\t\tmrp: toMajor(l.unit_price),\n\t\tsubtotal: toMajor(l.total),\n\t\ttotal: toMajor(l.total),\n\t\tinStock: l.in_stock,\n\t\tpriceChanged: l.price_changed,\n\t\tcurrentPrice: toMajor(l.current_price),\n\t\t// The storefront's review step lists only lines marked for checkout. The\n\t\t// engine checks a cart out whole, so every line is.\n\t\tisSelectedForCheckout: true,\n\t\tvariant: {\n\t\t\tid: str(l.variant_id),\n\t\t\toptions: l.variant_label ? l.variant_label.split(' / ').map((value) => ({ option: { title: '' }, value })) : [],\n\t\t},\n\t\tproduct: { id: str(l.product_id), categories: [] as unknown[] },\n\t}\n}\n\n/**\n * A cart, with what the engine does not keep laid over it: the coupon and its\n * previewed saving, the delivery choice and the addresses. Totals here are an\n * estimate the engine settles at checkout — tax in particular exists only on\n * the order — and the storefront is told so by `taxIncluded: false`.\n */\nexport function toCart(\n\tc: Cart,\n\textras: CartExtras = {},\n\tlineExtra: (l: CartLine) => { slug?: string; thumbnail?: string | null } = () => ({}),\n) {\n\tconst lines = c.status === 'converted' ? [] : arr(c.line_items)\n\tconst currency = c.currency\n\tconst subtotalMinor = lines.reduce((n, l) => n + l.total.amount_minor, 0)\n\tconst discountMinor = extras.discount && !extras.discount.free_shipping ? extras.discount.amount_minor : 0\n\tconst shippingMinor = extras.discount?.free_shipping ? 0 : (extras.shippingRate?.minor ?? 0)\n\tconst totalMinor = Math.max(0, subtotalMinor - discountMinor) + shippingMinor\n\tconst money = (minor: number) => minorToMajor(minor, currency)\n\tconst ship = extras.shippingAddress ?? null\n\n\treturn {\n\t\tid: c.id,\n\t\tstatus: c.status,\n\t\temail: c.email ?? ship?.email ?? null,\n\t\tphone: extras.phone ?? ship?.phone ?? null,\n\t\tname: ship ? [ship.firstName, ship.lastName].filter(Boolean).join(' ') : null,\n\t\tlineItems: lines.map((l) => toCartLine(l, lineExtra(l))),\n\t\tqty: lines.reduce((n, l) => n + l.quantity, 0),\n\t\tcurrencyCode: currency,\n\t\tcurrency,\n\t\tsubtotal: money(subtotalMinor),\n\t\tdiscountAmount: money(discountMinor),\n\t\tsavingAmount: money(discountMinor),\n\t\tcouponCode: extras.discount?.code ?? null,\n\t\tdiscount: extras.discount ?? null,\n\t\tshippingCharges: money(shippingMinor),\n\t\tshippingRateId: extras.shippingRateId ?? null,\n\t\tshippingMethod: extras.shippingRate?.name ?? null,\n\t\ttax: 0,\n\t\ttaxIncluded: false,\n\t\tcodCharges: 0,\n\t\ttotal: money(totalMinor),\n\t\tshippingAddress: ship,\n\t\tshippingAddressId: ship ? (ship.id && ship.id !== 'new' ? String(ship.id) : 'cart') : null,\n\t\tbillingAddress: extras.billingAddress ?? ship,\n\t\tbillingAddressId: extras.billingAddress\n\t\t\t? extras.billingAddress.id && extras.billingAddress.id !== 'new'\n\t\t\t\t? String(extras.billingAddress.id)\n\t\t\t\t: 'cart-billing'\n\t\t\t: ship\n\t\t\t\t? ship.id && ship.id !== 'new'\n\t\t\t\t\t? String(ship.id)\n\t\t\t\t\t: 'cart'\n\t\t\t\t: null,\n\t\tpaymentMethod: null,\n\t\tneedAddress: lines.length > 0,\n\t\tcompletedAt: c.status === 'converted' ? c.updated_at : null,\n\t\tcreatedAt: c.created_at,\n\t\tupdatedAt: c.updated_at,\n\t\texpiresAt: c.expires_at,\n\t}\n}\n\n/** What the storefront shows for \"no bag yet\": its own initial cart, field for field. */\nexport function emptyCart(currency = 'USD') {\n\treturn {\n\t\tid: '',\n\t\tstatus: 'open',\n\t\temail: null,\n\t\tphone: null,\n\t\tlineItems: [] as ReturnType<typeof toCartLine>[],\n\t\tqty: 0,\n\t\tcurrencyCode: currency,\n\t\tsubtotal: 0,\n\t\tdiscountAmount: 0,\n\t\tsavingAmount: 0,\n\t\tcouponCode: null,\n\t\tshippingCharges: 0,\n\t\ttax: 0,\n\t\ttotal: 0,\n\t\tshippingAddress: null,\n\t\tshippingAddressId: null,\n\t\tbillingAddress: null,\n\t\tbillingAddressId: null,\n\t}\n}\n\n// ---------------------------------------------------------------- orders\n\nconst STATUS: Record<string, string> = {\n\tpending: 'Pending',\n\tconfirmed: 'Confirmed',\n\tpartial: 'Partially shipped',\n\tshipped: 'Shipped',\n\tdelivered: 'Delivered',\n\tcancelled: 'Cancelled',\n}\n\nconst PAYMENT_STATUS: Record<string, string> = {\n\tpending: 'Pending',\n\tpaid: 'Paid',\n\tfailed: 'Failed',\n\trefunded: 'Refunded',\n}\n\nfunction toOrderLine(l: OrderLine, currency: string) {\n\treturn {\n\t\tid: str(l.id),\n\t\tproductId: str(l.product_id),\n\t\tvariantId: str(l.variant_id),\n\t\tsku: l.sku,\n\t\ttitle: l.title,\n\t\tname: l.title,\n\t\tslug: '',\n\t\tthumbnail: l.image_url ?? null,\n\t\timg: l.image_url ?? null,\n\t\tvariantTitle: l.variant_label ?? '',\n\t\tqty: l.quantity,\n\t\tshippedQty: l.shipped_quantity,\n\t\tprice: toMajor(l.unit_price),\n\t\tmrp: toMajor(l.unit_price),\n\t\tsubtotal: toMajor(l.total),\n\t\ttotal: toMajor(l.total),\n\t\tcurrencyCode: currency,\n\t\tstatus: l.shipped_quantity >= l.quantity ? 'Shipped' : 'Pending',\n\t\tfiles: [],\n\t\tusedOptions: [],\n\t}\n}\n\nexport type StorefrontOrder = ReturnType<typeof toOrder>\n\nexport function toOrder(o: Order) {\n\tconst address = fromEngineAddress(o.address, o.email)\n\tconst code = (o.discounts ?? []).find((d) => d.code)?.code\n\treturn {\n\t\tid: str(o.id),\n\t\torderNo: o.number,\n\t\torderNumber: o.number,\n\t\tnumber: o.number,\n\t\t// The storefront links an order by this; the engine has no sub-orders,\n\t\t// so an order is its own parent.\n\t\tparentOrderNo: o.number,\n\t\tstatus: STATUS[o.status] ?? o.status,\n\t\tengineStatus: o.status,\n\t\tpaymentStatus: PAYMENT_STATUS[o.payment_status] ?? o.payment_status,\n\t\tpaymentMethod: o.payment_provider.toUpperCase(),\n\t\tcurrencyCode: o.currency,\n\t\tsubtotal: toMajor(o.subtotal),\n\t\tshippingCharges: toMajor(o.shipping),\n\t\tdiscount: toMajor(o.discount),\n\t\ttax: toMajor(o.tax),\n\t\ttaxIncluded: o.tax_inclusive,\n\t\ttotal: toMajor(o.total),\n\t\trefunded: toMajor(o.refunded),\n\t\tcodCharges: 0,\n\t\tcoupon: code ? { code } : null,\n\t\tuserEmail: o.email,\n\t\temail: o.email,\n\t\tphone: o.phone ?? null,\n\t\tshippingAddress: address,\n\t\tbillingAddress: address,\n\t\tshippingMethod: o.shipping_method ?? null,\n\t\tshippingRate: o.shipping_method ? { name: o.shipping_method } : null,\n\t\tlineItems: arr(o.line_items).map((l) => toOrderLine(l, o.currency)),\n\t\tfulfillments: arr(o.fulfillments).map((f) => ({\n\t\t\tid: str(f.id),\n\t\t\tstatus: f.status,\n\t\t\tcarrier: f.carrier_name || f.carrier || f.provider,\n\t\t\ttrackingNumber: f.tracking ?? null,\n\t\t\ttrackingUrl: f.tracking_url ?? null,\n\t\t\tlineItems: arr(f.lines).map((l) => ({ id: str(l.order_line_id), title: l.title, qty: l.quantity })),\n\t\t\tcreatedAt: f.created_at,\n\t\t})),\n\t\ttracking: [],\n\t\torderHistory: [],\n\t\tisReplaceOrReturn: false,\n\t\tcreatedAt: o.created_at,\n\t\tupdatedAt: o.updated_at,\n\t}\n}\n\n// ---------------------------------------------------------------- the rest\n\nexport function toRating(r: Review) {\n\treturn {\n\t\tid: str(r.id),\n\t\trating: r.rating,\n\t\tname: r.name,\n\t\ttitle: r.title ?? '',\n\t\treview: r.body,\n\t\tmessage: r.body,\n\t\treply: r.reply ?? null,\n\t\tverified: r.verified,\n\t\timg: '',\n\t\tcreatedAt: r.created_at,\n\t}\n}\n\nexport function toCmsPage(p: CmsPage) {\n\treturn {\n\t\tid: str(p.id),\n\t\tslug: p.slug,\n\t\tname: p.title,\n\t\ttitle: p.title,\n\t\tcontent: p.body,\n\t\texcerpt: p.excerpt ?? null,\n\t\tlayouts: [],\n\t\tlanguage: p.language,\n\t\tmetaTitle: p.seo?.title || p.title,\n\t\tmetaDescription: p.seo?.description || p.excerpt || null,\n\t\tmetaKeywords: p.seo?.keywords || null,\n\t\tpublishedAt: p.published_at ?? null,\n\t\tcreatedAt: p.created_at,\n\t\tupdatedAt: p.updated_at,\n\t}\n}\n\nexport function toVendor(v: Vendor) {\n\treturn {\n\t\tid: str(v.id),\n\t\tslug: v.slug,\n\t\tname: v.name,\n\t\tbusinessName: v.name,\n\t\tabout: v.about,\n\t\tdescription: v.about,\n\t\twebsite: v.website,\n\t\taddress: v.address,\n\t\tbanners: [],\n\t\trating: null,\n\t}\n}\n\nexport function toUser(c: Customer) {\n\tconst [firstName, ...rest] = (c.name ?? '').trim().split(/\\s+/)\n\treturn {\n\t\tid: str(c.id),\n\t\tuserId: str(c.id),\n\t\temail: c.email,\n\t\temailVerified: c.email_verified,\n\t\tphone: c.phone || null,\n\t\tfirstName: firstName || '',\n\t\tlastName: rest.join(' '),\n\t\tname: c.name,\n\t\tfullName: c.name,\n\t\tavatar: null,\n\t\trole: 'USER',\n\t\tcreatedAt: c.created_at,\n\t\tupdatedAt: c.updated_at,\n\t}\n}\n\nexport const priceOf = (m: Money | undefined) => (m ? toMajor(m) : 0)\n","/**\n * The state this connector keeps in the shopper's browser, and only there.\n *\n * The storefront renders some services from a server singleton shared by every\n * shopper, so nothing about one shopper may live in module scope: a token held\n * in a static field would be served to the next request. Everything here is\n * read from `localStorage` or `document.cookie` at the moment it is needed, and\n * on the server every reader answers \"nothing\".\n *\n * What lives here, and why the engine does not hold it:\n *\n * - the account session token — ext/identity is bearer-only and sets no cookie;\n * - the `me` and `connect.sid` cookies — the storefront's own idea of who is\n * signed in, which every connector in the family writes itself;\n * - `cart_id` — the storefront reads it, the connector writes it;\n * - per-cart checkout details — the engine's cart holds lines and an email, and\n * takes the address, phone and delivery choice only in the checkout request,\n * so they are kept here until then;\n * - order access tokens — returned once, at checkout, and the only way a guest\n * can read an order back;\n * - the wishlist token — ext/wishlist keys a list by its own token.\n */\nimport type { AppliedDiscount, AuthResponse, Customer } from './engine'\n\nexport const inBrowser = (): boolean => typeof window !== 'undefined' && typeof document !== 'undefined'\n\nexport function readLocal(key: string): string | null {\n\tif (!inBrowser()) return null\n\ttry {\n\t\treturn window.localStorage.getItem(key)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nexport function writeLocal(key: string, value: string): void {\n\tif (!inBrowser()) return\n\ttry {\n\t\twindow.localStorage.setItem(key, value)\n\t} catch {\n\t\t// Private mode or a full quota. The call it belongs to still succeeds;\n\t\t// only the memory of it is lost.\n\t}\n}\n\nexport function removeLocal(key: string): void {\n\tif (!inBrowser()) return\n\ttry {\n\t\twindow.localStorage.removeItem(key)\n\t} catch {\n\t\t// see writeLocal\n\t}\n}\n\nfunction readJSON<T>(key: string): T | null {\n\tconst raw = readLocal(key)\n\tif (!raw) return null\n\ttry {\n\t\treturn JSON.parse(raw) as T\n\t} catch {\n\t\treturn null\n\t}\n}\n\nconst YEAR = 60 * 60 * 24 * 365\n\nfunction setCookie(name: string, value: string, maxAge = YEAR): void {\n\tif (!inBrowser()) return\n\tdocument.cookie = `${name}=${value}; path=/; max-age=${maxAge}; samesite=lax`\n}\n\nfunction clearCookie(name: string): void {\n\tif (!inBrowser()) return\n\tdocument.cookie = `${name}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`\n}\n\nexport function readCookie(name: string): string | null {\n\tif (!inBrowser()) return null\n\tfor (const pair of document.cookie.split(';')) {\n\t\tconst at = pair.indexOf('=')\n\t\tif (at < 0) continue\n\t\tif (pair.slice(0, at).trim() === name) return pair.slice(at + 1).trim()\n\t}\n\treturn null\n}\n\n// ---------------------------------------------------------------- session\n\nconst TOKEN = 'gocommerce_token'\n\n/** The ext/identity bearer token, when a shopper is signed in in this browser. */\nexport const sessionToken = (): string | null => readLocal(TOKEN)\n\n/**\n * The user object the storefront keeps in its `me` cookie. `userId` is its\n * signed-in test and `role: 'USER'` its shopper test; the rest fills forms.\n */\nexport function toMe(c: Customer) {\n\tconst [firstName, ...rest] = (c.name ?? '').trim().split(/\\s+/)\n\treturn {\n\t\tid: String(c.id),\n\t\tuserId: String(c.id),\n\t\temail: c.email,\n\t\tphone: c.phone || null,\n\t\tfirstName: firstName || '',\n\t\tlastName: rest.join(' '),\n\t\tname: c.name ?? '',\n\t\tfullName: c.name ?? '',\n\t\tavatar: null,\n\t\trole: 'USER',\n\t\temailVerified: c.email_verified,\n\t\tstoreId: null,\n\t}\n}\n\nexport type Me = ReturnType<typeof toMe>\n\n/**\n * Signs this browser in: the token for the engine, the two cookies for the\n * storefront. `connect.sid` carries no secret — the storefront's server only\n * checks that it exists — so it holds a marker rather than the token, which\n * would otherwise ride along on every request to the storefront's origin.\n */\nexport function startSession(auth: AuthResponse): Me {\n\twriteLocal(TOKEN, auth.token)\n\tconst me = toMe(auth.record)\n\tconst expires = Math.max(60, Math.floor((Date.parse(auth.expires_at) - Date.now()) / 1000)) || YEAR\n\tsetCookie('me', encodeURIComponent(JSON.stringify(me)), expires)\n\tsetCookie('connect.sid', 'gocommerce', expires)\n\treturn me\n}\n\n/** Refreshes the `me` cookie after a profile change, keeping the session. */\nexport function updateMe(c: Customer): Me {\n\tconst me = toMe(c)\n\tsetCookie('me', encodeURIComponent(JSON.stringify(me)))\n\treturn me\n}\n\nexport function endSession(): void {\n\tremoveLocal(TOKEN)\n\tclearCookie('me')\n\tclearCookie('connect.sid')\n}\n\n/** The `me` cookie, decoded — the name and email a review is signed with. */\nexport function currentMe(): Partial<Me> | null {\n\tconst raw = readCookie('me')\n\tif (!raw) return null\n\ttry {\n\t\treturn JSON.parse(decodeURIComponent(raw))\n\t} catch {\n\t\treturn null\n\t}\n}\n\n// ---------------------------------------------------------------- cart\n\n/** `localStorage.cart_id`, the storefront's own key, with its stale spellings refused. */\nexport function storedCartId(): string | null {\n\tconst v = readLocal('cart_id')\n\tif (!v || v === 'undefined' || v === 'null') return null\n\treturn v\n}\n\nexport const rememberCartId = (id: string): void => writeLocal('cart_id', id)\n\n/** The storefront's address shape, as its checkout form builds it. */\nexport type StorefrontAddress = {\n\tid?: string\n\tfirstName?: string\n\tlastName?: string\n\temail?: string\n\tphone?: string\n\taddress_1?: string\n\taddress_2?: string\n\tlocality?: string\n\tcity?: string\n\tstate?: string\n\tzip?: string\n\tcountry?: string\n\tcountryCode?: string\n\t[key: string]: unknown\n}\n\nexport type CartExtras = {\n\tphone?: string\n\tshippingAddress?: StorefrontAddress | null\n\tbillingAddress?: StorefrontAddress | null\n\tshippingRateId?: string | null\n\tshippingRate?: { id: string; name: string; minor: number; currency: string } | null\n\tdiscount?: AppliedDiscount | null\n\t/** The Idempotency-Key of the last checkout attempt, and the body it was sent with. */\n\tattempt?: { key: string; body: string } | null\n}\n\nconst extrasKey = (cartId: string) => `gocommerce_cart_${cartId}`\n\nexport const cartExtras = (cartId: string): CartExtras => readJSON<CartExtras>(extrasKey(cartId)) ?? {}\n\nexport function saveCartExtras(cartId: string, patch: CartExtras): CartExtras {\n\tconst next = { ...cartExtras(cartId), ...patch }\n\twriteLocal(extrasKey(cartId), JSON.stringify(next))\n\treturn next\n}\n\nexport const forgetCartExtras = (cartId: string): void => removeLocal(extrasKey(cartId))\n\n// ---------------------------------------------------------------- orders\n\ntype PlacedOrder = { number: string; token: string; cartId: string; reference?: string }\n\nconst ORDERS = 'gocommerce_orders'\n\nexport const placedOrders = (): PlacedOrder[] => readJSON<PlacedOrder[]>(ORDERS) ?? []\n\n/**\n * Keeps an order's access token. The engine returns it exactly once — a\n * replayed checkout leaves it out — and without it a guest cannot read the\n * order back, so losing it here loses the order.\n */\nexport function rememberOrder(o: PlacedOrder): void {\n\tconst kept = placedOrders().filter((p) => p.number !== o.number)\n\t// Bounded: a shared computer should not accumulate a history forever.\n\twriteLocal(ORDERS, JSON.stringify([o, ...kept].slice(0, 50)))\n}\n\nexport const placedOrder = (number: string): PlacedOrder | undefined => placedOrders().find((p) => p.number === number)\n\nexport const placedOrderForCart = (cartId: string): PlacedOrder | undefined =>\n\tplacedOrders().find((p) => p.cartId === cartId)\n\nexport const placedOrderByReference = (reference: string): PlacedOrder | undefined =>\n\tplacedOrders().find((p) => p.reference === reference)\n\n// ---------------------------------------------------------------- wishlist\n\nconst WISHLIST = 'gocommerce_wishlist'\nexport const wishlistToken = (): string | null => readLocal(WISHLIST)\nexport const rememberWishlistToken = (token: string): void => writeLocal(WISHLIST, token)\nexport const forgetWishlistToken = (): void => removeLocal(WISHLIST)\n","import type { Credentials } from '../config'\nimport type { Envelope } from '../engine'\nimport { GoCommerceError } from '../errors'\nimport { resolveRestLocally } from '../rest-guard'\nimport { sessionToken } from '../browser'\n\ntype Query = Record<string, string | number | boolean | null | undefined | (string | number)[]>\n\nexport type EngineRequest = {\n\tmethod?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\tquery?: Query\n\tbody?: unknown\n\theaders?: Record<string, string>\n\t/** Send the signed-in shopper's bearer token. Only ext/identity reads it. */\n\tauth?: boolean\n}\n\n/**\n * BaseService — the one place this connector talks to the engine.\n *\n * - Credentials arrive through the static `setCredentials` (both hooks), never\n * a constructor, and merge: the storefront drops unset variables rather than\n * sending `undefined`, so a second call must not erase the first.\n * - Server-side, a service is built with SvelteKit's `fetch`; client-side, the\n * prebuilt singletons use the global one. Either way it is called with the\n * global object as receiver, because the browser's native fetch throws\n * \"Illegal invocation\" when called as a method of anything else.\n * - Every engine call goes through `engine()`, with an absolute URL. The\n * engine's own routes start with `/api/`, and the storefront patches this\n * class's `get/post/put/patch/delete` to swallow any relative `/api/` path\n * (see rest-guard.ts), so those verbs are kept for the Litekart paths the\n * storefront still sends and never used for the engine.\n * - Failures throw a `GoCommerceError`: an `Error` with the engine's message,\n * status and code, which is what the storefront toasts.\n */\nexport class BaseService {\n\tprivate static _credentials: Credentials = { apiUrl: '' }\n\tprotected _fetch: typeof fetch\n\n\tconstructor(fetchFn?: typeof fetch) {\n\t\tthis._fetch = fetchFn ?? ((input, init) => globalThis.fetch(input, init))\n\t}\n\n\tstatic setCredentials(creds: Partial<Credentials>): void {\n\t\tBaseService._credentials = { ...BaseService._credentials, ...creds }\n\t}\n\n\tstatic getCredentials(): Credentials {\n\t\treturn BaseService._credentials\n\t}\n\n\tprotected get creds(): Credentials {\n\t\treturn BaseService._credentials\n\t}\n\n\t/**\n\t * The engine's base URL from wherever this code runs. In the browser a\n\t * configured proxy path wins, because the engine answers no CORS preflight.\n\t */\n\tprotected engineBase(): string {\n\t\tconst { apiUrl, proxyPath } = this.creds\n\t\tif (proxyPath && typeof window !== 'undefined' && window.location) {\n\t\t\treturn new URL(proxyPath, window.location.origin).href.replace(/\\/+$/, '')\n\t\t}\n\t\tconst url = (apiUrl ?? '').trim()\n\t\tif (!url) {\n\t\t\tthrow new GoCommerceError(\n\t\t\t\t'PUBLIC_GOCOMMERCE_API_URL is not set, so this storefront does not know where its commerce ' +\n\t\t\t\t\t'engine is. Point it at a running GoCommerce, e.g. http://127.0.0.1:8080.',\n\t\t\t\t0,\n\t\t\t)\n\t\t}\n\t\treturn url.replace(/\\/+$/, '')\n\t}\n\n\t/** An absolute engine URL for a path and query, without sending anything. */\n\tprotected engineURL(path: string, query?: Query): string {\n\t\treturn this.engineBase() + path + qs(query)\n\t}\n\n\t/**\n\t * One request to the engine, envelope and all.\n\t *\n\t * The body is read as text first, so a proxy's HTML error page is reported\n\t * as what it is rather than as a JSON parse error three frames away.\n\t */\n\tprotected async engine<T>(path: string, req: EngineRequest = {}): Promise<Envelope<T>> {\n\t\t// A language only means something on a read; a write's answer is a cart\n\t\t// or an order, whose lines keep the words they were bought under.\n\t\tconst lang = (req.method ?? 'GET') === 'GET' ? this.creds.language : undefined\n\t\tconst url = this.engineURL(path, lang ? { lang, ...req.query } : req.query)\n\t\tconst headers: Record<string, string> = { Accept: 'application/json', ...req.headers }\n\t\tif (req.body !== undefined) headers['Content-Type'] = 'application/json'\n\t\tif (this.creds.store) headers['X-Store'] = this.creds.store\n\t\tif (req.auth) {\n\t\t\tconst token = sessionToken()\n\t\t\tif (!token) throw new GoCommerceError('Please sign in to continue.', 401, 'unauthorized')\n\t\t\theaders.Authorization = `Bearer ${token}`\n\t\t}\n\n\t\tconst init: RequestInit = {\n\t\t\tmethod: req.method ?? 'GET',\n\t\t\theaders,\n\t\t\tbody: req.body === undefined ? undefined : JSON.stringify(req.body),\n\t\t}\n\t\tlet res: Response\n\t\ttry {\n\t\t\tres = await this._fetch.call(globalThis, url, init)\n\t\t} catch (cause) {\n\t\t\t// SvelteKit's server-side fetch applies the browser's CORS rule to a\n\t\t\t// universal load, and the engine sends no CORS headers. On the server\n\t\t\t// there is no browser to protect, so ask again with Node's own fetch;\n\t\t\t// in the browser the same call goes through PUBLIC_GOCOMMERCE_PROXY_PATH.\n\t\t\tif (typeof window === 'undefined' && /CORS/i.test(String((cause as Error)?.message))) {\n\t\t\t\ttry {\n\t\t\t\t\tres = await globalThis.fetch(url, init)\n\t\t\t\t} catch (again) {\n\t\t\t\t\tthrow unreachable(this.engineBase(), again)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow unreachable(this.engineBase(), cause)\n\t\t\t}\n\t\t}\n\t\treturn this.unwrap<T>(res)\n\t}\n\n\t/** The envelope opened: the payload, or the engine's error as a GoCommerceError. */\n\tprivate async unwrap<T>(res: Response): Promise<Envelope<T>> {\n\t\tconst text = await res.text()\n\t\tlet parsed: any = null\n\t\tif (text) {\n\t\t\ttry {\n\t\t\t\tparsed = JSON.parse(text)\n\t\t\t} catch {\n\t\t\t\tthrow new GoCommerceError(\n\t\t\t\t\t`The commerce engine answered ${res.status} with something that is not JSON: ${text.slice(0, 120)}`,\n\t\t\t\t\tres.status,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tif (!res.ok) {\n\t\t\tconst err = parsed?.error ?? {}\n\t\t\tthrow new GoCommerceError(\n\t\t\t\terr.message ?? `The commerce engine answered ${res.status}.`,\n\t\t\t\tres.status,\n\t\t\t\terr.code,\n\t\t\t\terr.details,\n\t\t\t)\n\t\t}\n\t\t// 204 is a success with nothing to say; the caller decides what that means.\n\t\treturn (parsed ?? { data: null }) as Envelope<T>\n\t}\n\n\t/** The bare payload, for the many callers that never look at `meta`. */\n\tprotected async data<T>(path: string, req: EngineRequest = {}): Promise<T> {\n\t\treturn (await this.engine<T>(path, req)).data\n\t}\n\n\t/**\n\t * Prices a cart at the signed-in shopper's customer-group prices. The\n\t * engine does this only for an account whose email is confirmed (403\n\t * otherwise), and the cart stays the shopper's either way — so a refusal\n\t * is not an error, and neither is a build without ext/identity.\n\t */\n\tprotected async claimCartForAccount(cartId: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.engine('/x/identity/me/carts', { method: 'POST', body: { cart_id: cartId }, auth: true })\n\t\t} catch {\n\t\t\t// Unconfirmed email, no identity module, or a cart already checked out.\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------ Litekart verbs\n\n\t/**\n\t * The family's path-addressed verbs. An absolute URL is fetched as-is; a\n\t * relative one is a Litekart REST path, answered from the storefront's own\n\t * data where it has some and refused otherwise (rest-guard.ts).\n\t */\n\tget<T = any>(path: string): Promise<T> {\n\t\treturn this.raw<T>('get', path)\n\t}\n\tpost<T = any>(path: string, data?: unknown): Promise<T> {\n\t\treturn this.raw<T>('post', path, data)\n\t}\n\tput<T = any>(path: string, data?: unknown): Promise<T> {\n\t\treturn this.raw<T>('put', path, data)\n\t}\n\tpatch<T = any>(path: string, data?: unknown): Promise<T> {\n\t\treturn this.raw<T>('patch', path, data)\n\t}\n\tdelete<T = any>(path: string): Promise<T> {\n\t\treturn this.raw<T>('delete', path)\n\t}\n\n\tprivate async raw<T>(method: string, path: string, data?: unknown): Promise<T> {\n\t\tif (!/^https?:\\/\\//i.test(path)) return (await resolveRestLocally(method, path)) as T\n\t\tconst res = await this._fetch.call(globalThis, path, {\n\t\t\tmethod: method.toUpperCase(),\n\t\t\theaders: { Accept: 'application/json', ...(data === undefined ? {} : { 'Content-Type': 'application/json' }) },\n\t\t\tbody: data === undefined ? undefined : JSON.stringify(data),\n\t\t})\n\t\tconst body = await res.json().catch(() => ({}))\n\t\tif (!res.ok)\n\t\t\tthrow new GoCommerceError(body?.error?.message ?? `Request failed with status ${res.status}`, res.status)\n\t\treturn body as T\n\t}\n}\n\n/** A refused connection is the commonest failure in development; it says which address did not answer. */\nconst unreachable = (base: string, cause: unknown) =>\n\tnew GoCommerceError(`Could not reach the commerce engine at ${base}: ${(cause as Error)?.message ?? cause}`, 0)\n\n/** `?a=1&b=2`, dropping what was not asked for. Arrays repeat the key. */\nexport function qs(query?: Query): string {\n\tif (!query) return ''\n\tconst sp = new URLSearchParams()\n\tfor (const [key, value] of Object.entries(query)) {\n\t\t// Undefined, null and '' are \"did not ask\", not \"asked for nothing\":\n\t\t// `?q=` would filter to the empty string.\n\t\tif (value === undefined || value === null || value === '') continue\n\t\tif (Array.isArray(value)) for (const v of value) sp.append(key, String(v))\n\t\telse sp.append(key, String(value))\n\t}\n\tconst s = sp.toString()\n\treturn s ? `?${s}` : ''\n}\n\n/** The family's list shape, from the engine's `{data, meta}`. Totals are the engine's, never invented. */\nexport function toPage<T, U>(env: Envelope<T[] | null>, map: (row: T) => U) {\n\tconst rows = env.data ?? []\n\tconst meta = env.meta\n\treturn {\n\t\tdata: rows.map(map),\n\t\tcount: meta?.total ?? rows.length,\n\t\tpageSize: meta?.limit ?? rows.length,\n\t\tnoOfPage: meta?.total_pages ?? 1,\n\t\tpage: meta?.page ?? 1,\n\t}\n}\n\nexport const emptyPage = <T = never>() => ({ data: [] as T[], count: 0, pageSize: 0, noOfPage: 0, page: 1 })\n","import { remember } from '../cache'\nimport type { Category, CheckoutOptions, Plugin } from '../engine'\nimport { BaseService } from './base.service'\n\n/**\n * Store-level questions several services ask, answered once a minute.\n *\n * Not exported from the package: it is plumbing the other services share.\n */\nexport class StoreFacts extends BaseService {\n\tprivate key(name: string) {\n\t\treturn `${this.engineBase()}|${this.creds.store ?? ''}|${name}`\n\t}\n\n\t/** Enabled plugins by key. A module that is not installed has no key here. */\n\tplugins(): Promise<Map<string, Plugin>> {\n\t\treturn remember(this.key('plugins'), async () => {\n\t\t\tconst list = (await this.data<Plugin[] | null>('/api/plugins')) ?? []\n\t\t\treturn new Map(list.map((p) => [p.key, p]))\n\t\t})\n\t}\n\n\tasync pluginOn(key: string): Promise<boolean> {\n\t\ttry {\n\t\t\treturn (await this.plugins()).has(key)\n\t\t} catch {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/** The store's settlement currency and default language. */\n\tready(): Promise<{ currency: string; language: string; version: string }> {\n\t\treturn remember(this.key('ready'), () => this.data('/health/ready'))\n\t}\n\n\tcheckoutOptions(): Promise<CheckoutOptions> {\n\t\treturn remember(this.key('checkout'), () => this.data<CheckoutOptions>('/api/checkout'))\n\t}\n\n\t/**\n\t * The whole tree, flat and depth-first. Past 500 categories the engine\n\t * answers a truncated list; the tree then serves what it has, and a\n\t * breadcrumb for a category outside it falls back to the category alone.\n\t */\n\tcategories(): Promise<Category[]> {\n\t\treturn remember(\n\t\t\tthis.key('categories'),\n\t\t\tasync () => (await this.data<Category[] | null>('/api/categories', { query: { flat: 1 } })) ?? [],\n\t\t)\n\t}\n\n\t/** Root → `slug`, by walking parents in the flat tree. */\n\tasync hierarchy(slug: string): Promise<{ name: string; slug: string }[]> {\n\t\tconst all = await this.categories().catch(() => [] as Category[])\n\t\tconst byId = new Map(all.map((c) => [c.id, c]))\n\t\tconst out: { name: string; slug: string }[] = []\n\t\tlet c = all.find((x) => x.slug === slug)\n\t\twhile (c) {\n\t\t\tout.unshift({ name: c.title, slug: c.slug })\n\t\t\tc = c.parent_id === null ? undefined : byId.get(c.parent_id)\n\t\t}\n\t\treturn out\n\t}\n\n\t/** `slug` and every category under it — what a category page sells. */\n\tasync subtree(slug: string): Promise<Category[]> {\n\t\tconst all = await this.categories()\n\t\tconst root = all.find((c) => c.slug === slug)\n\t\tif (!root) return []\n\t\tconst ids = new Set([root.id])\n\t\tconst out = [root]\n\t\t// Depth-first and flat, so a parent always precedes its children.\n\t\tfor (const c of all) {\n\t\t\tif (c.parent_id !== null && ids.has(c.parent_id) && !ids.has(c.id)) {\n\t\t\t\tids.add(c.id)\n\t\t\t\tout.push(c)\n\t\t\t}\n\t\t}\n\t\treturn out\n\t}\n}\n","import type { Category, Product, SearchResult } from '../engine'\nimport { fromSearchDoc, toProduct } from '../map'\nimport { toMinor } from '../money'\nimport { BaseService, toPage } from './base.service'\nimport { StoreFacts } from './facts'\n\nexport const PAGE_SIZE = 24\n\nexport type CatalogQuery = {\n\tpage?: number\n\tlimit?: number\n\tsearch?: string\n\t/** The family's sort spellings: `-createdAt`, `price`, `price:asc`, `updatedAt:desc`, `-popularity`… */\n\tsort?: string\n\t/** A category slug: the page sells it and everything under it. */\n\tcategory?: string\n\tpriceFrom?: number\n\tpriceTo?: number\n\t/**\n\t * Attribute answers, `{ color: ['Red', 'Blue'] }`: one handle's values OR-ed,\n\t * different handles AND-ed. The engine filters on them in the whole-shop\n\t * listing only — its category route takes none — so inside a category they\n\t * are not applied.\n\t */\n\tattributes?: Record<string, string[]>\n}\n\nexport type CatalogPage = {\n\tdata: ReturnType<typeof toProduct>[] | ReturnType<typeof fromSearchDoc>[]\n\tcount: number\n\tpageSize: number\n\tnoOfPage: number\n\tpage: number\n\tcategoryHierarchy: { name: string; slug: string }[]\n\t/** Whether the answer honoured `sort` and the price range, or had to drop them. */\n\tsorted: boolean\n}\n\n/**\n * The family's sort names, in the search index's terms. The engine's own\n * listing has one order — newest first — so anything else needs the index.\n * Popularity has no answer anywhere: the engine keeps no such score, and\n * inventing one would sort the shop into a plausible-looking lie.\n */\nfunction indexSort(sort?: string): string | undefined {\n\tif (!sort) return undefined\n\tconst s = sort.trim()\n\tconst [field, dir] = s.startsWith('-') ? [s.slice(1), 'desc'] : s.includes(':') ? s.split(':') : [s, 'asc']\n\tconst d = dir === 'desc' ? 'desc' : 'asc'\n\tswitch (field) {\n\t\tcase 'price':\n\t\t\treturn `price_minor:${d}`\n\t\tcase 'updatedAt':\n\t\tcase 'updated_at':\n\t\tcase 'createdAt':\n\t\tcase 'created_at':\n\t\t\treturn `updated_at:${d}`\n\t\tcase 'title':\n\t\tcase 'name':\n\t\t\treturn `title:${d}`\n\t\tdefault:\n\t\t\treturn undefined\n\t}\n}\n\n/** Newest first is the engine's own order, so these need no index. */\nconst NATURAL = new Set([\n\t'-createdAt',\n\t'createdAt:desc',\n\t'-updatedAt',\n\t'updatedAt:desc',\n\t'-popularity',\n\t'popularity:desc',\n])\n\nconst quote = (s: string) => `\"${s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`\n\n/**\n * One shelf of products, from whichever engine route can answer the question.\n *\n * - A category, no reordering: `GET /api/categories/{slug}`, which sells the\n * category and its descendants.\n * - A search or the whole shop, no reordering: `GET /api/products?q=`.\n * - Any sort but newest, or a price range: the Meilisearch module, when it is\n * installed and configured. Without it the shelf comes back in the engine's\n * order with `sorted: false`, rather than failing or pretending.\n */\nexport class CatalogService extends BaseService {\n\tprotected readonly facts = new StoreFacts(this._fetch)\n\n\tprotected async queryCatalog(q: CatalogQuery): Promise<CatalogPage> {\n\t\tconst page = Math.max(1, Number(q.page) || 1)\n\t\tconst limit = Math.min(100, Math.max(1, Number(q.limit) || PAGE_SIZE))\n\t\tconst search = q.search?.trim() || undefined\n\t\tconst wantsRange = Number.isFinite(q.priceFrom) || Number.isFinite(q.priceTo)\n\t\tconst sortKey = q.sort && !NATURAL.has(q.sort) ? indexSort(q.sort) : undefined\n\t\tconst hierarchy = q.category ? await this.facts.hierarchy(q.category) : []\n\n\t\tif ((sortKey || wantsRange) && (await this.facts.pluginOn('meilisearch'))) {\n\t\t\tconst filters: string[] = []\n\t\t\tif (q.category) {\n\t\t\t\tconst names = (await this.facts.subtree(q.category).catch(() => [] as Category[])).map((c) =>\n\t\t\t\t\tquote(c.full_name),\n\t\t\t\t)\n\t\t\t\t// A slug the tree does not know sells nothing — say so, don't widen to the shop.\n\t\t\t\tif (!names.length) return { ...emptyCatalog(limit), categoryHierarchy: hierarchy, sorted: true }\n\t\t\t\tfilters.push(`category IN [${names.join(', ')}]`)\n\t\t\t}\n\t\t\tif (wantsRange) {\n\t\t\t\tconst { currency } = await this.facts.ready()\n\t\t\t\tif (Number.isFinite(q.priceFrom)) filters.push(`price_minor >= ${toMinor(q.priceFrom as number, currency)}`)\n\t\t\t\tif (Number.isFinite(q.priceTo)) filters.push(`price_minor <= ${toMinor(q.priceTo as number, currency)}`)\n\t\t\t}\n\t\t\tconst res = await this.data<SearchResult>('/x/meilisearch/search', {\n\t\t\t\tquery: {\n\t\t\t\t\tq: search ?? '',\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset: (page - 1) * limit,\n\t\t\t\t\tfilter: filters.join(' AND ') || undefined,\n\t\t\t\t\tsort: sortKey,\n\t\t\t\t},\n\t\t\t})\n\t\t\tconst total = res.total ?? 0\n\t\t\treturn {\n\t\t\t\tdata: (res.hits ?? []).map(fromSearchDoc),\n\t\t\t\tcount: total,\n\t\t\t\tpageSize: limit,\n\t\t\t\tnoOfPage: Math.max(1, Math.ceil(total / limit)),\n\t\t\t\tpage,\n\t\t\t\tcategoryHierarchy: hierarchy,\n\t\t\t\tsorted: true,\n\t\t\t}\n\t\t}\n\n\t\tconst sorted = !sortKey && !wantsRange\n\t\tif (q.category && !search) {\n\t\t\tconst env = await this.engine<{ products: Product[] | null }>(\n\t\t\t\t`/api/categories/${encodeURIComponent(q.category)}`,\n\t\t\t\t{ query: { page, limit } },\n\t\t\t)\n\t\t\tconst products = env.data?.products ?? []\n\t\t\treturn {\n\t\t\t\t...toPage({ data: products, meta: env.meta }, (p: Product) => toProduct(p)),\n\t\t\t\tcategoryHierarchy: hierarchy,\n\t\t\t\tsorted,\n\t\t\t}\n\t\t}\n\t\t// A search inside a category, without the index, searches the whole shop:\n\t\t// the engine's category route takes no query and its search takes no\n\t\t// category, and filtering one page client-side would make the count a lie.\n\t\tconst attr = Object.entries(q.attributes ?? {}).flatMap(([handle, values]) =>\n\t\t\tvalues.filter(Boolean).map((v) => `${handle}:${v}`),\n\t\t)\n\t\tconst env = await this.engine<Product[] | null>('/api/products', {\n\t\t\tquery: { q: search, page, limit, channel: this.creds.channel, attr },\n\t\t})\n\t\treturn { ...toPage(env, (p: Product) => toProduct(p)), categoryHierarchy: hierarchy, sorted }\n\t}\n}\n\nexport function emptyCatalog(limit = PAGE_SIZE) {\n\treturn { data: [], count: 0, pageSize: limit, noOfPage: 0, page: 1 }\n}\n","import type { Product, ReviewPage } from '../engine'\nimport { GoCommerceError, NotSupportedError } from '../errors'\nimport { toProduct, toRating } from '../map'\nimport { currentMe } from '../browser'\nimport { CatalogService, PAGE_SIZE, type CatalogQuery } from './catalog'\n\n/**\n * Products: one by slug, and the shelves the homepage and listings draw.\n *\n * \"Featured\" and \"trending\" are curated rather than computed — the engine\n * keeps no sales or view counts to rank by. A collection with the slug\n * `featured` (or `trending`) is that shelf, so a merchant curates it in the\n * panel; without one, the shelf is the newest products, and says nothing more\n * about them than that.\n */\nexport class ProductService extends CatalogService {\n\t/**\n\t * A product page. `slug` may also be a numeric id or a variant SKU, which is\n\t * how an old link or a search hit sometimes arrives.\n\t *\n\t * Reviews ride along when ext/reviews is installed and switched on; a review\n\t * failure never costs the shopper the product page.\n\t */\n\tasync getOne(slug: string) {\n\t\tconst p = await this.findProduct(String(slug))\n\t\tconst product = toProduct(p, {\n\t\t\tcategoryHierarchy: p.category ? await this.facts.hierarchy(p.category.slug) : [],\n\t\t})\n\t\tif (await this.facts.pluginOn('product-reviews')) {\n\t\t\ttry {\n\t\t\t\tconst res = await this.data<ReviewPage>('/x/reviews', { query: { product_id: p.id, limit: 50 } })\n\t\t\t\tproduct.ratings = (res.reviews ?? []).map(toRating)\n\t\t\t\tproduct.rating = res.summary?.count ? res.summary.average : null\n\t\t\t\tproduct.ratingCount = res.summary?.count ?? 0\n\t\t\t\tproduct.reviewCount = res.summary?.count ?? 0\n\t\t\t} catch {\n\t\t\t\t// The page renders without stars rather than not at all.\n\t\t\t}\n\t\t}\n\t\treturn product\n\t}\n\n\tprivate async findProduct(slug: string): Promise<Product> {\n\t\ttry {\n\t\t\treturn await this.data<Product>(`/api/products/slug/${encodeURIComponent(slug)}`)\n\t\t} catch (err) {\n\t\t\tif (!(err instanceof GoCommerceError) || err.status !== 404) throw err\n\t\t\t// Not a slug. An id or a SKU is worth one more question each, and a\n\t\t\t// miss on all three is the product's 404, not theirs.\n\t\t\tconst fallback = /^\\d+$/.test(slug) ? `/api/products/${slug}` : `/api/products/sku/${encodeURIComponent(slug)}`\n\t\t\ttry {\n\t\t\t\treturn await this.data<Product>(fallback)\n\t\t\t} catch {\n\t\t\t\tthrow err\n\t\t\t}\n\t\t}\n\t}\n\n\t/** The shop's listing: `{ page, search, sort }`, newest first unless the index can reorder it. */\n\tasync list({\n\t\tpage = 1,\n\t\tsearch,\n\t\tq,\n\t\tsort,\n\t\tlimit,\n\t\tcategories,\n\t}: CatalogQuery & { q?: string; categories?: string } = {}) {\n\t\tconst res = await this.queryCatalog({ page, search: search ?? q, sort, limit, category: categories || undefined })\n\t\treturn { data: res.data, count: res.count, pageSize: res.pageSize, noOfPage: res.noOfPage, page: res.page }\n\t}\n\n\tasync listFeaturedProducts({ page = 1, sort, limit }: { page?: number; sort?: string; limit?: number } = {}) {\n\t\treturn this.shelf('featured', { page, sort, limit })\n\t}\n\n\tasync listTrendingProducts({ page = 1, limit }: { page?: number; limit?: number } = {}) {\n\t\treturn this.shelf('trending', { page, limit })\n\t}\n\n\t/** More from this product's category. */\n\tasync listRelatedProducts({\n\t\tpage = 1,\n\t\tcategoryId,\n\t\tlimit,\n\t}: { page?: number; categoryId?: string; limit?: number } = {}) {\n\t\tif (!categoryId) return this.list({ page, limit })\n\t\tconst category = (await this.facts.categories()).find((c) => String(c.id) === String(categoryId))\n\t\tif (!category) return this.list({ page, limit })\n\t\treturn this.list({ page, limit, categories: category.slug })\n\t}\n\n\tprivate async shelf(slug: string, { page, sort, limit }: { page: number; sort?: string; limit?: number }) {\n\t\tconst size = Math.min(100, Math.max(1, Number(limit) || PAGE_SIZE))\n\t\ttry {\n\t\t\tconst env = await this.engine<{ products: Product[] | null }>(`/api/collections/${slug}`, {\n\t\t\t\tquery: { page, limit: size },\n\t\t\t})\n\t\t\tconst rows = env.data?.products ?? []\n\t\t\treturn {\n\t\t\t\tdata: rows.map((p) => toProduct(p)),\n\t\t\t\tcount: env.meta?.total ?? rows.length,\n\t\t\t\tpageSize: env.meta?.limit ?? size,\n\t\t\t\tnoOfPage: env.meta?.total_pages ?? 1,\n\t\t\t\tpage: env.meta?.page ?? page,\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tif (!(err instanceof GoCommerceError) || err.status !== 404) throw err\n\t\t\treturn this.list({ page, sort, limit: size })\n\t\t}\n\t}\n\n\t/**\n\t * A review, through ext/reviews. The engine asks for a name and an email\n\t * with every review, so a signed-out shopper is asked to sign in rather\n\t * than having one made up for them. Uploaded photos have nowhere to go: the\n\t * module stores text.\n\t */\n\tasync addReview({\n\t\tproductId,\n\t\trating,\n\t\treview,\n\t\ttitle,\n\t}: {\n\t\tproductId: string\n\t\tvariantId?: string\n\t\trating: number\n\t\treview: string\n\t\ttitle?: string\n\t}) {\n\t\tconst me = currentMe()\n\t\tif (!me?.email) throw new GoCommerceError('Please sign in to write a review.', 401, 'unauthorized')\n\t\tconst name = [me.firstName, me.lastName].filter(Boolean).join(' ') || me.email.split('@')[0]\n\t\treturn this.data<{ status: string; verified: boolean }>('/x/reviews', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: {\n\t\t\t\tproduct_id: Number(productId),\n\t\t\t\tname,\n\t\t\t\temail: me.email,\n\t\t\t\trating: Math.round(Number(rating)),\n\t\t\t\t...(title ? { title } : {}),\n\t\t\t\tbody: String(review ?? ''),\n\t\t\t},\n\t\t})\n\t}\n\n\tasync fetchReels(): Promise<never> {\n\t\tthrow new NotSupportedError('ProductService', 'fetchReels', 'the engine has no reels')\n\t}\n}\n\nexport const productService = new ProductService()\n","import { CatalogService } from './catalog'\n\nconst num = (v: string | null): number | undefined => {\n\tif (v === null || v.trim() === '') return undefined\n\tconst n = Number(v)\n\treturn Number.isFinite(n) ? n : undefined\n}\n\n/** `?attributes.color=Red,Blue` — the storefront's facet params — as `{ color: ['Red', 'Blue'] }`. */\nfunction attributesFrom(p: URLSearchParams): Record<string, string[]> | undefined {\n\tconst out: Record<string, string[]> = {}\n\tfor (const [key, value] of p) {\n\t\tif (!key.startsWith('attributes.')) continue\n\t\tconst handle = key.slice('attributes.'.length)\n\t\tconst values = value\n\t\t\t.split(',')\n\t\t\t.map((v) => decodeURIComponent(v).trim())\n\t\t\t.filter(Boolean)\n\t\tif (handle && values.length) out[handle] = [...(out[handle] ?? []), ...values]\n\t}\n\treturn Object.keys(out).length ? out : undefined\n}\n\n/**\n * The listing pages' search: `/products?search=&sort=&page=` and the category\n * catch-all `/{slug}`.\n *\n * Facets are empty. The engine's search route returns hits and a total, not\n * distributions, and a facet list made from one page of hits would count that\n * page, not the shop. An empty `priceStat` hides the price slider rather than\n * drawing one with a made-up range.\n */\nexport class SearchService extends CatalogService {\n\temptyResult() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\tcount: 0,\n\t\t\ttotalPages: 0,\n\t\t\tcategoryHierarchy: [] as { name: string; slug: string }[],\n\t\t\tfacets: { priceStat: {}, categories: [], tags: [], allFilters: {} },\n\t\t}\n\t}\n\n\tasync searchWithUrl(url: URL | string, slug?: string) {\n\t\ttry {\n\t\t\tconst u = typeof url === 'string' ? new URL(url, 'http://localhost') : url\n\t\t\tconst p = u.searchParams\n\t\t\t// `?price=10,50` is the chip form; priceFrom/priceTo the slider's.\n\t\t\tconst [from, to] = (p.get('price') ?? '').split(/[,-]/)\n\t\t\tconst res = await this.queryCatalog({\n\t\t\t\tpage: num(p.get('page')),\n\t\t\t\tsearch: p.get('search') ?? p.get('q') ?? undefined,\n\t\t\t\tsort: p.get('sort') ?? undefined,\n\t\t\t\tcategory: slug || p.get('categories')?.split(',')[0] || undefined,\n\t\t\t\tpriceFrom: num(p.get('priceFrom')) ?? num(from ?? null),\n\t\t\t\tpriceTo: num(p.get('priceTo')) ?? num(to ?? null),\n\t\t\t\tattributes: attributesFrom(p),\n\t\t\t})\n\t\t\treturn {\n\t\t\t\tdata: res.data,\n\t\t\t\tcount: res.count,\n\t\t\t\ttotalPages: res.noOfPage,\n\t\t\t\tpage: res.page,\n\t\t\t\tcategoryHierarchy: res.categoryHierarchy,\n\t\t\t\tfacets: { priceStat: {}, categories: [], tags: [], allFilters: {} },\n\t\t\t}\n\t\t} catch (err) {\n\t\t\t// A missing category is an empty result — the route turns that into\n\t\t\t// its 404 — but an engine that cannot be reached is not, and says so.\n\t\t\tif ((err as { status?: number })?.status === 404) return this.emptyResult()\n\t\t\tthrow err\n\t\t}\n\t}\n}\n\nexport const searchService = new SearchService()\n","import type { Product, SearchResult } from '../engine'\nimport { fromSearchDoc, toProduct } from '../map'\nimport { CatalogService } from './catalog'\n\n/**\n * The two places the storefront asks for raw search hits: \"more from this\n * category\" on a product page, and the header's type-ahead.\n *\n * Both go through ext/search-meilisearch when it is installed, and through the\n * engine's own listing when it is not — a type-ahead backed by a LIKE query is\n * slower and unranked, but it is not empty.\n */\nexport class MeilisearchService extends CatalogService {\n\t/** `{ query, categories, page }` → a Meilisearch-shaped answer: `hits`, `totalHits`, `totalPages`. */\n\tasync search({\n\t\tquery,\n\t\tsearch,\n\t\tcategories,\n\t\tpage = 1,\n\t\tlimit,\n\t}: { query?: string; search?: string; categories?: string; page?: number; limit?: number } = {}) {\n\t\tconst res = await this.queryCatalog({ page, limit, search: query ?? search, category: categories || undefined })\n\t\treturn {\n\t\t\thits: res.data,\n\t\t\ttotalHits: res.count,\n\t\t\testimatedTotalHits: res.count,\n\t\t\ttotalPages: res.noOfPage,\n\t\t\tpage: res.page,\n\t\t\tcategories: res.categoryHierarchy,\n\t\t\tfacetDistribution: {},\n\t\t}\n\t}\n\n\t/** The header's type-ahead: `{ data: [{ slug, title, thumbnail, price }] }`. */\n\tasync searchAutoComplete({ query, search, limit = 8 }: { query?: string; search?: string; limit?: number } = {}) {\n\t\tconst q = (query ?? search ?? '').trim()\n\t\tif (!q) return { data: [] }\n\t\tif (await this.facts.pluginOn('meilisearch')) {\n\t\t\tconst res = await this.data<SearchResult>('/x/meilisearch/search', { query: { q, limit } })\n\t\t\treturn { data: (res.hits ?? []).map(fromSearchDoc) }\n\t\t}\n\t\tconst rows =\n\t\t\t(await this.data<Product[] | null>('/api/products', { query: { q, limit, channel: this.creds.channel } })) ?? []\n\t\treturn { data: rows.map((p) => toProduct(p)) }\n\t}\n}\n\nexport const meilisearchService = new MeilisearchService()\n","import type { Category } from '../engine'\nimport { toCategory } from '../map'\nimport { BaseService } from './base.service'\nimport { StoreFacts } from './facts'\n\nconst asList = (rows: ReturnType<typeof toCategory>[]) => ({\n\tdata: rows,\n\tcount: rows.length,\n\tpageSize: rows.length,\n\tnoOfPage: 1,\n\tpage: 1,\n})\n\n/**\n * The category tree. The engine has no \"featured\" flag on a category, so the\n * featured row is the top level of the tree, in the merchant's order — which\n * is what a shop's first row of category tiles usually is anyway.\n */\nexport class CategoryService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\n\t/** Every category, flat, each naming its parent. The storefront builds the tree. */\n\tasync fetchAllCategories(_args: Record<string, unknown> = {}) {\n\t\tconst all = await this.facts.categories()\n\t\treturn asList(all.map(flat))\n\t}\n\n\tasync fetchFeaturedCategories({ limit = 18 }: { limit?: number } = {}) {\n\t\tconst roots = (await this.facts.categories()).filter((c) => c.parent_id === null)\n\t\treturn asList(roots.slice(0, Math.max(0, Number(limit) || 18)).map(flat))\n\t}\n\n\tasync fetchFooterCategories(args: { limit?: number } = {}) {\n\t\treturn this.fetchFeaturedCategories(args)\n\t}\n\n\t/** The nested tree, roots first. */\n\tasync getMegamenu(_args: Record<string, unknown> = {}) {\n\t\tconst tree = (await this.data<Category[] | null>('/api/categories')) ?? []\n\t\treturn tree.map(toCategory)\n\t}\n\n\tasync fetchCategory(slug: string) {\n\t\tconst c = await this.data<Category>(`/api/categories/${encodeURIComponent(slug)}`, { query: { limit: 1 } })\n\t\treturn toCategory(c)\n\t}\n\n\t/**\n\t * kitcommerce-core's category filter asks for `/api/categories/all` by path,\n\t * through the family's raw `get`. That is a Litekart path the rest-guard\n\t * would swallow, so it is answered here, from the engine's tree.\n\t */\n\toverride async get<T = any>(path: string): Promise<T> {\n\t\tif (path.split('?')[0] === '/api/categories/all') return (await this.fetchAllCategories()) as T\n\t\treturn super.get<T>(path)\n\t}\n}\n\n/** One row of the flat tree: no `children`, so the storefront's builder is the only one. */\nconst flat = (c: Category) => ({ ...toCategory(c), children: [] })\n\nexport const categoryService = new CategoryService()\n","import type { Collection, Product } from '../engine'\nimport { toCollection, toProduct } from '../map'\nimport { BaseService, toPage } from './base.service'\n\n/** Curated lists. Only collections holding at least one product on sale are listed. */\nexport class CollectionService extends BaseService {\n\tasync list({ page = 1, limit = 24 }: { page?: number; limit?: number; sort?: string; q?: string } = {}) {\n\t\tconst env = await this.engine<Collection[] | null>('/api/collections', { query: { page, limit } })\n\t\treturn toPage(env, toCollection)\n\t}\n\n\t/** A collection page: the collection, and its products in the merchant's order. */\n\tasync getOne(slug: string, { page = 1, limit = 48 }: { page?: number; limit?: number } = {}) {\n\t\tconst env = await this.engine<Collection & { products: Product[] | null }>(\n\t\t\t`/api/collections/${encodeURIComponent(slug)}`,\n\t\t\t{ query: { page, limit } },\n\t\t)\n\t\tconst products = (env.data.products ?? []).map((p) => toProduct(p))\n\t\treturn {\n\t\t\t...toCollection(env.data),\n\t\t\tproducts,\n\t\t\t// The family's shape for a collection's members.\n\t\t\tcollectionvalues: products.map((p) => ({ products: p })),\n\t\t\tcount: env.meta?.total ?? products.length,\n\t\t\tnoOfPage: env.meta?.total_pages ?? 1,\n\t\t\tpage: env.meta?.page ?? page,\n\t\t}\n\t}\n\n\t/** Collection-level ratings are a Litekart aggregate; the engine has none to report. */\n\tasync getAllRatings() {\n\t\treturn { data: [] as unknown[] }\n\t}\n}\n\nexport const collectionService = new CollectionService()\n","import type { AppliedDiscount, Cart, CartLine, Product } from '../engine'\nimport { GoCommerceError, NotSupportedError } from '../errors'\nimport { emptyCart, toCart } from '../map'\nimport { remember } from '../cache'\nimport {\n\tcartExtras,\n\tforgetCartExtras,\n\trememberCartId,\n\tsaveCartExtras,\n\tsessionToken,\n\tstoredCartId,\n\ttype StorefrontAddress,\n} from '../browser'\nimport { BaseService } from './base.service'\nimport { StoreFacts } from './facts'\n\n/** The storefront's \"take this line out\" sentinel, sent when − is pressed on a quantity of one. */\nconst REMOVE = -9999999\n\n/**\n * The bag.\n *\n * The engine's cart is addressed by an opaque token it mints, held by the\n * storefront in `localStorage.cart_id`. It keeps lines and an email; the\n * coupon, the address and the delivery choice the storefront collects before\n * checkout are kept beside it in the browser (browser.ts) and sent with the\n * checkout request, which is the only place the engine takes them.\n *\n * Every method answers the whole cart, as the storefront assigns it whole.\n */\nexport class CartService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\n\tasync getCartByCartId(cartId?: string | null) {\n\t\tconst id = clean(cartId)\n\t\tif (!id) return emptyCart(await this.currency())\n\t\ttry {\n\t\t\treturn await this.present(await this.data<Cart>(`/api/carts/${encodeURIComponent(id)}`))\n\t\t} catch (err) {\n\t\t\t// A cart expires after a month untouched. A shopper coming back to a\n\t\t\t// dead token sees an empty bag, not an error.\n\t\t\tif (err instanceof GoCommerceError && err.status === 404) return emptyCart(await this.currency())\n\t\t\tthrow err\n\t\t}\n\t}\n\n\tasync fetchCartData(cartId?: string | null) {\n\t\treturn this.getCartByCartId(cartId ?? storedCartId())\n\t}\n\n\t/**\n\t * The cart after an order: the engine marks it `converted` and keeps its\n\t * lines, and this answers it with none — which is how the storefront knows\n\t * to clear the bag on the success page.\n\t */\n\tasync refereshCart() {\n\t\tconst id = storedCartId()\n\t\tconst cart = await this.getCartByCartId(id)\n\t\tif (id && (cart as { status?: string }).status === 'converted') forgetCartExtras(id)\n\t\treturn cart\n\t}\n\n\t/**\n\t * `qty` is a change, not a total: +1 from a product page, −1 from a card's\n\t * minus button. With no cart yet, one is opened and remembered.\n\t */\n\tasync addToCart({\n\t\tcartId,\n\t\tlineId,\n\t\tqty = 1,\n\t\tvariantId,\n\t}: {\n\t\tcartId?: string | null\n\t\tlineId?: string | null\n\t\tqty?: number\n\t\tproductId?: string\n\t\tvariantId?: string\n\t}) {\n\t\tlet id = clean(cartId) ?? storedCartId()\n\t\tif (lineId && id) {\n\t\t\tconst cart = await this.data<Cart>(`/api/carts/${encodeURIComponent(id)}`)\n\t\t\tconst line = (cart.line_items ?? []).find((l) => String(l.id) === String(lineId))\n\t\t\tif (line) {\n\t\t\t\tconst next = qty === REMOVE ? 0 : line.quantity + Number(qty)\n\t\t\t\treturn this.setQuantity(id, line.id, next)\n\t\t\t}\n\t\t}\n\t\tif (qty === REMOVE || Number(qty) <= 0) return this.getCartByCartId(id)\n\t\tif (!variantId) throw new GoCommerceError('Please choose an option before adding this to your bag.', 400)\n\t\tif (!id) id = await this.open()\n\t\ttry {\n\t\t\treturn await this.present(\n\t\t\t\tawait this.data<Cart>(`/api/carts/${encodeURIComponent(id)}/line-items`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: { variant_id: Number(variantId), quantity: Number(qty) },\n\t\t\t\t}),\n\t\t\t)\n\t\t} catch (err) {\n\t\t\t// The remembered cart was checked out in another tab, or expired.\n\t\t\t// Start a new one rather than refusing the shopper's click.\n\t\t\tif (err instanceof GoCommerceError && (err.status === 404 || /checked out/.test(err.message))) {\n\t\t\t\tconst fresh = await this.open()\n\t\t\t\treturn this.present(\n\t\t\t\t\tawait this.data<Cart>(`/api/carts/${encodeURIComponent(fresh)}/line-items`, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\tbody: { variant_id: Number(variantId), quantity: Number(qty) },\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tthrow err\n\t\t}\n\t}\n\n\t/** `qty` is the new total; 0 takes the line out. */\n\tasync updateCart({\n\t\tcartId,\n\t\tlineId,\n\t\tqty,\n\t}: {\n\t\tcartId?: string\n\t\tlineId: string\n\t\tqty: number\n\t\tisSelectedForCheckout?: boolean\n\t}) {\n\t\tconst id = clean(cartId) ?? storedCartId()\n\t\tif (!id) return emptyCart(await this.currency())\n\t\treturn this.setQuantity(id, lineId, Number(qty))\n\t}\n\n\tasync removeCart({ cartId, lineId }: { cartId?: string; lineId: string }) {\n\t\tconst id = clean(cartId) ?? storedCartId()\n\t\tif (!id) return emptyCart(await this.currency())\n\t\treturn this.present(\n\t\t\tawait this.data<Cart>(`/api/carts/${encodeURIComponent(id)}/line-items/${encodeURIComponent(String(lineId))}`, {\n\t\t\t\tmethod: 'DELETE',\n\t\t\t}),\n\t\t)\n\t}\n\n\t/**\n\t * Contact details and addresses, from the checkout's address step. The\n\t * email goes to the engine — it is how an abandoned cart is followed up —\n\t * and the rest is kept for the checkout request.\n\t */\n\tasync updateCart2(args: {\n\t\tcartId?: string\n\t\temail?: string\n\t\tphone?: string\n\t\tshippingAddress?: StorefrontAddress | null\n\t\tbillingAddress?: StorefrontAddress | null\n\t\tisBillingAddressSameAsShipping?: boolean\n\t}) {\n\t\tconst id = clean(args.cartId) ?? storedCartId()\n\t\tif (!id) return emptyCart(await this.currency())\n\n\t\tconst patch: Parameters<typeof saveCartExtras>[1] = {}\n\t\tif (args.phone !== undefined) patch.phone = args.phone || undefined\n\t\tif (args.shippingAddress !== undefined) {\n\t\t\tpatch.shippingAddress = args.shippingAddress\n\t\t\tif (args.shippingAddress?.phone && !patch.phone) patch.phone = String(args.shippingAddress.phone)\n\t\t}\n\t\tif (args.billingAddress !== undefined || args.isBillingAddressSameAsShipping) {\n\t\t\tpatch.billingAddress = args.isBillingAddressSameAsShipping ? null : (args.billingAddress ?? null)\n\t\t}\n\t\t// A new destination may not be served by the rate chosen for the old one.\n\t\tconst before = cartExtras(id)\n\t\tconst country = (a?: StorefrontAddress | null) => String(a?.countryCode || a?.country || '').toUpperCase()\n\t\tif (args.shippingAddress !== undefined && country(args.shippingAddress) !== country(before.shippingAddress)) {\n\t\t\tpatch.shippingRateId = null\n\t\t\tpatch.shippingRate = null\n\t\t}\n\t\tsaveCartExtras(id, patch)\n\n\t\tconst email = args.email ?? (args.shippingAddress?.email ? String(args.shippingAddress.email) : undefined)\n\t\tif (email !== undefined) {\n\t\t\treturn this.present(\n\t\t\t\tawait this.data<Cart>(`/api/carts/${encodeURIComponent(id)}/email`, { method: 'PUT', body: { email } }),\n\t\t\t)\n\t\t}\n\t\treturn this.getCartByCartId(id)\n\t}\n\n\t/**\n\t * A discount code. The engine prices it against the basket now and decides\n\t * it again at checkout; what it answers is kept so the bag can show it,\n\t * because the cart itself does not carry the code.\n\t */\n\tasync applyCoupon({ cartId, couponCode }: { cartId?: string; couponCode: string }) {\n\t\tconst id = clean(cartId) ?? storedCartId()\n\t\tif (!id) throw new GoCommerceError('Add something to your bag before applying a code.', 400)\n\t\tconst cart = await this.data<Cart>(`/api/carts/${encodeURIComponent(id)}`)\n\t\tconst discount = await this.data<AppliedDiscount>(`/api/carts/${encodeURIComponent(id)}/discount`, {\n\t\t\tmethod: 'PUT',\n\t\t\tbody: { code: String(couponCode ?? '').trim(), ...(cart.email ? { email: cart.email } : {}) },\n\t\t})\n\t\tsaveCartExtras(id, { discount: { ...discount, code: discount.code || String(couponCode).trim() } })\n\t\treturn this.present(cart)\n\t}\n\n\tasync removeCoupon(cartId?: string) {\n\t\tconst id = clean(cartId) ?? storedCartId()\n\t\tif (!id) return emptyCart(await this.currency())\n\t\tawait this.engine(`/api/carts/${encodeURIComponent(id)}/discount`, { method: 'DELETE' })\n\t\tsaveCartExtras(id, { discount: null })\n\t\treturn this.getCartByCartId(id)\n\t}\n\n\t/** The delivery option the shopper picked, priced from the engine's own quote. */\n\tasync updateShippingRate({ cartId, shippingRateId }: { cartId?: string; shippingRateId: string }) {\n\t\tconst id = clean(cartId) ?? storedCartId()\n\t\tif (!id) return emptyCart(await this.currency())\n\t\tconst ship = cartExtras(id).shippingAddress\n\t\tconst country = String(ship?.countryCode || ship?.country || '').toUpperCase()\n\t\tif (!country) throw new GoCommerceError('Add a delivery address first.', 400)\n\t\tconst quote = await this.data<{\n\t\t\trates: { rate_id: number; name: string; price: { amount_minor: number; currency: string } }[] | null\n\t\t\tcurrency: string\n\t\t}>('/api/checkout/rates', { query: { cart: id, country, state: ship?.state ? String(ship.state) : undefined } })\n\t\tconst rate = (quote.rates ?? []).find((r) => String(r.rate_id) === String(shippingRateId))\n\t\tif (!rate) throw new GoCommerceError('That delivery option is not available for this address any more.', 409)\n\t\tsaveCartExtras(id, {\n\t\t\tshippingRateId: String(rate.rate_id),\n\t\t\tshippingRate: {\n\t\t\t\tid: String(rate.rate_id),\n\t\t\t\tname: rate.name,\n\t\t\t\tminor: rate.price.amount_minor,\n\t\t\t\tcurrency: rate.price.currency,\n\t\t\t},\n\t\t})\n\t\treturn this.getCartByCartId(id)\n\t}\n\n\t/** The payment method is chosen at checkout, by which checkout route is called. */\n\tasync updateCartPaymentMethod({ cartId }: { cartId?: string; paymentMethod?: string }) {\n\t\treturn this.getCartByCartId(clean(cartId) ?? storedCartId())\n\t}\n\n\tasync completeCart(): Promise<never> {\n\t\tthrow new NotSupportedError('CartService', 'completeCart', 'an order is placed through checkoutService')\n\t}\n\n\t// ------------------------------------------------------------ internals\n\n\tprivate async setQuantity(cartId: string, lineId: string | number, qty: number) {\n\t\tconst path = `/api/carts/${encodeURIComponent(cartId)}/line-items/${encodeURIComponent(String(lineId))}`\n\t\t// Zero is a removal: the engine accepts it on PATCH, and DELETE says it plainly.\n\t\tif (qty <= 0) return this.present(await this.data<Cart>(path, { method: 'DELETE' }))\n\t\treturn this.present(await this.data<Cart>(path, { method: 'PATCH', body: { quantity: qty } }))\n\t}\n\n\t/** A new cart, remembered — and priced for the signed-in shopper's group when the engine allows it. */\n\tprivate async open(): Promise<string> {\n\t\tconst channel = this.creds.channel\n\t\tconst cart = await this.data<Cart>('/api/carts', { method: 'POST', ...(channel ? { body: { channel } } : {}) })\n\t\trememberCartId(cart.id)\n\t\tif (sessionToken()) await this.claimCartForAccount(cart.id)\n\t\treturn cart.id\n\t}\n\n\tprivate async currency(): Promise<string> {\n\t\ttry {\n\t\t\treturn (await this.facts.ready()).currency\n\t\t} catch {\n\t\t\treturn 'USD'\n\t\t}\n\t}\n\n\t/** The engine's cart with the browser-held extras and each line's picture and link. */\n\tprivate async present(cart: Cart) {\n\t\tconst ids = [...new Set((cart.line_items ?? []).map((l) => l.product_id))]\n\t\tconst products = new Map<number, Product | null>()\n\t\tawait Promise.all(\n\t\t\tids.map(async (pid) => {\n\t\t\t\tproducts.set(pid, await this.productFor(pid))\n\t\t\t}),\n\t\t)\n\t\treturn toCart(cart, cartExtras(cart.id), (l: CartLine) => {\n\t\t\tconst p = products.get(l.product_id)\n\t\t\tif (!p) return {}\n\t\t\tconst v = (p.variants ?? []).find((x) => x.id === l.variant_id)\n\t\t\treturn { slug: p.slug, thumbnail: v?.image?.url ?? p.image_url ?? null }\n\t\t})\n\t}\n\n\tprivate productFor(id: number): Promise<Product | null> {\n\t\treturn remember(`${this.engineBase()}|product|${id}`, () =>\n\t\t\tthis.data<Product>(`/api/products/${id}`).catch(() => null),\n\t\t)\n\t}\n}\n\nconst clean = (id?: string | null): string | null => (id && id !== 'undefined' && id !== 'null' ? id : null)\n\nexport const cartService = new CartService()\n","import type { Cart, CheckoutResult } from '../engine'\nimport { GoCommerceError, NotSupportedError } from '../errors'\nimport { toEngineAddress, toOrder } from '../map'\nimport { minorToMajor } from '../money'\nimport {\n\tcartExtras,\n\tplacedOrderByReference,\n\trememberOrder,\n\tsaveCartExtras,\n\tsessionToken,\n\tstoredCartId,\n} from '../browser'\nimport { BaseService } from './base.service'\n\n/**\n * Placing an order.\n *\n * The engine turns a cart into an order in one call, `POST /api/checkout/{code}`,\n * and that call is the only thing that moves stock and asks for money. It takes\n * the address, phone and delivery choice in its body — the cart keeps none of\n * them — so they are read back from what the address step stored (browser.ts).\n *\n * Payment is confirmed by the gateway's webhook to the engine, never by the\n * storefront. So the \"capture\" calls the storefront makes after a gateway's\n * modal closes do not capture anything: they hand back the order number, and\n * the order page shows `payment_status` once the webhook has landed.\n */\nexport class CheckoutService extends BaseService {\n\t/** Delivery options for the address on the cart: `{ data: [{ id, name, base_rate }] }`. */\n\tasync getShippingRates({ cartId }: { cartId?: string } = {}) {\n\t\tconst id = cartId || storedCartId()\n\t\tconst ship = id ? cartExtras(id).shippingAddress : null\n\t\tconst country = String(ship?.countryCode || ship?.country || '').toUpperCase()\n\t\tif (!id || !country) return { data: [] }\n\t\tconst quote = await this.data<{\n\t\t\trates: { rate_id: number; name: string; price: { amount_minor: number; currency: string } }[] | null\n\t\t\tcurrency: string\n\t\t}>('/api/checkout/rates', { query: { cart: id, country, state: ship?.state ? String(ship.state) : undefined } })\n\t\treturn {\n\t\t\tdata: (quote.rates ?? []).map((r) => ({\n\t\t\t\tid: String(r.rate_id),\n\t\t\t\tname: r.name,\n\t\t\t\tdescription: null,\n\t\t\t\tbase_rate: minorToMajor(r.price.amount_minor, r.price.currency),\n\t\t\t\tprice: minorToMajor(r.price.amount_minor, r.price.currency),\n\t\t\t\tcurrencyCode: r.price.currency,\n\t\t\t\t// The engine's rates carry no delivery estimate; none is made up.\n\t\t\t\testimated_min_days: null,\n\t\t\t\testimated_max_days: null,\n\t\t\t})),\n\t\t}\n\t}\n\n\t/** Cash on delivery: the order is confirmed at once and paid on the doorstep. */\n\tasync checkoutCOD({ cartId }: { cartId?: string; origin?: string } = {}) {\n\t\tconst result = await this.place('cod', cartId)\n\t\treturn {\n\t\t\torder_no: result.order.number,\n\t\t\torderNo: result.order.number,\n\t\t\tid: String(result.order.id),\n\t\t\tstatus: result.order.status,\n\t\t}\n\t}\n\n\t/**\n\t * Razorpay's modal. The engine has already created the Razorpay order; this\n\t * hands the storefront what the modal needs. A store running Razorpay's\n\t * hosted (redirect) mode cannot be driven from this storefront's modal flow,\n\t * and says so rather than opening a modal on an order it cannot pay.\n\t */\n\tasync checkoutRazorpay({ cartId }: { cartId?: string; origin?: string } = {}) {\n\t\tconst result = await this.place('razorpay', cartId)\n\t\tconst data = result.payment.client_data ?? {}\n\t\tif (result.payment.kind !== 'client_action' || !data.razorpay_order_id) {\n\t\t\tthrow new GoCommerceError(\n\t\t\t\t'This store takes Razorpay payments on Razorpay’s own page, which this storefront does not support yet.',\n\t\t\t\t0,\n\t\t\t)\n\t\t}\n\t\treturn {\n\t\t\torder_no: result.order.number,\n\t\t\tid: data.razorpay_order_id,\n\t\t\tkey_id: data.key_id,\n\t\t\tamount: Number(data.amount),\n\t\t\tcurrency: data.currency,\n\t\t}\n\t}\n\n\t/** The modal closed with a payment. The engine learns of it from Razorpay itself. */\n\tasync captureRazorpayPayment({ razorpay_order_id }: { razorpay_order_id: string; razorpay_payment_id?: string }) {\n\t\tconst order = placedOrderByReference(razorpay_order_id)\n\t\tif (!order) throw new GoCommerceError('That payment does not belong to an order placed from this browser.', 404)\n\t\treturn { order_no: order.number, status: 'processing' }\n\t}\n\n\t// The family's other gateway flows. GoCommerce's Stripe is a Payment\n\t// Element (a client secret, not a hosted page) — `checkout('stripe')` returns\n\t// that secret for a storefront that mounts the element. Cashfree, PhonePe and\n\t// Affirm are not engine gateways at all. paymentMethodService never offers\n\t// these codes, so they are reached only by a storefront that hard-codes one.\n\tasync checkoutStripe(): Promise<never> {\n\t\tthrow unsupported(\n\t\t\t'checkoutStripe',\n\t\t\t'GoCommerce’s Stripe gateway uses the Payment Element, not a hosted checkout page',\n\t\t)\n\t}\n\tasync checkoutStripeCapture(): Promise<never> {\n\t\tthrow unsupported('checkoutStripeCapture', 'Stripe confirms payments to the engine by webhook')\n\t}\n\t/**\n\t * The storefront's generic redirect flow, which it reaches through the code\n\t * `PAYPAL`. The engine has no PayPal gateway; paymentMethodService puts the\n\t * store's first hosted-page gateway — Adyen, Paddle, Lemon Squeezy, Creem,\n\t * Hyperswitch or RevenueCat — under that code, with its own name and a\n\t * neutral icon, because this is the one storefront flow that sends a shopper\n\t * to a URL and back. The shopper returns to the success page; the gateway's\n\t * webhook tells the engine the order is paid.\n\t */\n\tasync checkoutPaypal({ cartId, origin }: { cartId?: string; origin?: string; return_url?: string } = {}) {\n\t\tconst gateway = await this.redirectGateway()\n\t\tif (!gateway) throw unsupported('checkoutPaypal', 'this store has no hosted-page payment gateway switched on')\n\t\tconst id = cartId || storedCartId() || ''\n\t\tconst back = origin ? `${origin.replace(/\\/+$/, '')}/checkout/success?cart_id=${encodeURIComponent(id)}` : undefined\n\t\tconst result = await this.place(gateway, id, back ? { return_url: back } : {})\n\t\tconst url = result.payment.client_data?.url\n\t\tif (!url) throw new GoCommerceError('The payment page did not open. Please try again.', 502)\n\t\treturn { redirect_url: url, order_no: result.order.number }\n\t}\n\n\t/**\n\t * Nothing to capture: a hosted-page gateway confirms the payment to the\n\t * engine by webhook. Answering, rather than throwing, sends the storefront's\n\t * process page on to the success page instead of the failure page.\n\t */\n\tasync capturePaypalPayment({\n\t\torder_no,\n\t}: { order_no?: string; token?: string; PayerID?: string; storeId?: string } = {}) {\n\t\treturn { order_no: order_no ?? null, status: 'processing' }\n\t}\n\tasync checkoutCashfree(): Promise<never> {\n\t\tthrow unsupported('checkoutCashfree', 'the engine has no Cashfree gateway')\n\t}\n\tasync captureCashfreePayment(): Promise<never> {\n\t\tthrow unsupported('captureCashfreePayment', 'the engine has no Cashfree gateway')\n\t}\n\tasync checkoutPhonepe(): Promise<never> {\n\t\tthrow unsupported('checkoutPhonepe', 'the engine has no PhonePe gateway')\n\t}\n\tasync createAffirmPayOrder(): Promise<never> {\n\t\tthrow unsupported('createAffirmPayOrder', 'the engine has no Affirm gateway')\n\t}\n\tasync confirmAffirmOrder(): Promise<never> {\n\t\tthrow unsupported('confirmAffirmOrder', 'the engine has no Affirm gateway')\n\t}\n\tasync cancelAffirmOrder(): Promise<never> {\n\t\tthrow unsupported('cancelAffirmOrder', 'the engine has no Affirm gateway')\n\t}\n\tasync checkoutPOS(): Promise<never> {\n\t\tthrow unsupported('checkoutPOS', 'point-of-sale orders are placed from the admin panel')\n\t}\n\n\t/**\n\t * Any payment method the engine has switched on, by its engine code —\n\t * `cod`, `stripe`, `razorpay`, `adyen`, `paddle`, `helcim`… For a storefront\n\t * that drives the payment itself: the answer says what to do next.\n\t *\n\t * - `kind: 'none'` — nothing to pay now (cash on delivery).\n\t * - `kind: 'client_action'` — mount the gateway's own widget with\n\t * `clientData`: Stripe's Payment Element takes `clientSecret`, Razorpay's\n\t * modal `razorpay_order_id` and `key_id`, Helcim's `checkout_token`.\n\t * - `kind: 'redirect'` — send the shopper to `redirectUrl`; `returnUrl` is\n\t * where the gateway brings them back.\n\t *\n\t * Either way the gateway's webhook tells the engine when the money arrives;\n\t * read `orderService.getOrder(orderNo).paymentStatus` to see it.\n\t */\n\tasync checkout(\n\t\tcode: string,\n\t\t{\n\t\t\tcartId,\n\t\t\treturnUrl,\n\t\t\tpaymentData,\n\t\t\tmetadata,\n\t\t}: {\n\t\t\tcartId?: string\n\t\t\treturnUrl?: string\n\t\t\tpaymentData?: Record<string, string>\n\t\t\tmetadata?: Record<string, unknown>\n\t\t} = {},\n\t) {\n\t\tconst result = await this.place(String(code).toLowerCase(), cartId, {\n\t\t\t...(returnUrl ? { return_url: returnUrl } : {}),\n\t\t\t...(paymentData ? { payment_data: paymentData } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t})\n\t\tconst data = result.payment.client_data ?? {}\n\t\treturn {\n\t\t\torderNo: result.order.number,\n\t\t\torder: toOrder(result.order),\n\t\t\tpayment: {\n\t\t\t\tkind: result.payment.kind,\n\t\t\t\tprovider: result.payment.provider,\n\t\t\t\treference: result.payment.reference ?? null,\n\t\t\t\tclientSecret: data.client_secret ?? null,\n\t\t\t\tredirectUrl: data.url ?? null,\n\t\t\t\tclientData: data,\n\t\t\t},\n\t\t}\n\t}\n\n\t/** Every payment method the engine has switched on, by engine code and name — drivable here or not. */\n\tasync listMethods() {\n\t\tconst options = await this.data<{ methods: { code: string; name: string }[] | null; currency: string }>(\n\t\t\t'/api/checkout',\n\t\t)\n\t\treturn { methods: options.methods ?? [], currency: options.currency }\n\t}\n\n\tprivate async redirectGateway(): Promise<string | undefined> {\n\t\tconst { methods } = await this.listMethods()\n\t\treturn methods.find((m) => REDIRECT_GATEWAYS.has(m.code))?.code\n\t}\n\n\t/**\n\t * One checkout attempt.\n\t *\n\t * The Idempotency-Key is kept with the cart and reused while the request is\n\t * the same, because a payment gateway that fails after the engine has\n\t * created the order leaves the cart converted: only a retry under the same\n\t * key resumes that order, and without one the shopper is stuck. A changed\n\t * request — a different address, a different method — gets a new key, since\n\t * the engine refuses a key replayed with a different body.\n\t */\n\tprivate async place(\n\t\tcode: string,\n\t\tcartId?: string,\n\t\textra: { return_url?: string; payment_data?: Record<string, string>; metadata?: Record<string, unknown> } = {},\n\t): Promise<CheckoutResult> {\n\t\tconst id = cartId || storedCartId()\n\t\tif (!id) throw new GoCommerceError('Your bag is empty.', 400)\n\t\tconst extras = cartExtras(id)\n\t\tconst ship = extras.shippingAddress\n\t\tif (!ship) throw new GoCommerceError('Add a delivery address first.', 400)\n\n\t\tconst cart = await this.data<Cart>(`/api/carts/${encodeURIComponent(id)}`)\n\t\tconst email = cart.email || (ship.email ? String(ship.email) : '')\n\t\tif (!email) throw new GoCommerceError('Add an email address so we can send your receipt.', 400)\n\t\tconst address = toEngineAddress(ship)\n\t\tconst body = {\n\t\t\tcart_id: id,\n\t\t\temail,\n\t\t\t...(extras.phone || address.phone ? { phone: String(extras.phone || address.phone) } : {}),\n\t\t\t...(address.name ? { name: address.name } : {}),\n\t\t\taddress,\n\t\t\t...(extras.shippingRateId ? { shipping_rate_id: Number(extras.shippingRateId) } : {}),\n\t\t\t...extra,\n\t\t}\n\t\tconst serialised = JSON.stringify(body)\n\t\tconst key = extras.attempt?.body === `${code}:${serialised}` ? extras.attempt.key : newKey()\n\t\tsaveCartExtras(id, { attempt: { key, body: `${code}:${serialised}` } })\n\n\t\tconst result = await this.data<CheckoutResult>(`/api/checkout/${encodeURIComponent(code)}`, {\n\t\t\tmethod: 'POST',\n\t\t\tbody,\n\t\t\theaders: { 'Idempotency-Key': key },\n\t\t})\n\n\t\t// The access token is returned once; a replayed response leaves it out,\n\t\t// so a replay must not overwrite the one already kept.\n\t\tif (result.order.access_token) {\n\t\t\trememberOrder({\n\t\t\t\tnumber: result.order.number,\n\t\t\t\ttoken: result.order.access_token,\n\t\t\t\tcartId: id,\n\t\t\t\treference: result.payment.client_data?.razorpay_order_id ?? result.payment.reference,\n\t\t\t})\n\t\t\t// A signed-in shopper's order joins their account. The engine never\n\t\t\t// links an order by email, so this call is the only way it appears\n\t\t\t// under \"My orders\".\n\t\t\tif (sessionToken()) {\n\t\t\t\tawait this.engine('/x/identity/me/orders', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: { number: result.order.number, token: result.order.access_token },\n\t\t\t\t\tauth: true,\n\t\t\t\t}).catch(() => undefined)\n\t\t\t}\n\t\t}\n\t\tsaveCartExtras(id, { attempt: null })\n\t\treturn result\n\t}\n}\n\n/** The engine's gateways that take payment on their own hosted page. */\nexport const REDIRECT_GATEWAYS = new Set(['adyen', 'paddle', 'lemonsqueezy', 'creem', 'hyperswitch', 'revenuecat'])\n\nconst unsupported = (method: string, why: string) => new NotSupportedError('CheckoutService', method, why)\n\nfunction newKey(): string {\n\tconst c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto\n\tif (c?.randomUUID) return c.randomUUID()\n\treturn `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}-${Math.random().toString(36).slice(2)}`\n}\n\nexport const checkoutService = new CheckoutService()\n","import { BaseService } from './base.service'\nimport { StoreFacts } from './facts'\nimport { REDIRECT_GATEWAYS } from './checkout-service'\n\n/**\n * The engine's payment methods this storefront can actually drive.\n *\n * The storefront dispatches on an upper-cased code from a fixed list, so a\n * method is offered only where one of its flows can complete it: cash on\n * delivery, Razorpay's modal, and — through the storefront's redirect flow,\n * which it reaches by the code `PAYPAL` — the first of the engine's hosted-page\n * gateways. That one keeps its own name and gets a neutral card icon, never a\n * PayPal mark. The flow carries no gateway code, so a second hosted-page\n * gateway cannot be told apart from the first and is not offered; nor is\n * Stripe, whose engine gateway is a Payment Element this storefront does not\n * mount. Each method left off is reported once, and every one stays reachable\n * through `checkoutService.checkout(code)` for a storefront that drives its own.\n */\nconst DRIVABLE: Record<string, { code: string; img?: string }> = {\n\tcod: { code: 'COD', img: '/payment/cod.svg' },\n\trazorpay: { code: 'RAZORPAY' },\n}\n\nconst reported = new Set<string>()\n\nexport class PaymentMethodService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\tconst options = await this.facts.checkoutOptions()\n\t\tconst methods = options.methods ?? []\n\t\tconst redirect = methods.find((m) => REDIRECT_GATEWAYS.has(m.code))?.code\n\t\tconst drive = (code: string) =>\n\t\t\tDRIVABLE[code] ?? (code === redirect ? { code: 'PAYPAL', img: '/payment/card.svg' } : undefined)\n\t\tconst data = methods\n\t\t\t.filter((m) => {\n\t\t\t\tif (drive(m.code)) return true\n\t\t\t\tif (!reported.has(m.code)) {\n\t\t\t\t\treported.add(m.code)\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[gocommerce] payment method \"${m.code}\" is switched on but this storefront cannot drive its flow, so it is not offered here; checkoutService.checkout('${m.code}') still reaches it.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t\t.map((m, i) => ({\n\t\t\t\tid: m.code,\n\t\t\t\tcode: drive(m.code)!.code,\n\t\t\t\tengineCode: m.code,\n\t\t\t\tname: m.name,\n\t\t\t\ttitle: m.name,\n\t\t\t\tdescription: '',\n\t\t\t\timg: drive(m.code)!.img ?? null,\n\t\t\t\trank: i,\n\t\t\t\tactive: true,\n\t\t\t\tisActive: true,\n\t\t\t}))\n\t\treturn { data, count: data.length, pageSize: data.length, noOfPage: 1, page: 1 }\n\t}\n}\n\nexport const paymentMethodService = new PaymentMethodService()\n","import { emptyPage } from './base.service'\nimport { BaseService } from './base.service'\n\n/**\n * Discount codes are typed, not browsed: the engine has no public list of\n * them, by design — a list would hand every shopper every code. An empty list\n * hides the storefront's coupon drawer, and the code box still works through\n * `cartService.applyCoupon`.\n */\nexport class CouponService extends BaseService {\n\tasync listCoupons(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport const couponService = new CouponService()\n","import type { Order, Product } from '../engine'\nimport { GoCommerceError, NotSupportedError } from '../errors'\nimport { toOrder } from '../map'\nimport { toMajor } from '../money'\nimport { inBrowser, placedOrder, placedOrderForCart, sessionToken } from '../browser'\nimport { BaseService, emptyPage, toPage } from './base.service'\n\n/**\n * Orders, read back two ways.\n *\n * A guest's order is read with the access token checkout returned, which this\n * connector kept in the browser that placed it (`GET /api/orders/{n}?token=`).\n * A signed-in shopper's orders are the ones joined to their account\n * (ext/identity's `/me/orders`). There is no third way: an order list that\n * answered without either would be every order in the shop.\n */\nexport class OrderService extends BaseService {\n\t/**\n\t * The order-success page's lookup, by the number and cart in its URL.\n\t *\n\t * It runs on the server, where neither the token nor the session exists —\n\t * they live in the shopper's browser — so there it answers nothing and the\n\t * page says the details are not available yet. In the browser it answers\n\t * the order. Inventing a server-side credential from the cart token in the\n\t * URL would make that URL, which lands in history and referrers, a key to\n\t * the shopper's address.\n\t */\n\tasync listOrdersByParent({ orderNo, cartId }: { orderNo?: string; cartId?: string } = {}) {\n\t\tconst number = clean(orderNo) ?? (clean(cartId) ? placedOrderForCart(clean(cartId) as string)?.number : undefined)\n\t\tif (!number) return { data: [] }\n\t\ttry {\n\t\t\treturn { data: [await this.getOrder(number)] }\n\t\t} catch (err) {\n\t\t\tif (err instanceof GoCommerceError && (err.status === 404 || err.status === 401)) return { data: [] }\n\t\t\tthrow err\n\t\t}\n\t}\n\n\t/** The signed-in shopper's orders, newest claim first. */\n\tasync list({ page = 1, limit = 20 }: { page?: number; limit?: number; q?: string; sort?: string } = {}) {\n\t\tconst env = await this.engine<Order[] | null>('/x/identity/me/orders', { query: { page, limit }, auth: true })\n\t\treturn toPage(env, toOrder)\n\t}\n\n\t/** One order by number: the account's when signed in, otherwise one this browser placed. */\n\tasync getOrder(number: string) {\n\t\tconst kept = placedOrder(number)\n\t\tif (kept) {\n\t\t\treturn toOrder(\n\t\t\t\tawait this.data<Order>(`/api/orders/${encodeURIComponent(number)}`, { query: { token: kept.token } }),\n\t\t\t)\n\t\t}\n\t\tif (sessionToken()) {\n\t\t\treturn toOrder(await this.data<Order>(`/x/identity/me/orders/${encodeURIComponent(number)}`, { auth: true }))\n\t\t}\n\t\tthrow new GoCommerceError(\n\t\t\tinBrowser() ? 'Sign in to see this order, or open it from the browser that placed it.' : 'order not found',\n\t\t\t404,\n\t\t\t'not_found',\n\t\t)\n\t}\n\n\t/** Everything the signed-in shopper has bought, once each, most recent first. */\n\tasync buyAgain() {\n\t\tconst orders =\n\t\t\t(await this.data<Order[] | null>('/x/identity/me/orders', { query: { limit: 20 }, auth: true })) ?? []\n\t\tconst seen = new Set<number>()\n\t\tconst lines: {\n\t\t\tproductId: number\n\t\t\tvariantId: number\n\t\t\ttitle: string\n\t\t\timg: string | null\n\t\t\tprice: number\n\t\t\tqty: number\n\t\t}[] = []\n\t\tfor (const o of orders) {\n\t\t\tfor (const l of o.line_items ?? []) {\n\t\t\t\tif (!l.product_id || !l.variant_id || seen.has(l.variant_id)) continue\n\t\t\t\tseen.add(l.variant_id)\n\t\t\t\tlines.push({\n\t\t\t\t\tproductId: l.product_id,\n\t\t\t\t\tvariantId: l.variant_id,\n\t\t\t\t\ttitle: l.title,\n\t\t\t\t\timg: l.image_url ?? null,\n\t\t\t\t\tprice: toMajor(l.unit_price),\n\t\t\t\t\tqty: l.quantity,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\t// A product taken off sale is no longer something to buy again.\n\t\tconst live = await Promise.all(\n\t\t\tlines.map((l) => this.data<Product>(`/api/products/${l.productId}`).catch(() => null)),\n\t\t)\n\t\treturn lines.flatMap((l, i) => {\n\t\t\tconst p = live[i]\n\t\t\tif (!p) return []\n\t\t\treturn [{ ...l, productId: String(l.productId), variantId: String(l.variantId), slug: p.slug }]\n\t\t})\n\t}\n\n\t/** The \"someone just bought\" popup would publish other shoppers' purchases; the engine offers none. */\n\tasync listPublic(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n\n\tasync getOrderByEmailAndOTP(): Promise<never> {\n\t\tthrow new NotSupportedError(\n\t\t\t'OrderService',\n\t\t\t'getOrderByEmailAndOTP',\n\t\t\t'the engine sends no one-time codes; a guest reads an order with its access token',\n\t\t)\n\t}\n}\n\nconst clean = (v?: string | null) => (v && v !== 'undefined' && v !== 'null' ? v : undefined)\n\nexport const orderService = new OrderService()\n","import type { AuthResponse, Customer, Order } from '../engine'\nimport { GoCommerceError, NotSupportedError } from '../errors'\nimport { toOrder, toUser } from '../map'\nimport { endSession, placedOrder, startSession, storedCartId, updateMe } from '../browser'\nimport { BaseService } from './base.service'\n\n/**\n * Shopper accounts, through ext/identity.\n *\n * Guest checkout stays the engine's default (D22): an account is a place to\n * keep addresses and see past orders, never a requirement to buy. A store\n * built without `-identity` answers every call here with a 404, which arrives\n * as \"Accounts are not available on this store\" rather than as a route error.\n */\nexport class UserService extends BaseService {\n\t/** Email and password. The answer is the user object the storefront keeps in its `me` cookie. */\n\tasync login({ email, password }: { email: string; password: string; cartId?: string | null }) {\n\t\tconst auth = await this.account<AuthResponse>('/x/identity/login', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: { email: String(email ?? '').trim(), password: String(password ?? '') },\n\t\t})\n\t\treturn this.signedIn(auth)\n\t}\n\n\tasync signup({\n\t\temail,\n\t\tpassword,\n\t\tfirstName,\n\t\tlastName,\n\t\tphone,\n\t}: {\n\t\temail: string\n\t\tpassword: string\n\t\tfirstName?: string\n\t\tlastName?: string\n\t\tphone?: string\n\t\tcartId?: string | null\n\t\torigin?: string\n\t}) {\n\t\tconst name = [firstName, lastName].filter(Boolean).join(' ').trim()\n\t\tconst auth = await this.account<AuthResponse>('/x/identity/register', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: {\n\t\t\t\temail: String(email ?? '').trim(),\n\t\t\t\tpassword: String(password ?? ''),\n\t\t\t\t...(name ? { name } : {}),\n\t\t\t\t...(phone ? { phone: String(phone) } : {}),\n\t\t\t},\n\t\t})\n\t\treturn this.signedIn(auth)\n\t}\n\n\t/** Signs out here and on the engine. The storefront assigns the answer to its user: `null`. */\n\tasync logout() {\n\t\tawait this.engine('/x/identity/logout', { method: 'POST', auth: true }).catch(() => undefined)\n\t\tendSession()\n\t\treturn null\n\t}\n\n\tasync getMe() {\n\t\treturn toUser(await this.account<Customer>('/x/identity/me', { auth: true }))\n\t}\n\n\tasync updateProfile(user: { firstName?: string; lastName?: string; name?: string; email?: string; phone?: string }) {\n\t\tconst name =\n\t\t\tuser.name ??\n\t\t\t[user.firstName, user.lastName]\n\t\t\t\t.filter((v) => v !== undefined)\n\t\t\t\t.join(' ')\n\t\t\t\t.trim()\n\t\tconst c = await this.account<Customer>('/x/identity/me', {\n\t\t\tmethod: 'PATCH',\n\t\t\tauth: true,\n\t\t\tbody: {\n\t\t\t\t...(name !== undefined ? { name } : {}),\n\t\t\t\t...(user.email ? { email: String(user.email).trim() } : {}),\n\t\t\t\t...(user.phone !== undefined && user.phone !== null ? { phone: String(user.phone) } : {}),\n\t\t\t},\n\t\t})\n\t\tupdateMe(c)\n\t\treturn toUser(c)\n\t}\n\n\t/**\n\t * A password change ends every session the account had, this one included,\n\t * and the engine answers a fresh one — which is kept, so the shopper stays\n\t * signed in here and nowhere else.\n\t */\n\tasync changePassword({ old, oldPassword, password }: { old?: string; oldPassword?: string; password: string }) {\n\t\tconst auth = await this.account<AuthResponse>('/x/identity/me/password', {\n\t\t\tmethod: 'PUT',\n\t\t\tauth: true,\n\t\t\tbody: { current_password: String(old ?? oldPassword ?? ''), password: String(password ?? '') },\n\t\t})\n\t\tstartSession(auth)\n\t\treturn toUser(auth.record)\n\t}\n\n\t/**\n\t * Mails the signed-in shopper a link to confirm their address. The engine\n\t * sends none at signup, and a confirmed address is what customer-group\n\t * prices are keyed on. 409 once confirmed; 429 within a minute of the last.\n\t */\n\tasync requestEmailVerification() {\n\t\treturn this.account<{ accepted: boolean }>('/x/identity/me/email-verification', { method: 'POST', auth: true })\n\t}\n\n\t/** Extends the session another thirty days. The token stays the same. */\n\tasync refreshSession() {\n\t\treturn startSession(await this.account<AuthResponse>('/x/identity/refresh', { method: 'POST', auth: true }))\n\t}\n\n\t/**\n\t * Files a guest order under the signed-in account, so it appears in their\n\t * order history. The order's access token is the proof of ownership: pass\n\t * it, or leave it out for an order placed from this browser, whose token was\n\t * kept at checkout.\n\t *\n\t * Never done automatically at sign-in. On a shared computer that would file\n\t * one person's orders — address and all — under whoever signed in next.\n\t */\n\tasync claimOrder({ number, token }: { number: string; token?: string }) {\n\t\tconst proof = token ?? placedOrder(number)?.token\n\t\tif (!proof) {\n\t\t\tthrow new GoCommerceError(\n\t\t\t\t'This order was not placed from this browser; enter the code from its confirmation.',\n\t\t\t\t400,\n\t\t\t)\n\t\t}\n\t\tconst order = await this.account<Order>('/x/identity/me/orders', {\n\t\t\tmethod: 'POST',\n\t\t\tauth: true,\n\t\t\tbody: { number: String(number), token: proof },\n\t\t})\n\t\treturn toOrder(order)\n\t}\n\n\tasync deleteUser(): Promise<never> {\n\t\tthrow new NotSupportedError('UserService', 'deleteUser', 'an account is closed by the store, on request')\n\t}\n\n\tasync checkEmail(): Promise<never> {\n\t\tthrow new NotSupportedError('UserService', 'checkEmail', 'the engine does not say which addresses have accounts')\n\t}\n\n\tasync joinAsVendor(): Promise<never> {\n\t\tthrow new NotSupportedError('UserService', 'joinAsVendor', 'sellers are invited by the store')\n\t}\n\n\tprivate async signedIn(auth: AuthResponse) {\n\t\tconst me = startSession(auth)\n\t\tconst cartId = storedCartId()\n\t\tif (cartId) await this.claimCartForAccount(cartId)\n\t\treturn me\n\t}\n\n\t/** An identity call, with a 404 from a build without the module said in words. */\n\tprotected async account<T>(path: string, req: Parameters<BaseService['engine']>[1] = {}): Promise<T> {\n\t\ttry {\n\t\t\treturn await this.data<T>(path, req)\n\t\t} catch (err) {\n\t\t\tif (err instanceof GoCommerceError && err.status === 404 && /no route/i.test(err.message)) {\n\t\t\t\tthrow new GoCommerceError('Accounts are not available on this store.', 404, 'not_found')\n\t\t\t}\n\t\t\tif (err instanceof GoCommerceError && err.status === 401 && req.auth) endSession()\n\t\t\tthrow err\n\t\t}\n\t}\n}\n\n/**\n * Password resets and email confirmation. Phone sign-in by one-time code is a\n * Litekart flow; the engine has no such thing and says so.\n */\nexport class AuthService extends UserService {\n\tasync forgotPassword({ email }: { email: string; referrer?: string }) {\n\t\treturn this.account<{ accepted: boolean }>('/x/identity/password-reset', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: { email: String(email ?? '').trim() },\n\t\t})\n\t}\n\n\t/** The token arrives in the link the engine emailed (`GOCOMMERCE_IDENTITY_RESET_URL`). */\n\tasync resetPassword({ token, password }: { userId?: string; token: string; password: string }) {\n\t\tconst auth = await this.account<AuthResponse>('/x/identity/password-reset/confirm', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: { token: String(token ?? ''), password: String(password ?? '') },\n\t\t})\n\t\treturn startSession(auth)\n\t}\n\n\t/** Answers `{ errorCode, message }` on failure rather than throwing: that is how the page reads it. */\n\tasync verifyEmail(_email: string | undefined, token: string) {\n\t\ttry {\n\t\t\tconst c = await this.account<Customer>('/x/identity/email-verification/confirm', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: { token: String(token ?? '') },\n\t\t\t})\n\t\t\treturn { ...toUser(c), message: 'Your email address is confirmed.' }\n\t\t} catch (err) {\n\t\t\treturn { errorCode: (err as GoCommerceError).code ?? 'invalid_token', message: (err as Error).message }\n\t\t}\n\t}\n\n\tasync getOtp(): Promise<never> {\n\t\tthrow new NotSupportedError('AuthService', 'getOtp', 'sign in with an email and password')\n\t}\n\n\tasync verifyOtp(): Promise<never> {\n\t\tthrow new NotSupportedError('AuthService', 'verifyOtp', 'sign in with an email and password')\n\t}\n\n\tasync joinAsAdmin(): Promise<never> {\n\t\tthrow new NotSupportedError('AuthService', 'joinAsAdmin', 'operators are invited from the admin panel')\n\t}\n}\n\n/** The `/my/profile` form: the same account, read and saved. */\nexport class ProfileService extends UserService {\n\tasync getOne() {\n\t\treturn this.getMe()\n\t}\n\n\tasync save(profile: { firstName?: string; lastName?: string; email?: string; phone?: string }) {\n\t\treturn this.updateProfile(profile)\n\t}\n}\n\nexport const userService = new UserService()\nexport const authService = new AuthService()\nexport const profileService = new ProfileService()\n","import type { IdentityAddress } from '../engine'\nimport { fromIdentityAddress, toIdentityAddress } from '../map'\nimport { currentMe, type StorefrontAddress } from '../browser'\nimport { BaseService } from './base.service'\n\ntype AddressArg = StorefrontAddress & { isPrimary?: boolean; label?: string }\n\n/** The signed-in shopper's address book (ext/identity). A guest's address lives on the cart. */\nexport class AddressService extends BaseService {\n\tasync list({\n\t\tpage = 1,\n\t\tlimit = 20,\n\t}: { page?: number; limit?: number; user?: string; q?: string; sort?: string } = {}) {\n\t\tconst env = await this.engine<IdentityAddress[] | null>('/x/identity/me/addresses', {\n\t\t\tquery: { page, limit },\n\t\t\tauth: true,\n\t\t})\n\t\tconst email = currentMe()?.email\n\t\tconst rows = env.data ?? []\n\t\treturn {\n\t\t\tdata: rows.map((a) => fromIdentityAddress(a, email)),\n\t\t\tcount: env.meta?.total ?? rows.length,\n\t\t\tpageSize: env.meta?.limit ?? limit,\n\t\t\tnoOfPage: env.meta?.total_pages ?? 1,\n\t\t\tpage: env.meta?.page ?? page,\n\t\t}\n\t}\n\n\tasync fetchAddress(id: string) {\n\t\treturn fromIdentityAddress(\n\t\t\tawait this.data<IdentityAddress>(`/x/identity/me/addresses/${enc(id)}`, { auth: true }),\n\t\t\tcurrentMe()?.email,\n\t\t)\n\t}\n\n\t/** New when it has no id (or the form's `'new'`), an edit when it has one — the storefront saves both here. */\n\tasync saveAddress(address: AddressArg) {\n\t\tconst id = address?.id && address.id !== 'new' ? String(address.id) : null\n\t\tif (id) return this.editAddress(id, address)\n\t\tconst a = await this.data<IdentityAddress>('/x/identity/me/addresses', {\n\t\t\tmethod: 'POST',\n\t\t\tauth: true,\n\t\t\tbody: toIdentityAddress(address),\n\t\t})\n\t\treturn fromIdentityAddress(a, currentMe()?.email)\n\t}\n\n\tasync editAddress(id: string, address: AddressArg) {\n\t\tconst a = await this.data<IdentityAddress>(`/x/identity/me/addresses/${enc(id)}`, {\n\t\t\tmethod: 'PATCH',\n\t\t\tauth: true,\n\t\t\tbody: toIdentityAddress(address),\n\t\t})\n\t\treturn fromIdentityAddress(a, currentMe()?.email)\n\t}\n\n\tasync deleteAddress(id: string) {\n\t\tawait this.engine(`/x/identity/me/addresses/${enc(id)}`, { method: 'DELETE', auth: true })\n\t\treturn { id: String(id), deleted: true }\n\t}\n}\n\nconst enc = (id: string) => encodeURIComponent(String(id))\n\nexport const addressService = new AddressService()\n","import type { Product, Wishlist } from '../engine'\nimport { GoCommerceError } from '../errors'\nimport { toProduct } from '../map'\nimport { currentMe, forgetWishlistToken, rememberWishlistToken, wishlistToken } from '../browser'\nimport { BaseService } from './base.service'\n\n/**\n * Saved products, through ext/wishlist.\n *\n * The module keys a list by a token of its own rather than by an account, so\n * a guest can save things too; this connector keeps that token in the browser.\n * The signed-in shopper's email is attached so the store can tell them when a\n * saved product comes back in stock.\n */\nexport class WishlistService extends BaseService {\n\tasync fetchWishlist(_args: Record<string, unknown> = {}) {\n\t\tconst list = await this.current()\n\t\tif (!list) return { data: [], count: 0 }\n\t\tconst items = (list.items ?? []).filter((i) => !i.deleted)\n\t\tconst products = await Promise.all(\n\t\t\titems.map((i) => this.data<Product>(`/api/products/${i.product_id}`).catch(() => null)),\n\t\t)\n\t\tconst data = items.flatMap((item, n) => {\n\t\t\tconst p = products[n]\n\t\t\tif (!p) return []\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: String(item.id),\n\t\t\t\t\tproductId: String(item.product_id),\n\t\t\t\t\tvariantId: item.variant_id ? String(item.variant_id) : null,\n\t\t\t\t\tproduct: toProduct(p),\n\t\t\t\t\tvariant: { id: item.variant_id ? String(item.variant_id) : null },\n\t\t\t\t\tcreatedAt: item.created_at,\n\t\t\t\t},\n\t\t\t]\n\t\t})\n\t\treturn { data, count: data.length }\n\t}\n\n\t/** Saved → removed, removed → saved. `{ active }` is the state after the click. */\n\tasync toggleWishlist({ productId, variantId }: { productId: string; variantId?: string | null }) {\n\t\tconst list = (await this.current()) ?? (await this.create())\n\t\tconst item = (list.items ?? []).find((i) => String(i.product_id) === String(productId))\n\t\tif (item) {\n\t\t\tawait this.data<Wishlist>(`/x/wishlist/${enc(list.token!)}/items/${item.id}`, { method: 'DELETE' })\n\t\t\treturn { active: false, id: String(item.id) }\n\t\t}\n\t\tconst next = await this.data<Wishlist>(`/x/wishlist/${enc(list.token!)}/items`, {\n\t\t\tmethod: 'POST',\n\t\t\tbody: { product_id: Number(productId), ...(variantId ? { variant_id: Number(variantId) } : {}) },\n\t\t})\n\t\tconst added = (next.items ?? []).find((i) => String(i.product_id) === String(productId))\n\t\treturn { active: true, id: added ? String(added.id) : null }\n\t}\n\n\tasync checkWishlist({ productId }: { productId: string; variantId?: string | null }) {\n\t\tconst list = await this.current()\n\t\treturn !!list && (list.items ?? []).some((i) => String(i.product_id) === String(productId))\n\t}\n\n\tasync checkWishlistInBulk(pairs: { productId: string; variantId?: string | null }[]) {\n\t\tconst list = await this.current()\n\t\tconst saved = new Set((list?.items ?? []).map((i) => String(i.product_id)))\n\t\treturn (pairs ?? []).map((p) => ({ ...p, exists: saved.has(String(p.productId)) }))\n\t}\n\n\t/**\n\t * The address the store may write to when a saved product is back in stock\n\t * or on sale; `''` takes it off. A list that does not exist yet is made.\n\t */\n\tasync setEmail(email: string) {\n\t\tconst list = (await this.current()) ?? (await this.create())\n\t\tawait this.data<Wishlist>(`/x/wishlist/${enc(list.token)}`, {\n\t\t\tmethod: 'PATCH',\n\t\t\tbody: { email: String(email ?? '').trim() },\n\t\t})\n\t\treturn { email: String(email ?? '').trim() || null }\n\t}\n\n\tprivate async current(): Promise<(Wishlist & { token: string }) | null> {\n\t\tconst token = wishlistToken()\n\t\tif (!token) return null\n\t\ttry {\n\t\t\treturn { ...(await this.data<Wishlist>(`/x/wishlist/${enc(token)}`)), token }\n\t\t} catch (err) {\n\t\t\tif (err instanceof GoCommerceError && err.status === 404 && !/no wishlist|no route/i.test(err.message)) {\n\t\t\t\tforgetWishlistToken()\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tthrow err\n\t\t}\n\t}\n\n\tprivate async create(): Promise<Wishlist & { token: string }> {\n\t\tconst email = currentMe()?.email\n\t\tconst list = await this.data<Wishlist>('/x/wishlist', { method: 'POST', ...(email ? { body: { email } } : {}) })\n\t\tif (!list.token) throw new GoCommerceError('The store did not return a wishlist token.', 500)\n\t\trememberWishlistToken(list.token)\n\t\treturn { ...list, token: list.token }\n\t}\n}\n\nconst enc = (s: string) => encodeURIComponent(s)\n\nexport const wishlistService = new WishlistService()\n","import type { ReviewPage } from '../engine'\nimport { toRating } from '../map'\nimport { BaseService } from './base.service'\n\n/**\n * Product reviews (ext/reviews). Approved reviews only, newest first. The\n * product page gets them with the product; this is the paged form, and\n * `productService.addReview` writes one.\n */\nexport class ReviewService extends BaseService {\n\tasync fetchReviews({\n\t\tproductId,\n\t\tcurrentPage = 1,\n\t\tpage,\n\t\tlimit = 20,\n\t}: { productId?: string; currentPage?: number; page?: number; limit?: number; search?: string; sort?: string } = {}) {\n\t\t// A vendor's \"all my reviews\" page has no product to ask about.\n\t\tif (!productId) return { data: [], count: 0, pageSize: limit, noOfPage: 0, page: 1 }\n\t\tconst p = Math.max(1, Number(page ?? currentPage) || 1)\n\t\tconst res = await this.data<ReviewPage>('/x/reviews', { query: { product_id: productId, page: p, limit } })\n\t\tconst total = res.meta?.total ?? res.summary?.count ?? 0\n\t\treturn {\n\t\t\tdata: (res.reviews ?? []).map(toRating),\n\t\t\tcount: total,\n\t\t\tpageSize: limit,\n\t\t\tnoOfPage: Math.max(1, Math.ceil(total / limit)),\n\t\t\tpage: p,\n\t\t\tsummary: res.summary ?? null,\n\t\t}\n\t}\n\n\tasync allReviews(args: { productId?: string; page?: number } = {}) {\n\t\treturn this.fetchReviews(args)\n\t}\n}\n\nexport const reviewService = new ReviewService()\n","import type { Menu, MenuItem, MenuSummary } from '../engine'\nimport { resolveRestLocally } from '../rest-guard'\nimport { BaseService } from './base.service'\nimport { StoreFacts } from './facts'\nimport { remember } from '../cache'\n\nexport type StorefrontMenu = { menuId: string; name: string; items: StorefrontMenuItem[] }\ntype StorefrontMenuItem = { id: string; name: string; link: string; items: StorefrontMenuItem[] }\n\n/**\n * A link where this storefront serves it. The navigation module resolves URLs\n * from its own patterns, whose defaults suit a different storefront; the\n * targets it names are slugs, so they are re-pointed at this one's routes.\n */\nfunction linkFor(item: MenuItem): string {\n\tconst t = item.target ?? ''\n\tswitch (item.kind) {\n\t\tcase 'home':\n\t\t\treturn '/'\n\t\tcase 'product':\n\t\t\treturn t ? `/products/${t}` : item.url\n\t\tcase 'collection':\n\t\t\treturn t ? `/collections/${t}` : item.url\n\t\tcase 'category':\n\t\t\treturn t ? `/${t}` : item.url\n\t\tcase 'page':\n\t\t\treturn t ? `/p/${t}` : item.url\n\t\tdefault:\n\t\t\treturn item.url\n\t}\n}\n\nconst toItem = (item: MenuItem, i: number): StorefrontMenuItem => ({\n\tid: String(item.id ?? i),\n\tname: item.title,\n\tlink: linkFor(item),\n\titems: (item.children ?? []).map(toItem),\n})\n\n/**\n * Menus from ext/navigation, when it is installed and switched on; otherwise\n * the storefront's own `store.menu`, which is what it shows anyway.\n */\nexport class MenuService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\tconst menus = await this.engineMenus()\n\t\tif (menus) return { data: menus }\n\t\treturn resolveRestLocally('get', '/api/menu')\n\t}\n\n\t/** Every menu the store keeps, by handle — not only the header and footer. */\n\tasync listMenus() {\n\t\treturn (await this.data<MenuSummary[] | null>('/x/navigation/menus')) ?? []\n\t}\n\n\t/** One menu by handle, in the storefront's shape: `{ menuId, name, items: [{ id, name, link, items }] }`. */\n\tasync getMenu(handle: string): Promise<StorefrontMenu> {\n\t\tconst m = await this.data<Menu>(`/x/navigation/menus/${encodeURIComponent(handle)}`)\n\t\treturn { menuId: m.handle, name: m.title, items: (m.items ?? []).map(toItem) }\n\t}\n\n\t/** The header and footer menus, or `null` when the module is not there. Cached: a menu is store-level. */\n\tasync engineMenus(): Promise<StorefrontMenu[] | null> {\n\t\tif (!(await this.facts.pluginOn('navigation'))) return null\n\t\treturn remember(`${this.engineBase()}|${this.creds.store ?? ''}|menus`, async () => {\n\t\t\tconst out: StorefrontMenu[] = []\n\t\t\tfor (const handle of ['header', 'footer']) {\n\t\t\t\ttry {\n\t\t\t\t\tconst m = await this.data<Menu>(`/x/navigation/menus/${handle}`)\n\t\t\t\t\tout.push({ menuId: handle, name: m.title, items: (m.items ?? []).map(toItem) })\n\t\t\t\t} catch {\n\t\t\t\t\t// A store may have deleted one of the two.\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out\n\t\t}).catch(() => null)\n\t}\n}\n\nexport const menuService = new MenuService()\n","import { BaseService } from './base.service'\n\n/**\n * The signup box and its unsubscribe link (ext/newsletter). Subscribing twice\n * is not an error, and unsubscribing answers the same whether or not the token\n * matched, so neither call tells a stranger whether an address is on the list.\n */\nexport class NewsletterService extends BaseService {\n\tasync subscribe({ email, name, source }: { email: string; name?: string; source?: string }) {\n\t\treturn this.data<{ status: 'subscribed' }>('/x/newsletter/subscribe', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: { email: String(email ?? '').trim(), ...(name ? { name } : {}), ...(source ? { source } : {}) },\n\t\t})\n\t}\n\n\t/** The token from the unsubscribe link in a newsletter email. */\n\tasync unsubscribe(token: string) {\n\t\treturn this.data<{ status: 'unsubscribed' }>('/x/newsletter/unsubscribe', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: { token: String(token ?? '') },\n\t\t})\n\t}\n}\n\nexport const newsletterService = new NewsletterService()\n","import { readStaticStore } from '../static-store'\nimport { BaseService } from './base.service'\nimport { StoreFacts } from './facts'\nimport { MenuService } from './menu-service'\nimport { NewsletterService } from './newsletter-service'\n\n/** `$`, `€`, `₹` — from the platform's own tables rather than a list kept here. */\nfunction symbolFor(code: string): string {\n\ttry {\n\t\tconst part = new Intl.NumberFormat('en', { style: 'currency', currency: code })\n\t\t\t.formatToParts(0)\n\t\t\t.find((p) => p.type === 'currency')\n\t\treturn part?.value ?? code\n\t} catch {\n\t\treturn code\n\t}\n}\n\n/**\n * The store record every page renders from.\n *\n * Name, logo, theme and the rest are the storefront's own (its static store,\n * registered through `setStaticStore`); the engine has no opinion on them.\n * Where the engine does have one, it wins: the settlement currency — every\n * price on the site is formatted with it, and a store record saying USD over\n * an engine charging INR would print the wrong symbol on every price — the\n * modules that back a storefront feature, and the menus.\n *\n * This runs on every request and a throw here takes every page down, so the\n * engine's half is best-effort: unreachable, the storefront still renders\n * from its own record, and the failure shows up where a price is fetched.\n */\nexport class StoreService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\n\tasync getStoreByIdOrDomain(_args: { storeId?: string; domain?: string } = {}) {\n\t\tconst base = await readStaticStore()\n\t\tconst live = await this.live().catch(() => ({}))\n\t\t// `id` must be truthy and stable: the storefront keys a cookie on it.\n\t\treturn { ...base, ...live, id: base.id || 'gocommerce' }\n\t}\n\n\tasync getStore(storeId?: string) {\n\t\treturn this.getStoreByIdOrDomain({ storeId })\n\t}\n\n\t/**\n\t * The storefront's sitemap route asks for `/api/stores/<id>` and serves the\n\t * `sitemap` path it gets back from `PUBLIC_SITEMAP_URL`. With ext/sitemaps\n\t * installed, `/sitemaps/sitemap.xml` under `PUBLIC_SITEMAP_URL=<engine>/x`\n\t * is the engine's own sitemap; without it, an empty path is the route's\n\t * clean 404 rather than a crash.\n\t */\n\toverride async get<T = any>(path: string): Promise<T> {\n\t\tif (path.split('?')[0].startsWith('/api/stores/')) {\n\t\t\tconst on = await this.facts.pluginOn('sitemap')\n\t\t\treturn { sitemap: on ? '/sitemaps/sitemap.xml' : '' } as T\n\t\t}\n\t\treturn super.get<T>(path)\n\t}\n\n\t/**\n\t * The storefront's newsletter box posts `{ email }` to Litekart's\n\t * `/api/newsletter/subscribe` through this verb; ext/newsletter is where\n\t * that list lives here.\n\t */\n\toverride async post<T = any>(path: string, data?: unknown): Promise<T> {\n\t\tif (path.split('?')[0] === '/api/newsletter/subscribe') {\n\t\t\tconst { email, name } = (data ?? {}) as { email?: string; name?: string }\n\t\t\treturn (await new NewsletterService(this._fetch).subscribe({\n\t\t\t\temail: email ?? '',\n\t\t\t\tname,\n\t\t\t\tsource: 'storefront',\n\t\t\t})) as T\n\t\t}\n\t\treturn super.post<T>(path, data)\n\t}\n\n\tprivate async live(): Promise<Record<string, unknown>> {\n\t\tconst [ready, plugins, menus, base] = await Promise.all([\n\t\t\tthis.facts.ready(),\n\t\t\tthis.facts.plugins().catch(() => new Map()),\n\t\t\tnew MenuService(this._fetch).engineMenus(),\n\t\t\treadStaticStore(),\n\t\t])\n\t\tconst code = ready.currency\n\t\tconst sameCurrency = (base.currency?.code ?? base.currencyCode) === code\n\t\tconst flag = (on: boolean) => ({ ...(on ? { active: true } : { active: false }) })\n\t\tconst basePlugins = (base.plugins ?? {}) as Record<string, Record<string, unknown>>\n\t\treturn {\n\t\t\tcurrencyCode: code,\n\t\t\tcurrencySymbol: sameCurrency ? (base.currencySymbol ?? symbolFor(code)) : symbolFor(code),\n\t\t\tcurrency: {\n\t\t\t\t...(base.currency ?? {}),\n\t\t\t\tcode,\n\t\t\t\tsymbol: sameCurrency ? (base.currency?.symbol ?? symbolFor(code)) : symbolFor(code),\n\t\t\t},\n\t\t\tlanguage: ready.language,\n\t\t\tplugins: {\n\t\t\t\t...basePlugins,\n\t\t\t\t// Features this connector serves from a module: on exactly when the\n\t\t\t\t// module is installed and switched on, whatever the static record says.\n\t\t\t\tisWishlist: { ...basePlugins.isWishlist, ...flag(plugins.has('wishlist')) },\n\t\t\t\tisProductReviewsAndRatings: {\n\t\t\t\t\t...basePlugins.isProductReviewsAndRatings,\n\t\t\t\t\t...flag(plugins.has('product-reviews')),\n\t\t\t\t},\n\t\t\t},\n\t\t\t...(menus?.length ? { menu: menus } : {}),\n\t\t}\n\t}\n}\n\nexport const storeService = new StoreService()\n","import type { CmsPage, Faq } from '../engine'\nimport { toCmsPage as toStorefrontPage } from '../map'\nimport { BaseService, toPage } from './base.service'\n\n/**\n * Content pages from ext/cms, in the shopper's language with the store's\n * default as the fallback. A slug with no page is the page's 404.\n */\nexport class PageService extends BaseService {\n\tasync getOne(slug: string) {\n\t\treturn toStorefrontPage(await this.data<CmsPage>(`/x/cms/pages/${encodeURIComponent(String(slug))}`))\n\t}\n\n\tasync list({ page = 1, limit = 50 }: { page?: number; limit?: number; search?: string; sort?: string } = {}) {\n\t\tconst env = await this.engine<CmsPage[] | null>('/x/cms/pages', { query: { page, limit } })\n\t\treturn toPage(env, toStorefrontPage)\n\t}\n}\n\n/** The shop's questions and answers (ext/faq), flattened in the shop's own order. */\nexport class FaqService extends BaseService {\n\tasync listFaqs(_args: Record<string, unknown> = {}) {\n\t\tconst faq = await this.data<Faq>('/x/faq')\n\t\tconst data = (faq.sections ?? []).flatMap((s) =>\n\t\t\t(s.entries ?? []).map((e) => ({\n\t\t\t\tid: String(e.id),\n\t\t\t\tquestion: e.question,\n\t\t\t\tanswer: e.answer,\n\t\t\t\tcategory: s.section || null,\n\t\t\t})),\n\t\t)\n\t\treturn { data, count: data.length, heading: faq.heading, blurb: faq.blurb }\n\t}\n\n\tasync list(args: Record<string, unknown> = {}) {\n\t\treturn this.listFaqs(args)\n\t}\n}\n\nexport const pageService = new PageService()\nexport const faqService = new FaqService()\n","import type { Vendor } from '../engine'\nimport { toVendor } from '../map'\nimport { BaseService, emptyPage, toPage } from './base.service'\n\n/** The marketplace's sellers: approved vendors only. */\nexport class VendorService extends BaseService {\n\tasync list({\n\t\tpage = 1,\n\t\tlimit = 24,\n\t\tq,\n\t\tsearch,\n\t}: { page?: number; limit?: number; q?: string; search?: string; sort?: string } = {}) {\n\t\tconst env = await this.engine<Vendor[] | null>('/api/vendors', { query: { page, limit, q: q ?? search } })\n\t\treturn toPage(env, toVendor)\n\t}\n\n\tasync getVendor(slug: string) {\n\t\treturn toVendor(await this.data<Vendor>(`/api/vendors/${encodeURIComponent(String(slug))}`))\n\t}\n\n\t/**\n\t * A seller's shelf. The engine's vendors sell through offers on the shop's\n\t * own variants and the public API lists no products by seller, so the shelf\n\t * is empty — the seller's page still renders, with their details.\n\t */\n\tasync fetchProductsOfVendor(_vendorId?: string) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport const vendorService = new VendorService()\n","/**\n * The rest of the family's service surface.\n *\n * Svelte Commerce imports some four dozen services by name because Litekart\n * has them, and an export that is missing is a TypeError at import. Each one\n * is here. Where the engine has the thing, it is wired; where it does not, a\n * read of a list answers empty (a shop legitimately has no reels) and anything\n * that would write, or that names one record, throws `NotSupportedError` —\n * a silent success would tell a shopper their message was sent when nothing\n * left the browser.\n */\nimport type { Plugin } from '../engine'\nimport { NotSupportedError } from '../errors'\nimport { readStaticStore } from '../static-store'\nimport { resolveRestLocally } from '../rest-guard'\nimport { BaseService, emptyPage } from './base.service'\nimport { StoreFacts } from './facts'\nimport { MeilisearchService } from './meilisearch-service'\nimport { StoreService } from './store-service'\n\nconst refuse = (service: string, method: string, why: string) => new NotSupportedError(service, method, why)\n\n/** The storefront's contact form and product enquiries, through ext/contact's inbox. */\nexport class ContactService extends BaseService {\n\tasync submitContactUsForm({\n\t\tname,\n\t\temail,\n\t\tphone,\n\t\tmessage,\n\t\tsubject,\n\t}: {\n\t\tname: string\n\t\temail: string\n\t\tphone?: string\n\t\tmessage: string\n\t\tsubject?: string\n\t}) {\n\t\treturn this.data<{ status: string }>('/x/contact/messages', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: {\n\t\t\t\tname: String(name ?? ''),\n\t\t\t\temail: String(email ?? ''),\n\t\t\t\t...(phone ? { phone: String(phone) } : {}),\n\t\t\t\t...(subject ? { subject: String(subject) } : {}),\n\t\t\t\tbody: String(message ?? ''),\n\t\t\t},\n\t\t})\n\t}\n}\n\nexport class EnquiryService extends ContactService {\n\tasync create({\n\t\tname,\n\t\temail,\n\t\tphone,\n\t\tmessage,\n\t\tproductId,\n\t}: {\n\t\tname: string\n\t\temail: string\n\t\tphone?: string\n\t\tmessage: string\n\t\tproductId?: string\n\t}) {\n\t\treturn this.submitContactUsForm({\n\t\t\tname,\n\t\t\temail,\n\t\t\tphone,\n\t\t\tsubject: productId ? `Enquiry about product ${productId}` : 'Enquiry',\n\t\t\tmessage,\n\t\t})\n\t}\n}\n\n/** Enabled plugins and their public settings, `{ key, title, settings }`. */\nexport class PluginService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\tconst data: Plugin[] = [...(await this.facts.plugins()).values()]\n\t\treturn { data, count: data.length, pageSize: data.length, noOfPage: 1, page: 1 }\n\t}\n}\n\n/** The store record again, for the callers that ask for it as \"settings\" or \"init\". */\nexport class SettingService extends BaseService {\n\tasync fetchSettings(_args: Record<string, unknown> = {}) {\n\t\treturn new StoreService(this._fetch).getStoreByIdOrDomain()\n\t}\n\tasync list(args: Record<string, unknown> = {}) {\n\t\treturn this.fetchSettings(args)\n\t}\n}\n\nexport class InitService extends SettingService {\n\tasync fetchInit(_args: Record<string, unknown> = {}) {\n\t\tconst store = await this.fetchSettings()\n\t\treturn { storeOne: store, store, settings: store }\n\t}\n}\n\nexport class HomeService extends BaseService {\n\t/** A homepage is assembled by the storefront from shelves; the engine has no page of its own for it. */\n\tasync getHome(_args: Record<string, unknown> = {}) {\n\t\treturn { banners: [], groupByBanner: [], categories: [], products: [] }\n\t}\n}\n\n/** Countries for the address form: the storefront's own list, which is what it offers anyway. */\nexport class CountryService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn resolveRestLocally('get', '/api/countries')\n\t}\n}\n\n/** The one currency an engine store settles in. */\nexport class CurrencyService extends BaseService {\n\tprivate readonly facts = new StoreFacts(this._fetch)\n\tasync listCurrencies(_args: Record<string, unknown> = {}) {\n\t\tconst { currency } = await this.facts.ready()\n\t\tconst data = [{ code: currency, name: currency, isDefault: true }]\n\t\treturn { data, count: 1, pageSize: 1, noOfPage: 1, page: 1 }\n\t}\n\tasync list(args: Record<string, unknown> = {}) {\n\t\treturn this.listCurrencies(args)\n\t}\n}\n\n/** States are free text on a GoCommerce address; there is no list to offer. */\nexport class StateService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport class RegionService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\n/** The header's type-ahead, under the name some storefront builds still call it by. */\nexport class AutocompleteService extends MeilisearchService {\n\tasync list({ q, search }: { q?: string; search?: string } = {}) {\n\t\treturn this.searchAutoComplete({ query: q ?? search })\n\t}\n}\n\nexport class PopularSearchService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\n/** The engine keeps no popularity score; a page view is not recorded. */\nexport class PopularityService extends BaseService {\n\tasync updatePopularity(_args: Record<string, unknown> = {}) {\n\t\treturn undefined\n\t}\n}\n\nexport class BlogService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n\tasync getOne(_slug: string): Promise<never> {\n\t\tthrow refuse('BlogService', 'getOne', 'the engine has no blog; publish articles as pages')\n\t}\n}\n\nexport class BannerService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n\tasync listBanners(args: Record<string, unknown> = {}) {\n\t\treturn this.list(args)\n\t}\n\tasync fetchBanners(args: Record<string, unknown> = {}) {\n\t\treturn this.list(args)\n\t}\n}\n\nexport class ReelsService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport class DealService extends BaseService {\n\tasync fetchDeals(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport class GalleryService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\nexport class ChatService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n\tasync chats(): Promise<never> {\n\t\tthrow refuse('ChatService', 'chats', 'the engine has no shopper chat')\n\t}\n\tasync save(): Promise<never> {\n\t\tthrow refuse('ChatService', 'save', 'the engine has no shopper chat')\n\t}\n}\n\nexport class FeedbackService extends BaseService {\n\tasync save(): Promise<never> {\n\t\tthrow refuse('FeedbackService', 'save', 'use the contact form')\n\t}\n}\n\nexport class DemoRequestService extends BaseService {\n\tasync save(): Promise<never> {\n\t\tthrow refuse('DemoRequestService', 'save', 'use the contact form')\n\t}\n}\n\nexport class UploadService extends BaseService {\n\tasync uploadMultipleToS3(): Promise<never> {\n\t\tthrow refuse('UploadService', 'uploadMultipleToS3', 'shoppers cannot upload files to the engine')\n\t}\n\tasync upload(): Promise<never> {\n\t\tthrow refuse('UploadService', 'upload', 'shoppers cannot upload files to the engine')\n\t}\n}\n\nexport class WarrantyService extends BaseService {\n\tasync submitWarrantyRegistration(): Promise<never> {\n\t\tthrow refuse('WarrantyService', 'submitWarrantyRegistration', 'the engine has no warranty registrations')\n\t}\n}\n\nexport class VarniCustomDesignService extends BaseService {\n\tasync submitForm(): Promise<never> {\n\t\tthrow refuse('VarniCustomDesignService', 'submitForm', 'custom design requests are a Litekart feature')\n\t}\n}\n\nexport class VarniCustomProductService extends BaseService {\n\tasync list(_args: Record<string, unknown> = {}) {\n\t\treturn emptyPage()\n\t}\n}\n\n/** The storefront's static store record, for code that wants the raw config. */\nexport const staticStore = () => readStaticStore()\n\nexport const contactService = new ContactService()\nexport const enquiryService = new EnquiryService()\nexport const pluginService = new PluginService()\nexport const settingService = new SettingService()\nexport const initService = new InitService()\nexport const homeService = new HomeService()\nexport const countryService = new CountryService()\nexport const currencyService = new CurrencyService()\nexport const stateService = new StateService()\nexport const regionService = new RegionService()\nexport const autocompleteService = new AutocompleteService()\nexport const popularSearchService = new PopularSearchService()\nexport const popularityService = new PopularityService()\nexport const blogService = new BlogService()\nexport const bannerService = new BannerService()\nexport const reelsService = new ReelsService()\nexport const dealService = new DealService()\nexport const galleryService = new GalleryService()\nexport const chatService = new ChatService()\nexport const feedbackService = new FeedbackService()\nexport const demoRequestService = new DemoRequestService()\nexport const uploadService = new UploadService()\nexport const warrantyService = new WarrantyService()\nexport const varniCustomDesignService = new VarniCustomDesignService()\nexport const varniCustomProductService = new VarniCustomProductService()\n\n// kitcommerce-core reads the plural spellings; the family exports the singular. Both, then.\nexport { PluginService as PluginsService, SettingService as SettingsService }\nexport const pluginsService = pluginService\nexport const settingsService = settingService\n","import type { ListMeta, Offer, Variant } from '../engine'\nimport { toMajor } from '../money'\nimport { BaseService } from './base.service'\n\n/**\n * Variants on their own, and the marketplace's offers on one.\n *\n * Svelte Commerce reads variants through their product, so this service is\n * for code written against GoCommerce: it answers the engine's own shapes —\n * numeric ids, money as `{ amount_minor, currency }` — with a major-unit\n * `amount` added beside each price so a template need not divide.\n */\nexport class VariantService extends BaseService {\n\t/** A product's variants, inactive ones included (filter on `active`), in the merchant's order. */\n\tasync list(productId: string | number, { page = 1, limit = 50 }: { page?: number; limit?: number } = {}) {\n\t\tconst env = await this.engine<Variant[] | null>('/api/variants', { query: { product_id: productId, page, limit } })\n\t\treturn { data: (env.data ?? []).map(withAmounts), meta: env.meta as ListMeta | undefined }\n\t}\n\n\tasync getOne(id: string | number) {\n\t\treturn withAmounts(await this.data<Variant>(`/api/variants/${encodeURIComponent(String(id))}`))\n\t}\n\n\t/**\n\t * What each approved seller asks for this variant, cheapest first. A cart\n\t * line takes a variant, not an offer, so this informs a shopper rather than\n\t * choosing who fulfils.\n\t */\n\tasync offers(variantId: string | number) {\n\t\tconst offers =\n\t\t\t(await this.data<Offer[] | null>(`/api/variants/${encodeURIComponent(String(variantId))}/offers`)) ?? []\n\t\treturn offers.map((o) => ({ ...o, price: { ...o.price, amount: toMajor(o.price) } }))\n\t}\n}\n\nfunction withAmounts(v: Variant) {\n\treturn {\n\t\t...v,\n\t\tprice: { ...v.price, amount: toMajor(v.price) },\n\t\tcompare_at_price: v.compare_at_price ? { ...v.compare_at_price, amount: toMajor(v.compare_at_price) } : undefined,\n\t}\n}\n\nexport const variantService = new VariantService()\n","import type { Address, Cart, CheckoutResult, ListMeta, Order, PaymentIntent } from '../engine'\nimport type { Money } from '../money'\nimport { GoCommerceError } from '../errors'\nimport { toCart, toEngineAddress, toOrder } from '../map'\nimport { cartExtras, rememberCartId, rememberOrder, storedCartId, type StorefrontAddress } from '../browser'\nimport { BaseService } from './base.service'\n\n// ---------------------------------------------------------------- ext/b2b shapes\n\nexport type B2bRole = 'admin' | 'approver' | 'buyer'\n\nexport type Company = {\n\tid: number\n\tcode: string\n\tname: string\n\ttax_id: string\n\tstatus: 'active' | 'on_hold' | 'closed'\n\tgroup_id: number | null\n\t/** `null`: no account with the store — the company pays up front. */\n\tcredit_limit: Money | null\n\tnet_days: number\n\t/** `null`: a buyer never needs approval. */\n\tapproval_threshold: Money | null\n\trequire_po: boolean\n\tmember_count: number\n\t/** More than 0: the company is a dealer, and receives leads. */\n\tterritory_count: number\n\tcreated_at: string\n\tupdated_at: string\n}\n\nexport type Credit = {\n\tlimit: Money | null\n\toutstanding: Money\n\tavailable: Money | null\n\toverdue: Money\n\toverdue_orders: number\n\tnet_days: number\n}\n\nexport type Member = {\n\tcompany_id: number\n\tcustomer_id: number\n\temail: string\n\tconfirmed: boolean\n\tname: string\n\trole: B2bRole\n\tcreated_at: string\n}\n\nexport type Invitation = {\n\tid: number\n\tcompany_id: number\n\temail: string\n\trole: B2bRole\n\tinvited_by: string\n\texpires_at: string\n\taccepted_at?: string\n\tcreated_at: string\n}\n\nexport type CompanyOrder = {\n\torder_id: number\n\tnumber: string\n\tstatus: string\n\tpayment_status: string\n\ttotal: Money\n\tpo_number: string\n\tplaced_by: string\n\ton_account: boolean\n\tdue_at?: string\n\toverdue: boolean\n\tcompany_id: number\n\tcompany_name: string\n\tapproval_id?: number\n\tquote_id?: number\n\tcreated_at: string\n}\n\nexport type Approval = {\n\tid: number\n\tcompany_id: number\n\tkind: 'cart' | 'quote'\n\tquote_id?: number\n\tstatus: 'pending' | 'placing' | 'approved' | 'rejected' | 'cancelled'\n\trequested_by: number\n\trequested_by_email: string\n\tlines: { variant_id: number; sku: string; quantity: number; unit_price: Money }[]\n\tsubtotal: Money\n\ttotal: Money\n\tpayment_method: string\n\tpo_number: string\n\tdecided_by?: number\n\tdecided_at?: string\n\treason?: string\n\tlast_error?: string\n\torder_id?: number\n\torder_number?: string\n\tcreated_at: string\n\tupdated_at: string\n}\n\nexport type Quote = {\n\tid: number\n\tnumber: string\n\tcompany_id: number\n\tcompany_name: string\n\tstatus: 'requested' | 'quoted' | 'awaiting_approval' | 'accepted' | 'declined' | 'expired'\n\trequested_by: number\n\trequested_by_email: string\n\tnote: string\n\treply: string\n\tdeclined_by?: string\n\tlines: { variant_id: number; sku: string; title: string; quantity: number; unit_price: Money | null }[]\n\ttotal: Money | null\n\texpires_at?: string\n\tquoted_at?: string\n\taccepted_at?: string\n\torder_id?: number\n\torder_number?: string\n\tcreated_at: string\n\tupdated_at: string\n}\n\nexport type Lead = {\n\tid: number\n\tname: string\n\temail: string\n\tphone: string\n\tmessage: string\n\tcountry: string\n\tstate: string\n\tpostal_code: string\n\tvariant_id: number | null\n\tproduct_id: number | null\n\tproduct_title?: string\n\tvariant_sku?: string\n\tstatus: 'new' | 'contacted' | 'won' | 'lost'\n\tcompany_id: number | null\n\tcompany_name?: string\n\trouted_by: 'territory' | 'store' | 'unrouted'\n\tsource: string\n\tcreated_at: string\n\tupdated_at: string\n}\n\nexport type RejectedLine = {\n\tsku: string\n\tvariant_id: number | null\n\tquantity: number\n\treason: 'not_found' | 'inactive' | 'insufficient_stock' | 'invalid'\n\tmessage: string\n}\n\ntype Paged<T> = { data: T[]; meta?: ListMeta }\n\ntype PlaceOptions = {\n\t/** An engine payment code; omitted, the company's account (`on_account`) when it has one. */\n\tpaymentMethod?: string\n\t/** Required when the company says so (`company.require_po`). */\n\tpoNumber?: string\n\tname?: string\n\tphone?: string\n\t/** Defaults to the address the checkout's address step kept for this cart. */\n\taddress?: StorefrontAddress | Address\n}\n\n/** A checkout or quote acceptance either placed an order or, for a buyer over the limit, asked for approval. */\nexport type B2bPlaced =\n\t| { kind: 'order'; orderNo: string; order: ReturnType<typeof toOrder>; payment: PaymentIntent }\n\t| { kind: 'approval'; approval: Approval }\n\n/**\n * Buying for a business (ext/b2b): a company with buyers in roles, orders on\n * account against a credit limit, approvals, quotes, a quick order by SKU, a\n * repeat order, and a dealer's leads.\n *\n * Every call but `submitLead` needs a signed-in shopper (ext/identity) who is\n * a member of a company; a signed-in account that is not answers 403, so\n * `me()` is how a storefront tells a business account from a consumer one.\n * Answers are the engine's own shapes — numeric ids, money as\n * `{ amount_minor, currency }` — except carts, which come back as the\n * storefront's bag so a quick-order page can hand them straight to it.\n */\nexport class B2bService extends BaseService {\n\t// ------------------------------------------------------------ company\n\n\t/** The company, the caller's role in it, and its credit: limit, outstanding, available, overdue. */\n\tasync me() {\n\t\tconst me = await this.data<{\n\t\t\tcompany: Company & { notes?: string; metadata?: unknown }\n\t\t\trole: B2bRole\n\t\t\tcredit: Credit\n\t\t}>('/x/b2b/me', { auth: true })\n\t\t// The engine answers the store's own notes on the company to its buyers;\n\t\t// they are not this storefront's to show.\n\t\tconst { notes: _notes, metadata: _metadata, ...company } = me.company\n\t\treturn { company: company as Company, role: me.role, credit: me.credit }\n\t}\n\n\tasync members() {\n\t\treturn (await this.data<Member[] | null>('/x/b2b/members', { auth: true })) ?? []\n\t}\n\n\t/** Admin only. Demoting the last admin is refused (409). */\n\tasync setMemberRole(customerId: number | string, role: B2bRole) {\n\t\treturn this.data<Member>(`/x/b2b/members/${id(customerId)}`, { method: 'PATCH', auth: true, body: { role } })\n\t}\n\n\t/** An admin removes anyone; any member may remove themselves. */\n\tasync removeMember(customerId: number | string) {\n\t\tawait this.engine(`/x/b2b/members/${id(customerId)}`, { method: 'DELETE', auth: true })\n\t}\n\n\t// ------------------------------------------------------------ invitations\n\n\t/** Admin only. Open invitations: not accepted, not expired. */\n\tasync invitations() {\n\t\treturn (await this.data<Invitation[] | null>('/x/b2b/invitations', { auth: true })) ?? []\n\t}\n\n\t/** Admin only. Emails a link; a second invitation to the same address replaces the first. */\n\tasync invite({ email, role }: { email: string; role: B2bRole }) {\n\t\treturn this.data<Invitation>('/x/b2b/invitations', {\n\t\t\tmethod: 'POST',\n\t\t\tauth: true,\n\t\t\tbody: { email: String(email ?? '').trim(), role },\n\t\t})\n\t}\n\n\tasync withdrawInvitation(invitationId: number | string) {\n\t\tawait this.engine(`/x/b2b/invitations/${id(invitationId)}`, { method: 'DELETE', auth: true })\n\t}\n\n\t/**\n\t * The token from the invitation email, accepted by the account it was sent\n\t * to — which also confirms that account's email address.\n\t */\n\tasync acceptInvitation(token: string) {\n\t\treturn this.data<Member>('/x/b2b/invitations/accept', {\n\t\t\tmethod: 'POST',\n\t\t\tauth: true,\n\t\t\tbody: { token: String(token ?? '').trim() },\n\t\t})\n\t}\n\n\t// ------------------------------------------------------------ filling a basket\n\n\t/**\n\t * A quick order: up to 500 lines by SKU or variant id, into the bag (or a new\n\t * one), at the company's prices. A line that will not go in is reported in\n\t * `rejected` with its reason; the rest are added.\n\t */\n\tasync addLines({\n\t\tcartId,\n\t\tlines,\n\t}: {\n\t\tcartId?: string\n\t\tlines: { sku?: string; variantId?: number | string; quantity: number }[]\n\t}) {\n\t\tconst res = await this.data<{ cart: Cart; rejected: RejectedLine[] | null }>('/x/b2b/cart/lines', {\n\t\t\tmethod: 'POST',\n\t\t\tauth: true,\n\t\t\tbody: {\n\t\t\t\t...((cartId ?? storedCartId()) ? { cart_id: cartId ?? storedCartId() } : {}),\n\t\t\t\tlines: (lines ?? []).map((l) => ({\n\t\t\t\t\t...(l.variantId ? { variant_id: Number(l.variantId) } : {}),\n\t\t\t\t\t...(l.sku ? { sku: String(l.sku).trim() } : {}),\n\t\t\t\t\tquantity: Number(l.quantity),\n\t\t\t\t})),\n\t\t\t},\n\t\t})\n\t\trememberCartId(res.cart.id)\n\t\treturn { cart: toCart(res.cart, cartExtras(res.cart.id)), rejected: res.rejected ?? [] }\n\t}\n\n\t/** A past order's lines in a new bag, at today's prices. Nothing is placed. */\n\tasync reorder(orderId: number | string) {\n\t\tconst res = await this.data<{ cart: Cart; rejected: RejectedLine[] | null }>(\n\t\t\t`/x/b2b/orders/${id(orderId)}/reorder`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\tauth: true,\n\t\t\t},\n\t\t)\n\t\trememberCartId(res.cart.id)\n\t\treturn { cart: toCart(res.cart, cartExtras(res.cart.id)), rejected: res.rejected ?? [] }\n\t}\n\n\t// ------------------------------------------------------------ placing an order\n\n\t/**\n\t * Places the bag through the company: on account by default, with a PO\n\t * number, optionally only some lines (`lineIds`). A buyer over the company's\n\t * approval threshold gets `{ kind: 'approval' }` instead of an order — the\n\t * bag stays as it was, and an approver places it later.\n\t *\n\t * Over the credit limit is 403 `credit_limit_exceeded`; `me().credit` says\n\t * how much is available before the shopper tries.\n\t */\n\tasync checkout({\n\t\tcartId,\n\t\tlineIds,\n\t\tshippingRateId,\n\t\treturnUrl,\n\t\tpaymentData,\n\t\t...opts\n\t}: PlaceOptions & {\n\t\tcartId?: string\n\t\tlineIds?: (number | string)[]\n\t\tshippingRateId?: number | string\n\t\treturnUrl?: string\n\t\tpaymentData?: Record<string, string>\n\t} = {}): Promise<B2bPlaced> {\n\t\tconst cart = cartId || storedCartId()\n\t\tif (!cart) throw new GoCommerceError('Your bag is empty.', 400)\n\t\tconst extras = cartExtras(cart)\n\t\tconst rate = shippingRateId ?? extras.shippingRateId\n\t\tconst body = {\n\t\t\tcart_id: cart,\n\t\t\t...this.placeBody(opts, extras.shippingAddress ?? undefined),\n\t\t\t...(rate ? { shipping_rate_id: Number(rate) } : {}),\n\t\t\t...(lineIds?.length ? { line_ids: lineIds.map(Number) } : {}),\n\t\t\t...(returnUrl ? { return_url: returnUrl } : {}),\n\t\t\t...(paymentData ? { payment_data: paymentData } : {}),\n\t\t}\n\t\tconst res = await this.data<CheckoutResult & { approval?: Approval }>('/x/b2b/checkout', {\n\t\t\tmethod: 'POST',\n\t\t\tauth: true,\n\t\t\tbody,\n\t\t\theaders: { 'Idempotency-Key': attemptKey(`b2b:${JSON.stringify(body)}`) },\n\t\t})\n\t\treturn this.placed(res, cart)\n\t}\n\n\t// ------------------------------------------------------------ the company's orders\n\n\t/** Admins and approvers see the company's; a buyer sees their own. `q` matches the number, PO or email. */\n\tasync orders({\n\t\tpage = 1,\n\t\tlimit = 20,\n\t\tq,\n\t\toverdue,\n\t}: { page?: number; limit?: number; q?: string; overdue?: boolean } = {}) {\n\t\treturn this.engine<CompanyOrder[]>('/x/b2b/orders', {\n\t\t\tauth: true,\n\t\t\tquery: { page, limit, q, ...(overdue ? { overdue: 'true' } : {}) },\n\t\t}) as Promise<Paged<CompanyOrder>>\n\t}\n\n\t// ------------------------------------------------------------ approvals\n\n\tasync approvals({\n\t\tpage = 1,\n\t\tlimit = 20,\n\t\tstatus,\n\t}: { page?: number; limit?: number; status?: Approval['status'] } = {}) {\n\t\treturn this.engine<Approval[]>('/x/b2b/approvals', { auth: true, query: { page, limit, status } }) as Promise<\n\t\t\tPaged<Approval>\n\t\t>\n\t}\n\n\tasync approval(approvalId: number | string) {\n\t\treturn this.data<Approval>(`/x/b2b/approvals/${id(approvalId)}`, { auth: true })\n\t}\n\n\t/**\n\t * Admin or approver: places the requested order at the prices it was\n\t * requested at. Credit limits and holds still apply. The payment intent is\n\t * the approver's to act on — for an account order there is nothing to do.\n\t */\n\tasync approve(approvalId: number | string) {\n\t\tconst res = await this.data<CheckoutResult & { approval: Approval }>(`/x/b2b/approvals/${id(approvalId)}/approve`, {\n\t\t\tmethod: 'POST',\n\t\t\tauth: true,\n\t\t})\n\t\treturn { approval: res.approval, orderNo: res.order.number, order: toOrder(res.order), payment: res.payment }\n\t}\n\n\tasync reject(approvalId: number | string, reason?: string) {\n\t\treturn this.data<Approval>(`/x/b2b/approvals/${id(approvalId)}/reject`, {\n\t\t\tmethod: 'POST',\n\t\t\tauth: true,\n\t\t\t...(reason ? { body: { reason } } : {}),\n\t\t})\n\t}\n\n\t/** The buyer who asked withdraws the request. */\n\tasync cancelApproval(approvalId: number | string) {\n\t\treturn this.data<Approval>(`/x/b2b/approvals/${id(approvalId)}/cancel`, { method: 'POST', auth: true })\n\t}\n\n\t// ------------------------------------------------------------ quotes\n\n\tasync quotes({ page = 1, limit = 20, status }: { page?: number; limit?: number; status?: Quote['status'] } = {}) {\n\t\treturn this.engine<Quote[]>('/x/b2b/quotes', { auth: true, query: { page, limit, status } }) as Promise<\n\t\t\tPaged<Quote>\n\t\t>\n\t}\n\n\tasync quote(quoteId: number | string) {\n\t\treturn this.data<Quote>(`/x/b2b/quotes/${id(quoteId)}`, { auth: true })\n\t}\n\n\t/** Asks the store to price these lines. The store answers with unit prices and an expiry. */\n\tasync requestQuote({ lines, note }: { lines: { variantId: number | string; quantity: number }[]; note?: string }) {\n\t\treturn this.data<Quote>('/x/b2b/quotes', {\n\t\t\tmethod: 'POST',\n\t\t\tauth: true,\n\t\t\tbody: {\n\t\t\t\tlines: (lines ?? []).map((l) => ({ variant_id: Number(l.variantId), quantity: Number(l.quantity) })),\n\t\t\t\t...(note ? { note } : {}),\n\t\t\t},\n\t\t})\n\t}\n\n\t/** Places the quote at its agreed prices — or, for a buyer over the threshold, asks for approval. */\n\tasync acceptQuote(quoteId: number | string, opts: PlaceOptions = {}): Promise<B2bPlaced> {\n\t\tconst res = await this.data<CheckoutResult & { approval?: Approval }>(`/x/b2b/quotes/${id(quoteId)}/accept`, {\n\t\t\tmethod: 'POST',\n\t\t\tauth: true,\n\t\t\tbody: this.placeBody(opts),\n\t\t})\n\t\treturn this.placed(res)\n\t}\n\n\tasync declineQuote(quoteId: number | string) {\n\t\treturn this.data<Quote>(`/x/b2b/quotes/${id(quoteId)}/decline`, { method: 'POST', auth: true })\n\t}\n\n\t// ------------------------------------------------------------ dealer leads\n\n\t/**\n\t * The public \"find a dealer\" form: no account needed. The engine routes it to\n\t * the dealer whose territory covers the address — or keeps it — and answers\n\t * the same either way, so the form never reveals who got it.\n\t */\n\tasync submitLead(lead: {\n\t\tname?: string\n\t\temail?: string\n\t\tphone?: string\n\t\tmessage?: string\n\t\tcountry?: string\n\t\tstate?: string\n\t\tpostalCode?: string\n\t\tproductId?: number | string\n\t\tvariantId?: number | string\n\t\tsource?: string\n\t}) {\n\t\treturn this.data<{ accepted: boolean }>('/x/b2b/leads', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: {\n\t\t\t\t...(lead.name ? { name: lead.name } : {}),\n\t\t\t\t...(lead.email ? { email: lead.email } : {}),\n\t\t\t\t...(lead.phone ? { phone: lead.phone } : {}),\n\t\t\t\t...(lead.message ? { message: lead.message } : {}),\n\t\t\t\t...(lead.country ? { country: lead.country } : {}),\n\t\t\t\t...(lead.state ? { state: lead.state } : {}),\n\t\t\t\t...(lead.postalCode ? { postal_code: lead.postalCode } : {}),\n\t\t\t\t...(lead.productId ? { product_id: Number(lead.productId) } : {}),\n\t\t\t\t...(lead.variantId ? { variant_id: Number(lead.variantId) } : {}),\n\t\t\t\t...(lead.source ? { source: lead.source } : {}),\n\t\t\t},\n\t\t})\n\t}\n\n\t/** A dealer's admins and approvers: the leads routed to their company. */\n\tasync leads({ page = 1, limit = 20, status }: { page?: number; limit?: number; status?: Lead['status'] } = {}) {\n\t\treturn this.engine<Lead[]>('/x/b2b/leads', { auth: true, query: { page, limit, status } }) as Promise<Paged<Lead>>\n\t}\n\n\tasync setLeadStatus(leadId: number | string, status: Lead['status']) {\n\t\treturn this.data<Lead>(`/x/b2b/leads/${id(leadId)}`, { method: 'PATCH', auth: true, body: { status } })\n\t}\n\n\t// ------------------------------------------------------------ internals\n\n\t/** The fields checkout and quote acceptance share. Only declared ones: the engine refuses the rest. */\n\tprivate placeBody(opts: PlaceOptions, fallback?: StorefrontAddress) {\n\t\tconst raw = opts.address ?? fallback\n\t\tif (!raw) throw new GoCommerceError('Add a delivery address first.', 400)\n\t\tconst address = 'line1' in raw ? (raw as Address) : toEngineAddress(raw as StorefrontAddress)\n\t\treturn {\n\t\t\taddress,\n\t\t\t...(opts.paymentMethod ? { payment_method: String(opts.paymentMethod).toLowerCase() } : {}),\n\t\t\t...(opts.poNumber ? { po_number: String(opts.poNumber).trim() } : {}),\n\t\t\t...((opts.name ?? address.name) ? { name: opts.name ?? address.name } : {}),\n\t\t\t...((opts.phone ?? address.phone) ? { phone: opts.phone ?? address.phone } : {}),\n\t\t}\n\t}\n\n\tprivate placed(res: Partial<CheckoutResult> & { approval?: Approval }, cartId?: string): B2bPlaced {\n\t\tif (res.approval && !res.order) return { kind: 'approval', approval: res.approval }\n\t\tconst order = res.order as Order\n\t\tif (order.access_token && cartId) {\n\t\t\trememberOrder({ number: order.number, token: order.access_token, cartId, reference: res.payment?.reference })\n\t\t}\n\t\treturn { kind: 'order', orderNo: order.number, order: toOrder(order), payment: res.payment as PaymentIntent }\n\t}\n}\n\nconst id = (v: number | string) => encodeURIComponent(String(v))\n\n/**\n * One Idempotency-Key per distinct request, kept for the page's life: a retry\n * of the same checkout — a double click, a timeout — resumes it rather than\n * placing a second order, and a changed request gets a new key, since the\n * engine refuses a key replayed with a different body.\n */\nconst keys = new Map<string, string>()\nfunction attemptKey(request: string): string {\n\tlet key = keys.get(request)\n\tif (!key) {\n\t\tconst c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto\n\t\tkey = c?.randomUUID?.() ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`\n\t\tkeys.set(request, key)\n\t}\n\treturn key\n}\n\nexport const b2bService = new B2bService()\n"]}
|