@replohq/sdk 0.1.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 (280) hide show
  1. package/LICENSE +11 -0
  2. package/_vendor/replo-utils/lib/crypto.d.ts +30 -0
  3. package/_vendor/replo-utils/lib/errors.d.ts +83 -0
  4. package/_vendor/replo-utils/lib/json.d.ts +6 -0
  5. package/_vendor/replo-utils/lib/json.mjs +43 -0
  6. package/_vendor/replo-utils/lib/misc.d.ts +145 -0
  7. package/_vendor/replo-utils/lib/object.d.ts +31 -0
  8. package/_vendor/schemas/errors.d.ts +459 -0
  9. package/_vendor/schemas/generated/consent.d.ts +55 -0
  10. package/_vendor/schemas/generated/errors.d.ts +61 -0
  11. package/_vendor/schemas/loaderKeys.d.ts +1 -0
  12. package/_vendor/schemas/loaderKeys.mjs +27 -0
  13. package/_vendor/schemas/money.d.ts +60 -0
  14. package/_vendor/schemas/money.mjs +2051 -0
  15. package/analytics/analytics-provider.d.ts +16 -0
  16. package/analytics/analytics-provider.js +113 -0
  17. package/analytics/analytics-provider.js.map +7 -0
  18. package/analytics/analytics-sink.d.ts +26 -0
  19. package/analytics/analytics-sink.js +1 -0
  20. package/analytics/analytics-sink.js.map +7 -0
  21. package/analytics/get-analytics-sinks.d.ts +27 -0
  22. package/analytics/get-analytics-sinks.js +52 -0
  23. package/analytics/get-analytics-sinks.js.map +7 -0
  24. package/analytics/hooks/use-product-viewed-analytics.d.ts +23 -0
  25. package/analytics/hooks/use-product-viewed-analytics.js +34 -0
  26. package/analytics/hooks/use-product-viewed-analytics.js.map +7 -0
  27. package/analytics/replo-first-party-pixel.d.ts +12 -0
  28. package/analytics/replo-first-party-pixel.js +31 -0
  29. package/analytics/replo-first-party-pixel.js.map +7 -0
  30. package/analytics/replo-pixel-script.d.ts +13 -0
  31. package/analytics/replo-pixel-script.js +30 -0
  32. package/analytics/replo-pixel-script.js.map +7 -0
  33. package/analytics/sinks/ga4-sink.d.ts +15 -0
  34. package/analytics/sinks/ga4-sink.js +60 -0
  35. package/analytics/sinks/ga4-sink.js.map +7 -0
  36. package/analytics/sinks/meta-sink.d.ts +14 -0
  37. package/analytics/sinks/meta-sink.js +56 -0
  38. package/analytics/sinks/meta-sink.js.map +7 -0
  39. package/analytics/sinks/pinterest-sink.d.ts +14 -0
  40. package/analytics/sinks/pinterest-sink.js +76 -0
  41. package/analytics/sinks/pinterest-sink.js.map +7 -0
  42. package/analytics/sinks/reddit-sink.d.ts +14 -0
  43. package/analytics/sinks/reddit-sink.js +80 -0
  44. package/analytics/sinks/reddit-sink.js.map +7 -0
  45. package/analytics/sinks/replo-sink.d.ts +14 -0
  46. package/analytics/sinks/replo-sink.js +57 -0
  47. package/analytics/sinks/replo-sink.js.map +7 -0
  48. package/analytics/sinks/snapchat-sink.d.ts +14 -0
  49. package/analytics/sinks/snapchat-sink.js +67 -0
  50. package/analytics/sinks/snapchat-sink.js.map +7 -0
  51. package/analytics/sinks/tiktok-sink.d.ts +14 -0
  52. package/analytics/sinks/tiktok-sink.js +79 -0
  53. package/analytics/sinks/tiktok-sink.js.map +7 -0
  54. package/analytics/sinks/window-sink.d.ts +18 -0
  55. package/analytics/sinks/window-sink.js +46 -0
  56. package/analytics/sinks/window-sink.js.map +7 -0
  57. package/analytics/utils/analytics-utils.d.ts +7 -0
  58. package/analytics/utils/analytics-utils.js +130 -0
  59. package/analytics/utils/analytics-utils.js.map +7 -0
  60. package/analytics/utils/navigation-tracker.d.ts +16 -0
  61. package/analytics/utils/navigation-tracker.js +44 -0
  62. package/analytics/utils/navigation-tracker.js.map +7 -0
  63. package/analytics/utils/shopify-funnel-gate.d.ts +8 -0
  64. package/analytics/utils/shopify-funnel-gate.js +22 -0
  65. package/analytics/utils/shopify-funnel-gate.js.map +7 -0
  66. package/cart/buy-now-action.d.ts +21 -0
  67. package/cart/buy-now-action.js +104 -0
  68. package/cart/buy-now-action.js.map +7 -0
  69. package/cart/cart-actions.d.ts +63 -0
  70. package/cart/cart-actions.js +90 -0
  71. package/cart/cart-actions.js.map +7 -0
  72. package/cart/cart-loader.d.ts +9 -0
  73. package/cart/cart-loader.js +11 -0
  74. package/cart/cart-loader.js.map +7 -0
  75. package/cart/cart-provider.d.ts +85 -0
  76. package/cart/cart-provider.js +372 -0
  77. package/cart/cart-provider.js.map +7 -0
  78. package/cart/cart-schema.d.ts +74 -0
  79. package/cart/cart-schema.js +69 -0
  80. package/cart/cart-schema.js.map +7 -0
  81. package/cart/cart-types.d.ts +132 -0
  82. package/cart/cart-types.js +8 -0
  83. package/cart/cart-types.js.map +7 -0
  84. package/cart/gateways/cart-constants.d.ts +1 -0
  85. package/cart/gateways/cart-constants.js +5 -0
  86. package/cart/gateways/cart-constants.js.map +7 -0
  87. package/cart/gateways/cart-gateway.d.ts +10 -0
  88. package/cart/gateways/cart-gateway.js +19 -0
  89. package/cart/gateways/cart-gateway.js.map +7 -0
  90. package/cart/gateways/cookie-cart-gateway.d.ts +28 -0
  91. package/cart/gateways/cookie-cart-gateway.js +109 -0
  92. package/cart/gateways/cookie-cart-gateway.js.map +7 -0
  93. package/cart/gateways/default-cart-gateway.d.ts +19 -0
  94. package/cart/gateways/default-cart-gateway.js +30 -0
  95. package/cart/gateways/default-cart-gateway.js.map +7 -0
  96. package/cart/gateways/resolver-cart-gateway.d.ts +2 -0
  97. package/cart/gateways/resolver-cart-gateway.js +109 -0
  98. package/cart/gateways/resolver-cart-gateway.js.map +7 -0
  99. package/cart/gateways/stripe-cart-gateway.d.ts +19 -0
  100. package/cart/gateways/stripe-cart-gateway.js +28 -0
  101. package/cart/gateways/stripe-cart-gateway.js.map +7 -0
  102. package/cart/hooks/use-add-to-cart.d.ts +63 -0
  103. package/cart/hooks/use-add-to-cart.js +124 -0
  104. package/cart/hooks/use-add-to-cart.js.map +7 -0
  105. package/cart/hooks/use-buy-now.d.ts +49 -0
  106. package/cart/hooks/use-buy-now.js +62 -0
  107. package/cart/hooks/use-buy-now.js.map +7 -0
  108. package/cart/utils/cart-utils.d.ts +43 -0
  109. package/cart/utils/cart-utils.js +46 -0
  110. package/cart/utils/cart-utils.js.map +7 -0
  111. package/cart/utils/cookie-cart-persistence.d.ts +55 -0
  112. package/cart/utils/cookie-cart-persistence.js +166 -0
  113. package/cart/utils/cookie-cart-persistence.js.map +7 -0
  114. package/cart/utils/variant-to-cart-line.d.ts +74 -0
  115. package/cart/utils/variant-to-cart-line.js +162 -0
  116. package/cart/utils/variant-to-cart-line.js.map +7 -0
  117. package/chunk-UJCSKKID.mjs +27 -0
  118. package/consent/consent-action.d.ts +9 -0
  119. package/consent/consent-action.js +25 -0
  120. package/consent/consent-action.js.map +7 -0
  121. package/consent/consent-actions.d.ts +28 -0
  122. package/consent/consent-actions.js +36 -0
  123. package/consent/consent-actions.js.map +7 -0
  124. package/consent/consent-store.d.ts +69 -0
  125. package/consent/consent-store.js +194 -0
  126. package/consent/consent-store.js.map +7 -0
  127. package/consent/cookie.d.ts +36 -0
  128. package/consent/cookie.js +82 -0
  129. package/consent/cookie.js.map +7 -0
  130. package/consent/replo-scripts.d.ts +23 -0
  131. package/consent/replo-scripts.js +102 -0
  132. package/consent/replo-scripts.js.map +7 -0
  133. package/consent/script-registration-store.d.ts +25 -0
  134. package/consent/script-registration-store.js +61 -0
  135. package/consent/script-registration-store.js.map +7 -0
  136. package/consent/script-snippets.d.ts +24 -0
  137. package/consent/script-snippets.js +122 -0
  138. package/consent/script-snippets.js.map +7 -0
  139. package/consent/types.d.ts +34 -0
  140. package/consent/types.js +1 -0
  141. package/consent/types.js.map +7 -0
  142. package/consent/window-api.d.ts +41 -0
  143. package/consent/window-api.js +73 -0
  144. package/consent/window-api.js.map +7 -0
  145. package/env.d.ts +9 -0
  146. package/env.js +42 -0
  147. package/env.js.map +7 -0
  148. package/gateways/canopy-api.d.ts +83 -0
  149. package/gateways/canopy-api.js +197 -0
  150. package/gateways/canopy-api.js.map +7 -0
  151. package/hooks/use-client-value.d.ts +10 -0
  152. package/hooks/use-client-value.js +12 -0
  153. package/hooks/use-client-value.js.map +7 -0
  154. package/hooks/use-formatted-price.d.ts +15 -0
  155. package/hooks/use-formatted-price.js +20 -0
  156. package/hooks/use-formatted-price.js.map +7 -0
  157. package/lib/canopy-error.d.ts +25 -0
  158. package/lib/canopy-error.js +24 -0
  159. package/lib/canopy-error.js.map +7 -0
  160. package/lib/get-query-client.d.ts +2 -0
  161. package/lib/get-query-client.js +34 -0
  162. package/lib/get-query-client.js.map +7 -0
  163. package/lib/integration-utils.d.ts +2 -0
  164. package/lib/integration-utils.js +9 -0
  165. package/lib/integration-utils.js.map +7 -0
  166. package/lib/shopify-utils.d.ts +10 -0
  167. package/lib/shopify-utils.js +7 -0
  168. package/lib/shopify-utils.js.map +7 -0
  169. package/lib/url-utils.d.ts +4 -0
  170. package/lib/url-utils.js +8 -0
  171. package/lib/url-utils.js.map +7 -0
  172. package/loaders/collection-loader.d.ts +11 -0
  173. package/loaders/collection-loader.js +55 -0
  174. package/loaders/collection-loader.js.map +7 -0
  175. package/loaders/collection-products-loader.d.ts +12 -0
  176. package/loaders/collection-products-loader.js +58 -0
  177. package/loaders/collection-products-loader.js.map +7 -0
  178. package/loaders/contentful-entries-loader.d.ts +17 -0
  179. package/loaders/contentful-entries-loader.js +78 -0
  180. package/loaders/contentful-entries-loader.js.map +7 -0
  181. package/loaders/contentful-entry-loader.d.ts +14 -0
  182. package/loaders/contentful-entry-loader.js +60 -0
  183. package/loaders/contentful-entry-loader.js.map +7 -0
  184. package/loaders/invoke-loader-action.d.ts +11 -0
  185. package/loaders/invoke-loader-action.js +14 -0
  186. package/loaders/invoke-loader-action.js.map +7 -0
  187. package/loaders/invoke-loader-server.d.ts +18 -0
  188. package/loaders/invoke-loader-server.js +40 -0
  189. package/loaders/invoke-loader-server.js.map +7 -0
  190. package/loaders/invoke-loader.d.ts +16 -0
  191. package/loaders/invoke-loader.js +37 -0
  192. package/loaders/invoke-loader.js.map +7 -0
  193. package/loaders/levanta-product-loader.d.ts +11 -0
  194. package/loaders/levanta-product-loader.js +53 -0
  195. package/loaders/levanta-product-loader.js.map +7 -0
  196. package/loaders/loader-error-boundary.d.ts +25 -0
  197. package/loaders/loader-error-boundary.js +24 -0
  198. package/loaders/loader-error-boundary.js.map +7 -0
  199. package/loaders/loader-keys.d.ts +34 -0
  200. package/loaders/loader-keys.js +26 -0
  201. package/loaders/loader-keys.js.map +7 -0
  202. package/loaders/loader-schemas.d.ts +946 -0
  203. package/loaders/loader-schemas.js +353 -0
  204. package/loaders/loader-schemas.js.map +7 -0
  205. package/loaders/metaobject-loader.d.ts +12 -0
  206. package/loaders/metaobject-loader.js +54 -0
  207. package/loaders/metaobject-loader.js.map +7 -0
  208. package/loaders/metaobjects-loader.d.ts +14 -0
  209. package/loaders/metaobjects-loader.js +60 -0
  210. package/loaders/metaobjects-loader.js.map +7 -0
  211. package/loaders/okendo-review-aggregate-loader.d.ts +17 -0
  212. package/loaders/okendo-review-aggregate-loader.js +56 -0
  213. package/loaders/okendo-review-aggregate-loader.js.map +7 -0
  214. package/loaders/okendo-reviews-loader.d.ts +23 -0
  215. package/loaders/okendo-reviews-loader.js +54 -0
  216. package/loaders/okendo-reviews-loader.js.map +7 -0
  217. package/loaders/prefetch-loaders.d.ts +33 -0
  218. package/loaders/prefetch-loaders.js +46 -0
  219. package/loaders/prefetch-loaders.js.map +7 -0
  220. package/loaders/preview-placeholder.d.ts +25 -0
  221. package/loaders/preview-placeholder.js +222 -0
  222. package/loaders/preview-placeholder.js.map +7 -0
  223. package/loaders/product-loader-args.d.ts +21 -0
  224. package/loaders/product-loader-args.js +17 -0
  225. package/loaders/product-loader-args.js.map +7 -0
  226. package/loaders/product-loader.d.ts +10 -0
  227. package/loaders/product-loader.js +52 -0
  228. package/loaders/product-loader.js.map +7 -0
  229. package/loaders/rebuy-recommendations-loader.d.ts +165 -0
  230. package/loaders/rebuy-recommendations-loader.js +57 -0
  231. package/loaders/rebuy-recommendations-loader.js.map +7 -0
  232. package/loaders/reviews-io-review-aggregate-loader.d.ts +12 -0
  233. package/loaders/reviews-io-review-aggregate-loader.js +43 -0
  234. package/loaders/reviews-io-review-aggregate-loader.js.map +7 -0
  235. package/loaders/reviews-io-reviews-loader.d.ts +14 -0
  236. package/loaders/reviews-io-reviews-loader.js +65 -0
  237. package/loaders/reviews-io-reviews-loader.js.map +7 -0
  238. package/loaders/smile-earning-rules-loader.d.ts +19 -0
  239. package/loaders/smile-earning-rules-loader.js +44 -0
  240. package/loaders/smile-earning-rules-loader.js.map +7 -0
  241. package/loaders/smile-rewards-loader.d.ts +19 -0
  242. package/loaders/smile-rewards-loader.js +44 -0
  243. package/loaders/smile-rewards-loader.js.map +7 -0
  244. package/loaders/smile-vip-tiers-loader.d.ts +18 -0
  245. package/loaders/smile-vip-tiers-loader.js +43 -0
  246. package/loaders/smile-vip-tiers-loader.js.map +7 -0
  247. package/loaders/statsig-experiment-loader.d.ts +20 -0
  248. package/loaders/statsig-experiment-loader.js +81 -0
  249. package/loaders/statsig-experiment-loader.js.map +7 -0
  250. package/loaders/yotpo-review-aggregate-loader.d.ts +12 -0
  251. package/loaders/yotpo-review-aggregate-loader.js +50 -0
  252. package/loaders/yotpo-review-aggregate-loader.js.map +7 -0
  253. package/loaders/yotpo-reviews-loader.d.ts +14 -0
  254. package/loaders/yotpo-reviews-loader.js +65 -0
  255. package/loaders/yotpo-reviews-loader.js.map +7 -0
  256. package/money.d.ts +9 -0
  257. package/money.js +13 -0
  258. package/money.js.map +7 -0
  259. package/next/config.d.ts +4 -0
  260. package/next/config.js +91 -0
  261. package/next/config.js.map +7 -0
  262. package/next/image-loader.d.ts +2 -0
  263. package/next/image-loader.js +52 -0
  264. package/next/image-loader.js.map +7 -0
  265. package/next/open-next.d.ts +2 -0
  266. package/next/open-next.js +24 -0
  267. package/next/open-next.js.map +7 -0
  268. package/orders/order-status-schema.d.ts +161 -0
  269. package/orders/order-status-schema.js +83 -0
  270. package/orders/order-status-schema.js.map +7 -0
  271. package/orders/order-status.d.ts +11 -0
  272. package/orders/order-status.js +41 -0
  273. package/orders/order-status.js.map +7 -0
  274. package/package.json +216 -0
  275. package/providers/query-provider.d.ts +1 -0
  276. package/providers/query-provider.js +12 -0
  277. package/providers/query-provider.js.map +7 -0
  278. package/providers/replo-provider.d.ts +1 -0
  279. package/providers/replo-provider.js +22 -0
  280. package/providers/replo-provider.js.map +7 -0
