the-foxy-library 1.0.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.
Files changed (125) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/components/index.d.ts +33 -0
  4. package/dist/components/iv-accordion.d.ts +11 -0
  5. package/dist/components/iv-banner.d.ts +11 -0
  6. package/dist/components/iv-button.d.ts +11 -0
  7. package/dist/components/iv-card.d.ts +11 -0
  8. package/dist/components/iv-carousel.d.ts +11 -0
  9. package/dist/components/iv-dynamic-products-carousel.d.ts +11 -0
  10. package/dist/components/iv-dynamic-products.d.ts +11 -0
  11. package/dist/components/iv-filters.d.ts +11 -0
  12. package/dist/components/iv-layout.d.ts +11 -0
  13. package/dist/components/iv-link.d.ts +11 -0
  14. package/dist/components/iv-modal.d.ts +11 -0
  15. package/dist/components/iv-predictive-search.d.ts +11 -0
  16. package/dist/components/iv-recently-viewed.d.ts +11 -0
  17. package/dist/components/iv-sidebar.d.ts +11 -0
  18. package/dist/components/iv-spinner.d.ts +11 -0
  19. package/dist/components/iv-suggest.d.ts +11 -0
  20. package/dist/components/iv-tabs.d.ts +11 -0
  21. package/dist/components/iv-toast-container.d.ts +11 -0
  22. package/dist/components/iv-toast.d.ts +11 -0
  23. package/dist/components/iv-wishlist-view.d.ts +11 -0
  24. package/dist/components/iv-wishlist.d.ts +11 -0
  25. package/dist/components/sw-in-grid-content.d.ts +11 -0
  26. package/dist/components/sw-size-guide.d.ts +11 -0
  27. package/dist/intravenous/factory-1QinX-o0.js +275 -0
  28. package/dist/intravenous/factory-1QinX-o0.js.map +1 -0
  29. package/dist/intravenous/factory-JClanx-E.js +596 -0
  30. package/dist/intravenous/factory-JClanx-E.js.map +1 -0
  31. package/dist/intravenous/factory-mrqy6XUM.js +36 -0
  32. package/dist/intravenous/factory-mrqy6XUM.js.map +1 -0
  33. package/dist/intravenous/index-Py50VI8u.js +4761 -0
  34. package/dist/intravenous/index-Py50VI8u.js.map +1 -0
  35. package/dist/intravenous/index.esm.js +17 -0
  36. package/dist/intravenous/index.esm.js.map +1 -0
  37. package/dist/intravenous/intravenous.esm.js +48 -0
  38. package/dist/intravenous/intravenous.esm.js.map +1 -0
  39. package/dist/intravenous/iv-accordion.entry.esm.js.map +1 -0
  40. package/dist/intravenous/iv-accordion.entry.js +35 -0
  41. package/dist/intravenous/iv-banner.entry.esm.js.map +1 -0
  42. package/dist/intravenous/iv-banner.entry.js +28 -0
  43. package/dist/intravenous/iv-button.entry.esm.js.map +1 -0
  44. package/dist/intravenous/iv-button.entry.js +40 -0
  45. package/dist/intravenous/iv-card.entry.esm.js.map +1 -0
  46. package/dist/intravenous/iv-card.entry.js +82 -0
  47. package/dist/intravenous/iv-carousel.entry.esm.js.map +1 -0
  48. package/dist/intravenous/iv-carousel.entry.js +16 -0
  49. package/dist/intravenous/iv-dynamic-products-carousel.entry.esm.js.map +1 -0
  50. package/dist/intravenous/iv-dynamic-products-carousel.entry.js +114 -0
  51. package/dist/intravenous/iv-dynamic-products.entry.esm.js.map +1 -0
  52. package/dist/intravenous/iv-dynamic-products.entry.js +97 -0
  53. package/dist/intravenous/iv-filters.entry.esm.js.map +1 -0
  54. package/dist/intravenous/iv-filters.entry.js +19 -0
  55. package/dist/intravenous/iv-layout.entry.esm.js.map +1 -0
  56. package/dist/intravenous/iv-layout.entry.js +60 -0
  57. package/dist/intravenous/iv-link.entry.esm.js.map +1 -0
  58. package/dist/intravenous/iv-link.entry.js +25 -0
  59. package/dist/intravenous/iv-modal.entry.esm.js.map +1 -0
  60. package/dist/intravenous/iv-modal.entry.js +19 -0
  61. package/dist/intravenous/iv-predictive-search.entry.esm.js.map +1 -0
  62. package/dist/intravenous/iv-predictive-search.entry.js +311 -0
  63. package/dist/intravenous/iv-recently-viewed.entry.esm.js.map +1 -0
  64. package/dist/intravenous/iv-recently-viewed.entry.js +101 -0
  65. package/dist/intravenous/iv-sidebar.entry.esm.js.map +1 -0
  66. package/dist/intravenous/iv-sidebar.entry.js +24 -0
  67. package/dist/intravenous/iv-spinner.entry.esm.js.map +1 -0
  68. package/dist/intravenous/iv-spinner.entry.js +19 -0
  69. package/dist/intravenous/iv-suggest.entry.esm.js.map +1 -0
  70. package/dist/intravenous/iv-suggest.entry.js +72 -0
  71. package/dist/intravenous/iv-tabs.entry.esm.js.map +1 -0
  72. package/dist/intravenous/iv-tabs.entry.js +22 -0
  73. package/dist/intravenous/iv-toast-container.entry.esm.js.map +1 -0
  74. package/dist/intravenous/iv-toast-container.entry.js +44 -0
  75. package/dist/intravenous/iv-toast.entry.esm.js.map +1 -0
  76. package/dist/intravenous/iv-toast.entry.js +23 -0
  77. package/dist/intravenous/iv-wishlist-view.entry.esm.js.map +1 -0
  78. package/dist/intravenous/iv-wishlist-view.entry.js +21 -0
  79. package/dist/intravenous/iv-wishlist.entry.esm.js.map +1 -0
  80. package/dist/intravenous/iv-wishlist.entry.js +73 -0
  81. package/dist/intravenous/loader.esm.js.map +1 -0
  82. package/dist/intravenous/sw-in-grid-content.entry.esm.js.map +1 -0
  83. package/dist/intravenous/sw-in-grid-content.entry.js +18 -0
  84. package/dist/intravenous/sw-size-guide.entry.esm.js.map +1 -0
  85. package/dist/intravenous/sw-size-guide.entry.js +111 -0
  86. package/dist/types/components/iv-accordion/iv-accordion.d.ts +12 -0
  87. package/dist/types/components/iv-banner/iv-banner.d.ts +7 -0
  88. package/dist/types/components/iv-button/iv-button.d.ts +12 -0
  89. package/dist/types/components/iv-card/iv-card.d.ts +15 -0
  90. package/dist/types/components/iv-carousel/iv-carousel.d.ts +3 -0
  91. package/dist/types/components/iv-dynamic-products/iv-dynamic-products.d.ts +26 -0
  92. package/dist/types/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.d.ts +29 -0
  93. package/dist/types/components/iv-filters/iv-filters.d.ts +3 -0
  94. package/dist/types/components/iv-layout/iv-layout.d.ts +12 -0
  95. package/dist/types/components/iv-link/iv-link.d.ts +9 -0
  96. package/dist/types/components/iv-modal/iv-modal.d.ts +3 -0
  97. package/dist/types/components/iv-predictive-search/iv-predictive-search.d.ts +44 -0
  98. package/dist/types/components/iv-recently-viewed/iv-recently-viewed.d.ts +17 -0
  99. package/dist/types/components/iv-sidebar/iv-sidebar.d.ts +5 -0
  100. package/dist/types/components/iv-spinner/iv-spinner.d.ts +4 -0
  101. package/dist/types/components/iv-suggest/iv-suggest.d.ts +21 -0
  102. package/dist/types/components/iv-tabs/iv-tabs.d.ts +7 -0
  103. package/dist/types/components/iv-toast/iv-toast.d.ts +7 -0
  104. package/dist/types/components/iv-toast-container/iv-toast-container.d.ts +8 -0
  105. package/dist/types/components/iv-wishlist/iv-wishlist.d.ts +16 -0
  106. package/dist/types/components/iv-wishlist-view/iv-wishlist-view.d.ts +3 -0
  107. package/dist/types/components/sw-in-grid-content/sw-in-grid-content.d.ts +3 -0
  108. package/dist/types/components/sw-size-guide/sw-size-guide.d.ts +14 -0
  109. package/dist/types/components.d.ts +943 -0
  110. package/dist/types/global/app.d.ts +1 -0
  111. package/dist/types/index.d.ts +11 -0
  112. package/dist/types/stencil-public-runtime.d.ts +1746 -0
  113. package/dist/types/utils/caching/factory.d.ts +72 -0
  114. package/dist/types/utils/config/factory.d.ts +2 -0
  115. package/dist/types/utils/error_handling/factory.d.ts +58 -0
  116. package/dist/types/utils/helpers/factory.d.ts +6 -0
  117. package/dist/types/utils/store/store.d.ts +21 -0
  118. package/dist/types/utils/storefront_api/factory.d.ts +22 -0
  119. package/dist/types/utils/utils.d.ts +1 -0
  120. package/loader/cdn.js +1 -0
  121. package/loader/index.cjs.js +1 -0
  122. package/loader/index.d.ts +24 -0
  123. package/loader/index.es2017.js +1 -0
  124. package/loader/index.js +2 -0
  125. package/package.json +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-JClanx-E.js","sources":["src/utils/caching/factory.ts","src/utils/caching/productCache.ts","src/utils/error_handling/factory.ts"],"sourcesContent":["/*\n Generic caching factory for component data (and optionally pre-rendered markup).\n Focus: Avoid repeated Storefront API calls across page loads & multiple instances.\n\n Strategy:\n - Cache normalized data (preferred) so Stencil still renders & binds events.\n - Optional markup caching (only for fully static / idempotent HTML) via setMarkup/getMarkup helpers.\n - Deterministic key: namespace + stable-hash(params + version + type).\n - Supports localStorage / sessionStorage / memory fallback.\n - TTL + optional staleWhileRevalidate.\n - Inflight request dedupe (single network fetch per key at a time).\n - Event emission (CustomEvent 'iv-cache') for diagnostics (hit/miss/stale/set/purge/error).\n\n IMPORTANT NOTE ABOUT MARKUP CACHING:\n Injecting raw cached markup can skip Stencil lifecycle & event listener binding.\n Prefer data caching and regular render path. Use markup caching only for static read-only fragments.\n*/\n\nexport interface CacheStored<T=any> {\n v: string; // version\n ts: number; // timestamp (ms)\n ttl: number; // time-to-live (ms)\n t: 'data' | 'markup'; // entry type\n data: T; // payload (string for markup)\n meta?: Record<string, any>;\n}\n\nexport interface CacheGetResult<T=any> {\n data?: T;\n meta?: Record<string, any>;\n isExpired: boolean;\n isStale: boolean;\n ageMs: number;\n raw?: CacheStored<T>;\n}\n\nexport interface CacheEventDetail {\n action: 'hit' | 'miss' | 'stale' | 'set' | 'purge' | 'error' | 'evict';\n key: string;\n namespace: string;\n info?: any;\n}\n\ninterface StorageAdapter {\n getItem(k: string): string | null;\n setItem(k: string, v: string): void;\n removeItem(k: string): void;\n keys(): string[]; // restricted to ones we can iterate\n}\n\ninterface CreateCacheOptions {\n namespace: string; // e.g. 'iv-dynamic-products'\n version?: string; // bump to invalidate all\n storage?: 'local' | 'session' | 'memory';\n prefix?: string; // key prefix\n defaultTTL?: number; // ms (fresh window)\n staleTTL?: number; // optional extra stale window (stale-while-revalidate)\n maxEntries?: number; // soft cap\n maxValueBytes?: number; // guard large payloads\n serialize?: (v: any) => string;\n deserialize?: (s: string) => any;\n dispatchEvents?: boolean; // emit CustomEvents\n target?: HTMLElement | Window; // event target\n}\n\ninterface GetOrSetOptions<T=any> {\n ttl?: number;\n meta?: Record<string, any>;\n staleWhileRevalidate?: boolean;\n type?: 'data' | 'markup';\n transform?: (fresh: any) => T; // allow post-processing before store\n}\n\nexport function createCache(options: CreateCacheOptions) {\n const {\n namespace,\n version = '1',\n storage = 'local',\n prefix = 'iv:cache:',\n defaultTTL = 1000 * 60 * 5,\n staleTTL,\n maxEntries = 200,\n maxValueBytes = 250_000, // ~250 KB safety guard\n serialize = JSON.stringify,\n deserialize = JSON.parse,\n dispatchEvents = true,\n target = (typeof window !== 'undefined' ? window : undefined)\n } = options;\n\n const adapter = resolveAdapter(storage);\n const inflight = new Map<string, Promise<any>>();\n let opCount = 0;\n\n function emit(action: CacheEventDetail['action'], key: string, info?: any) {\n if(!dispatchEvents || !target || typeof (target as any).dispatchEvent !== 'function') return;\n try {\n const detail: CacheEventDetail = { action, key, namespace, info };\n target.dispatchEvent(new CustomEvent('iv-cache', { detail, bubbles: true, composed: true }));\n } catch(_) {}\n }\n\n function stableString(obj: any): string {\n if(obj === null) return 'null';\n const type = typeof obj;\n if(type !== 'object') return JSON.stringify(obj);\n if(Array.isArray(obj)) return '[' + obj.map(stableString).join(',') + ']';\n const keys = Object.keys(obj).sort();\n return '{' + keys.map(k => JSON.stringify(k)+':'+stableString(obj[k])).join(',') + '}';\n }\n\n function hash(str: string): string {\n let h = 5381, i = str.length;\n while(i) h = (h * 33) ^ str.charCodeAt(--i);\n return (h >>> 0).toString(36);\n }\n\n function buildKey(type: 'data' | 'markup', params: Record<string, any>): string {\n const base = stableString(params);\n return `${prefix}${namespace}:${type}:${version}:${hash(base)}`;\n }\n\n function read<T>(key: string): CacheGetResult<T> {\n try {\n const rawStr = adapter.getItem(key);\n if(!rawStr) return { isExpired: true, isStale: false, ageMs: 0 };\n const stored: CacheStored<T> = deserialize(rawStr);\n if(!stored || stored.v !== version) return { isExpired: true, isStale: false, ageMs: 0 };\n const ageMs = Date.now() - stored.ts;\n const isExpired = ageMs > stored.ttl;\n const isStale = isExpired && staleTTL ? ageMs <= stored.ttl + staleTTL : false;\n return { data: stored.data, meta: stored.meta, isExpired, isStale, ageMs, raw: stored };\n } catch(err) {\n emit('error', key, { err: (err as any)?.message });\n return { isExpired: true, isStale: false, ageMs: 0 };\n }\n }\n\n function write<T>(key: string, type: 'data' | 'markup', data: T, cfg?: { ttl?: number; meta?: Record<string, any> }) {\n const ttl = cfg?.ttl ?? defaultTTL;\n const stored: CacheStored<T> = { v: version, ts: Date.now(), ttl, t: type, data, meta: cfg?.meta };\n try {\n const payload = serialize(stored);\n if(maxValueBytes && byteLength(payload) > maxValueBytes) {\n emit('error', key, { reason: 'oversize', bytes: byteLength(payload) });\n return;\n }\n adapter.setItem(key, payload);\n emit('set', key, { ttl, type });\n enforceLimit();\n } catch(err) {\n emit('error', key, { err: (err as any)?.message });\n }\n }\n\n function get<T>(key: string): CacheGetResult<T> {\n const res = read<T>(key);\n if(res.data && !res.isExpired) emit('hit', key, { ageMs: res.ageMs });\n else if(res.data && res.isExpired && res.isStale) emit('stale', key, { ageMs: res.ageMs });\n else emit('miss', key);\n return res;\n }\n\n async function getOrSet<T>(key: string, type: 'data' | 'markup', fetcher: () => Promise<T>, opts?: GetOrSetOptions<T>): Promise<T> {\n const existing = get<T>(key);\n if(existing.data && !existing.isExpired) return existing.data;\n if(existing.data && existing.isStale && opts?.staleWhileRevalidate) {\n // return stale, refresh in background\n refresh(key, type, fetcher, opts);\n return existing.data;\n }\n if(inflight.has(key)) return inflight.get(key)!;\n const p = (async () => {\n try {\n const raw = await fetcher();\n const transformed = opts?.transform ? opts.transform(raw) : raw;\n write(key, type, transformed, { ttl: opts?.ttl, meta: opts?.meta });\n return transformed;\n } finally {\n inflight.delete(key);\n }\n })();\n inflight.set(key, p);\n return p;\n }\n\n function refresh<T>(key: string, type: 'data' | 'markup', fetcher: () => Promise<T>, opts?: GetOrSetOptions<T>) {\n return getOrSet(key, type, fetcher, opts); // reuse logic\n }\n\n function purge(key: string) {\n adapter.removeItem(key);\n emit('purge', key);\n }\n\n function purgePattern(pattern: RegExp | ((k: string) => boolean)) {\n const keys = adapter.keys();\n for(const k of keys) {\n if(!k.startsWith(`${prefix}${namespace}:`)) continue;\n const matched = typeof pattern === 'function' ? pattern(k) : pattern.test(k);\n if(matched) purge(k);\n }\n }\n\n function clearNamespace() { purgePattern(() => true); }\n\n function enforceLimit() {\n if(!adapter.keys) return;\n opCount++;\n // only enforce every 20 writes to reduce overhead\n if(opCount % 20 !== 0) return;\n const keys = adapter.keys().filter(k => k.startsWith(`${prefix}${namespace}:`));\n if(keys.length <= maxEntries) return;\n const arr = keys.map(k => {\n try { const raw = deserialize(adapter.getItem(k)!); return { k, ts: raw?.ts || 0 }; } catch { return { k, ts: 0 }; }\n }).sort((a,b) => a.ts - b.ts); // oldest first\n const removeCount = keys.length - maxEntries;\n arr.slice(0, removeCount).forEach(e => { purge(e.k); emit('evict', e.k); });\n }\n\n // Convenience wrappers for common patterns\n function keyForData(params: Record<string, any>) { return buildKey('data', params); }\n function keyForMarkup(params: Record<string, any>) { return buildKey('markup', params); }\n\n function setData<T>(params: Record<string, any>, data: T, cfg?: { ttl?: number; meta?: Record<string, any> }) {\n write(keyForData(params), 'data', data, cfg);\n }\n\n function getData<T>(params: Record<string, any>): CacheGetResult<T> {\n return get<T>(keyForData(params));\n }\n\n function getOrSetData<T>(params: Record<string, any>, fetcher: () => Promise<T>, opts?: GetOrSetOptions<T>) {\n return getOrSet(keyForData(params), 'data', fetcher, opts);\n }\n\n function setMarkup(params: Record<string, any>, html: string, cfg?: { ttl?: number; meta?: Record<string, any> }) {\n write(keyForMarkup(params), 'markup', html, cfg);\n }\n\n function getMarkup(params: Record<string, any>): CacheGetResult<string> {\n return get<string>(keyForMarkup(params));\n }\n\n function getOrSetMarkup(params: Record<string, any>, producer: () => Promise<string>, opts?: GetOrSetOptions<string>) {\n return getOrSet(keyForMarkup(params), 'markup', producer, opts);\n }\n\n return {\n // generic\n buildKey,\n get,\n set: write,\n getOrSet,\n refresh,\n purge,\n purgePattern,\n clearNamespace,\n inflight,\n // data-specific helpers\n keyForData,\n getData,\n setData,\n getOrSetData,\n // markup-specific helpers\n keyForMarkup,\n getMarkup,\n setMarkup,\n getOrSetMarkup\n };\n}\n\nfunction resolveAdapter(sel: 'local' | 'session' | 'memory'): StorageAdapter {\n if(sel === 'memory') return createMemoryAdapter();\n const store = safeStorage(sel === 'session' ? 'session' : 'local');\n if(!store) return createMemoryAdapter();\n return {\n getItem: k => store.getItem(k),\n setItem: (k,v) => store.setItem(k,v),\n removeItem: k => store.removeItem(k),\n keys: () => {\n const arr: string[] = [];\n for(let i=0;i<store.length;i++) { const key = store.key(i); if(key) arr.push(key); }\n return arr;\n }\n };\n}\n\nfunction safeStorage(type: 'local' | 'session'): Storage | undefined {\n try {\n if(typeof window === 'undefined') return undefined;\n const s = type === 'local' ? window.localStorage : window.sessionStorage;\n const testKey = '__iv_cache_test__';\n s.setItem(testKey, '1');\n s.removeItem(testKey);\n return s;\n } catch { return undefined; }\n}\n\nfunction createMemoryAdapter(): StorageAdapter {\n const map = new Map<string, string>();\n return {\n getItem: k => map.get(k) || null,\n setItem: (k,v) => { map.set(k,v); },\n removeItem: k => { map.delete(k); },\n keys: () => Array.from(map.keys())\n };\n}\n\nfunction byteLength(str: string) {\n if(typeof Blob !== 'undefined') return new Blob([str]).size;\n // fallback rough estimate\n return encodeURIComponent(str).replace(/%../g, 'x').length;\n}\n\n/*\nUSAGE EXAMPLES (iv-dynamic-products):\n\nimport { createCache } from '../../utils/caching/factory';\nimport { fetchProducts } from '../../utils/storefront_api/factory';\n\nconst productCache = createCache({\n namespace: 'iv-dynamic-products',\n version: '1',\n storage: 'local',\n defaultTTL: 1000 * 60 * 5, // 5 minutes fresh\n staleTTL: 1000 * 60 * 5 // additional 5 minutes stale window\n});\n\nasync function loadProducts(params) {\n const data = await productCache.getOrSetData(\n { handle: params.handle, sort: params.sort, fields: params.fields, limit: params.limit, currency: params.currency },\n () => fetchProducts(params),\n { ttl: 1000 * 60 * 5, staleWhileRevalidate: true }\n );\n // assign to component state & let Stencil render\n this.products = data;\n}\n\n// Optional MARKUP caching (only if safe & static):\nasync function getMarkupFast(params) {\n return productCache.getOrSetMarkup(\n { handle: params.handle, sort: params.sort, limit: params.limit },\n async () => {\n const data = await fetchProducts(params);\n // build HTML string (ensure no dynamic listeners needed)\n return data.map(p => `<div class=\\\"iv-card\\\">${p.title}</div>`).join('');\n },\n { ttl: 1000 * 60 * 2, staleWhileRevalidate: true }\n );\n}\n\n/*\n============================================================\nCACHING FACTORY – USAGE & RATIONALE NOTES\n============================================================\nPurpose:\n Provide a unified, lightweight, observable cache for normalized DATA (preferred) and optionally static MARKUP.\n Designed to prevent redundant Shopify Storefront API calls across multiple component instances / navigations.\n\nCore Concepts:\n Key Derivation: stable, deterministic hash of (params + namespace + version + type).\n Data vs Markup: Markup support exists but is discouraged for interactive Stencil components (event binding loss).\n Fresh vs Stale vs Expired:\n - fresh: age <= ttl\n - expired + stale window active: treat as stale (returned immediately if staleWhileRevalidate enabled)\n - expired beyond stale window: treated as miss\n Stale‑While‑Revalidate: returns stale value immediately while background refresh updates cache.\n Inflight Dedupe: concurrent requests for same key share the same Promise.\n Size Guard: prevents storing overly large payloads (default ~250KB serialized).\n Soft Eviction: oldest entries removed when exceeding maxEntries (checked every 20 writes).\n Events: CustomEvent 'iv-cache' with actions (hit|miss|stale|set|purge|error|evict) for telemetry / debugging.\n\nRecommended Usage Pattern (Data):\n 1. Create one shared cache per domain concern (e.g. productCache, predictiveSearchCache).\n 2. Always cache normalized data objects – keep UI rendering inside Stencil.\n 3. Include parameters that materially affect the response in the key params object (collection handle, sort key, limit, currency).\n 4. Use staleWhileRevalidate for UX smoothness (fast paint + silent refresh).\n 5. Avoid caching partial markup for interactive components.\n\nExample (Products):\n import { productCache } from '../caching/productCache';\n import { fetchProducts } from '../storefront_api/factory';\n const products = await productCache.getOrSetData(\n { handle, sort, limit, fields, currency },\n () => fetchProducts({ collectionHandle: handle, sortKey: sort, limit, fields }),\n { ttl: 1000 * 60 * 5, staleWhileRevalidate: true }\n );\n\nDeciding TTL / Stale:\n High traffic / slow changing catalog: longer ttl (5–15m) + generous stale window.\n Rapidly changing pricing/inventory: shorter ttl (1–2m) or disable stale if consistency is critical.\n\nWhen NOT to Use This Cache:\n - Server authoritative real-time inventory checks pre‑purchase.\n - Personalized data (user-specific recommendations) unless key includes identity.\n - Security sensitive payloads (never store secrets / tokens).\n\nExtensibility Ideas:\n - BroadcastChannel or storage event listener to sync invalidations across tabs.\n - Add diff hashing of payload to skip downstream re-renders.\n - Integrate global telemetry to record hit/miss ratio.\n\nDebugging Tips:\n window.addEventListener('iv-cache', e => console.log('cache event', e.detail));\n productCache.clearNamespace() // manual purge\n\nMigration Path If Dropping Markup:\n 1. Remove 'markup' references and helpers.\n 2. Narrow CacheStored.t to implicit 'data'.\n 3. Delete keyForMarkup / setMarkup / getMarkup / getOrSetMarkup usages.\n\nSafety Notes:\n - Serialization errors are caught and emitted as 'error' events.\n - Oversize entries are skipped (no partial writes).\n - Stale return path never blocks UI; refresh runs through same deduped pipeline.\n============================================================\n*/\n","// Shared product cache singleton for product-related data across components.\n// Focused on data (not markup) to preserve Stencil lifecycle & event binding.\n// Includes stale-while-revalidate so multiple component instances reuse results.\n\nimport { createCache } from './factory';\n\nexport const productCache = createCache({\n namespace: 'products',\n version: '1',\n storage: 'local',\n defaultTTL: 1000 * 60 * 5, // 5 minutes fresh\n staleTTL: 1000 * 60 * 5, // additional 5 minutes stale window\n dispatchEvents: true\n});\n\nexport type ProductCacheParams = {\n handle: string;\n sort: string;\n fields: string;\n limit: number;\n currency: string;\n};\n\n/*\n============================================================\nPRODUCT CACHE – USAGE NOTES\n============================================================\nGoal:\n Provide a shared, cross-component data cache for normalized Shopify product lists.\n Prevents duplicate Storefront API queries when multiple components (e.g. carousels, grids) request the same dataset.\n\nWhy Data (Not Markup):\n Data caching keeps Stencil's render lifecycle & event listeners intact.\n Markup caching risks stale styling, missed hydration, lost interactivity.\n\nKey Parameters Included in Cache Key:\n handle : collection or 'all'\n sort : sort key (BEST_SELLING, PRICE, etc.)\n fields : requested GraphQL fields (affects shape / payload size)\n limit : number of products\n currency : ensures price formatting differences are segregated\n\nStale-While-Revalidate Flow:\n 1. Fresh hit -> returned immediately.\n 2. Expired but within stale window + staleWhileRevalidate=true -> stale data returned; background refresh updates cache.\n 3. Expired beyond stale window -> treated as miss; new fetch awaited.\n\nBasic Usage in a Component:\n import { productCache } from '../../utils/caching/productCache';\n import { fetchProducts } from '../../utils/storefront_api/factory';\n\n async function load() {\n const params = { handle: 'all', sort: 'BEST_SELLING', fields: 'id,title,images', limit: 8, currency: 'GBP' };\n const products = await productCache.getOrSetData(\n params,\n () => fetchProducts({\n collectionHandle: params.handle,\n sortKey: params.sort,\n limit: params.limit,\n fields: params.fields,\n }),\n { ttl: 1000 * 60 * 5, staleWhileRevalidate: true }\n );\n // render products...\n }\n\nListening for Cache Diagnostics:\n window.addEventListener('iv-cache', e => {\n const { action, key, namespace, info } = (e as CustomEvent).detail;\n if(namespace === 'products') console.debug('[productCache]', action, { key, info });\n });\n\nManual Invalidation Examples:\n productCache.clearNamespace(); // purge everything in 'products'\n // or targeted:\n // productCache.purge(specificKey);\n\nAdjusting Freshness Strategy:\n - High stability content: increase defaultTTL (10–15m) + keep staleTTL (same or larger).\n - Rapid inventory changes: shorten TTL (1–2m) or disable staleWhileRevalidate on critical views.\n\nExtending:\n - Add a lightweight wrapper that injects user segment into params if personalization introduced.\n - Introduce a background warm-up (call getOrSetData on route prefetch).\n\nSafety:\n - Oversize payloads are ignored (error event emitted) to guard storage quota.\n - Serialization failures fail open (miss on next access).\n============================================================\n*/\n","import { showToast } from '../store/store';\n\nexport type errorSeverity = 'debug' | 'info' | 'warn' | 'error' | 'critical';\n\nexport interface NormalizedError {\n id: string;\n ts: number;\n component?: string;\n scope: string;\n severity: errorSeverity;\n userSafe: boolean;\n userMessage?: string;\n devMessage?: string;\n raw?: any;\n meta?: Record<string, any>;\n deduped?: boolean;\n stack?: string;\n};\n\ninterface TelemetryConfig {\n record: (n: NormalizedError) => void | Promise<void>;\n sampleRate?: number;\n filter?: (n: NormalizedError) => boolean;\n enrich?: (n: NormalizedError) => Partial<NormalizedError>;\n};\n\ninterface CreateHandlerConfig {\n component?: string;\n toast?: (opts: { message: string; variant?: string }) => void; \n toastDuration?: number;\n emitEvents?: boolean;\n target?: HTMLElement | Window;\n classifier?: (ctx: { error: any; scope: string }) => Partial<{ userSafe: boolean; severity: errorSeverity; userMessage: string }>;\n dedupeMs?: number;\n defaultUserMessage?: string;\n maxConsoleStack?: number;\n telemetry?: TelemetryConfig;\n _sharedRecent?: Map<string, number>;\n};\n\ninterface HandleOptions {\n error: any;\n scope: string;\n userMessage?: string;\n devMessage?: string;\n severity?: errorSeverity;\n level?: errorSeverity;\n emitEvent?: boolean;\n meta?: Record<string, any>;\n};\n\nexport function createErrorHandler(config: CreateHandlerConfig = {}) {\n const {\n component,\n toast,\n toastDuration = 3000,\n emitEvents = true,\n target = window,\n classifier,\n dedupeMs = 4000,\n defaultUserMessage = 'Something went wrong. Please try again.',\n maxConsoleStack = 6,\n telemetry,\n _sharedRecent\n } = config;\n\n const recent = _sharedRecent || new Map<string, number>();\n\n function severityToToastType(sev: errorSeverity): 'info' | 'success' | 'warning' | 'error' {\n if(sev === 'warn') return 'warning';\n if(sev === 'debug' || sev === 'info') return 'info';\n return 'error';\n };\n\n function dispatchToast(message: string, severity: errorSeverity) {\n const type = severityToToastType(severity);\n try {\n toast ? toast({ message, variant: type }) : showToast(message, type, toastDuration);\n } catch(_) { /* swallow toast errors */ };\n };\n \n function classify(base: HandleOptions): { userSafe: boolean; severity: errorSeverity; userMessage?: string } {\n let severity: errorSeverity = base.severity || base.level || 'error';\n let userSafe = !!base.userMessage;\n let userMessage = base.userMessage;\n const err = base.error;\n const isNetwork = err?.name === 'TypeError' && /fetch/i.test(err?.message || '');\n if(isNetwork) { userSafe = true; userMessage ||= 'Network issue. Please retry.'; };\n const status = err?.status || err?.response?.status;\n if(status) {\n if(status >= 400 && status < 500) userSafe = true;\n if(status >= 500) { userSafe = false; severity = 'error'; } \n };\n if(!userMessage && userSafe) userMessage = defaultUserMessage;\n if(classifier) {\n const override = classifier({ error: err, scope: base.scope }) || {};\n if(override.userSafe !== undefined) userSafe = override.userSafe;\n if(override.severity) severity = override.severity;\n if(override.userMessage) userMessage = override.userMessage;\n };\n if(!userSafe) userMessage = undefined;\n return { userSafe, severity, userMessage };\n };\n\n function dedupeKey(n: NormalizedError) {\n return `${n.component||''}|${n.scope}|${n.devMessage||n.userMessage||n.raw?.message||''}|${n.severity}`;\n };\n\n function handle(opts: HandleOptions): NormalizedError {\n const { error, scope, devMessage, meta } = opts;\n const { userSafe, severity, userMessage } = classify(opts);\n const stack = (error?.stack || '').split('\\n').slice(0, maxConsoleStack).join('\\n');\n const normalized: NormalizedError = {\n id: crypto?.randomUUID ? crypto.randomUUID() : Date.now().toString(36)+Math.random().toString(36).slice(2),\n ts: Date.now(),\n component,\n scope,\n severity,\n userSafe,\n userMessage,\n devMessage: devMessage ?? (userSafe ? error?.message : undefined),\n raw: error,\n meta,\n stack\n };\n \n if(telemetry?.enrich) {\n try { Object.assign(normalized, telemetry.enrich(normalized)); } catch(_) {}\n };\n\n const key = dedupeKey(normalized);\n const last = recent.get(key);\n last && (Date.now() - last) < dedupeMs ? normalized.deduped = true : recent.set(key, Date.now());\n\n const consolePayload = { ...normalized, raw: undefined };\n if(severity === 'debug') console.debug('[iv-error]', consolePayload, error);\n else if(severity === 'info') console.info('[iv-error]', consolePayload, error);\n else if(severity === 'warn') console.warn('[iv-error]', consolePayload, error);\n else console.error('[iv-error]', consolePayload, error);\n \n if(userSafe && !normalized.deduped && userMessage) {\n dispatchToast(userMessage, severity);\n };\n \n if(emitEvents && (opts.emitEvent !== false) && target && typeof (target as any).dispatchEvent === 'function') {\n try {\n target.dispatchEvent(new CustomEvent('iv-error', { detail: normalized, bubbles: true, composed: true }));\n } catch(_) {}\n };\n\n if(telemetry && (!telemetry.sampleRate || Math.random() < telemetry.sampleRate)) {\n if(!telemetry.filter || telemetry.filter(normalized)) {\n try { Promise.resolve(telemetry.record(normalized)).catch(()=>{}); } catch(_) {}\n };\n };\n return normalized;\n };\n return { handle };\n};\n\n// Usage in a component:\n/*\nimport { createErrorHandler } from '../../utils/error_handling/factory';\nconst errors = createErrorHandler({ component: 'iv-dynamic-products', toast: showToast });\n\ntry {\n await fetchProducts(...);\n} catch(err) {\n errors.handle({\n error: err,\n scope: 'fetchProducts',\n userMessage: 'Could not load products.',\n devMessage: 'Storefront API fetch failed',\n severity: 'error'\n });\n}\n\nSo simplest component usage: \nconst errors = createErrorHandler({ component: 'iv-card' }); try { ... } catch (e) { errors.handle({ error: e, scope: 'load', userMessage: 'Failed to load.' }); }\n*/"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ function decodeJsonString(str) {
2
+ return str.replace(/&quot;/g, '"');
3
+ }
4
+ ;
5
+ function requestedFields(fields) {
6
+ return fields ? fields.split(',').map(f => f.trim()) : null;
7
+ }
8
+ ;
9
+ function formatMoney(amount, currencyCode = 'GBP', locale = 'en-GB') {
10
+ // return new Intl.NumberFormat(locale, { style: 'currency', currency: currencyCode }).format(amount / 100);
11
+ return new Intl.NumberFormat(locale, { style: 'currency', currency: currencyCode }).format(amount);
12
+ }
13
+ ;
14
+ function getCurrencySymbol(currencyCode = 'GBP', locale = 'en-GB') {
15
+ return (0).toLocaleString(locale, {
16
+ style: 'currency',
17
+ currency: currencyCode,
18
+ minimumFractionDigits: 0,
19
+ maximumFractionDigits: 0
20
+ }).replace(/\d/g, '').trim();
21
+ }
22
+ ;
23
+ function getProductIDFromGid(id) {
24
+ return Number(id.split('/').pop());
25
+ }
26
+ ;
27
+ function getProductHandle() {
28
+ const path = window.location.pathname;
29
+ return path.startsWith('/products/') ? path.replace('/products/', '').split('/')[0] : null;
30
+ }
31
+ ;
32
+
33
+ export { getProductHandle as a, getProductIDFromGid as b, decodeJsonString as d, formatMoney as f, getCurrencySymbol as g, requestedFields as r };
34
+ //# sourceMappingURL=factory-mrqy6XUM.js.map
35
+
36
+ //# sourceMappingURL=factory-mrqy6XUM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-mrqy6XUM.js","sources":["src/utils/helpers/factory.ts"],"sourcesContent":["export function decodeJsonString(str: string): string {\n return str.replace(/&quot;/g, '\"');\n};\n\nexport function requestedFields(fields: string): string[] | null {\n return fields ? fields.split(',').map(f => f.trim()) : null;\n}; \n\nexport function formatMoney(amount: number, currencyCode: string = 'GBP', locale: string = 'en-GB'): string {\n // return new Intl.NumberFormat(locale, { style: 'currency', currency: currencyCode }).format(amount / 100);\n return new Intl.NumberFormat(locale, { style: 'currency', currency: currencyCode }).format(amount);\n};\n\nexport function getCurrencySymbol(currencyCode: string = 'GBP', locale: string = 'en-GB'): string {\n return (0).toLocaleString(locale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0\n }).replace(/\\d/g, '').trim();\n};\n\nexport function getProductIDFromGid(id: string): number {\n return Number(id.split('/').pop()); \n};\n\nexport function getProductHandle(): string {\n const path = window.location.pathname;\n return path.startsWith('/products/') ? path.replace('/products/', '').split('/')[0] : null;\n};"],"names":[],"mappings":"AAAM,SAAU,gBAAgB,CAAC,GAAW,EAAA;IAC1C,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;AACpC;AAAC;AAEK,SAAU,eAAe,CAAC,MAAc,EAAA;IAC5C,OAAO,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;AAC7D;AAAC;AAEK,SAAU,WAAW,CAAC,MAAc,EAAE,YAAuB,GAAA,KAAK,EAAE,MAAA,GAAiB,OAAO,EAAA;;IAEhG,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AACpG;AAAC;AAEK,SAAU,iBAAiB,CAAC,eAAuB,KAAK,EAAE,SAAiB,OAAO,EAAA;AACtF,IAAA,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,EAAE;AAChC,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,QAAQ,EAAE,YAAY;AACtB,QAAA,qBAAqB,EAAE,CAAC;AACxB,QAAA,qBAAqB,EAAE;KACxB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;AAC9B;AAAC;AAEK,SAAU,mBAAmB,CAAC,EAAU,EAAA;AAC5C,IAAA,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AACpC;AAAC;SAEe,gBAAgB,GAAA;AAC9B,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ;AACrC,IAAA,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;AAC5F;AAAC;;;;"}