@replohq/sdk 1.7.2 → 1.8.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/_vendor/replo-utils/lib/string.d.ts +0 -2
- package/_vendor/schemas/errors.d.ts +0 -3
- package/_vendor/schemas/loaderKeys.mjs +0 -1
- package/_vendor/schemas/money.d.ts +1 -1
- package/_vendor/schemas/money.mjs +0 -6
- package/_vendor/schemas/routing/rules.mjs +0 -1
- package/analytics/analytics-provider.js +0 -1
- package/analytics/analytics-sink.js +0 -1
- package/analytics/get-analytics-sinks.js +0 -1
- package/analytics/hooks/use-collection-viewed-analytics.d.ts +19 -0
- package/analytics/hooks/use-collection-viewed-analytics.js +26 -0
- package/analytics/hooks/use-product-viewed-analytics.js +0 -1
- package/analytics/replo-first-party-pixel.js +0 -1
- package/analytics/replo-pixel-script.js +0 -1
- package/analytics/sinks/converge-event-mapper.js +0 -1
- package/analytics/sinks/converge-sink.js +0 -1
- package/analytics/sinks/elevar-sink.js +1 -4
- package/analytics/sinks/ga4-sink.js +23 -5
- package/analytics/sinks/meta-sink.js +0 -4
- package/analytics/sinks/northbeam-sink.js +0 -1
- package/analytics/sinks/pinterest-sink.js +19 -5
- package/analytics/sinks/reddit-sink.js +16 -5
- package/analytics/sinks/replo-sink.js +0 -2
- package/analytics/sinks/snapchat-sink.js +0 -4
- package/analytics/sinks/tiktok-sink.js +18 -5
- package/analytics/sinks/window-sink.js +0 -3
- package/analytics/utils/analytics-products.d.ts +36 -0
- package/analytics/utils/analytics-products.js +57 -0
- package/analytics/utils/analytics-utils.js +0 -1
- package/analytics/utils/collection-analytics.d.ts +44 -0
- package/analytics/utils/collection-analytics.js +41 -0
- package/analytics/utils/navigation-tracker.js +0 -1
- package/analytics/utils/shopify-funnel-gate.js +0 -1
- package/cart/buy-now-action.js +0 -3
- package/cart/cart-actions.js +0 -1
- package/cart/cart-loader.js +0 -1
- package/cart/cart-provider.js +1 -2
- package/cart/cart-schema.js +0 -1
- package/cart/cart-types.js +0 -1
- package/cart/gateways/cart-constants.js +0 -2
- package/cart/gateways/cart-gateway.js +0 -1
- package/cart/gateways/cookie-cart-gateway.js +0 -5
- package/cart/gateways/default-cart-gateway.js +0 -1
- package/cart/gateways/resolver-cart-gateway.js +0 -5
- package/cart/gateways/stripe-cart-gateway.js +0 -1
- package/cart/hooks/use-add-to-cart.js +0 -4
- package/cart/hooks/use-buy-now.js +0 -1
- package/cart/return-urls.js +0 -1
- package/cart/storefront-urls.js +0 -1
- package/cart/utils/cart-adjustments.js +0 -1
- package/cart/utils/cart-analytics.js +0 -1
- package/cart/utils/cart-error.js +0 -1
- package/cart/utils/cart-utils.js +0 -1
- package/cart/utils/cookie-cart-persistence.js +0 -1
- package/cart/utils/variant-to-cart-line.js +0 -6
- package/chunk-7OPH5UFQ.mjs +0 -1
- package/chunk-AL3F36PH.mjs +5 -127
- package/chunk-EUQVEPSD.mjs +0 -1
- package/chunk-GV5FY7ZZ.mjs +0 -11
- package/chunk-UJCSKKID.mjs +0 -4
- package/chunk-VKO7P3ED.mjs +0 -2
- package/chunk-VPEVERWE.mjs +0 -1
- package/chunk-YJQVNUW7.mjs +0 -16
- package/consent/consent-action.js +0 -1
- package/consent/consent-actions.js +0 -1
- package/consent/consent-platform.js +0 -3
- package/consent/consent-store.js +0 -5
- package/consent/cookie.js +0 -1
- package/consent/inject-script-descriptors.js +0 -1
- package/consent/replo-scripts.js +0 -1
- package/consent/script-registration-store.js +0 -2
- package/consent/script-snippets.js +0 -7
- package/consent/types.js +0 -1
- package/consent/window-api.js +0 -1
- package/content.js +0 -1
- package/env.js +0 -1
- package/gateways/canopy-api.js +0 -10
- package/hooks/use-client-value.d.ts +1 -1
- package/hooks/use-client-value.js +0 -1
- package/hooks/use-formatted-price.js +0 -1
- package/lib/buildMetadata.js +3 -3
- package/lib/canopy-error.js +0 -1
- package/lib/external-navigation.d.ts +1 -1
- package/lib/external-navigation.js +0 -1
- package/lib/get-query-client.js +0 -1
- package/lib/integration-utils.js +0 -1
- package/lib/shopify-utils.js +0 -1
- package/lib/url-utils.js +0 -1
- package/loaders/collection-loader-args.js +0 -1
- package/loaders/collection-loader.js +0 -1
- package/loaders/collection-products-loader-args.js +0 -1
- package/loaders/collection-products-loader.js +0 -1
- package/loaders/contentful-entries-loader.js +0 -1
- package/loaders/contentful-entry-loader.js +0 -1
- package/loaders/invoke-loader-action.js +0 -1
- package/loaders/invoke-loader-server.js +0 -1
- package/loaders/invoke-loader.js +0 -1
- package/loaders/judgeme-review-aggregate-loader.js +0 -1
- package/loaders/judgeme-reviews-loader.js +0 -1
- package/loaders/levanta-product-loader.js +0 -1
- package/loaders/loader-error-boundary.d.ts +11 -2
- package/loaders/loader-error-boundary.js +52 -9
- package/loaders/loader-error-details.d.ts +2 -0
- package/loaders/loader-error-details.js +7 -0
- package/loaders/loader-keys.js +0 -1
- package/loaders/loader-schemas.js +0 -4
- package/loaders/loox-review-aggregate-loader.js +0 -1
- package/loaders/loox-reviews-loader.js +0 -1
- package/loaders/metaobject-loader.js +0 -1
- package/loaders/metaobjects-loader.js +0 -1
- package/loaders/okendo-review-aggregate-loader.js +0 -1
- package/loaders/okendo-reviews-loader.js +0 -1
- package/loaders/prefetch-loaders.js +0 -1
- package/loaders/preview-placeholder.js +0 -5
- package/loaders/product-loader-args.js +0 -1
- package/loaders/product-loader.js +0 -1
- package/loaders/rebuy-recommendations-loader.js +0 -1
- package/loaders/reviews-io-review-aggregate-loader.js +0 -1
- package/loaders/reviews-io-reviews-loader.js +0 -1
- package/loaders/smile-earning-rules-loader.js +0 -1
- package/loaders/smile-rewards-loader.js +0 -1
- package/loaders/smile-vip-tiers-loader.js +0 -1
- package/loaders/statsig-experiment-loader.js +0 -1
- package/loaders/yotpo-review-aggregate-loader.js +0 -1
- package/loaders/yotpo-reviews-loader.js +0 -1
- package/money.js +0 -1
- package/next/config.js +0 -18
- package/next/image-loader.js +0 -1
- package/next/open-next.js +0 -1
- package/orders/order-status-schema.js +0 -4
- package/orders/order-status.js +0 -3
- package/package.json +8 -4
- package/providers/query-provider.js +0 -1
- package/providers/replo-provider.js +4 -3
- package/routing/evaluate.js +0 -1
- package/routing/geo.js +0 -1
- package/routing/locale.js +0 -1
- package/routing/rules.js +0 -1
- package/analytics/analytics-provider.js.map +0 -7
- package/analytics/analytics-sink.js.map +0 -7
- package/analytics/get-analytics-sinks.js.map +0 -7
- package/analytics/hooks/use-product-viewed-analytics.js.map +0 -7
- package/analytics/replo-first-party-pixel.js.map +0 -7
- package/analytics/replo-pixel-script.js.map +0 -7
- package/analytics/sinks/converge-event-mapper.js.map +0 -7
- package/analytics/sinks/converge-sink.js.map +0 -7
- package/analytics/sinks/elevar-sink.js.map +0 -7
- package/analytics/sinks/ga4-sink.js.map +0 -7
- package/analytics/sinks/meta-sink.js.map +0 -7
- package/analytics/sinks/northbeam-sink.js.map +0 -7
- package/analytics/sinks/pinterest-sink.js.map +0 -7
- package/analytics/sinks/reddit-sink.js.map +0 -7
- package/analytics/sinks/replo-sink.js.map +0 -7
- package/analytics/sinks/snapchat-sink.js.map +0 -7
- package/analytics/sinks/tiktok-sink.js.map +0 -7
- package/analytics/sinks/window-sink.js.map +0 -7
- package/analytics/utils/analytics-utils.js.map +0 -7
- package/analytics/utils/navigation-tracker.js.map +0 -7
- package/analytics/utils/shopify-funnel-gate.js.map +0 -7
- package/cart/buy-now-action.js.map +0 -7
- package/cart/cart-actions.js.map +0 -7
- package/cart/cart-loader.js.map +0 -7
- package/cart/cart-provider.js.map +0 -7
- package/cart/cart-schema.js.map +0 -7
- package/cart/cart-types.js.map +0 -7
- package/cart/gateways/cart-constants.js.map +0 -7
- package/cart/gateways/cart-gateway.js.map +0 -7
- package/cart/gateways/cookie-cart-gateway.js.map +0 -7
- package/cart/gateways/default-cart-gateway.js.map +0 -7
- package/cart/gateways/resolver-cart-gateway.js.map +0 -7
- package/cart/gateways/stripe-cart-gateway.js.map +0 -7
- package/cart/hooks/use-add-to-cart.js.map +0 -7
- package/cart/hooks/use-buy-now.js.map +0 -7
- package/cart/return-urls.js.map +0 -7
- package/cart/storefront-urls.js.map +0 -7
- package/cart/utils/cart-adjustments.js.map +0 -7
- package/cart/utils/cart-analytics.js.map +0 -7
- package/cart/utils/cart-error.js.map +0 -7
- package/cart/utils/cart-utils.js.map +0 -7
- package/cart/utils/cookie-cart-persistence.js.map +0 -7
- package/cart/utils/variant-to-cart-line.js.map +0 -7
- package/consent/consent-action.js.map +0 -7
- package/consent/consent-actions.js.map +0 -7
- package/consent/consent-platform.js.map +0 -7
- package/consent/consent-store.js.map +0 -7
- package/consent/cookie.js.map +0 -7
- package/consent/inject-script-descriptors.js.map +0 -7
- package/consent/replo-scripts.js.map +0 -7
- package/consent/script-registration-store.js.map +0 -7
- package/consent/script-snippets.js.map +0 -7
- package/consent/types.js.map +0 -7
- package/consent/window-api.js.map +0 -7
- package/content.js.map +0 -7
- package/env.js.map +0 -7
- package/gateways/canopy-api.js.map +0 -7
- package/hooks/use-client-value.js.map +0 -7
- package/hooks/use-formatted-price.js.map +0 -7
- package/lib/buildMetadata.js.map +0 -7
- package/lib/canopy-error.js.map +0 -7
- package/lib/external-navigation.js.map +0 -7
- package/lib/get-query-client.js.map +0 -7
- package/lib/integration-utils.js.map +0 -7
- package/lib/shopify-utils.js.map +0 -7
- package/lib/url-utils.js.map +0 -7
- package/loaders/collection-loader-args.js.map +0 -7
- package/loaders/collection-loader.js.map +0 -7
- package/loaders/collection-products-loader-args.js.map +0 -7
- package/loaders/collection-products-loader.js.map +0 -7
- package/loaders/contentful-entries-loader.js.map +0 -7
- package/loaders/contentful-entry-loader.js.map +0 -7
- package/loaders/invoke-loader-action.js.map +0 -7
- package/loaders/invoke-loader-server.js.map +0 -7
- package/loaders/invoke-loader.js.map +0 -7
- package/loaders/judgeme-review-aggregate-loader.js.map +0 -7
- package/loaders/judgeme-reviews-loader.js.map +0 -7
- package/loaders/levanta-product-loader.js.map +0 -7
- package/loaders/loader-error-boundary.js.map +0 -7
- package/loaders/loader-keys.js.map +0 -7
- package/loaders/loader-schemas.js.map +0 -7
- package/loaders/loox-review-aggregate-loader.js.map +0 -7
- package/loaders/loox-reviews-loader.js.map +0 -7
- package/loaders/metaobject-loader.js.map +0 -7
- package/loaders/metaobjects-loader.js.map +0 -7
- package/loaders/okendo-review-aggregate-loader.js.map +0 -7
- package/loaders/okendo-reviews-loader.js.map +0 -7
- package/loaders/prefetch-loaders.js.map +0 -7
- package/loaders/preview-placeholder.js.map +0 -7
- package/loaders/product-loader-args.js.map +0 -7
- package/loaders/product-loader.js.map +0 -7
- package/loaders/rebuy-recommendations-loader.js.map +0 -7
- package/loaders/reviews-io-review-aggregate-loader.js.map +0 -7
- package/loaders/reviews-io-reviews-loader.js.map +0 -7
- package/loaders/smile-earning-rules-loader.js.map +0 -7
- package/loaders/smile-rewards-loader.js.map +0 -7
- package/loaders/smile-vip-tiers-loader.js.map +0 -7
- package/loaders/statsig-experiment-loader.js.map +0 -7
- package/loaders/yotpo-review-aggregate-loader.js.map +0 -7
- package/loaders/yotpo-reviews-loader.js.map +0 -7
- package/money.js.map +0 -7
- package/next/config.js.map +0 -7
- package/next/image-loader.js.map +0 -7
- package/next/open-next.js.map +0 -7
- package/orders/order-status-schema.js.map +0 -7
- package/orders/order-status.js.map +0 -7
- package/providers/query-provider.js.map +0 -7
- package/providers/replo-provider.js.map +0 -7
- package/routing/evaluate.js.map +0 -7
- package/routing/geo.js.map +0 -7
- package/routing/locale.js.map +0 -7
- package/routing/rules.js.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
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.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
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.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../next/config.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync } from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\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\nconst DEFAULT_PAGE_EXTENSIONS = [\"tsx\", \"ts\", \"jsx\", \"js\"];\n// Routed only by the sandbox dev server: site-component previews and page drafts.\nconst DEVELOPMENT_ONLY_PAGE_EXTENSIONS = [\"dev.jsx\", \"dev.tsx\"];\n// Routed only by publish builds: the live copy of every page.\nconst BUILD_ONLY_PAGE_EXTENSIONS = [\"published.tsx\"];\nconst PUBLISH_TSCONFIG_FILENAME = \"tsconfig.publish.json\";\n\n// Pair routing is a platform invariant, not an editor nicety: without it a\n// build silently drops every page.published.tsx, so the site ships missing\n// routes. A site's own extensions are kept, but platform ones are filtered out\n// of the input and re-prepended so a site can never drop pair routing.\n// Behaviorally identical to @replohq/sandbox-runtime's wrapper, which\n// starter-scaffolded sites use instead of this function.\nfunction resolvePageExtensions(configuredExtensions: string[] | undefined) {\n const baseExtensions = (\n configuredExtensions ?? DEFAULT_PAGE_EXTENSIONS\n ).filter((extension) => {\n return (\n !DEVELOPMENT_ONLY_PAGE_EXTENSIONS.includes(extension) &&\n !BUILD_ONLY_PAGE_EXTENSIONS.includes(extension)\n );\n });\n\n return process.env.BUILD_ENV === \"build\"\n ? [...BUILD_ONLY_PAGE_EXTENSIONS, ...baseExtensions]\n : [...DEVELOPMENT_ONLY_PAGE_EXTENSIONS, ...baseExtensions];\n}\n\n// Drafts are excluded from the publish typecheck so unfinished pages never\n// block a publish; live files stay checked. Overrides the site's own\n// tsconfigPath during publish builds when the publish tsconfig is present.\nfunction resolvePublishTypescriptConfig(configured: NextConfig[\"typescript\"]) {\n if (process.env.BUILD_ENV !== \"build\") {\n return configured;\n }\n\n const tsconfigPath = path.join(process.cwd(), PUBLISH_TSCONFIG_FILENAME);\n return existsSync(tsconfigPath)\n ? { ...configured, tsconfigPath: PUBLISH_TSCONFIG_FILENAME }\n : configured;\n}\n\n/**\n * Builds the site's `next.config.ts`, layering your options over Replo's\n * platform defaults (image loader, preview origins, build settings). Add keys\n * freely: nested blocks are deep-merged, and platform wiring always wins, so\n * setting one nested option never drops the rest of the block.\n *\n * Export the result as the default from `next.config.ts`. A site that needs no\n * customization can re-export this module's own default instead.\n *\n * @param overrides Next.js config options to layer on top of the defaults.\n * @returns The merged Next.js config.\n * @example\n * ```ts\n * import { siteConfig } from \"@replohq/sdk/next/config\";\n *\n * export default siteConfig({ experimental: { typedRoutes: true } });\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 devRoot = process.env.IS_REPLO_SANDBOX\n ? \"/workspace/dev\"\n : process.cwd();\n const {\n turbopack: overrideTurbopack,\n images: overrideImages,\n experimental: overrideExperimental,\n allowedDevOrigins: overrideDevOrigins,\n pageExtensions: overridePageExtensions,\n typescript: overrideTypescript,\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 pageExtensions: resolvePageExtensions(overridePageExtensions),\n typescript: resolvePublishTypescriptConfig(overrideTypescript),\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 ? \"/\" : devRoot,\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,SAAS,kBAAkB;AAC3B,OAAO,QAAQ;AACf,OAAO,UAAU;AAOjB,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;AAEA,MAAM,0BAA0B,CAAC,OAAO,MAAM,OAAO,IAAI;AAEzD,MAAM,mCAAmC,CAAC,WAAW,SAAS;AAE9D,MAAM,6BAA6B,CAAC,eAAe;AACnD,MAAM,4BAA4B;AAQlC,SAAS,sBAAsB,sBAA4C;AACzE,QAAM,kBACJ,wBAAwB,yBACxB,OAAO,CAAC,cAAc;AACtB,WACE,CAAC,iCAAiC,SAAS,SAAS,KACpD,CAAC,2BAA2B,SAAS,SAAS;AAAA,EAElD,CAAC;AAED,SAAO,QAAQ,IAAI,cAAc,UAC7B,CAAC,GAAG,4BAA4B,GAAG,cAAc,IACjD,CAAC,GAAG,kCAAkC,GAAG,cAAc;AAC7D;AAKA,SAAS,+BAA+B,YAAsC;AAC5E,MAAI,QAAQ,IAAI,cAAc,SAAS;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,KAAK,KAAK,QAAQ,IAAI,GAAG,yBAAyB;AACvE,SAAO,WAAW,YAAY,IAC1B,EAAE,GAAG,YAAY,cAAc,0BAA0B,IACzD;AACN;AAkCO,SAAS,WAAW,YAAwB,CAAC,GAAe;AACjE,QAAM,UAAU,QAAQ,IAAI,cAAc;AAC1C,QAAM,UAAU,QAAQ,IAAI,mBACxB,mBACA,QAAQ,IAAI;AAChB,QAAM;AAAA,IACJ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,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,IAC7B,gBAAgB,sBAAsB,sBAAsB;AAAA,IAC5D,YAAY,+BAA+B,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO7D,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
|
-
}
|
package/next/image-loader.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
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 site-zone resizer URLs would 404.\n // NOTE (Cole, 2026-09-13, REPL-30607): Only site-zone URLs skip resizing in\n // dev. Returning every src unchanged made Next warn that the loader \"does not\n // implement width\" for each image, and absolute sources can resize on the\n // replocdn zone, which is reachable from dev.\n const isDevelopment = process.env.NODE_ENV === \"development\";\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 const resizerOrigin = isDevelopment ? REPLO_IMAGE_CDN : \"\";\n return `${resizerOrigin}/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 if (isDevelopment) {\n return src;\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;AAQ3B,QAAM,gBAAgB,QAAQ,IAAI,aAAa;AAE/C,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,YAAM,gBAAgB,gBAAgB,kBAAkB;AACxD,aAAO,GAAG,aAAa,kBAAkB,OAAO,KAAK,GAAG,CAAC,IAAI,GAAG;AAAA,IAClE;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,MAAI,eAAe;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,IAAI,WAAW,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI;AAC3D,SAAO,kBAAkB,OAAO,KAAK,GAAG,CAAC,IAAI,aAAa;AAC5D;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/next/open-next.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../orders/order-status-schema.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from \"zod\";\n\n// The storefront's contract with canopy-api's POST /api/v1/order-status.\n// canopy-api owns its response types server-side (apps/canopy-api/src/services/\n// order-status.ts); this is the tolerant-reader view published sites parse\n// with, same split as the cart schemas. All amounts are integer minor units.\n\nexport const orderStatusAddressSchema = z.object({\n name: z.string().nullable(),\n line1: z.string(),\n line2: z.string().nullable(),\n city: z.string(),\n state: z.string().nullable(),\n postalCode: z.string(),\n // ISO 3166-1 alpha-2, as written by Stripe checkout.\n country: z.string(),\n});\n\nexport const orderStatusItemSchema = z.object({\n title: z.string(),\n imageUrl: z.string().nullable(),\n quantity: z.number(),\n unitPrice: z.number(),\n lineTotal: z.number(),\n});\n\nexport const orderStatusShipmentSchema = z.object({\n carrier: z.string().nullable(),\n trackingNumber: z.string().nullable(),\n trackingUrl: z.string().nullable(),\n shippedAt: z.string(),\n});\n\nexport const orderFinancialStatusSchema = z.enum([\n \"pending\",\n \"paid\",\n \"failed\",\n \"refunded\",\n \"partiallyRefunded\",\n]);\n\nexport const orderStatusSummarySchema = z.object({\n statusToken: z.string(),\n orderNumber: z.string(),\n placedAt: z.string(),\n financialStatus: orderFinancialStatusSchema,\n currencyCode: z.string(),\n subtotalAmount: z.number(),\n shippingAmount: z.number(),\n taxAmount: z.number(),\n discountAmount: z.number(),\n totalAmount: z.number(),\n refundedAmount: z.number(),\n customerEmail: z.string().nullable(),\n shippingAddress: orderStatusAddressSchema.nullable(),\n items: z.array(orderStatusItemSchema),\n shipments: z.array(orderStatusShipmentSchema),\n emailExpected: z.boolean(),\n});\n\nexport const checkoutSessionSummarySchema = z.object({\n paymentStatus: z.enum([\"paid\", \"unpaid\", \"no_payment_required\"]),\n currencyCode: z.string().nullable(),\n subtotalAmount: z.number().nullable(),\n totalAmount: z.number().nullable(),\n items: z.array(\n z.object({\n title: z.string(),\n quantity: z.number(),\n unitPrice: z.number().nullable(),\n lineTotal: z.number(),\n }),\n ),\n});\n\nexport const orderStatusResultSchema = z.discriminatedUnion(\"state\", [\n // Our order row \u2014 the durable Order status page.\n z.object({ state: z.literal(\"order\"), order: orderStatusSummarySchema }),\n // Stripe's session \u2014 the Thank you page, before our row exists.\n z.object({\n state: z.literal(\"session\"),\n session: checkoutSessionSummarySchema,\n }),\n z.object({ state: z.literal(\"unavailable\") }),\n]);\n\nexport type OrderStatusAddress = z.infer<typeof orderStatusAddressSchema>;\nexport type OrderStatusItem = z.infer<typeof orderStatusItemSchema>;\nexport type OrderStatusShipment = z.infer<typeof orderStatusShipmentSchema>;\nexport type OrderStatusSummary = z.infer<typeof orderStatusSummarySchema>;\nexport type CheckoutSessionSummary = z.infer<\n typeof checkoutSessionSummarySchema\n>;\nexport type OrderStatusResult = z.infer<typeof orderStatusResultSchema>;\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,SAAS;AAOX,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO;AAAA,EAChB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,YAAY,EAAE,OAAO;AAAA;AAAA,EAErB,SAAS,EAAE,OAAO;AACpB,CAAC;AAEM,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,OAAO,EAAE,OAAO;AAAA,EAChB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,UAAU,EAAE,OAAO;AAAA,EACnB,WAAW,EAAE,OAAO;AAAA,EACpB,WAAW,EAAE,OAAO;AACtB,CAAC;AAEM,MAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,WAAW,EAAE,OAAO;AACtB,CAAC;AAEM,MAAM,6BAA6B,EAAE,KAAK;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,aAAa,EAAE,OAAO;AAAA,EACtB,aAAa,EAAE,OAAO;AAAA,EACtB,UAAU,EAAE,OAAO;AAAA,EACnB,iBAAiB;AAAA,EACjB,cAAc,EAAE,OAAO;AAAA,EACvB,gBAAgB,EAAE,OAAO;AAAA,EACzB,gBAAgB,EAAE,OAAO;AAAA,EACzB,WAAW,EAAE,OAAO;AAAA,EACpB,gBAAgB,EAAE,OAAO;AAAA,EACzB,aAAa,EAAE,OAAO;AAAA,EACtB,gBAAgB,EAAE,OAAO;AAAA,EACzB,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,iBAAiB,yBAAyB,SAAS;AAAA,EACnD,OAAO,EAAE,MAAM,qBAAqB;AAAA,EACpC,WAAW,EAAE,MAAM,yBAAyB;AAAA,EAC5C,eAAe,EAAE,QAAQ;AAC3B,CAAC;AAEM,MAAM,+BAA+B,EAAE,OAAO;AAAA,EACnD,eAAe,EAAE,KAAK,CAAC,QAAQ,UAAU,qBAAqB,CAAC;AAAA,EAC/D,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAO,EAAE;AAAA,IACP,EAAE,OAAO;AAAA,MACP,OAAO,EAAE,OAAO;AAAA,MAChB,UAAU,EAAE,OAAO;AAAA,MACnB,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,WAAW,EAAE,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AACF,CAAC;AAEM,MAAM,0BAA0B,EAAE,mBAAmB,SAAS;AAAA;AAAA,EAEnE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,OAAO,GAAG,OAAO,yBAAyB,CAAC;AAAA;AAAA,EAEvE,EAAE,OAAO;AAAA,IACP,OAAO,EAAE,QAAQ,SAAS;AAAA,IAC1B,SAAS;AAAA,EACX,CAAC;AAAA,EACD,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,aAAa,EAAE,CAAC;AAC9C,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../orders/order-status.ts"],
|
|
4
|
-
"sourcesContent": ["import type { OrderStatusResult } from \"./order-status-schema\";\n\nimport { getEnv } from \"../env\";\nimport { buildBaseUrl } from \"../lib/url-utils\";\nimport { orderStatusResultSchema } from \"./order-status-schema\";\n\n/**\n * Resolve an order-status reference (an order's `statusToken`, or a `cs_`\n * Stripe Checkout Session id straight after checkout) into what the order\n * status page renders. Every failure \u2014 network, non-200, contract drift \u2014\n * maps to `{ state: \"unavailable\" }`: a broken status lookup must degrade to\n * the page's no-data state, never take the storefront down.\n */\nexport async function getOrderStatus({\n reference,\n}: {\n reference: string;\n}): Promise<OrderStatusResult> {\n const env = await getEnv();\n const url = `${buildBaseUrl(env.CANOPY_API_HOST)}/api/v1/order-status`;\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ reference, projectId: env.PROJECT_ID }),\n // The page must reflect the webhook race resolving (session \u2192 order on\n // refresh), so never serve a cached resolution.\n cache: \"no-store\",\n });\n if (!response.ok) {\n console.warn(\"Order status request failed\", {\n status: response.status,\n statusText: response.statusText,\n });\n return { state: \"unavailable\" };\n }\n const parsed = orderStatusResultSchema.safeParse(await response.json());\n if (!parsed.success) {\n console.warn(\"Order status response did not match the expected shape\", {\n error: parsed.error.message,\n });\n return { state: \"unavailable\" };\n }\n return parsed.data;\n } catch (error) {\n console.warn(\"Order status request errored\", { error });\n return { state: \"unavailable\" };\n }\n}\n"],
|
|
5
|
-
"mappings": "AAEA,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAC7B,SAAS,+BAA+B;AASxC,eAAsB,eAAe;AAAA,EACnC;AACF,GAE+B;AAC7B,QAAM,MAAM,MAAM,OAAO;AACzB,QAAM,MAAM,GAAG,aAAa,IAAI,eAAe,CAAC;AAChD,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,WAAW,WAAW,IAAI,WAAW,CAAC;AAAA;AAAA;AAAA,MAG7D,OAAO;AAAA,IACT,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,cAAQ,KAAK,+BAA+B;AAAA,QAC1C,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,MACvB,CAAC;AACD,aAAO,EAAE,OAAO,cAAc;AAAA,IAChC;AACA,UAAM,SAAS,wBAAwB,UAAU,MAAM,SAAS,KAAK,CAAC;AACtE,QAAI,CAAC,OAAO,SAAS;AACnB,cAAQ,KAAK,0DAA0D;AAAA,QACrE,OAAO,OAAO,MAAM;AAAA,MACtB,CAAC;AACD,aAAO,EAAE,OAAO,cAAc;AAAA,IAChC;AACA,WAAO,OAAO;AAAA,EAChB,SAAS,OAAO;AACd,YAAQ,KAAK,gCAAgC,EAAE,MAAM,CAAC;AACtD,WAAO,EAAE,OAAO,cAAc;AAAA,EAChC;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../providers/query-provider.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\";\n\nimport { QueryClientProvider } from \"@tanstack/react-query\";\n\nimport { getQueryClient } from \"../lib/get-query-client\";\n\nexport function QueryProvider({ children }: React.PropsWithChildren) {\n const queryClient = getQueryClient();\n\n return (\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n );\n}\n"],
|
|
5
|
-
"mappings": ";AAUI;AARJ,SAAS,2BAA2B;AAEpC,SAAS,sBAAsB;AAExB,SAAS,cAAc,EAAE,SAAS,GAA4B;AACnE,QAAM,cAAc,eAAe;AAEnC,SACE,oBAAC,uBAAoB,QAAQ,aAAc,UAAS;AAExD;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../providers/replo-provider.tsx"],
|
|
4
|
-
"sourcesContent": ["import type { CheckoutProvider } from \"../lib/integration-utils\";\n\nimport { AnalyticsProvider } from \"../analytics/analytics-provider\";\nimport { ReploFirstPartyPixel } from \"../analytics/replo-first-party-pixel\";\nimport { CartLoader } from \"../cart/cart-loader\";\nimport { getCheckoutProvider } from \"../lib/integration-utils\";\nimport { QueryProvider } from \"./query-provider\";\n\n/**\n * Root provider for a Replo site. Mount it once in `app/layout.tsx`, wrapping\n * the whole app. It sets up the React Query client every data loader reads\n * from, the analytics layer, and cart state, so `useCart`, `useAnalytics`, and\n * the loader components only work beneath it.\n *\n * @example\n * ```tsx\n * export default function RootLayout({ children }: React.PropsWithChildren) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <ReploProvider>{children}</ReploProvider>\n * </body>\n * </html>\n * );\n * }\n * ```\n */\nexport async function ReploProvider({ children }: React.PropsWithChildren) {\n // Server-resolved so the analytics layer can suppress checkout-funnel events\n // that Shopify's hosted checkout already reports. Defaults to \"none\" (events\n // fire) if the env can't be read, preserving prior behavior.\n let checkoutProvider: CheckoutProvider = \"none\";\n try {\n checkoutProvider = await getCheckoutProvider();\n } catch {\n checkoutProvider = \"none\";\n }\n\n return (\n <QueryProvider>\n <AnalyticsProvider checkoutProvider={checkoutProvider}>\n <ReploFirstPartyPixel />\n <CartLoader>{children}</CartLoader>\n </AnalyticsProvider>\n </QueryProvider>\n );\n}\n"],
|
|
5
|
-
"mappings": "AAwCM,SACE,KADF;AAtCN,SAAS,yBAAyB;AAClC,SAAS,4BAA4B;AACrC,SAAS,kBAAkB;AAC3B,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAqB9B,eAAsB,cAAc,EAAE,SAAS,GAA4B;AAIzE,MAAI,mBAAqC;AACzC,MAAI;AACF,uBAAmB,MAAM,oBAAoB;AAAA,EAC/C,QAAQ;AACN,uBAAmB;AAAA,EACrB;AAEA,SACE,oBAAC,iBACC,+BAAC,qBAAkB,kBACjB;AAAA,wBAAC,wBAAqB;AAAA,IACtB,oBAAC,cAAY,UAAS;AAAA,KACxB,GACF;AAEJ;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/routing/evaluate.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../routing/evaluate.ts"],
|
|
4
|
-
"sourcesContent": ["import type { NextRequest } from \"next/server\";\nimport type { LocaleRoutingConfig } from \"schemas/routing/locale\";\nimport type {\n LocaleScope,\n NegotiatedLocale,\n PathLocale,\n} from \"schemas/routing/localeNegotiation\";\nimport type { RedirectRule } from \"schemas/routing/rules\";\n\nimport { NextResponse } from \"next/server\";\n\nimport { REPLO_LOCALE_COOKIE } from \"schemas/routing/locale\";\nimport {\n getLocaleFromPath,\n negotiateLocale,\n resolveLocaleScope,\n withLocalePrefix,\n} from \"schemas/routing/localeNegotiation\";\nimport { applyParams, matchSource } from \"schemas/routing/match\";\n\nimport { ipCountry } from \"./geo\";\n\nexport function evaluateRouting({\n request,\n rules,\n localeRouting,\n}: {\n request: NextRequest;\n rules: readonly RedirectRule[];\n localeRouting?: LocaleRoutingConfig;\n}): NextResponse {\n const localeContext = localeRouting\n ? getLocaleContext({ request, config: localeRouting })\n : null;\n for (const rule of rules) {\n const response = evaluateRedirect({ request, rule, localeContext });\n if (response) {\n return response;\n }\n }\n return evaluateLocalePhase({ request, localeContext });\n}\n\ninterface LocaleContext {\n config: LocaleRoutingConfig;\n scope: LocaleScope;\n /** A single-locale domain serves clean URLs whatever the config says. */\n urlMode: LocaleRoutingConfig[\"urlMode\"];\n pathLocale: PathLocale | null;\n negotiated: NegotiatedLocale;\n}\n\nfunction getLocaleContext({\n request,\n config,\n}: {\n request: NextRequest;\n config: LocaleRoutingConfig;\n}): LocaleContext {\n const scope = resolveLocaleScope({\n host: request.headers.get(\"host\"),\n config,\n });\n // The prefix is read against every configured locale, not just the scope's:\n // an explicitly requested out-of-scope locale is served rather than fought,\n // it just never wins negotiation or gets advertised in a cookie.\n const pathLocale = getLocaleFromPath({\n pathname: request.nextUrl.pathname,\n locales: config.locales,\n });\n const negotiated = negotiateLocale({\n scope,\n detection: config.detection,\n cookieLocale: request.cookies.get(REPLO_LOCALE_COOKIE)?.value ?? null,\n countryCode: ipCountry(request),\n acceptLanguageHeader: request.headers.get(\"accept-language\"),\n });\n return {\n config,\n scope,\n urlMode: scope.locales.length === 1 ? \"hidden\" : config.urlMode,\n pathLocale,\n negotiated,\n };\n}\n\nfunction evaluateRedirect({\n request,\n rule,\n localeContext,\n}: {\n request: NextRequest;\n rule: RedirectRule;\n localeContext: LocaleContext | null;\n}): NextResponse | null {\n // Raw first, so a locale-prefixed source targets exactly that locale; then\n // the locale-stripped path, so a rule authored against the logical path\n // covers every locale.\n const params =\n matchSource({\n source: rule.source,\n pathname: request.nextUrl.pathname,\n }) ??\n (localeContext?.pathLocale\n ? matchSource({\n source: rule.source,\n pathname: localeContext.pathLocale.logicalPath,\n })\n : null);\n if (!params) {\n return null;\n }\n const url = new URL(\n applyParams({ value: rule.destination, params }),\n request.nextUrl.origin,\n );\n if (url.origin === request.nextUrl.origin && !url.search) {\n url.search = request.nextUrl.search;\n }\n if (localeContext && url.origin === request.nextUrl.origin) {\n applyLocaleToDestination({ url, localeContext });\n }\n // A destination that lands back on the current request would loop. The rule\n // still consumes the request \u2014 later rules were authored as alternatives to\n // it, not fallbacks for it \u2014 so the page renders normally instead.\n const redirectsToCurrentRequest =\n url.origin === request.nextUrl.origin &&\n normalizePath(url.pathname) === normalizePath(request.nextUrl.pathname) &&\n url.search === request.nextUrl.search;\n if (redirectsToCurrentRequest) {\n return NextResponse.next();\n }\n const response = NextResponse.redirect(url, rule.status);\n // Hidden-mode destinations stay clean, so the locale an explicit prefix\n // carried would be lost across the hop \u2014 keep it in the cookie instead.\n if (\n localeContext?.pathLocale &&\n localeContext.urlMode === \"hidden\" &&\n url.origin === request.nextUrl.origin &&\n localeContext.scope.locales.includes(localeContext.pathLocale.locale)\n ) {\n setLocaleCookie({ response, locale: localeContext.pathLocale.locale });\n }\n return response;\n}\n\n/**\n * In prefixed mode every page lives under a locale, so an unprefixed\n * same-site destination gets one \u2014 the request's own locale when the URL\n * carried one, the negotiated locale otherwise \u2014 collapsing what would be a\n * second redirect hop. A destination that names a locale is left alone:\n * explicit always wins.\n */\nfunction applyLocaleToDestination({\n url,\n localeContext,\n}: {\n url: URL;\n localeContext: LocaleContext;\n}) {\n if (localeContext.urlMode !== \"prefixed\") {\n return;\n }\n if (isLocaleExemptPath(url.pathname)) {\n return;\n }\n const destinationLocale = getLocaleFromPath({\n pathname: url.pathname,\n locales: localeContext.config.locales,\n });\n if (destinationLocale) {\n // A non-canonically-cased prefix (`/fr-ca/x`) would otherwise 308 back to\n // the canonical spelling, re-match the rule, and loop forever \u2014 the loop\n // guard compares pathnames case-sensitively.\n if (destinationLocale.pathSegment !== destinationLocale.locale) {\n url.pathname = withLocalePrefix({\n locale: destinationLocale.locale,\n path: destinationLocale.logicalPath,\n });\n }\n return;\n }\n url.pathname = withLocalePrefix({\n locale: localeContext.pathLocale?.locale ?? localeContext.negotiated.locale,\n path: url.pathname,\n });\n}\n\nfunction evaluateLocalePhase({\n request,\n localeContext,\n}: {\n request: NextRequest;\n localeContext: LocaleContext | null;\n}): NextResponse {\n if (!localeContext) {\n return NextResponse.next();\n }\n const { pathname } = request.nextUrl;\n if (isLocaleExemptPath(pathname)) {\n return NextResponse.next();\n }\n const { urlMode, pathLocale, negotiated, scope } = localeContext;\n\n if (urlMode === \"prefixed\") {\n if (!pathLocale) {\n const url = request.nextUrl.clone();\n url.pathname = withLocalePrefix({\n locale: negotiated.locale,\n path: pathname,\n });\n // Temporary: the same URL legitimately serves different locales to\n // different visitors, so this must never cache as permanent.\n return NextResponse.redirect(url, 307);\n }\n if (pathLocale.pathSegment !== pathLocale.locale) {\n const url = request.nextUrl.clone();\n url.pathname = withLocalePrefix({\n locale: pathLocale.locale,\n path: pathLocale.logicalPath,\n });\n return NextResponse.redirect(url, 308);\n }\n const response = NextResponse.next();\n // A prefix that differs from what negotiation would pick is an explicit\n // choice \u2014 keep it sticky. A matching prefix proves nothing: the 307\n // above manufactures exactly that navigation, and persisting the guess\n // would freeze the first detection result for a year.\n if (\n pathLocale.locale !== negotiated.locale &&\n request.cookies.get(REPLO_LOCALE_COOKIE)?.value !== pathLocale.locale &&\n scope.locales.includes(pathLocale.locale)\n ) {\n setLocaleCookie({ response, locale: pathLocale.locale });\n }\n return response;\n }\n\n // Hidden mode: a locale-prefixed URL is the language-switcher mechanism \u2014\n // adopt the locale as a cookie and settle on the clean URL.\n if (pathLocale) {\n const url = request.nextUrl.clone();\n url.pathname = pathLocale.logicalPath;\n const response = NextResponse.redirect(url, 307);\n if (scope.locales.includes(pathLocale.locale)) {\n setLocaleCookie({ response, locale: pathLocale.locale });\n }\n return response;\n }\n const url = request.nextUrl.clone();\n url.pathname = withLocalePrefix({\n locale: negotiated.locale,\n path: pathname,\n });\n return NextResponse.rewrite(url);\n}\n\n// Requests for files and API routes have no locale variant; prefixing or\n// rewriting them would just 404.\nfunction isLocaleExemptPath(pathname: string): boolean {\n if (pathname === \"/api\" || pathname.startsWith(\"/api/\")) {\n return true;\n }\n const lastSegment = pathname.slice(pathname.lastIndexOf(\"/\") + 1);\n return lastSegment.includes(\".\");\n}\n\nfunction setLocaleCookie({\n response,\n locale,\n}: {\n response: NextResponse;\n locale: string;\n}) {\n response.cookies.set(REPLO_LOCALE_COOKIE, locale, {\n path: \"/\",\n maxAge: 31_536_000,\n sameSite: \"lax\",\n });\n}\n\n/** Trailing slashes carry no meaning, so `/blogs` and `/blogs/` are the same. */\nfunction normalizePath(pathname: string): string {\n const trimmed = pathname.replace(/\\/+$/, \"\");\n return trimmed === \"\" ? \"/\" : trimmed;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["url"]
|
|
7
|
-
}
|
package/routing/geo.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../routing/geo.ts"],
|
|
4
|
-
"sourcesContent": ["import type { NextRequest } from \"next/server\";\n\nimport { REPLO_COUNTRY_OVERRIDE_COOKIE } from \"schemas/routing/locale\";\n\n// Cloudflare's header uses `XX` for \"unknown\" (`T1` for Tor fails the\n// letters-only check on its own).\nconst COUNTRY_CODE = /^[A-Za-z]{2}$/;\n\n/**\n * The visitor's ISO 3166-1 alpha-2 country, or null when unknown. The\n * override cookie wins so geo behavior is testable without a VPN \u2014 in dev\n * sandboxes, where the Cloudflare header never exists, and on the published\n * site alike. At worst the override lets a visitor pick which locale they\n * see, which the locale cookie already allows deliberately.\n */\nexport function ipCountry(request: NextRequest): string | null {\n const override = request.cookies\n .get(REPLO_COUNTRY_OVERRIDE_COOKIE)\n ?.value.trim();\n if (override && COUNTRY_CODE.test(override)) {\n return override.toUpperCase();\n }\n const header = request.headers.get(\"cf-ipcountry\")?.trim().toUpperCase();\n if (!header || !COUNTRY_CODE.test(header) || header === \"XX\") {\n return null;\n }\n return header;\n}\n"],
|
|
5
|
-
"mappings": "AAEA,SAAS,qCAAqC;AAI9C,MAAM,eAAe;AASd,SAAS,UAAU,SAAqC;AAC7D,QAAM,WAAW,QAAQ,QACtB,IAAI,6BAA6B,GAChC,MAAM,KAAK;AACf,MAAI,YAAY,aAAa,KAAK,QAAQ,GAAG;AAC3C,WAAO,SAAS,YAAY;AAAA,EAC9B;AACA,QAAM,SAAS,QAAQ,QAAQ,IAAI,cAAc,GAAG,KAAK,EAAE,YAAY;AACvE,MAAI,CAAC,UAAU,CAAC,aAAa,KAAK,MAAM,KAAK,WAAW,MAAM;AAC5D,WAAO;AAAA,EACT;AACA,SAAO;AACT;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/routing/locale.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../routing/locale.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Site-facing entrypoint for locale routing authoring and helpers.\n *\n * The schema, negotiation, and URL helpers live in `schemas/routing` so the\n * Website Builder can import them without depending on a published package,\n * whose release cycle shouldn't gate editor-only changes. Sites can't import\n * `schemas` directly \u2014 it is workspace-only and reaches generated sites\n * through the SDK's vendoring step \u2014 so `middleware.ts` and language\n * switchers import from here.\n */\nexport type {\n LocaleDetection,\n LocaleRoutingConfig,\n LocaleRoutingConfigInput,\n LocaleUrlMode,\n} from \"schemas/routing/locale\"; /* eslint-disable-line barrel-files/avoid-barrel-files, replo/no-export-from -- site-facing entrypoint intentionally re-exports the authoring API. */\nexport {\n REPLO_COUNTRY_OVERRIDE_COOKIE,\n REPLO_LOCALE_COOKIE,\n reploLocaleRouting,\n} from \"schemas/routing/locale\"; /* eslint-disable-line replo/no-export-from -- site-facing entrypoint intentionally re-exports the authoring API. */\nexport { localeUrl } from \"schemas/routing/localeNegotiation\"; /* eslint-disable-line replo/no-export-from -- site-facing entrypoint intentionally re-exports the authoring API. */\n"],
|
|
5
|
-
"mappings": "AAgBA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/routing/rules.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../routing/rules.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Site-facing entrypoint for redirect rule authoring.\n *\n * The schema, validators, and matcher live in `schemas/routing` so the Website\n * Builder can import them without depending on a published package, whose\n * release cycle shouldn't gate editor-only changes. Sites can't import\n * `schemas` directly \u2014 it is workspace-only and reaches generated sites through\n * the SDK's vendoring step \u2014 so `middleware.ts` keeps importing `reploRedirect`\n * from here.\n */\nexport type {\n RedirectRule,\n RedirectStatus,\n} from \"schemas/routing/rules\"; /* eslint-disable-line replo/no-export-from -- site-facing entrypoint intentionally re-exports the authoring API. */\nexport { reploRedirect } from \"schemas/routing/rules\"; /* eslint-disable-line replo/no-export-from -- site-facing entrypoint intentionally re-exports the authoring API. */\n"],
|
|
5
|
-
"mappings": "AAcA,SAAS,qBAAqB;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|