@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.
- package/LICENSE +11 -0
- package/_vendor/replo-utils/lib/crypto.d.ts +30 -0
- package/_vendor/replo-utils/lib/errors.d.ts +83 -0
- package/_vendor/replo-utils/lib/json.d.ts +6 -0
- package/_vendor/replo-utils/lib/json.mjs +43 -0
- package/_vendor/replo-utils/lib/misc.d.ts +145 -0
- package/_vendor/replo-utils/lib/object.d.ts +31 -0
- package/_vendor/schemas/errors.d.ts +459 -0
- package/_vendor/schemas/generated/consent.d.ts +55 -0
- package/_vendor/schemas/generated/errors.d.ts +61 -0
- package/_vendor/schemas/loaderKeys.d.ts +1 -0
- package/_vendor/schemas/loaderKeys.mjs +27 -0
- package/_vendor/schemas/money.d.ts +60 -0
- package/_vendor/schemas/money.mjs +2051 -0
- package/analytics/analytics-provider.d.ts +16 -0
- package/analytics/analytics-provider.js +113 -0
- package/analytics/analytics-provider.js.map +7 -0
- package/analytics/analytics-sink.d.ts +26 -0
- package/analytics/analytics-sink.js +1 -0
- package/analytics/analytics-sink.js.map +7 -0
- package/analytics/get-analytics-sinks.d.ts +27 -0
- package/analytics/get-analytics-sinks.js +52 -0
- package/analytics/get-analytics-sinks.js.map +7 -0
- package/analytics/hooks/use-product-viewed-analytics.d.ts +23 -0
- package/analytics/hooks/use-product-viewed-analytics.js +34 -0
- package/analytics/hooks/use-product-viewed-analytics.js.map +7 -0
- package/analytics/replo-first-party-pixel.d.ts +12 -0
- package/analytics/replo-first-party-pixel.js +31 -0
- package/analytics/replo-first-party-pixel.js.map +7 -0
- package/analytics/replo-pixel-script.d.ts +13 -0
- package/analytics/replo-pixel-script.js +30 -0
- package/analytics/replo-pixel-script.js.map +7 -0
- package/analytics/sinks/ga4-sink.d.ts +15 -0
- package/analytics/sinks/ga4-sink.js +60 -0
- package/analytics/sinks/ga4-sink.js.map +7 -0
- package/analytics/sinks/meta-sink.d.ts +14 -0
- package/analytics/sinks/meta-sink.js +56 -0
- package/analytics/sinks/meta-sink.js.map +7 -0
- package/analytics/sinks/pinterest-sink.d.ts +14 -0
- package/analytics/sinks/pinterest-sink.js +76 -0
- package/analytics/sinks/pinterest-sink.js.map +7 -0
- package/analytics/sinks/reddit-sink.d.ts +14 -0
- package/analytics/sinks/reddit-sink.js +80 -0
- package/analytics/sinks/reddit-sink.js.map +7 -0
- package/analytics/sinks/replo-sink.d.ts +14 -0
- package/analytics/sinks/replo-sink.js +57 -0
- package/analytics/sinks/replo-sink.js.map +7 -0
- package/analytics/sinks/snapchat-sink.d.ts +14 -0
- package/analytics/sinks/snapchat-sink.js +67 -0
- package/analytics/sinks/snapchat-sink.js.map +7 -0
- package/analytics/sinks/tiktok-sink.d.ts +14 -0
- package/analytics/sinks/tiktok-sink.js +79 -0
- package/analytics/sinks/tiktok-sink.js.map +7 -0
- package/analytics/sinks/window-sink.d.ts +18 -0
- package/analytics/sinks/window-sink.js +46 -0
- package/analytics/sinks/window-sink.js.map +7 -0
- package/analytics/utils/analytics-utils.d.ts +7 -0
- package/analytics/utils/analytics-utils.js +130 -0
- package/analytics/utils/analytics-utils.js.map +7 -0
- package/analytics/utils/navigation-tracker.d.ts +16 -0
- package/analytics/utils/navigation-tracker.js +44 -0
- package/analytics/utils/navigation-tracker.js.map +7 -0
- package/analytics/utils/shopify-funnel-gate.d.ts +8 -0
- package/analytics/utils/shopify-funnel-gate.js +22 -0
- package/analytics/utils/shopify-funnel-gate.js.map +7 -0
- package/cart/buy-now-action.d.ts +21 -0
- package/cart/buy-now-action.js +104 -0
- package/cart/buy-now-action.js.map +7 -0
- package/cart/cart-actions.d.ts +63 -0
- package/cart/cart-actions.js +90 -0
- package/cart/cart-actions.js.map +7 -0
- package/cart/cart-loader.d.ts +9 -0
- package/cart/cart-loader.js +11 -0
- package/cart/cart-loader.js.map +7 -0
- package/cart/cart-provider.d.ts +85 -0
- package/cart/cart-provider.js +372 -0
- package/cart/cart-provider.js.map +7 -0
- package/cart/cart-schema.d.ts +74 -0
- package/cart/cart-schema.js +69 -0
- package/cart/cart-schema.js.map +7 -0
- package/cart/cart-types.d.ts +132 -0
- package/cart/cart-types.js +8 -0
- package/cart/cart-types.js.map +7 -0
- package/cart/gateways/cart-constants.d.ts +1 -0
- package/cart/gateways/cart-constants.js +5 -0
- package/cart/gateways/cart-constants.js.map +7 -0
- package/cart/gateways/cart-gateway.d.ts +10 -0
- package/cart/gateways/cart-gateway.js +19 -0
- package/cart/gateways/cart-gateway.js.map +7 -0
- package/cart/gateways/cookie-cart-gateway.d.ts +28 -0
- package/cart/gateways/cookie-cart-gateway.js +109 -0
- package/cart/gateways/cookie-cart-gateway.js.map +7 -0
- package/cart/gateways/default-cart-gateway.d.ts +19 -0
- package/cart/gateways/default-cart-gateway.js +30 -0
- package/cart/gateways/default-cart-gateway.js.map +7 -0
- package/cart/gateways/resolver-cart-gateway.d.ts +2 -0
- package/cart/gateways/resolver-cart-gateway.js +109 -0
- package/cart/gateways/resolver-cart-gateway.js.map +7 -0
- package/cart/gateways/stripe-cart-gateway.d.ts +19 -0
- package/cart/gateways/stripe-cart-gateway.js +28 -0
- package/cart/gateways/stripe-cart-gateway.js.map +7 -0
- package/cart/hooks/use-add-to-cart.d.ts +63 -0
- package/cart/hooks/use-add-to-cart.js +124 -0
- package/cart/hooks/use-add-to-cart.js.map +7 -0
- package/cart/hooks/use-buy-now.d.ts +49 -0
- package/cart/hooks/use-buy-now.js +62 -0
- package/cart/hooks/use-buy-now.js.map +7 -0
- package/cart/utils/cart-utils.d.ts +43 -0
- package/cart/utils/cart-utils.js +46 -0
- package/cart/utils/cart-utils.js.map +7 -0
- package/cart/utils/cookie-cart-persistence.d.ts +55 -0
- package/cart/utils/cookie-cart-persistence.js +166 -0
- package/cart/utils/cookie-cart-persistence.js.map +7 -0
- package/cart/utils/variant-to-cart-line.d.ts +74 -0
- package/cart/utils/variant-to-cart-line.js +162 -0
- package/cart/utils/variant-to-cart-line.js.map +7 -0
- package/chunk-UJCSKKID.mjs +27 -0
- package/consent/consent-action.d.ts +9 -0
- package/consent/consent-action.js +25 -0
- package/consent/consent-action.js.map +7 -0
- package/consent/consent-actions.d.ts +28 -0
- package/consent/consent-actions.js +36 -0
- package/consent/consent-actions.js.map +7 -0
- package/consent/consent-store.d.ts +69 -0
- package/consent/consent-store.js +194 -0
- package/consent/consent-store.js.map +7 -0
- package/consent/cookie.d.ts +36 -0
- package/consent/cookie.js +82 -0
- package/consent/cookie.js.map +7 -0
- package/consent/replo-scripts.d.ts +23 -0
- package/consent/replo-scripts.js +102 -0
- package/consent/replo-scripts.js.map +7 -0
- package/consent/script-registration-store.d.ts +25 -0
- package/consent/script-registration-store.js +61 -0
- package/consent/script-registration-store.js.map +7 -0
- package/consent/script-snippets.d.ts +24 -0
- package/consent/script-snippets.js +122 -0
- package/consent/script-snippets.js.map +7 -0
- package/consent/types.d.ts +34 -0
- package/consent/types.js +1 -0
- package/consent/types.js.map +7 -0
- package/consent/window-api.d.ts +41 -0
- package/consent/window-api.js +73 -0
- package/consent/window-api.js.map +7 -0
- package/env.d.ts +9 -0
- package/env.js +42 -0
- package/env.js.map +7 -0
- package/gateways/canopy-api.d.ts +83 -0
- package/gateways/canopy-api.js +197 -0
- package/gateways/canopy-api.js.map +7 -0
- package/hooks/use-client-value.d.ts +10 -0
- package/hooks/use-client-value.js +12 -0
- package/hooks/use-client-value.js.map +7 -0
- package/hooks/use-formatted-price.d.ts +15 -0
- package/hooks/use-formatted-price.js +20 -0
- package/hooks/use-formatted-price.js.map +7 -0
- package/lib/canopy-error.d.ts +25 -0
- package/lib/canopy-error.js +24 -0
- package/lib/canopy-error.js.map +7 -0
- package/lib/get-query-client.d.ts +2 -0
- package/lib/get-query-client.js +34 -0
- package/lib/get-query-client.js.map +7 -0
- package/lib/integration-utils.d.ts +2 -0
- package/lib/integration-utils.js +9 -0
- package/lib/integration-utils.js.map +7 -0
- package/lib/shopify-utils.d.ts +10 -0
- package/lib/shopify-utils.js +7 -0
- package/lib/shopify-utils.js.map +7 -0
- package/lib/url-utils.d.ts +4 -0
- package/lib/url-utils.js +8 -0
- package/lib/url-utils.js.map +7 -0
- package/loaders/collection-loader.d.ts +11 -0
- package/loaders/collection-loader.js +55 -0
- package/loaders/collection-loader.js.map +7 -0
- package/loaders/collection-products-loader.d.ts +12 -0
- package/loaders/collection-products-loader.js +58 -0
- package/loaders/collection-products-loader.js.map +7 -0
- package/loaders/contentful-entries-loader.d.ts +17 -0
- package/loaders/contentful-entries-loader.js +78 -0
- package/loaders/contentful-entries-loader.js.map +7 -0
- package/loaders/contentful-entry-loader.d.ts +14 -0
- package/loaders/contentful-entry-loader.js +60 -0
- package/loaders/contentful-entry-loader.js.map +7 -0
- package/loaders/invoke-loader-action.d.ts +11 -0
- package/loaders/invoke-loader-action.js +14 -0
- package/loaders/invoke-loader-action.js.map +7 -0
- package/loaders/invoke-loader-server.d.ts +18 -0
- package/loaders/invoke-loader-server.js +40 -0
- package/loaders/invoke-loader-server.js.map +7 -0
- package/loaders/invoke-loader.d.ts +16 -0
- package/loaders/invoke-loader.js +37 -0
- package/loaders/invoke-loader.js.map +7 -0
- package/loaders/levanta-product-loader.d.ts +11 -0
- package/loaders/levanta-product-loader.js +53 -0
- package/loaders/levanta-product-loader.js.map +7 -0
- package/loaders/loader-error-boundary.d.ts +25 -0
- package/loaders/loader-error-boundary.js +24 -0
- package/loaders/loader-error-boundary.js.map +7 -0
- package/loaders/loader-keys.d.ts +34 -0
- package/loaders/loader-keys.js +26 -0
- package/loaders/loader-keys.js.map +7 -0
- package/loaders/loader-schemas.d.ts +946 -0
- package/loaders/loader-schemas.js +353 -0
- package/loaders/loader-schemas.js.map +7 -0
- package/loaders/metaobject-loader.d.ts +12 -0
- package/loaders/metaobject-loader.js +54 -0
- package/loaders/metaobject-loader.js.map +7 -0
- package/loaders/metaobjects-loader.d.ts +14 -0
- package/loaders/metaobjects-loader.js +60 -0
- package/loaders/metaobjects-loader.js.map +7 -0
- package/loaders/okendo-review-aggregate-loader.d.ts +17 -0
- package/loaders/okendo-review-aggregate-loader.js +56 -0
- package/loaders/okendo-review-aggregate-loader.js.map +7 -0
- package/loaders/okendo-reviews-loader.d.ts +23 -0
- package/loaders/okendo-reviews-loader.js +54 -0
- package/loaders/okendo-reviews-loader.js.map +7 -0
- package/loaders/prefetch-loaders.d.ts +33 -0
- package/loaders/prefetch-loaders.js +46 -0
- package/loaders/prefetch-loaders.js.map +7 -0
- package/loaders/preview-placeholder.d.ts +25 -0
- package/loaders/preview-placeholder.js +222 -0
- package/loaders/preview-placeholder.js.map +7 -0
- package/loaders/product-loader-args.d.ts +21 -0
- package/loaders/product-loader-args.js +17 -0
- package/loaders/product-loader-args.js.map +7 -0
- package/loaders/product-loader.d.ts +10 -0
- package/loaders/product-loader.js +52 -0
- package/loaders/product-loader.js.map +7 -0
- package/loaders/rebuy-recommendations-loader.d.ts +165 -0
- package/loaders/rebuy-recommendations-loader.js +57 -0
- package/loaders/rebuy-recommendations-loader.js.map +7 -0
- package/loaders/reviews-io-review-aggregate-loader.d.ts +12 -0
- package/loaders/reviews-io-review-aggregate-loader.js +43 -0
- package/loaders/reviews-io-review-aggregate-loader.js.map +7 -0
- package/loaders/reviews-io-reviews-loader.d.ts +14 -0
- package/loaders/reviews-io-reviews-loader.js +65 -0
- package/loaders/reviews-io-reviews-loader.js.map +7 -0
- package/loaders/smile-earning-rules-loader.d.ts +19 -0
- package/loaders/smile-earning-rules-loader.js +44 -0
- package/loaders/smile-earning-rules-loader.js.map +7 -0
- package/loaders/smile-rewards-loader.d.ts +19 -0
- package/loaders/smile-rewards-loader.js +44 -0
- package/loaders/smile-rewards-loader.js.map +7 -0
- package/loaders/smile-vip-tiers-loader.d.ts +18 -0
- package/loaders/smile-vip-tiers-loader.js +43 -0
- package/loaders/smile-vip-tiers-loader.js.map +7 -0
- package/loaders/statsig-experiment-loader.d.ts +20 -0
- package/loaders/statsig-experiment-loader.js +81 -0
- package/loaders/statsig-experiment-loader.js.map +7 -0
- package/loaders/yotpo-review-aggregate-loader.d.ts +12 -0
- package/loaders/yotpo-review-aggregate-loader.js +50 -0
- package/loaders/yotpo-review-aggregate-loader.js.map +7 -0
- package/loaders/yotpo-reviews-loader.d.ts +14 -0
- package/loaders/yotpo-reviews-loader.js +65 -0
- package/loaders/yotpo-reviews-loader.js.map +7 -0
- package/money.d.ts +9 -0
- package/money.js +13 -0
- package/money.js.map +7 -0
- package/next/config.d.ts +4 -0
- package/next/config.js +91 -0
- package/next/config.js.map +7 -0
- package/next/image-loader.d.ts +2 -0
- package/next/image-loader.js +52 -0
- package/next/image-loader.js.map +7 -0
- package/next/open-next.d.ts +2 -0
- package/next/open-next.js +24 -0
- package/next/open-next.js.map +7 -0
- package/orders/order-status-schema.d.ts +161 -0
- package/orders/order-status-schema.js +83 -0
- package/orders/order-status-schema.js.map +7 -0
- package/orders/order-status.d.ts +11 -0
- package/orders/order-status.js +41 -0
- package/orders/order-status.js.map +7 -0
- package/package.json +216 -0
- package/providers/query-provider.d.ts +1 -0
- package/providers/query-provider.js +12 -0
- package/providers/query-provider.js.map +7 -0
- package/providers/replo-provider.d.ts +1 -0
- package/providers/replo-provider.js +22 -0
- package/providers/replo-provider.js.map +7 -0
|
@@ -0,0 +1,81 @@
|
|
|
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 { statsigExperimentLoaderOutputSchema } from "./loader-schemas";
|
|
8
|
+
function buildArgs({
|
|
9
|
+
experimentName,
|
|
10
|
+
stableId,
|
|
11
|
+
userId,
|
|
12
|
+
environmentTier,
|
|
13
|
+
customAttributes
|
|
14
|
+
}) {
|
|
15
|
+
return {
|
|
16
|
+
experimentName,
|
|
17
|
+
stableId,
|
|
18
|
+
...userId !== void 0 ? { userId } : {},
|
|
19
|
+
...environmentTier !== void 0 ? { environmentTier } : {},
|
|
20
|
+
...customAttributes !== void 0 ? { customAttributes } : {}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function StatsigExperimentLoaderInner({
|
|
24
|
+
loaderKey,
|
|
25
|
+
experimentName,
|
|
26
|
+
stableId,
|
|
27
|
+
userId,
|
|
28
|
+
environmentTier,
|
|
29
|
+
customAttributes,
|
|
30
|
+
children
|
|
31
|
+
}) {
|
|
32
|
+
const args = buildArgs({
|
|
33
|
+
experimentName,
|
|
34
|
+
stableId,
|
|
35
|
+
userId,
|
|
36
|
+
environmentTier,
|
|
37
|
+
customAttributes
|
|
38
|
+
});
|
|
39
|
+
const { data } = useSuspenseQuery({
|
|
40
|
+
queryKey: [loaderKey, args],
|
|
41
|
+
queryFn: async () => {
|
|
42
|
+
const loadedData = await invokeLoader({ loaderKey, args });
|
|
43
|
+
return statsigExperimentLoaderOutputSchema.parse(loadedData);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return /* @__PURE__ */ jsx(Fragment, { children: children(data) });
|
|
47
|
+
}
|
|
48
|
+
function StatsigExperimentLoader({
|
|
49
|
+
loaderKey,
|
|
50
|
+
experimentName,
|
|
51
|
+
stableId,
|
|
52
|
+
userId,
|
|
53
|
+
environmentTier,
|
|
54
|
+
customAttributes,
|
|
55
|
+
children,
|
|
56
|
+
fallback
|
|
57
|
+
}) {
|
|
58
|
+
return /* @__PURE__ */ jsx(
|
|
59
|
+
LoaderErrorBoundary,
|
|
60
|
+
{
|
|
61
|
+
fallback: fallback ?? null,
|
|
62
|
+
resetKey: `${loaderKey}:${experimentName}:${stableId}`,
|
|
63
|
+
children: /* @__PURE__ */ jsx(Suspense, { fallback: fallback ?? null, children: /* @__PURE__ */ jsx(
|
|
64
|
+
StatsigExperimentLoaderInner,
|
|
65
|
+
{
|
|
66
|
+
loaderKey,
|
|
67
|
+
experimentName,
|
|
68
|
+
stableId,
|
|
69
|
+
userId,
|
|
70
|
+
environmentTier,
|
|
71
|
+
customAttributes,
|
|
72
|
+
children
|
|
73
|
+
}
|
|
74
|
+
) })
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
export {
|
|
79
|
+
StatsigExperimentLoader
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=statsig-experiment-loader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../loaders/statsig-experiment-loader.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { StatsigExperimentAssignment } 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 { statsigExperimentLoaderOutputSchema } from \"./loader-schemas\";\n\ntype StatsigExperimentLoaderProps = {\n loaderKey: string;\n experimentName: string;\n /**\n * Durable per-visitor identifier. Read it from the `statsig_stable_id` cookie\n * in the page's server component and pass the same value to both\n * `PrefetchedLoaders` and this component so the SSR-prefetched assignment\n * hydrates without a refetch and stays consistent across renders.\n */\n stableId: string;\n userId?: string;\n environmentTier?: string;\n customAttributes?: Record<string, string>;\n children: (assignment: StatsigExperimentAssignment) => ReactNode;\n fallback?: ReactNode;\n};\n\nfunction buildArgs({\n experimentName,\n stableId,\n userId,\n environmentTier,\n customAttributes,\n}: Omit<StatsigExperimentLoaderProps, \"loaderKey\" | \"children\" | \"fallback\">) {\n return {\n experimentName,\n stableId,\n ...(userId !== undefined ? { userId } : {}),\n ...(environmentTier !== undefined ? { environmentTier } : {}),\n ...(customAttributes !== undefined ? { customAttributes } : {}),\n };\n}\n\nfunction StatsigExperimentLoaderInner({\n loaderKey,\n experimentName,\n stableId,\n userId,\n environmentTier,\n customAttributes,\n children,\n}: Omit<StatsigExperimentLoaderProps, \"fallback\">) {\n const args = buildArgs({\n experimentName,\n stableId,\n userId,\n environmentTier,\n customAttributes,\n });\n const { data } = useSuspenseQuery({\n queryKey: [loaderKey, args],\n queryFn: async () => {\n const loadedData = await invokeLoader({ loaderKey, args });\n return statsigExperimentLoaderOutputSchema.parse(loadedData);\n },\n });\n\n return <>{children(data)}</>;\n}\n\nexport function StatsigExperimentLoader({\n loaderKey,\n experimentName,\n stableId,\n userId,\n environmentTier,\n customAttributes,\n children,\n fallback,\n}: StatsigExperimentLoaderProps) {\n return (\n <LoaderErrorBoundary\n fallback={fallback ?? null}\n resetKey={`${loaderKey}:${experimentName}:${stableId}`}\n >\n <Suspense fallback={fallback ?? null}>\n <StatsigExperimentLoaderInner\n loaderKey={loaderKey}\n experimentName={experimentName}\n stableId={stableId}\n userId={userId}\n environmentTier={environmentTier}\n customAttributes={customAttributes}\n >\n {children}\n </StatsigExperimentLoaderInner>\n </Suspense>\n </LoaderErrorBoundary>\n );\n}\n"],
|
|
5
|
+
"mappings": ";AAsES;AAjET,SAAS,gBAAgB;AAEzB,SAAS,wBAAwB;AAEjC,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AACpC,SAAS,2CAA2C;AAmBpD,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8E;AAC5E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,IACzC,GAAI,oBAAoB,SAAY,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC3D,GAAI,qBAAqB,SAAY,EAAE,iBAAiB,IAAI,CAAC;AAAA,EAC/D;AACF;AAEA,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmD;AACjD,QAAM,OAAO,UAAU;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;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;AACF,GAAiC;AAC/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,YAAY;AAAA,MACtB,UAAU,GAAG,SAAS,IAAI,cAAc,IAAI,QAAQ;AAAA,MAEpD,8BAAC,YAAS,UAAU,YAAY,MAC9B;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UAEC;AAAA;AAAA,MACH,GACF;AAAA;AAAA,EACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { yotpoProductReviewAggregateLoaderOutputSchema } from "./loader-schemas";
|
|
4
|
+
type YotpoReviewAggregateData = z.infer<typeof yotpoProductReviewAggregateLoaderOutputSchema>;
|
|
5
|
+
type YotpoReviewAggregateLoaderProps = {
|
|
6
|
+
loaderKey: string;
|
|
7
|
+
productId: string;
|
|
8
|
+
children: (data: YotpoReviewAggregateData) => ReactNode;
|
|
9
|
+
fallback?: ReactNode;
|
|
10
|
+
};
|
|
11
|
+
export declare function YotpoReviewAggregateLoader({ loaderKey, productId, children, fallback, }: YotpoReviewAggregateLoaderProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
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 { yotpoProductReviewAggregateLoaderOutputSchema } from "./loader-schemas";
|
|
8
|
+
function YotpoReviewAggregateLoaderInner({
|
|
9
|
+
loaderKey,
|
|
10
|
+
productId,
|
|
11
|
+
children
|
|
12
|
+
}) {
|
|
13
|
+
const queryResult = useSuspenseQuery({
|
|
14
|
+
queryKey: [loaderKey, { productId }],
|
|
15
|
+
queryFn: async () => {
|
|
16
|
+
const loadedData = await invokeLoader({
|
|
17
|
+
loaderKey,
|
|
18
|
+
args: { productId }
|
|
19
|
+
});
|
|
20
|
+
return yotpoProductReviewAggregateLoaderOutputSchema.parse(loadedData);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return /* @__PURE__ */ jsx(Fragment, { children: children(queryResult.data) });
|
|
24
|
+
}
|
|
25
|
+
function YotpoReviewAggregateLoader({
|
|
26
|
+
loaderKey,
|
|
27
|
+
productId,
|
|
28
|
+
children,
|
|
29
|
+
fallback
|
|
30
|
+
}) {
|
|
31
|
+
return /* @__PURE__ */ jsx(
|
|
32
|
+
LoaderErrorBoundary,
|
|
33
|
+
{
|
|
34
|
+
fallback: fallback ?? null,
|
|
35
|
+
resetKey: `${loaderKey}:${productId}`,
|
|
36
|
+
children: /* @__PURE__ */ jsx(Suspense, { fallback: fallback ?? null, children: /* @__PURE__ */ jsx(
|
|
37
|
+
YotpoReviewAggregateLoaderInner,
|
|
38
|
+
{
|
|
39
|
+
loaderKey,
|
|
40
|
+
productId,
|
|
41
|
+
children
|
|
42
|
+
}
|
|
43
|
+
) })
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
export {
|
|
48
|
+
YotpoReviewAggregateLoader
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=yotpo-review-aggregate-loader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../loaders/yotpo-review-aggregate-loader.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { Suspense } from \"react\";\n\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { z } from \"zod\";\n\nimport { invokeLoader } from \"./invoke-loader\";\nimport { LoaderErrorBoundary } from \"./loader-error-boundary\";\nimport { yotpoProductReviewAggregateLoaderOutputSchema } from \"./loader-schemas\";\n\ntype YotpoReviewAggregateData = z.infer<\n typeof yotpoProductReviewAggregateLoaderOutputSchema\n>;\n\ntype YotpoReviewAggregateLoaderProps = {\n loaderKey: string;\n productId: string;\n children: (data: YotpoReviewAggregateData) => ReactNode;\n fallback?: ReactNode;\n};\n\nfunction YotpoReviewAggregateLoaderInner({\n loaderKey,\n productId,\n children,\n}: Omit<YotpoReviewAggregateLoaderProps, \"fallback\">) {\n const queryResult = useSuspenseQuery({\n queryKey: [loaderKey, { productId }],\n queryFn: async () => {\n const loadedData = await invokeLoader({\n loaderKey,\n args: { productId },\n });\n return yotpoProductReviewAggregateLoaderOutputSchema.parse(loadedData);\n },\n });\n\n return <>{children(queryResult.data)}</>;\n}\n\nexport function YotpoReviewAggregateLoader({\n loaderKey,\n productId,\n children,\n fallback,\n}: YotpoReviewAggregateLoaderProps) {\n return (\n <LoaderErrorBoundary\n fallback={fallback ?? null}\n resetKey={`${loaderKey}:${productId}`}\n >\n <Suspense fallback={fallback ?? null}>\n <YotpoReviewAggregateLoaderInner\n loaderKey={loaderKey}\n productId={productId}\n >\n {children}\n </YotpoReviewAggregateLoaderInner>\n </Suspense>\n </LoaderErrorBoundary>\n );\n}\n"],
|
|
5
|
+
"mappings": ";AAwCS;AApCT,SAAS,gBAAgB;AAEzB,SAAS,wBAAwB;AAGjC,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AACpC,SAAS,qDAAqD;AAa9D,SAAS,gCAAgC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,GAAsD;AACpD,QAAM,cAAc,iBAAiB;AAAA,IACnC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC;AAAA,IACnC,SAAS,YAAY;AACnB,YAAM,aAAa,MAAM,aAAa;AAAA,QACpC;AAAA,QACA,MAAM,EAAE,UAAU;AAAA,MACpB,CAAC;AACD,aAAO,8CAA8C,MAAM,UAAU;AAAA,IACvE;AAAA,EACF,CAAC;AAED,SAAO,gCAAG,mBAAS,YAAY,IAAI,GAAE;AACvC;AAEO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoC;AAClC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,YAAY;AAAA,MACtB,UAAU,GAAG,SAAS,IAAI,SAAS;AAAA,MAEnC,8BAAC,YAAS,UAAU,YAAY,MAC9B;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UAEC;AAAA;AAAA,MACH,GACF;AAAA;AAAA,EACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { yotpoProductReviewsLoaderOutputSchema } from "./loader-schemas";
|
|
4
|
+
type YotpoReviewsData = z.infer<typeof yotpoProductReviewsLoaderOutputSchema>;
|
|
5
|
+
type YotpoReviewsLoaderProps = {
|
|
6
|
+
loaderKey: string;
|
|
7
|
+
productId: string;
|
|
8
|
+
perPage?: number;
|
|
9
|
+
page?: number;
|
|
10
|
+
children: (data: YotpoReviewsData) => ReactNode;
|
|
11
|
+
fallback?: ReactNode;
|
|
12
|
+
};
|
|
13
|
+
export declare function YotpoReviewsLoader({ loaderKey, productId, perPage, page, children, fallback, }: YotpoReviewsLoaderProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
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 { yotpoProductReviewsLoaderOutputSchema } from "./loader-schemas";
|
|
8
|
+
function buildReviewsArgs({
|
|
9
|
+
productId,
|
|
10
|
+
perPage,
|
|
11
|
+
page
|
|
12
|
+
}) {
|
|
13
|
+
return {
|
|
14
|
+
productId,
|
|
15
|
+
...perPage !== void 0 ? { perPage } : {},
|
|
16
|
+
...page !== void 0 ? { page } : {}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function YotpoReviewsLoaderInner({
|
|
20
|
+
loaderKey,
|
|
21
|
+
productId,
|
|
22
|
+
perPage,
|
|
23
|
+
page,
|
|
24
|
+
children
|
|
25
|
+
}) {
|
|
26
|
+
const args = buildReviewsArgs({ productId, perPage, page });
|
|
27
|
+
const queryResult = useSuspenseQuery({
|
|
28
|
+
queryKey: [loaderKey, args],
|
|
29
|
+
queryFn: async () => {
|
|
30
|
+
const loadedData = await invokeLoader({ loaderKey, args });
|
|
31
|
+
return yotpoProductReviewsLoaderOutputSchema.parse(loadedData);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return /* @__PURE__ */ jsx(Fragment, { children: children(queryResult.data) });
|
|
35
|
+
}
|
|
36
|
+
function YotpoReviewsLoader({
|
|
37
|
+
loaderKey,
|
|
38
|
+
productId,
|
|
39
|
+
perPage,
|
|
40
|
+
page,
|
|
41
|
+
children,
|
|
42
|
+
fallback
|
|
43
|
+
}) {
|
|
44
|
+
return /* @__PURE__ */ jsx(
|
|
45
|
+
LoaderErrorBoundary,
|
|
46
|
+
{
|
|
47
|
+
fallback: fallback ?? null,
|
|
48
|
+
resetKey: `${loaderKey}:${productId}:${perPage ?? ""}:${page ?? ""}`,
|
|
49
|
+
children: /* @__PURE__ */ jsx(Suspense, { fallback: fallback ?? null, children: /* @__PURE__ */ jsx(
|
|
50
|
+
YotpoReviewsLoaderInner,
|
|
51
|
+
{
|
|
52
|
+
loaderKey,
|
|
53
|
+
productId,
|
|
54
|
+
perPage,
|
|
55
|
+
page,
|
|
56
|
+
children
|
|
57
|
+
}
|
|
58
|
+
) })
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
export {
|
|
63
|
+
YotpoReviewsLoader
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=yotpo-reviews-loader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../loaders/yotpo-reviews-loader.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { Suspense } from \"react\";\n\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { z } from \"zod\";\n\nimport { invokeLoader } from \"./invoke-loader\";\nimport { LoaderErrorBoundary } from \"./loader-error-boundary\";\nimport { yotpoProductReviewsLoaderOutputSchema } from \"./loader-schemas\";\n\ntype YotpoReviewsData = z.infer<typeof yotpoProductReviewsLoaderOutputSchema>;\n\ntype YotpoReviewsLoaderProps = {\n loaderKey: string;\n productId: string;\n perPage?: number;\n page?: number;\n children: (data: YotpoReviewsData) => ReactNode;\n fallback?: ReactNode;\n};\n\n// NOTE (Noah, 2026-07-21): Only forward pagination args when set so the queryKey\n// and prefetch args match (a prefetch that omits page/perPage must hydrate a\n// component that also omits them). React Query keys are structural, so undefined\n// entries would break the prefetch \u2192 client cache handoff.\nfunction buildReviewsArgs({\n productId,\n perPage,\n page,\n}: {\n productId: string;\n perPage?: number;\n page?: number;\n}) {\n return {\n productId,\n ...(perPage !== undefined ? { perPage } : {}),\n ...(page !== undefined ? { page } : {}),\n };\n}\n\nfunction YotpoReviewsLoaderInner({\n loaderKey,\n productId,\n perPage,\n page,\n children,\n}: Omit<YotpoReviewsLoaderProps, \"fallback\">) {\n const args = buildReviewsArgs({ productId, perPage, page });\n const queryResult = useSuspenseQuery({\n queryKey: [loaderKey, args],\n queryFn: async () => {\n const loadedData = await invokeLoader({ loaderKey, args });\n return yotpoProductReviewsLoaderOutputSchema.parse(loadedData);\n },\n });\n\n return <>{children(queryResult.data)}</>;\n}\n\nexport function YotpoReviewsLoader({\n loaderKey,\n productId,\n perPage,\n page,\n children,\n fallback,\n}: YotpoReviewsLoaderProps) {\n return (\n <LoaderErrorBoundary\n fallback={fallback ?? null}\n resetKey={`${loaderKey}:${productId}:${perPage ?? \"\"}:${page ?? \"\"}`}\n >\n <Suspense fallback={fallback ?? null}>\n <YotpoReviewsLoaderInner\n loaderKey={loaderKey}\n productId={productId}\n perPage={perPage}\n page={page}\n >\n {children}\n </YotpoReviewsLoaderInner>\n </Suspense>\n </LoaderErrorBoundary>\n );\n}\n"],
|
|
5
|
+
"mappings": ";AA4DS;AAxDT,SAAS,gBAAgB;AAEzB,SAAS,wBAAwB;AAGjC,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AACpC,SAAS,6CAA6C;AAiBtD,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SAAO;AAAA,IACL;AAAA,IACA,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC3C,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,EACvC;AACF;AAEA,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8C;AAC5C,QAAM,OAAO,iBAAiB,EAAE,WAAW,SAAS,KAAK,CAAC;AAC1D,QAAM,cAAc,iBAAiB;AAAA,IACnC,UAAU,CAAC,WAAW,IAAI;AAAA,IAC1B,SAAS,YAAY;AACnB,YAAM,aAAa,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AACzD,aAAO,sCAAsC,MAAM,UAAU;AAAA,IAC/D;AAAA,EACF,CAAC;AAED,SAAO,gCAAG,mBAAS,YAAY,IAAI,GAAE;AACvC;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,YAAY;AAAA,MACtB,UAAU,GAAG,SAAS,IAAI,SAAS,IAAI,WAAW,EAAE,IAAI,QAAQ,EAAE;AAAA,MAElE,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
|
+
}
|
package/money.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Money helpers for storefronts. All commerce amounts in the SDK (variant
|
|
3
|
+
* prices, cart costs) are integer minor units, Stripe convention: 1999 =
|
|
4
|
+
* $19.99 USD, 1999 = ¥1999 JPY. Use formatAmount/useFormattedPrice for
|
|
5
|
+
* display and fromMinorUnitsToMajorUnits when handing amounts to analytics or third-party
|
|
6
|
+
* APIs that speak decimal money.
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
export { formatAmount, fromMinorUnitsToMajorUnits, fromMinorUnitsToMajorUnitsString, fromMajorUnitsToMinorUnits, } from "./_vendor/schemas/money";
|
package/money.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
formatAmount,
|
|
3
|
+
fromMinorUnitsToMajorUnits,
|
|
4
|
+
fromMinorUnitsToMajorUnitsString,
|
|
5
|
+
fromMajorUnitsToMinorUnits
|
|
6
|
+
} from "./_vendor/schemas/money.mjs";
|
|
7
|
+
export {
|
|
8
|
+
formatAmount,
|
|
9
|
+
fromMajorUnitsToMinorUnits,
|
|
10
|
+
fromMinorUnitsToMajorUnits,
|
|
11
|
+
fromMinorUnitsToMajorUnitsString
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=money.js.map
|
package/money.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../money.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Money helpers for storefronts. All commerce amounts in the SDK (variant\n * prices, cart costs) are integer minor units, Stripe convention: 1999 =\n * $19.99 USD, 1999 = \u00A51999 JPY. Use formatAmount/useFormattedPrice for\n * display and fromMinorUnitsToMajorUnits when handing amounts to analytics or third-party\n * APIs that speak decimal money.\n * @module\n */\n// eslint-disable-next-line barrel-files/avoid-barrel-files, replo/no-export-from -- public SDK entrypoint: scaffolded sites cannot import workspace `schemas`, so this module is their only path to the money helpers.\nexport {\n formatAmount,\n fromMinorUnitsToMajorUnits,\n fromMinorUnitsToMajorUnitsString,\n fromMajorUnitsToMinorUnits,\n} from \"schemas/money\";\n"],
|
|
5
|
+
"mappings": "AASA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/next/config.d.ts
ADDED
package/next/config.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import os from "os";
|
|
2
|
+
const PLATFORM_DEV_ORIGINS = [
|
|
3
|
+
"localhost:*",
|
|
4
|
+
"*.localhost:*",
|
|
5
|
+
"*.lvh.me:*",
|
|
6
|
+
"*.daytonaproxy01.net",
|
|
7
|
+
"*.preview.reploapi.com",
|
|
8
|
+
"*.preview-staging.reploapi.com"
|
|
9
|
+
];
|
|
10
|
+
const PLATFORM_SERVER_ACTION_ORIGINS = [
|
|
11
|
+
"localhost:*",
|
|
12
|
+
"*.localhost:*",
|
|
13
|
+
"*.lvh.me:*",
|
|
14
|
+
"*.cloudflare-agent-coordinator.replo.workers.dev",
|
|
15
|
+
"*.preview.reploapi.com",
|
|
16
|
+
"*.preview-staging.reploapi.com"
|
|
17
|
+
];
|
|
18
|
+
function siteConfig(overrides = {}) {
|
|
19
|
+
const isBuild = process.env.BUILD_ENV === "build";
|
|
20
|
+
const {
|
|
21
|
+
turbopack: overrideTurbopack,
|
|
22
|
+
images: overrideImages,
|
|
23
|
+
experimental: overrideExperimental,
|
|
24
|
+
allowedDevOrigins: overrideDevOrigins,
|
|
25
|
+
...restOverrides
|
|
26
|
+
} = overrides;
|
|
27
|
+
const { serverActions: overrideServerActions, ...restOverrideExperimental } = overrideExperimental ?? {};
|
|
28
|
+
return {
|
|
29
|
+
// Site-overridable defaults.
|
|
30
|
+
reactStrictMode: true,
|
|
31
|
+
devIndicators: false,
|
|
32
|
+
...restOverrides,
|
|
33
|
+
// Platform invariants — re-asserted after the spread so a site override
|
|
34
|
+
// can never break sandbox builds, publish, or the dev server.
|
|
35
|
+
output: "standalone",
|
|
36
|
+
distDir: isBuild ? ".next" : ".next-dev",
|
|
37
|
+
// NOTE (Cole, 2026-04-30, REPL-26637): The publish tool patches
|
|
38
|
+
// required-server-files.json to clear this value before OpenNext bundles,
|
|
39
|
+
// since "/" makes esbuild emit absolute-path requires that break in Workers.
|
|
40
|
+
// NOTE (Patrick Lu, 2026-07-06, REPL-28775): Leave outputFileTracingRoot
|
|
41
|
+
// unset outside builds because Next 15.5+ otherwise forces turbopack.root to
|
|
42
|
+
// "/" and makes the dev watcher retain whole-filesystem state.
|
|
43
|
+
outputFileTracingRoot: isBuild ? "/" : void 0,
|
|
44
|
+
// NOTE (Patrick Lu, 2026-07-06, REPL-28775): Match build tracing at publish
|
|
45
|
+
// time; keep dev's watcher on the user app tree.
|
|
46
|
+
turbopack: {
|
|
47
|
+
...overrideTurbopack,
|
|
48
|
+
root: isBuild ? "/" : "/workspace/dev"
|
|
49
|
+
},
|
|
50
|
+
// @replohq/sdk ships as raw source with zero workspace deps, so we can't pull
|
|
51
|
+
// in lodash-es `uniq` here — dedupe inline via a Set instead.
|
|
52
|
+
allowedDevOrigins: Array.from(
|
|
53
|
+
/* @__PURE__ */ new Set([...overrideDevOrigins ?? [], ...PLATFORM_DEV_ORIGINS])
|
|
54
|
+
),
|
|
55
|
+
images: {
|
|
56
|
+
...overrideImages,
|
|
57
|
+
loader: "custom",
|
|
58
|
+
loaderFile: "./image-loader.ts",
|
|
59
|
+
remotePatterns: overrideImages?.remotePatterns ?? [
|
|
60
|
+
{
|
|
61
|
+
protocol: "https",
|
|
62
|
+
hostname: "**"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
experimental: {
|
|
67
|
+
...restOverrideExperimental,
|
|
68
|
+
// NOTE (Cole, 2026-06-18, REPL-28180): Next sizes its build worker pool
|
|
69
|
+
// off os.cpus().length = host cores (~64) inside a cgroup-limited sandbox,
|
|
70
|
+
// not the 2 the container actually has — a worker swarm that OOMs the
|
|
71
|
+
// 4 GiB box. availableParallelism() is cgroup-aware. Gated to prod build.
|
|
72
|
+
cpus: isBuild ? os.availableParallelism() : void 0,
|
|
73
|
+
serverActions: {
|
|
74
|
+
...overrideServerActions,
|
|
75
|
+
allowedOrigins: Array.from(
|
|
76
|
+
/* @__PURE__ */ new Set([
|
|
77
|
+
...overrideServerActions?.allowedOrigins ?? [],
|
|
78
|
+
...PLATFORM_SERVER_ACTION_ORIGINS
|
|
79
|
+
])
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const nextConfig = siteConfig();
|
|
86
|
+
var config_default = nextConfig;
|
|
87
|
+
export {
|
|
88
|
+
config_default as default,
|
|
89
|
+
siteConfig
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../next/config.ts"],
|
|
4
|
+
"sourcesContent": ["import os from \"os\";\nimport type { NextConfig } from \"next\";\n\n// Origins browsers load sandbox previews from \u2014 PREVIEW_HOSTNAME in the\n// coordinator's wrangler.jsonc plus Daytona's native preview domain. Next 16\n// hard-blocks cross-origin dev requests (HMR WebSocket, Server Actions) from\n// origins missing here.\nconst PLATFORM_DEV_ORIGINS = [\n \"localhost:*\",\n \"*.localhost:*\",\n \"*.lvh.me:*\",\n \"*.daytonaproxy01.net\",\n \"*.preview.reploapi.com\",\n \"*.preview-staging.reploapi.com\",\n];\n\nconst PLATFORM_SERVER_ACTION_ORIGINS = [\n \"localhost:*\",\n \"*.localhost:*\",\n \"*.lvh.me:*\",\n \"*.cloudflare-agent-coordinator.replo.workers.dev\",\n \"*.preview.reploapi.com\",\n \"*.preview-staging.reploapi.com\",\n];\n\n// The canonical Next.js runtime contract shared by every agent-built site.\n// Sites re-export `default` from here through a one-line `next.config.ts` shim,\n// so the platform wiring (sandbox dist dirs, Turbopack root, preview origins,\n// Cloudflare image loader) lives in exactly one place instead of being copied\n// into each template.\n//\n// `overrides` is a per-site customization surface, but it must not be able to\n// silently amputate platform wiring. A plain `...overrides` spread is a shallow\n// merge: a site that sets any nested key (e.g. `experimental.typedRoutes`)\n// would replace the whole `experimental`/`images` block and drop platform\n// defaults like the build-worker OOM guard or the Cloudflare image loader. So\n// load-bearing keys are re-asserted after the spread and the nested blocks are\n// deep-merged: a site can add keys, but platform invariants always win and\n// platform origin lists are preserved (site entries are appended, not swapped).\nexport function siteConfig(overrides: NextConfig = {}): NextConfig {\n const isBuild = process.env.BUILD_ENV === \"build\";\n const {\n turbopack: overrideTurbopack,\n images: overrideImages,\n experimental: overrideExperimental,\n allowedDevOrigins: overrideDevOrigins,\n ...restOverrides\n } = overrides;\n\n const { serverActions: overrideServerActions, ...restOverrideExperimental } =\n overrideExperimental ?? {};\n\n return {\n // Site-overridable defaults.\n reactStrictMode: true,\n devIndicators: false,\n ...restOverrides,\n\n // Platform invariants \u2014 re-asserted after the spread so a site override\n // can never break sandbox builds, publish, or the dev server.\n output: \"standalone\",\n distDir: isBuild ? \".next\" : \".next-dev\",\n // NOTE (Cole, 2026-04-30, REPL-26637): The publish tool patches\n // required-server-files.json to clear this value before OpenNext bundles,\n // since \"/\" makes esbuild emit absolute-path requires that break in Workers.\n // NOTE (Patrick Lu, 2026-07-06, REPL-28775): Leave outputFileTracingRoot\n // unset outside builds because Next 15.5+ otherwise forces turbopack.root to\n // \"/\" and makes the dev watcher retain whole-filesystem state.\n outputFileTracingRoot: isBuild ? \"/\" : undefined,\n // NOTE (Patrick Lu, 2026-07-06, REPL-28775): Match build tracing at publish\n // time; keep dev's watcher on the user app tree.\n turbopack: {\n ...overrideTurbopack,\n root: isBuild ? \"/\" : \"/workspace/dev\",\n },\n // @replohq/sdk ships as raw source with zero workspace deps, so we can't pull\n // in lodash-es `uniq` here \u2014 dedupe inline via a Set instead.\n allowedDevOrigins: Array.from(\n new Set([...(overrideDevOrigins ?? []), ...PLATFORM_DEV_ORIGINS]),\n ),\n images: {\n ...overrideImages,\n loader: \"custom\",\n loaderFile: \"./image-loader.ts\",\n remotePatterns: overrideImages?.remotePatterns ?? [\n {\n protocol: \"https\",\n hostname: \"**\",\n },\n ],\n },\n experimental: {\n ...restOverrideExperimental,\n // NOTE (Cole, 2026-06-18, REPL-28180): Next sizes its build worker pool\n // off os.cpus().length = host cores (~64) inside a cgroup-limited sandbox,\n // not the 2 the container actually has \u2014 a worker swarm that OOMs the\n // 4 GiB box. availableParallelism() is cgroup-aware. Gated to prod build.\n cpus: isBuild ? os.availableParallelism() : undefined,\n serverActions: {\n ...overrideServerActions,\n allowedOrigins: Array.from(\n new Set([\n ...(overrideServerActions?.allowedOrigins ?? []),\n ...PLATFORM_SERVER_ACTION_ORIGINS,\n ]),\n ),\n },\n },\n };\n}\n\nconst nextConfig: NextConfig = siteConfig();\n\nexport default nextConfig;\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,QAAQ;AAOf,MAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,iCAAiC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAgBO,SAAS,WAAW,YAAwB,CAAC,GAAe;AACjE,QAAM,UAAU,QAAQ,IAAI,cAAc;AAC1C,QAAM;AAAA,IACJ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,EAAE,eAAe,uBAAuB,GAAG,yBAAyB,IACxE,wBAAwB,CAAC;AAE3B,SAAO;AAAA;AAAA,IAEL,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,GAAG;AAAA;AAAA;AAAA,IAIH,QAAQ;AAAA,IACR,SAAS,UAAU,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO7B,uBAAuB,UAAU,MAAM;AAAA;AAAA;AAAA,IAGvC,WAAW;AAAA,MACT,GAAG;AAAA,MACH,MAAM,UAAU,MAAM;AAAA,IACxB;AAAA;AAAA;AAAA,IAGA,mBAAmB,MAAM;AAAA,MACvB,oBAAI,IAAI,CAAC,GAAI,sBAAsB,CAAC,GAAI,GAAG,oBAAoB,CAAC;AAAA,IAClE;AAAA,IACA,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,gBAAgB,gBAAgB,kBAAkB;AAAA,QAChD;AAAA,UACE,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IACA,cAAc;AAAA,MACZ,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,MAKH,MAAM,UAAU,GAAG,qBAAqB,IAAI;AAAA,MAC5C,eAAe;AAAA,QACb,GAAG;AAAA,QACH,gBAAgB,MAAM;AAAA,UACpB,oBAAI,IAAI;AAAA,YACN,GAAI,uBAAuB,kBAAkB,CAAC;AAAA,YAC9C,GAAG;AAAA,UACL,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,MAAM,aAAyB,WAAW;AAE1C,IAAO,iBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const REPLO_IMAGE_CDN = "https://assets.replocdn.com";
|
|
2
|
+
function isContentfulImagesCdn(hostname) {
|
|
3
|
+
return /^images(?:\.[a-z]+)?\.ctfassets\.net$/i.test(hostname);
|
|
4
|
+
}
|
|
5
|
+
function contentfulImagesApiUrl({
|
|
6
|
+
src,
|
|
7
|
+
width,
|
|
8
|
+
quality
|
|
9
|
+
}) {
|
|
10
|
+
const url = new URL(src);
|
|
11
|
+
url.searchParams.set("w", String(width));
|
|
12
|
+
url.searchParams.set("q", String(quality ?? 75));
|
|
13
|
+
if (!url.searchParams.has("fm")) {
|
|
14
|
+
url.searchParams.set("fm", "webp");
|
|
15
|
+
}
|
|
16
|
+
return url.toString();
|
|
17
|
+
}
|
|
18
|
+
function cloudflareLoader({
|
|
19
|
+
src,
|
|
20
|
+
width,
|
|
21
|
+
quality
|
|
22
|
+
}) {
|
|
23
|
+
if (process.env.NODE_ENV === "development") {
|
|
24
|
+
return src;
|
|
25
|
+
}
|
|
26
|
+
const params = [`width=${width}`, `quality=${quality ?? 75}`, "format=auto"];
|
|
27
|
+
if (/^https:\/\//i.test(src)) {
|
|
28
|
+
let hostname;
|
|
29
|
+
try {
|
|
30
|
+
hostname = new URL(src).hostname;
|
|
31
|
+
} catch {
|
|
32
|
+
return src;
|
|
33
|
+
}
|
|
34
|
+
if (/(^|\.)ctfassets\.net$/i.test(hostname)) {
|
|
35
|
+
if (isContentfulImagesCdn(hostname)) {
|
|
36
|
+
return contentfulImagesApiUrl({ src, width, quality });
|
|
37
|
+
}
|
|
38
|
+
return src;
|
|
39
|
+
}
|
|
40
|
+
if (/(^|\.)replocdn\.com$/i.test(hostname)) {
|
|
41
|
+
return `/cdn-cgi/image/${params.join(",")}/${src}`;
|
|
42
|
+
}
|
|
43
|
+
const passthroughUrl = `${REPLO_IMAGE_CDN}/images/external?url=${encodeURIComponent(src)}`;
|
|
44
|
+
return `${REPLO_IMAGE_CDN}/cdn-cgi/image/${[...params, "onerror=redirect"].join(",")}/${passthroughUrl}`;
|
|
45
|
+
}
|
|
46
|
+
const normalizedSrc = src.startsWith("/") ? src.slice(1) : src;
|
|
47
|
+
return `/cdn-cgi/image/${params.join(",")}/${normalizedSrc}`;
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
cloudflareLoader as default
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=image-loader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../next/image-loader.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ImageLoaderProps } from \"next/image\";\n\nconst REPLO_IMAGE_CDN = \"https://assets.replocdn.com\";\n\n// Contentful Images API hosts (US + regional, e.g. images.eu.ctfassets.net).\n// These already resize/format via query params \u2014 do not Cloudflare-proxy them.\nfunction isContentfulImagesCdn(hostname: string): boolean {\n return /^images(?:\\.[a-z]+)?\\.ctfassets\\.net$/i.test(hostname);\n}\n\nfunction contentfulImagesApiUrl({\n src,\n width,\n quality,\n}: {\n src: string;\n width: number;\n quality?: number;\n}): string {\n const url = new URL(src);\n url.searchParams.set(\"w\", String(width));\n url.searchParams.set(\"q\", String(quality ?? 75));\n if (!url.searchParams.has(\"fm\")) {\n url.searchParams.set(\"fm\", \"webp\");\n }\n return url.toString();\n}\n\nexport default function cloudflareLoader({\n src,\n width,\n quality,\n}: ImageLoaderProps): string {\n // NOTE (Cole, 2026-05-15, REPL-27122): /cdn-cgi/image/ only exists on\n // Cloudflare's edge. During `next dev` in the sandbox the preview is served\n // through the Daytona proxy, so rewritten URLs would 404.\n if (process.env.NODE_ENV === \"development\") {\n return src;\n }\n\n const params = [`width=${width}`, `quality=${quality ?? 75}`, \"format=auto\"];\n\n if (/^https:\\/\\//i.test(src)) {\n let hostname: string;\n try {\n hostname = new URL(src).hostname;\n } catch {\n return src;\n }\n // NOTE (Noah, 2026-07-31): Contentful's own CDN owns transforms\n // (Images API on images*.ctfassets.net). Never route ctfassets through the\n // Cloudflare/replocdn passthrough \u2014 double-proxying fights their params.\n if (/(^|\\.)ctfassets\\.net$/i.test(hostname)) {\n if (isContentfulImagesCdn(hostname)) {\n return contentfulImagesApiUrl({ src, width, quality });\n }\n return src;\n }\n if (/(^|\\.)replocdn\\.com$/i.test(hostname)) {\n return `/cdn-cgi/image/${params.join(\",\")}/${src}`;\n }\n // NOTE (Cole, 2026-07-02, REPL-28680): commerce CDNs (Shopify, BigCommerce)\n // reject the Cloudflare resizer's own fetches, so third-party images resize\n // on the replocdn zone from our passthrough endpoint, which re-fetches them\n // with an ordinary request. The replocdn zone only resizes same-zone\n // sources, so the passthrough URL must stay on assets.replocdn.com.\n // onerror=redirect serves the unoptimized original if the transform fails.\n const passthroughUrl = `${REPLO_IMAGE_CDN}/images/external?url=${encodeURIComponent(src)}`;\n return `${REPLO_IMAGE_CDN}/cdn-cgi/image/${[...params, \"onerror=redirect\"].join(\",\")}/${passthroughUrl}`;\n }\n\n const normalizedSrc = src.startsWith(\"/\") ? src.slice(1) : src;\n return `/cdn-cgi/image/${params.join(\",\")}/${normalizedSrc}`;\n}\n"],
|
|
5
|
+
"mappings": "AAEA,MAAM,kBAAkB;AAIxB,SAAS,sBAAsB,UAA2B;AACxD,SAAO,yCAAyC,KAAK,QAAQ;AAC/D;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIW;AACT,QAAM,MAAM,IAAI,IAAI,GAAG;AACvB,MAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AACvC,MAAI,aAAa,IAAI,KAAK,OAAO,WAAW,EAAE,CAAC;AAC/C,MAAI,CAAC,IAAI,aAAa,IAAI,IAAI,GAAG;AAC/B,QAAI,aAAa,IAAI,MAAM,MAAM;AAAA,EACnC;AACA,SAAO,IAAI,SAAS;AACtB;AAEe,SAAR,iBAAkC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAI3B,MAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,CAAC,SAAS,KAAK,IAAI,WAAW,WAAW,EAAE,IAAI,aAAa;AAE3E,MAAI,eAAe,KAAK,GAAG,GAAG;AAC5B,QAAI;AACJ,QAAI;AACF,iBAAW,IAAI,IAAI,GAAG,EAAE;AAAA,IAC1B,QAAQ;AACN,aAAO;AAAA,IACT;AAIA,QAAI,yBAAyB,KAAK,QAAQ,GAAG;AAC3C,UAAI,sBAAsB,QAAQ,GAAG;AACnC,eAAO,uBAAuB,EAAE,KAAK,OAAO,QAAQ,CAAC;AAAA,MACvD;AACA,aAAO;AAAA,IACT;AACA,QAAI,wBAAwB,KAAK,QAAQ,GAAG;AAC1C,aAAO,kBAAkB,OAAO,KAAK,GAAG,CAAC,IAAI,GAAG;AAAA,IAClD;AAOA,UAAM,iBAAiB,GAAG,eAAe,wBAAwB,mBAAmB,GAAG,CAAC;AACxF,WAAO,GAAG,eAAe,kBAAkB,CAAC,GAAG,QAAQ,kBAAkB,EAAE,KAAK,GAAG,CAAC,IAAI,cAAc;AAAA,EACxG;AAEA,QAAM,gBAAgB,IAAI,WAAW,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI;AAC3D,SAAO,kBAAkB,OAAO,KAAK,GAAG,CAAC,IAAI,aAAa;AAC5D;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { defineCloudflareConfig } from "@opennextjs/cloudflare";
|
|
2
|
+
import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
|
|
3
|
+
import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
|
|
4
|
+
import doShardedTagCache from "@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache";
|
|
5
|
+
var open_next_default = defineCloudflareConfig({
|
|
6
|
+
incrementalCache: withRegionalCache(r2IncrementalCache, {
|
|
7
|
+
mode: "short-lived"
|
|
8
|
+
}),
|
|
9
|
+
enableCacheInterception: false,
|
|
10
|
+
tagCache: doShardedTagCache({
|
|
11
|
+
baseShardSize: 12,
|
|
12
|
+
regionalCache: true,
|
|
13
|
+
regionalCacheTtlSec: 5,
|
|
14
|
+
shardReplication: {
|
|
15
|
+
numberOfSoftReplicas: 2,
|
|
16
|
+
numberOfHardReplicas: 1,
|
|
17
|
+
regionalReplication: { defaultRegion: "enam" }
|
|
18
|
+
}
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
export {
|
|
22
|
+
open_next_default as default
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=open-next.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../next/open-next.ts"],
|
|
4
|
+
"sourcesContent": ["import { defineCloudflareConfig } from \"@opennextjs/cloudflare\";\nimport r2IncrementalCache from \"@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache\";\nimport { withRegionalCache } from \"@opennextjs/cloudflare/overrides/incremental-cache/regional-cache\";\nimport doShardedTagCache from \"@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache\";\n\nexport default defineCloudflareConfig({\n incrementalCache: withRegionalCache(r2IncrementalCache, {\n mode: \"short-lived\",\n }),\n enableCacheInterception: false,\n tagCache: doShardedTagCache({\n baseShardSize: 12,\n regionalCache: true,\n regionalCacheTtlSec: 5,\n shardReplication: {\n numberOfSoftReplicas: 2,\n numberOfHardReplicas: 1,\n regionalReplication: { defaultRegion: \"enam\" },\n },\n }),\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,8BAA8B;AACvC,OAAO,wBAAwB;AAC/B,SAAS,yBAAyB;AAClC,OAAO,uBAAuB;AAE9B,IAAO,oBAAQ,uBAAuB;AAAA,EACpC,kBAAkB,kBAAkB,oBAAoB;AAAA,IACtD,MAAM;AAAA,EACR,CAAC;AAAA,EACD,yBAAyB;AAAA,EACzB,UAAU,kBAAkB;AAAA,IAC1B,eAAe;AAAA,IACf,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,MAChB,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,qBAAqB,EAAE,eAAe,OAAO;AAAA,IAC/C;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|