@@ -0,0 +1,58 @@
1
+ "use client";
2
+ import { Fragment, jsx } from "react/jsx-runtime";
3
+ import { Suspense } from "react";
4
+ import { useSuspenseQuery } from "@tanstack/react-query";
5
+ import { invokeLoader } from "./invoke-loader";
6
+ import { LoaderErrorBoundary } from "./loader-error-boundary";
7
+ import { paginatedProductsSchema } from "./loader-schemas";
8
+ import { useReportPreviewPlaceholderRender } from "./preview-placeholder";
9
+ function CollectionProductsLoaderInner({
10
+ loaderKey,
11
+ collectionGid,
12
+ first,
13
+ after,
14
+ children
15
+ }) {
16
+ const queryResult = useSuspenseQuery({
17
+ queryKey: [loaderKey, { collectionGid, first, after }],
18
+ queryFn: async () => {
19
+ const loadedData = await invokeLoader({
20
+ loaderKey,
21
+ args: { collectionGid, first, after }
22
+ });
23
+ return paginatedProductsSchema.parse(loadedData);
24
+ }
25
+ });
26
+ useReportPreviewPlaceholderRender(queryResult.data);
27
+ return /* @__PURE__ */ jsx(Fragment, { children: children(queryResult.data) });
28
+ }
29
+ function CollectionProductsLoader({
30
+ loaderKey,
31
+ collectionGid,
32
+ first,
33
+ after,
34
+ children,
35
+ fallback
36
+ }) {
37
+ return /* @__PURE__ */ jsx(
38
+ LoaderErrorBoundary,
39
+ {
40
+ fallback: fallback ?? null,
41
+ resetKey: `${loaderKey}:${collectionGid}:${first ?? ""}:${after ?? ""}`,
42
+ children: /* @__PURE__ */ jsx(Suspense, { fallback: fallback ?? null, children: /* @__PURE__ */ jsx(
43
+ CollectionProductsLoaderInner,
44
+ {
45
+ loaderKey,
46
+ collectionGid,
47
+ first,
48
+ after,
49
+ children
50
+ }
51
+ ) })
52
+ }
53
+ );
54
+ }
55
+ export {
56
+ CollectionProductsLoader
57
+ };
58
+ //# sourceMappingURL=collection-products-loader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../loaders/collection-products-loader.tsx"],
4
+ "sourcesContent": ["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { PaginatedProducts } from \"./loader-schemas\";\n\nimport { Suspense } from \"react\";\n\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\n\nimport { invokeLoader } from \"./invoke-loader\";\nimport { LoaderErrorBoundary } from \"./loader-error-boundary\";\nimport { paginatedProductsSchema } from \"./loader-schemas\";\nimport { useReportPreviewPlaceholderRender } from \"./preview-placeholder\";\n\ntype CollectionProductsLoaderProps = {\n loaderKey: string;\n collectionGid: string;\n first?: number;\n after?: string;\n children: (data: PaginatedProducts) => ReactNode;\n fallback?: ReactNode;\n};\n\nfunction CollectionProductsLoaderInner({\n loaderKey,\n collectionGid,\n first,\n after,\n children,\n}: Omit<CollectionProductsLoaderProps, \"fallback\">) {\n const queryResult = useSuspenseQuery({\n queryKey: [loaderKey, { collectionGid, first, after }],\n queryFn: async () => {\n const loadedData = await invokeLoader({\n loaderKey,\n args: { collectionGid, first, after },\n });\n return paginatedProductsSchema.parse(loadedData);\n },\n });\n useReportPreviewPlaceholderRender(queryResult.data);\n\n return <>{children(queryResult.data)}</>;\n}\n\nexport function CollectionProductsLoader({\n loaderKey,\n collectionGid,\n first,\n after,\n children,\n fallback,\n}: CollectionProductsLoaderProps) {\n return (\n <LoaderErrorBoundary\n fallback={fallback ?? null}\n resetKey={`${loaderKey}:${collectionGid}:${first ?? \"\"}:${after ?? \"\"}`}\n >\n <Suspense fallback={fallback ?? null}>\n <CollectionProductsLoaderInner\n loaderKey={loaderKey}\n collectionGid={collectionGid}\n first={first}\n after={after}\n >\n {children}\n </CollectionProductsLoaderInner>\n </Suspense>\n </LoaderErrorBoundary>\n );\n}\n"],
5
+ "mappings": ";AA0CS;AArCT,SAAS,gBAAgB;AAEzB,SAAS,wBAAwB;AAEjC,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AACpC,SAAS,+BAA+B;AACxC,SAAS,yCAAyC;AAWlD,SAAS,8BAA8B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoD;AAClD,QAAM,cAAc,iBAAiB;AAAA,IACnC,UAAU,CAAC,WAAW,EAAE,eAAe,OAAO,MAAM,CAAC;AAAA,IACrD,SAAS,YAAY;AACnB,YAAM,aAAa,MAAM,aAAa;AAAA,QACpC;AAAA,QACA,MAAM,EAAE,eAAe,OAAO,MAAM;AAAA,MACtC,CAAC;AACD,aAAO,wBAAwB,MAAM,UAAU;AAAA,IACjD;AAAA,EACF,CAAC;AACD,oCAAkC,YAAY,IAAI;AAElD,SAAO,gCAAG,mBAAS,YAAY,IAAI,GAAE;AACvC;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkC;AAChC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,YAAY;AAAA,MACtB,UAAU,GAAG,SAAS,IAAI,aAAa,IAAI,SAAS,EAAE,IAAI,SAAS,EAAE;AAAA,MAErE,8BAAC,YAAS,UAAU,YAAY,MAC9B;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UAEC;AAAA;AAAA,MACH,GACF;AAAA;AAAA,EACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from "react";
2
+ import type { ContentfulEntriesLoaderOutput } from "./loader-schemas";
3
+ type ContentfulEntriesLoaderProps = {
4
+ loaderKey: string;
5
+ spaceId: string;
6
+ contentType: string;
7
+ environmentId?: string;
8
+ locale?: string;
9
+ order?: string;
10
+ limit?: number;
11
+ skip?: number;
12
+ include?: number;
13
+ children: (data: ContentfulEntriesLoaderOutput) => ReactNode;
14
+ fallback?: ReactNode;
15
+ };
16
+ export declare function ContentfulEntriesLoader({ loaderKey, spaceId, contentType, environmentId, locale, order, limit, skip, include, children, fallback, }: ContentfulEntriesLoaderProps): import("react/jsx-runtime").JSX.Element;
17
+ export {};
@@ -0,0 +1,78 @@
1
+ "use client";
2
+ import { Fragment, jsx } from "react/jsx-runtime";
3
+ import { Suspense } from "react";
4
+ import { useSuspenseQuery } from "@tanstack/react-query";
5
+ import { invokeLoader } from "./invoke-loader";
6
+ import { LoaderErrorBoundary } from "./loader-error-boundary";
7
+ import { contentfulEntriesLoaderOutputSchema } from "./loader-schemas";
8
+ function buildArgs({
9
+ spaceId,
10
+ contentType,
11
+ environmentId,
12
+ locale,
13
+ order,
14
+ limit,
15
+ skip,
16
+ include
17
+ }) {
18
+ return {
19
+ spaceId,
20
+ contentType,
21
+ ...environmentId !== void 0 ? { environmentId } : {},
22
+ ...locale !== void 0 ? { locale } : {},
23
+ ...order !== void 0 ? { order } : {},
24
+ ...limit !== void 0 ? { limit } : {},
25
+ ...skip !== void 0 ? { skip } : {},
26
+ ...include !== void 0 ? { include } : {}
27
+ };
28
+ }
29
+ function ContentfulEntriesLoaderInner({
30
+ loaderKey,
31
+ args,
32
+ children
33
+ }) {
34
+ const { data } = useSuspenseQuery({
35
+ queryKey: [loaderKey, args],
36
+ queryFn: async () => {
37
+ const loadedData = await invokeLoader({ loaderKey, args });
38
+ return contentfulEntriesLoaderOutputSchema.parse(loadedData);
39
+ }
40
+ });
41
+ return /* @__PURE__ */ jsx(Fragment, { children: children(data) });
42
+ }
43
+ function ContentfulEntriesLoader({
44
+ loaderKey,
45
+ spaceId,
46
+ contentType,
47
+ environmentId,
48
+ locale,
49
+ order,
50
+ limit,
51
+ skip,
52
+ include,
53
+ children,
54
+ fallback
55
+ }) {
56
+ const args = buildArgs({
57
+ spaceId,
58
+ contentType,
59
+ environmentId,
60
+ locale,
61
+ order,
62
+ limit,
63
+ skip,
64
+ include
65
+ });
66
+ return /* @__PURE__ */ jsx(
67
+ LoaderErrorBoundary,
68
+ {
69
+ fallback: fallback ?? null,
70
+ resetKey: `${loaderKey}:${JSON.stringify(args)}`,
71
+ children: /* @__PURE__ */ jsx(Suspense, { fallback: fallback ?? null, children: /* @__PURE__ */ jsx(ContentfulEntriesLoaderInner, { loaderKey, args, children }) })
72
+ }
73
+ );
74
+ }
75
+ export {
76
+ ContentfulEntriesLoader
77
+ };
78
+ //# sourceMappingURL=contentful-entries-loader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../loaders/contentful-entries-loader.tsx"],
4
+ "sourcesContent": ["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { ContentfulEntriesLoaderOutput } from \"./loader-schemas\";\n\nimport { Suspense } from \"react\";\n\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\n\nimport { invokeLoader } from \"./invoke-loader\";\nimport { LoaderErrorBoundary } from \"./loader-error-boundary\";\nimport { contentfulEntriesLoaderOutputSchema } from \"./loader-schemas\";\n\ntype ContentfulEntriesLoaderProps = {\n loaderKey: string;\n spaceId: string;\n contentType: string;\n environmentId?: string;\n locale?: string;\n order?: string;\n limit?: number;\n skip?: number;\n include?: number;\n children: (data: ContentfulEntriesLoaderOutput) => ReactNode;\n fallback?: ReactNode;\n};\n\nfunction buildArgs({\n spaceId,\n contentType,\n environmentId,\n locale,\n order,\n limit,\n skip,\n include,\n}: Omit<ContentfulEntriesLoaderProps, \"loaderKey\" | \"children\" | \"fallback\">) {\n return {\n spaceId,\n contentType,\n ...(environmentId !== undefined ? { environmentId } : {}),\n ...(locale !== undefined ? { locale } : {}),\n ...(order !== undefined ? { order } : {}),\n ...(limit !== undefined ? { limit } : {}),\n ...(skip !== undefined ? { skip } : {}),\n ...(include !== undefined ? { include } : {}),\n };\n}\n\nfunction ContentfulEntriesLoaderInner({\n loaderKey,\n args,\n children,\n}: {\n loaderKey: string;\n args: ReturnType<typeof buildArgs>;\n children: (data: ContentfulEntriesLoaderOutput) => ReactNode;\n}) {\n const { data } = useSuspenseQuery({\n queryKey: [loaderKey, args],\n queryFn: async () => {\n const loadedData = await invokeLoader({ loaderKey, args });\n return contentfulEntriesLoaderOutputSchema.parse(loadedData);\n },\n });\n\n return <>{children(data)}</>;\n}\n\nexport function ContentfulEntriesLoader({\n loaderKey,\n spaceId,\n contentType,\n environmentId,\n locale,\n order,\n limit,\n skip,\n include,\n children,\n fallback,\n}: ContentfulEntriesLoaderProps) {\n const args = buildArgs({\n spaceId,\n contentType,\n environmentId,\n locale,\n order,\n limit,\n skip,\n include,\n });\n\n return (\n <LoaderErrorBoundary\n fallback={fallback ?? null}\n resetKey={`${loaderKey}:${JSON.stringify(args)}`}\n >\n <Suspense fallback={fallback ?? null}>\n <ContentfulEntriesLoaderInner loaderKey={loaderKey} args={args}>\n {children}\n </ContentfulEntriesLoaderInner>\n </Suspense>\n </LoaderErrorBoundary>\n );\n}\n"],
5
+ "mappings": ";AAkES;AA7DT,SAAS,gBAAgB;AAEzB,SAAS,wBAAwB;AAEjC,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AACpC,SAAS,2CAA2C;AAgBpD,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8E;AAC5E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAI,kBAAkB,SAAY,EAAE,cAAc,IAAI,CAAC;AAAA,IACvD,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,IACzC,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,IACrC,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC7C;AACF;AAEA,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,EAAE,KAAK,IAAI,iBAAiB;AAAA,IAChC,UAAU,CAAC,WAAW,IAAI;AAAA,IAC1B,SAAS,YAAY;AACnB,YAAM,aAAa,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AACzD,aAAO,oCAAoC,MAAM,UAAU;AAAA,IAC7D;AAAA,EACF,CAAC;AAED,SAAO,gCAAG,mBAAS,IAAI,GAAE;AAC3B;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiC;AAC/B,QAAM,OAAO,UAAU;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,YAAY;AAAA,MACtB,UAAU,GAAG,SAAS,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,MAE9C,8BAAC,YAAS,UAAU,YAAY,MAC9B,8BAAC,gCAA6B,WAAsB,MACjD,UACH,GACF;AAAA;AAAA,EACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from "react";
2
+ import type { ContentfulEntryLoaderOutput } from "./loader-schemas";
3
+ type ContentfulEntryLoaderProps = {
4
+ loaderKey: string;
5
+ spaceId: string;
6
+ entryId: string;
7
+ environmentId?: string;
8
+ locale?: string;
9
+ include?: number;
10
+ children: (data: ContentfulEntryLoaderOutput) => ReactNode;
11
+ fallback?: ReactNode;
12
+ };
13
+ export declare function ContentfulEntryLoader({ loaderKey, spaceId, entryId, environmentId, locale, include, children, fallback, }: ContentfulEntryLoaderProps): import("react/jsx-runtime").JSX.Element;
14
+ export {};
@@ -0,0 +1,60 @@
1
+ "use client";
2
+ import { Fragment, jsx } from "react/jsx-runtime";
3
+ import { Suspense } from "react";
4
+ import { useSuspenseQuery } from "@tanstack/react-query";
5
+ import { invokeLoader } from "./invoke-loader";
6
+ import { LoaderErrorBoundary } from "./loader-error-boundary";
7
+ import { contentfulEntryLoaderOutputSchema } from "./loader-schemas";
8
+ function buildArgs({
9
+ spaceId,
10
+ entryId,
11
+ environmentId,
12
+ locale,
13
+ include
14
+ }) {
15
+ return {
16
+ spaceId,
17
+ entryId,
18
+ ...environmentId !== void 0 ? { environmentId } : {},
19
+ ...locale !== void 0 ? { locale } : {},
20
+ ...include !== void 0 ? { include } : {}
21
+ };
22
+ }
23
+ function ContentfulEntryLoaderInner({
24
+ loaderKey,
25
+ args,
26
+ children
27
+ }) {
28
+ const { data } = useSuspenseQuery({
29
+ queryKey: [loaderKey, args],
30
+ queryFn: async () => {
31
+ const loadedData = await invokeLoader({ loaderKey, args });
32
+ return contentfulEntryLoaderOutputSchema.parse(loadedData);
33
+ }
34
+ });
35
+ return /* @__PURE__ */ jsx(Fragment, { children: children(data) });
36
+ }
37
+ function ContentfulEntryLoader({
38
+ loaderKey,
39
+ spaceId,
40
+ entryId,
41
+ environmentId,
42
+ locale,
43
+ include,
44
+ children,
45
+ fallback
46
+ }) {
47
+ const args = buildArgs({ spaceId, entryId, environmentId, locale, include });
48
+ return /* @__PURE__ */ jsx(
49
+ LoaderErrorBoundary,
50
+ {
51
+ fallback: fallback ?? null,
52
+ resetKey: `${loaderKey}:${JSON.stringify(args)}`,
53
+ children: /* @__PURE__ */ jsx(Suspense, { fallback: fallback ?? null, children: /* @__PURE__ */ jsx(ContentfulEntryLoaderInner, { loaderKey, args, children }) })
54
+ }
55
+ );
56
+ }
57
+ export {
58
+ ContentfulEntryLoader
59
+ };
60
+ //# sourceMappingURL=contentful-entry-loader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../loaders/contentful-entry-loader.tsx"],
4
+ "sourcesContent": ["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { ContentfulEntryLoaderOutput } from \"./loader-schemas\";\n\nimport { Suspense } from \"react\";\n\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\n\nimport { invokeLoader } from \"./invoke-loader\";\nimport { LoaderErrorBoundary } from \"./loader-error-boundary\";\nimport { contentfulEntryLoaderOutputSchema } from \"./loader-schemas\";\n\ntype ContentfulEntryLoaderProps = {\n loaderKey: string;\n spaceId: string;\n entryId: string;\n environmentId?: string;\n locale?: string;\n include?: number;\n children: (data: ContentfulEntryLoaderOutput) => ReactNode;\n fallback?: ReactNode;\n};\n\nfunction buildArgs({\n spaceId,\n entryId,\n environmentId,\n locale,\n include,\n}: Omit<ContentfulEntryLoaderProps, \"loaderKey\" | \"children\" | \"fallback\">) {\n return {\n spaceId,\n entryId,\n ...(environmentId !== undefined ? { environmentId } : {}),\n ...(locale !== undefined ? { locale } : {}),\n ...(include !== undefined ? { include } : {}),\n };\n}\n\nfunction ContentfulEntryLoaderInner({\n loaderKey,\n args,\n children,\n}: {\n loaderKey: string;\n args: ReturnType<typeof buildArgs>;\n children: (data: ContentfulEntryLoaderOutput) => ReactNode;\n}) {\n const { data } = useSuspenseQuery({\n queryKey: [loaderKey, args],\n queryFn: async () => {\n const loadedData = await invokeLoader({ loaderKey, args });\n return contentfulEntryLoaderOutputSchema.parse(loadedData);\n },\n });\n\n return <>{children(data)}</>;\n}\n\nexport function ContentfulEntryLoader({\n loaderKey,\n spaceId,\n entryId,\n environmentId,\n locale,\n include,\n children,\n fallback,\n}: ContentfulEntryLoaderProps) {\n const args = buildArgs({ spaceId, entryId, environmentId, locale, include });\n\n return (\n <LoaderErrorBoundary\n fallback={fallback ?? null}\n resetKey={`${loaderKey}:${JSON.stringify(args)}`}\n >\n <Suspense fallback={fallback ?? null}>\n <ContentfulEntryLoaderInner loaderKey={loaderKey} args={args}>\n {children}\n </ContentfulEntryLoaderInner>\n </Suspense>\n </LoaderErrorBoundary>\n );\n}\n"],
5
+ "mappings": ";AAyDS;AApDT,SAAS,gBAAgB;AAEzB,SAAS,wBAAwB;AAEjC,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AACpC,SAAS,yCAAyC;AAalD,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4E;AAC1E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAI,kBAAkB,SAAY,EAAE,cAAc,IAAI,CAAC;AAAA,IACvD,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,IACzC,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC7C;AACF;AAEA,SAAS,2BAA2B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,EAAE,KAAK,IAAI,iBAAiB;AAAA,IAChC,UAAU,CAAC,WAAW,IAAI;AAAA,IAC1B,SAAS,YAAY;AACnB,YAAM,aAAa,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AACzD,aAAO,kCAAkC,MAAM,UAAU;AAAA,IAC3D;AAAA,EACF,CAAC;AAED,SAAO,gCAAG,mBAAS,IAAI,GAAE;AAC3B;AAEO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAC7B,QAAM,OAAO,UAAU,EAAE,SAAS,SAAS,eAAe,QAAQ,QAAQ,CAAC;AAE3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,YAAY;AAAA,MACtB,UAAU,GAAG,SAAS,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,MAE9C,8BAAC,YAAS,UAAU,YAAY,MAC9B,8BAAC,8BAA2B,WAAsB,MAC/C,UACH,GACF;AAAA;AAAA,EACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Server action that invokes a data loader via the canopy-api gateway.
3
+ * Called from client-side loader components when React Query needs to
4
+ * fetch data in the browser (e.g., client-side navigation, cache miss).
5
+ * This runs on the server — Next.js handles the client/server boundary
6
+ * automatically.
7
+ */
8
+ export declare function invokeLoaderAction({ loaderKey, args, }: {
9
+ loaderKey: string;
10
+ args: Record<string, unknown>;
11
+ }): Promise<unknown>;
@@ -0,0 +1,14 @@
1
+ "use server";
2
+ import { getCanopyApiGateway } from "../gateways/canopy-api";
3
+ async function invokeLoaderAction({
4
+ loaderKey,
5
+ args
6
+ }) {
7
+ const gateway = await getCanopyApiGateway();
8
+ const response = await gateway.invokeLoader({ loaderKey, args });
9
+ return response.data;
10
+ }
11
+ export {
12
+ invokeLoaderAction
13
+ };
14
+ //# sourceMappingURL=invoke-loader-action.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../loaders/invoke-loader-action.ts"],
4
+ "sourcesContent": ["\"use server\";\n\nimport { getCanopyApiGateway } from \"../gateways/canopy-api\";\n\n/**\n * Server action that invokes a data loader via the canopy-api gateway.\n * Called from client-side loader components when React Query needs to\n * fetch data in the browser (e.g., client-side navigation, cache miss).\n * This runs on the server \u2014 Next.js handles the client/server boundary\n * automatically.\n */\nexport async function invokeLoaderAction({\n loaderKey,\n args,\n}: {\n loaderKey: string;\n args: Record<string, unknown>;\n}) {\n const gateway = await getCanopyApiGateway();\n const response = await gateway.invokeLoader({ loaderKey, args });\n return response.data;\n}\n"],
5
+ "mappings": ";AAEA,SAAS,2BAA2B;AASpC,eAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA;AACF,GAGG;AACD,QAAM,UAAU,MAAM,oBAAoB;AAC1C,QAAM,WAAW,MAAM,QAAQ,aAAa,EAAE,WAAW,KAAK,CAAC;AAC/D,SAAO,SAAS;AAClB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Server-only loader invocation that calls the canopy-api gateway directly.
3
+ * Used by PrefetchedLoaders to seed the React Query cache during SSR.
4
+ *
5
+ * Results are cached via Next.js `unstable_cache` so repeated SSR renders
6
+ * for the same loader+args return instantly without a network round-trip
7
+ * to canopy-api. The canopy-api's own in-memory cache still acts as a second
8
+ * layer for cold starts and cross-instance sharing.
9
+ *
10
+ * @param revalidateSeconds - How long (in seconds) the cached result is
11
+ * considered fresh. Defaults to 60. Set to `false` to cache indefinitely
12
+ * (use tag-based invalidation via `revalidateTag` to purge).
13
+ */
14
+ export declare function invokeLoaderServer({ loaderKey, args, revalidateSeconds, }: {
15
+ loaderKey: string;
16
+ args: Record<string, unknown>;
17
+ revalidateSeconds?: number | false;
18
+ }): Promise<unknown>;
@@ -0,0 +1,40 @@
1
+ import { unstable_cache } from "next/cache";
2
+ import { getCanopyApiGateway } from "../gateways/canopy-api";
3
+ import { resolvePreviewPlaceholderData } from "./preview-placeholder";
4
+ const DEFAULT_REVALIDATE_SECONDS = 60;
5
+ function buildStableCacheKeyParts({
6
+ loaderKey,
7
+ args
8
+ }) {
9
+ const sortedArgsJson = JSON.stringify(
10
+ Object.entries(args).sort(([keyA], [keyB]) => keyA.localeCompare(keyB)).map(([key, value]) => [key, value])
11
+ );
12
+ return ["loader", loaderKey, sortedArgsJson];
13
+ }
14
+ async function invokeLoaderServer({
15
+ loaderKey,
16
+ args,
17
+ revalidateSeconds = DEFAULT_REVALIDATE_SECONDS
18
+ }) {
19
+ const placeholderData = resolvePreviewPlaceholderData({ loaderKey, args });
20
+ if (placeholderData !== null) {
21
+ return placeholderData;
22
+ }
23
+ const cacheKeyParts = buildStableCacheKeyParts({ loaderKey, args });
24
+ return unstable_cache(
25
+ async () => {
26
+ const gateway = await getCanopyApiGateway();
27
+ const response = await gateway.invokeLoader({ loaderKey, args });
28
+ return response.data;
29
+ },
30
+ cacheKeyParts,
31
+ {
32
+ revalidate: revalidateSeconds,
33
+ tags: [`loader:${loaderKey}`, ...cacheKeyParts]
34
+ }
35
+ )();
36
+ }
37
+ export {
38
+ invokeLoaderServer
39
+ };
40
+ //# sourceMappingURL=invoke-loader-server.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../loaders/invoke-loader-server.ts"],
4
+ "sourcesContent": ["import { unstable_cache } from \"next/cache\";\n\nimport { getCanopyApiGateway } from \"../gateways/canopy-api\";\nimport { resolvePreviewPlaceholderData } from \"./preview-placeholder\";\n\nconst DEFAULT_REVALIDATE_SECONDS = 60;\n\nfunction buildStableCacheKeyParts({\n loaderKey,\n args,\n}: {\n loaderKey: string;\n args: Record<string, unknown>;\n}): string[] {\n const sortedArgsJson = JSON.stringify(\n Object.entries(args)\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, value]) => [key, value]),\n );\n return [\"loader\", loaderKey, sortedArgsJson];\n}\n\n/**\n * Server-only loader invocation that calls the canopy-api gateway directly.\n * Used by PrefetchedLoaders to seed the React Query cache during SSR.\n *\n * Results are cached via Next.js `unstable_cache` so repeated SSR renders\n * for the same loader+args return instantly without a network round-trip\n * to canopy-api. The canopy-api's own in-memory cache still acts as a second\n * layer for cold starts and cross-instance sharing.\n *\n * @param revalidateSeconds - How long (in seconds) the cached result is\n * considered fresh. Defaults to 60. Set to `false` to cache indefinitely\n * (use tag-based invalidation via `revalidateTag` to purge).\n */\nexport async function invokeLoaderServer({\n loaderKey,\n args,\n revalidateSeconds = DEFAULT_REVALIDATE_SECONDS,\n}: {\n loaderKey: string;\n args: Record<string, unknown>;\n revalidateSeconds?: number | false;\n}) {\n // Dev-server previews of an unfilled dynamic route prefetch sample data\n // instead of fetching \u2014 a real fetch with the literal bracket param can only\n // 404, and the thrown error marks the whole preview frame as broken. Kept\n // outside unstable_cache so sample data never enters the loader cache.\n const placeholderData = resolvePreviewPlaceholderData({ loaderKey, args });\n if (placeholderData !== null) {\n return placeholderData;\n }\n const cacheKeyParts = buildStableCacheKeyParts({ loaderKey, args });\n\n return unstable_cache(\n async () => {\n const gateway = await getCanopyApiGateway();\n const response = await gateway.invokeLoader({ loaderKey, args });\n return response.data;\n },\n cacheKeyParts,\n {\n revalidate: revalidateSeconds,\n tags: [`loader:${loaderKey}`, ...cacheKeyParts],\n },\n )();\n}\n"],
5
+ "mappings": "AAAA,SAAS,sBAAsB;AAE/B,SAAS,2BAA2B;AACpC,SAAS,qCAAqC;AAE9C,MAAM,6BAA6B;AAEnC,SAAS,yBAAyB;AAAA,EAChC;AAAA,EACA;AACF,GAGa;AACX,QAAM,iBAAiB,KAAK;AAAA,IAC1B,OAAO,QAAQ,IAAI,EAChB,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,MAAM,KAAK,cAAc,IAAI,CAAC,EACjD,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,KAAK,CAAC;AAAA,EACvC;AACA,SAAO,CAAC,UAAU,WAAW,cAAc;AAC7C;AAeA,eAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA;AAAA,EACA,oBAAoB;AACtB,GAIG;AAKD,QAAM,kBAAkB,8BAA8B,EAAE,WAAW,KAAK,CAAC;AACzE,MAAI,oBAAoB,MAAM;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,gBAAgB,yBAAyB,EAAE,WAAW,KAAK,CAAC;AAElE,SAAO;AAAA,IACL,YAAY;AACV,YAAM,UAAU,MAAM,oBAAoB;AAC1C,YAAM,WAAW,MAAM,QAAQ,aAAa,EAAE,WAAW,KAAK,CAAC;AAC/D,aAAO,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY;AAAA,MACZ,MAAM,CAAC,UAAU,SAAS,IAAI,GAAG,aAAa;AAAA,IAChD;AAAA,EACF,EAAE;AACJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,16 @@
1
+ import { CanopyError } from "../lib/canopy-error";
2
+ /** Scoped error for loader invocation failures. */
3
+ export declare class LoaderInvokeError extends CanopyError {
4
+ }
5
+ /**
6
+ * Invokes a data loader. During SSR, calls the canopy-api gateway directly.
7
+ * In the browser, dynamically imports a server action so React 19 never sees
8
+ * the "use server" reference during render.
9
+ *
10
+ * In an editor iframe previewing an unfilled dynamic route, returns sample
11
+ * data instead of fetching — see `preview-placeholder.ts`.
12
+ */
13
+ export declare function invokeLoader({ loaderKey, args, }: {
14
+ loaderKey: string;
15
+ args: Record<string, unknown>;
16
+ }): Promise<unknown>;
@@ -0,0 +1,37 @@
1
+ import { CanopyError } from "../lib/canopy-error";
2
+ import { resolvePreviewPlaceholderData } from "./preview-placeholder";
3
+ class LoaderInvokeError extends CanopyError {
4
+ }
5
+ async function invokeLoader({
6
+ loaderKey,
7
+ args
8
+ }) {
9
+ const placeholderData = resolvePreviewPlaceholderData({ loaderKey, args });
10
+ if (placeholderData !== null) {
11
+ return placeholderData;
12
+ }
13
+ try {
14
+ if (typeof window === "undefined") {
15
+ const { getCanopyApiGateway } = await import("../gateways/canopy-api");
16
+ const gateway = await getCanopyApiGateway();
17
+ const response = await gateway.invokeLoader({ loaderKey, args });
18
+ return response.data;
19
+ }
20
+ const { invokeLoaderAction } = await import("./invoke-loader-action");
21
+ return await invokeLoaderAction({ loaderKey, args });
22
+ } catch (error) {
23
+ if (error instanceof LoaderInvokeError) {
24
+ throw error;
25
+ }
26
+ throw new LoaderInvokeError({
27
+ message: `Loader ${loaderKey} failed: ${error instanceof Error ? error.message : String(error)}`,
28
+ cause: error,
29
+ additionalData: { loaderKey }
30
+ });
31
+ }
32
+ }
33
+ export {
34
+ LoaderInvokeError,
35
+ invokeLoader
36
+ };
37
+ //# sourceMappingURL=invoke-loader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../loaders/invoke-loader.ts"],
4
+ "sourcesContent": ["import { CanopyError } from \"../lib/canopy-error\";\nimport { resolvePreviewPlaceholderData } from \"./preview-placeholder\";\n\n/** Scoped error for loader invocation failures. */\nexport class LoaderInvokeError extends CanopyError {}\n\n/**\n * Invokes a data loader. During SSR, calls the canopy-api gateway directly.\n * In the browser, dynamically imports a server action so React 19 never sees\n * the \"use server\" reference during render.\n *\n * In an editor iframe previewing an unfilled dynamic route, returns sample\n * data instead of fetching \u2014 see `preview-placeholder.ts`.\n */\nexport async function invokeLoader({\n loaderKey,\n args,\n}: {\n loaderKey: string;\n args: Record<string, unknown>;\n}) {\n const placeholderData = resolvePreviewPlaceholderData({ loaderKey, args });\n if (placeholderData !== null) {\n return placeholderData;\n }\n try {\n if (typeof window === \"undefined\") {\n const { getCanopyApiGateway } = await import(\"../gateways/canopy-api\");\n const gateway = await getCanopyApiGateway();\n const response = await gateway.invokeLoader({ loaderKey, args });\n return response.data;\n }\n\n const { invokeLoaderAction } = await import(\"./invoke-loader-action\");\n return await invokeLoaderAction({ loaderKey, args });\n } catch (error) {\n if (error instanceof LoaderInvokeError) {\n throw error;\n }\n throw new LoaderInvokeError({\n message: `Loader ${loaderKey} failed: ${error instanceof Error ? error.message : String(error)}`,\n cause: error,\n additionalData: { loaderKey },\n });\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,mBAAmB;AAC5B,SAAS,qCAAqC;AAGvC,MAAM,0BAA0B,YAAY;AAAC;AAUpD,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AACF,GAGG;AACD,QAAM,kBAAkB,8BAA8B,EAAE,WAAW,KAAK,CAAC;AACzE,MAAI,oBAAoB,MAAM;AAC5B,WAAO;AAAA,EACT;AACA,MAAI;AACF,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,wBAAwB;AACrE,YAAM,UAAU,MAAM,oBAAoB;AAC1C,YAAM,WAAW,MAAM,QAAQ,aAAa,EAAE,WAAW,KAAK,CAAC;AAC/D,aAAO,SAAS;AAAA,IAClB;AAEA,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,wBAAwB;AACpE,WAAO,MAAM,mBAAmB,EAAE,WAAW,KAAK,CAAC;AAAA,EACrD,SAAS,OAAO;AACd,QAAI,iBAAiB,mBAAmB;AACtC,YAAM;AAAA,IACR;AACA,UAAM,IAAI,kBAAkB;AAAA,MAC1B,SAAS,UAAU,SAAS,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC9F,OAAO;AAAA,MACP,gBAAgB,EAAE,UAAU;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,11 @@
1
+ import type { ReactNode } from "react";
2
+ import type { LevantaProductFull } from "./loader-schemas";
3
+ type LevantaProductLoaderProps = {
4
+ loaderKey: string;
5
+ asin: string;
6
+ marketplace?: string;
7
+ children: (data: LevantaProductFull) => ReactNode;
8
+ fallback?: ReactNode;
9
+ };
10
+ export declare function LevantaProductLoader({ loaderKey, asin, marketplace, children, fallback, }: LevantaProductLoaderProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,53 @@
1
+ "use client";
2
+ import { Fragment, jsx } from "react/jsx-runtime";
3
+ import { Suspense } from "react";
4
+ import { useSuspenseQuery } from "@tanstack/react-query";
5
+ import { invokeLoader } from "./invoke-loader";
6
+ import { LoaderErrorBoundary } from "./loader-error-boundary";
7
+ import { levantaProductFullSchema } from "./loader-schemas";
8
+ function LevantaProductLoaderInner({
9
+ loaderKey,
10
+ asin,
11
+ marketplace,
12
+ children
13
+ }) {
14
+ const queryResult = useSuspenseQuery({
15
+ queryKey: [loaderKey, { asin, marketplace }],
16
+ queryFn: async () => {
17
+ const loadedData = await invokeLoader({
18
+ loaderKey,
19
+ args: { asin, marketplace }
20
+ });
21
+ return levantaProductFullSchema.parse(loadedData);
22
+ }
23
+ });
24
+ return /* @__PURE__ */ jsx(Fragment, { children: children(queryResult.data) });
25
+ }
26
+ function LevantaProductLoader({
27
+ loaderKey,
28
+ asin,
29
+ marketplace,
30
+ children,
31
+ fallback
32
+ }) {
33
+ return /* @__PURE__ */ jsx(
34
+ LoaderErrorBoundary,
35
+ {
36
+ fallback: fallback ?? null,
37
+ resetKey: `${loaderKey}:${asin}:${marketplace ?? ""}`,
38
+ children: /* @__PURE__ */ jsx(Suspense, { fallback: fallback ?? null, children: /* @__PURE__ */ jsx(
39
+ LevantaProductLoaderInner,
40
+ {
41
+ loaderKey,
42
+ asin,
43
+ marketplace,
44
+ children
45
+ }
46
+ ) })
47
+ }
48
+ );
49
+ }
50
+ export {
51
+ LevantaProductLoader
52
+ };
53
+ //# sourceMappingURL=levanta-product-loader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../loaders/levanta-product-loader.tsx"],
4
+ "sourcesContent": ["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { LevantaProductFull } from \"./loader-schemas\";\n\nimport { Suspense } from \"react\";\n\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\n\nimport { invokeLoader } from \"./invoke-loader\";\nimport { LoaderErrorBoundary } from \"./loader-error-boundary\";\nimport { levantaProductFullSchema } from \"./loader-schemas\";\n\ntype LevantaProductLoaderProps = {\n loaderKey: string;\n asin: string;\n marketplace?: string;\n children: (data: LevantaProductFull) => ReactNode;\n fallback?: ReactNode;\n};\n\nfunction LevantaProductLoaderInner({\n loaderKey,\n asin,\n marketplace,\n children,\n}: Omit<LevantaProductLoaderProps, \"fallback\">) {\n const queryResult = useSuspenseQuery({\n queryKey: [loaderKey, { asin, marketplace }],\n queryFn: async () => {\n const loadedData = await invokeLoader({\n loaderKey,\n args: { asin, marketplace },\n });\n return levantaProductFullSchema.parse(loadedData);\n },\n });\n\n return <>{children(queryResult.data)}</>;\n}\n\nexport function LevantaProductLoader({\n loaderKey,\n asin,\n marketplace,\n children,\n fallback,\n}: LevantaProductLoaderProps) {\n return (\n <LoaderErrorBoundary\n fallback={fallback ?? null}\n resetKey={`${loaderKey}:${asin}:${marketplace ?? \"\"}`}\n >\n <Suspense fallback={fallback ?? null}>\n <LevantaProductLoaderInner\n loaderKey={loaderKey}\n asin={asin}\n marketplace={marketplace}\n >\n {children}\n </LevantaProductLoaderInner>\n </Suspense>\n </LoaderErrorBoundary>\n );\n}\n"],
5
+ "mappings": ";AAsCS;AAjCT,SAAS,gBAAgB;AAEzB,SAAS,wBAAwB;AAEjC,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AACpC,SAAS,gCAAgC;AAUzC,SAAS,0BAA0B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgD;AAC9C,QAAM,cAAc,iBAAiB;AAAA,IACnC,UAAU,CAAC,WAAW,EAAE,MAAM,YAAY,CAAC;AAAA,IAC3C,SAAS,YAAY;AACnB,YAAM,aAAa,MAAM,aAAa;AAAA,QACpC;AAAA,QACA,MAAM,EAAE,MAAM,YAAY;AAAA,MAC5B,CAAC;AACD,aAAO,yBAAyB,MAAM,UAAU;AAAA,IAClD;AAAA,EACF,CAAC;AAED,SAAO,gCAAG,mBAAS,YAAY,IAAI,GAAE;AACvC;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,YAAY;AAAA,MACtB,UAAU,GAAG,SAAS,IAAI,IAAI,IAAI,eAAe,EAAE;AAAA,MAEnD,8BAAC,YAAS,UAAU,YAAY,MAC9B;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UAEC;AAAA;AAAA,MACH,GACF;AAAA;AAAA,EACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,25 @@
1
+ import type { ReactNode } from "react";
2
+ import * as React from "react";
3
+ interface LoaderErrorBoundaryState {
4
+ hasError: boolean;
5
+ resetKey: string;
6
+ }
7
+ type LoaderErrorBoundaryProps = React.PropsWithChildren<{
8
+ fallback: ReactNode;
9
+ resetKey: string;
10
+ }>;
11
+ /**
12
+ * Error boundary for loader components that renders the fallback instead of
13
+ * crashing the page when a loader fails (e.g. product not published to the
14
+ * Online Store sales channel, deleted collection, etc.).
15
+ *
16
+ * When resetKey changes (e.g. navigating to a different product), the error
17
+ * state is cleared so the new loader gets a chance to render.
18
+ */
19
+ export declare class LoaderErrorBoundary extends React.Component<LoaderErrorBoundaryProps, LoaderErrorBoundaryState> {
20
+ state: LoaderErrorBoundaryState;
21
+ static getDerivedStateFromError(): Partial<LoaderErrorBoundaryState>;
22
+ static getDerivedStateFromProps(props: LoaderErrorBoundaryProps, state: LoaderErrorBoundaryState): Partial<LoaderErrorBoundaryState> | null;
23
+ render(): ReactNode;
24
+ }
25
+ export {};
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ class LoaderErrorBoundary extends React.Component {
4
+ state = { hasError: false, resetKey: "" };
5
+ static getDerivedStateFromError() {
6
+ return { hasError: true };
7
+ }
8
+ static getDerivedStateFromProps(props, state) {
9
+ if (props.resetKey !== state.resetKey) {
10
+ return { hasError: false, resetKey: props.resetKey };
11
+ }
12
+ return null;
13
+ }
14
+ render() {
15
+ if (this.state.hasError) {
16
+ return this.props.fallback;
17
+ }
18
+ return this.props.children;
19
+ }
20
+ }
21
+ export {
22
+ LoaderErrorBoundary
23
+ };
24
+ //# sourceMappingURL=loader-error-boundary.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../loaders/loader-error-boundary.tsx"],
4
+ "sourcesContent": ["\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport * as React from \"react\";\n\ninterface LoaderErrorBoundaryState {\n hasError: boolean;\n resetKey: string;\n}\n\ntype LoaderErrorBoundaryProps = React.PropsWithChildren<{\n fallback: ReactNode;\n resetKey: string;\n}>;\n\n/**\n * Error boundary for loader components that renders the fallback instead of\n * crashing the page when a loader fails (e.g. product not published to the\n * Online Store sales channel, deleted collection, etc.).\n *\n * When resetKey changes (e.g. navigating to a different product), the error\n * state is cleared so the new loader gets a chance to render.\n */\nexport class LoaderErrorBoundary extends React.Component<\n LoaderErrorBoundaryProps,\n LoaderErrorBoundaryState\n> {\n state: LoaderErrorBoundaryState = { hasError: false, resetKey: \"\" };\n\n static getDerivedStateFromError(): Partial<LoaderErrorBoundaryState> {\n return { hasError: true };\n }\n\n static getDerivedStateFromProps(\n props: LoaderErrorBoundaryProps,\n state: LoaderErrorBoundaryState,\n ): Partial<LoaderErrorBoundaryState> | null {\n if (props.resetKey !== state.resetKey) {\n return { hasError: false, resetKey: props.resetKey };\n }\n return null;\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback;\n }\n return this.props.children;\n }\n}\n"],
5
+ "mappings": ";AAIA,YAAY,WAAW;AAoBhB,MAAM,4BAA4B,MAAM,UAG7C;AAAA,EACA,QAAkC,EAAE,UAAU,OAAO,UAAU,GAAG;AAAA,EAElE,OAAO,2BAA8D;AACnE,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAO,yBACL,OACA,OAC0C;AAC1C,QAAI,MAAM,aAAa,MAAM,UAAU;AACrC,aAAO,EAAE,UAAU,OAAO,UAAU,MAAM,SAAS;AAAA,IACrD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS;AACP,QAAI,KAAK,MAAM,UAAU;AACvB,aAAO,KAAK,MAAM;AAAA,IACpB;AACA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Shared data-loader key constants. Loader components and prefetch queries
3
+ * import from here so the strings are never duplicated across a generated site.
4
+ *
5
+ * These keys serve double duty: they identify which backend loader to invoke
6
+ * AND are used as React Query cache key prefixes. Loader components internally
7
+ * construct queryKey as `[loaderKey, args]`.
8
+ *
9
+ * Naming convention: `<integration>.<objectType>` or
10
+ * `<integration>.<objectType>_<qualifier>`.
11
+ */
12
+ export declare const DATA_LOADER_KEYS: {
13
+ readonly SHOPIFY_PRODUCT: "shopify_storefront.product";
14
+ readonly SHOPIFY_COLLECTION: "shopify_storefront.collection";
15
+ readonly SHOPIFY_COLLECTION_PRODUCTS: "shopify_storefront.collection_products";
16
+ readonly SHOPIFY_METAOBJECT: "shopify_storefront.metaobject";
17
+ readonly SHOPIFY_METAOBJECTS: "shopify_storefront.metaobjects";
18
+ readonly REPLO_PRODUCT: "replo_products.product";
19
+ readonly OKENDO_PRODUCT_REVIEWS: "okendo.product_reviews";
20
+ readonly OKENDO_PRODUCT_REVIEW_AGGREGATE: "okendo.product_review_aggregate";
21
+ readonly REBUY_RECOMMENDATIONS: "rebuy.recommendations";
22
+ readonly LEVANTA_PRODUCT: "levanta_products.product";
23
+ readonly SMILE_IO_VIP_TIERS: "smile_io.vip_tiers";
24
+ readonly SMILE_IO_EARNING_RULES: "smile_io.earning_rules";
25
+ readonly SMILE_IO_REWARDS: "smile_io.rewards";
26
+ readonly YOTPO_PRODUCT_REVIEWS: "yotpo.product_reviews";
27
+ readonly YOTPO_PRODUCT_REVIEW_AGGREGATE: "yotpo.product_review_aggregate";
28
+ readonly REVIEWS_IO_PRODUCT_REVIEWS: "reviews_io.product_reviews";
29
+ readonly REVIEWS_IO_PRODUCT_REVIEW_AGGREGATE: "reviews_io.product_review_aggregate";
30
+ readonly STATSIG_EXPERIMENT: "statsig.experiment";
31
+ readonly CONTENTFUL_ENTRY: "contentful.entry";
32
+ readonly CONTENTFUL_ENTRIES: "contentful.entries";
33
+ };
34
+ export type DataLoaderKey = (typeof DATA_LOADER_KEYS)[keyof typeof DATA_LOADER_KEYS];