@replohq/sdk 1.21.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/_vendor/replo-utils/lib/json.mjs +4 -5
  2. package/_vendor/replo-utils/lib/misc.mjs +4 -3
  3. package/_vendor/replo-utils/lib/object.d.ts +16 -1
  4. package/_vendor/replo-utils/lib/object.mjs +3 -4
  5. package/_vendor/schemas/contentEntry.mjs +3 -3
  6. package/_vendor/schemas/contentManifest.mjs +6 -6
  7. package/_vendor/schemas/errors.d.ts +3 -43
  8. package/_vendor/schemas/{money.d.ts → moneyFormat.d.ts} +1 -8
  9. package/_vendor/schemas/{money.mjs → moneyFormat.mjs} +5 -16
  10. package/_vendor/schemas/reploError.d.ts +43 -0
  11. package/_vendor/schemas/routing/locale.mjs +6 -4
  12. package/_vendor/schemas/routing/rules.mjs +6 -4
  13. package/analytics/analytics-sink.d.ts +126 -14
  14. package/analytics/combine-sinks.js +36 -13
  15. package/analytics/hooks/use-product-viewed-analytics.d.ts +1 -17
  16. package/analytics/hooks/use-product-viewed-analytics.js +5 -14
  17. package/analytics/legacy-checkout.d.ts +2 -0
  18. package/analytics/legacy-checkout.js +26 -0
  19. package/analytics/sinks/converge-event-mapper.d.ts +10 -11
  20. package/analytics/sinks/converge-event-mapper.js +50 -133
  21. package/analytics/sinks/converge-sink.d.ts +8 -7
  22. package/analytics/sinks/converge-sink.js +21 -3
  23. package/analytics/sinks/elevar-sink.d.ts +9 -7
  24. package/analytics/sinks/elevar-sink.js +37 -128
  25. package/analytics/sinks/ga4-sink.d.ts +9 -8
  26. package/analytics/sinks/ga4-sink.js +9 -8
  27. package/analytics/sinks/intelligems-sink.d.ts +9 -8
  28. package/analytics/sinks/intelligems-sink.js +3 -1
  29. package/analytics/sinks/meta-sink.d.ts +5 -4
  30. package/analytics/sinks/meta-sink.js +7 -3
  31. package/analytics/sinks/northbeam-sink.d.ts +1 -0
  32. package/analytics/sinks/northbeam-sink.js +2 -0
  33. package/analytics/sinks/pinterest-sink.d.ts +7 -6
  34. package/analytics/sinks/pinterest-sink.js +14 -20
  35. package/analytics/sinks/reddit-sink.d.ts +8 -7
  36. package/analytics/sinks/reddit-sink.js +13 -20
  37. package/analytics/sinks/replo-sink.d.ts +21 -9
  38. package/analytics/sinks/replo-sink.js +37 -39
  39. package/analytics/sinks/snapchat-sink.d.ts +6 -5
  40. package/analytics/sinks/snapchat-sink.js +8 -8
  41. package/analytics/sinks/tiktok-sink.d.ts +8 -7
  42. package/analytics/sinks/tiktok-sink.js +10 -15
  43. package/analytics/sinks/window-sink.d.ts +11 -9
  44. package/analytics/sinks/window-sink.js +5 -1
  45. package/analytics/sinks/x-sink.d.ts +5 -4
  46. package/analytics/sinks/x-sink.js +19 -50
  47. package/analytics/test-fixtures.d.ts +5 -0
  48. package/analytics/test-fixtures.js +18 -0
  49. package/analytics/utils/analytics-products.d.ts +0 -30
  50. package/analytics/utils/analytics-products.js +1 -51
  51. package/analytics/utils/collection-analytics.d.ts +2 -15
  52. package/analytics/utils/collection-analytics.js +14 -18
  53. package/analytics/utils/product-analytics.d.ts +23 -0
  54. package/analytics/utils/product-analytics.js +21 -0
  55. package/cart/hooks/use-add-to-cart.js +1 -1
  56. package/cart/utils/cart-analytics.d.ts +3 -23
  57. package/cart/utils/cart-analytics.js +1 -1
  58. package/cart/utils/cart-utils.js +1 -1
  59. package/cart/utils/variant-to-cart-line.js +1 -1
  60. package/chunk-CKRRL66R.mjs +28 -0
  61. package/{chunk-VVB7BEDE.mjs → chunk-O4QBR4QC.mjs} +9 -4
  62. package/{chunk-EUIVDITZ.mjs → chunk-OPKMOW43.mjs} +1 -1
  63. package/{chunk-C37TXOGI.mjs → chunk-PSYP2DYM.mjs} +1 -1
  64. package/{chunk-ACQS4AG5.mjs → chunk-TTEBDCWT.mjs} +272 -109
  65. package/{chunk-HFKL4ZR5.mjs → chunk-XGXJOHUY.mjs} +2 -1
  66. package/{chunk-AQG3256R.mjs → chunk-XSMYSAKY.mjs} +0 -26
  67. package/{chunk-SSBIMQES.mjs → chunk-XWWFRIXV.mjs} +36 -99
  68. package/chunk-ZPDXVFCR.mjs +66 -0
  69. package/hooks/use-formatted-price.js +1 -1
  70. package/lib/buildMetadata.js +3 -3
  71. package/loaders/collection-loader.js +8 -6
  72. package/loaders/collection-products-loader.js +8 -6
  73. package/loaders/contentful-entries-loader.js +5 -3
  74. package/loaders/contentful-entry-loader.js +5 -3
  75. package/loaders/integration-loader-schemas.d.ts +260 -0
  76. package/loaders/integration-loader-schemas.js +55 -0
  77. package/loaders/invoke-loader.d.ts +5 -0
  78. package/loaders/invoke-loader.js +1 -1
  79. package/loaders/judgeme-review-aggregate-loader.d.ts +1 -1
  80. package/loaders/judgeme-review-aggregate-loader.js +10 -6
  81. package/loaders/judgeme-reviews-loader.d.ts +1 -1
  82. package/loaders/judgeme-reviews-loader.js +5 -3
  83. package/loaders/kaching-bundles-loader.js +5 -3
  84. package/loaders/levanta-product-loader.js +8 -6
  85. package/loaders/loox-review-aggregate-loader.d.ts +1 -1
  86. package/loaders/loox-review-aggregate-loader.js +10 -6
  87. package/loaders/loox-reviews-loader.d.ts +1 -1
  88. package/loaders/loox-reviews-loader.js +8 -6
  89. package/loaders/metaobject-loader.js +5 -3
  90. package/loaders/metaobjects-loader.js +5 -3
  91. package/loaders/okendo-review-aggregate-loader.d.ts +2 -7
  92. package/loaders/okendo-review-aggregate-loader.js +8 -12
  93. package/loaders/okendo-reviews-loader.d.ts +2 -42
  94. package/loaders/okendo-reviews-loader.js +5 -8
  95. package/loaders/product-loader.js +5 -3
  96. package/loaders/rebuy-recommendations-loader.d.ts +2 -167
  97. package/loaders/rebuy-recommendations-loader.js +8 -10
  98. package/loaders/reviews-io-review-aggregate-loader.d.ts +1 -1
  99. package/loaders/reviews-io-review-aggregate-loader.js +5 -3
  100. package/loaders/reviews-io-reviews-loader.d.ts +1 -1
  101. package/loaders/reviews-io-reviews-loader.js +7 -3
  102. package/loaders/shopify-integration-details-loader.js +10 -6
  103. package/loaders/smile-earning-rules-loader.d.ts +2 -8
  104. package/loaders/smile-earning-rules-loader.js +8 -16
  105. package/loaders/smile-rewards-loader.d.ts +2 -8
  106. package/loaders/smile-rewards-loader.js +8 -16
  107. package/loaders/smile-vip-tiers-loader.d.ts +2 -7
  108. package/loaders/smile-vip-tiers-loader.js +8 -15
  109. package/loaders/statsig-experiment-loader.js +5 -3
  110. package/loaders/yotpo-review-aggregate-loader.d.ts +1 -1
  111. package/loaders/yotpo-review-aggregate-loader.js +10 -6
  112. package/loaders/yotpo-reviews-loader.d.ts +1 -1
  113. package/loaders/yotpo-reviews-loader.js +5 -3
  114. package/money.d.ts +1 -1
  115. package/money.js +1 -1
  116. package/next/config.js +4 -0
  117. package/next/image-loader.js +3 -3
  118. package/package.json +8 -4
  119. package/chunk-CQYCPDPI.mjs +0 -166
@@ -4,7 +4,6 @@ import { Suspense } from "react";
4
4
  import { useSuspenseQuery } from "@tanstack/react-query";
5
5
  import { invokeLoader } from "./invoke-loader";
6
6
  import { LoaderErrorBoundary } from "./loader-error-boundary";
7
- import { yotpoProductReviewsLoaderOutputSchema } from "./loader-schemas";
8
7
  function buildReviewsArgs({
9
8
  productId,
10
9
  perPage,
@@ -27,8 +26,11 @@ function YotpoReviewsLoaderInner({
27
26
  const queryResult = useSuspenseQuery({
28
27
  queryKey: [loaderKey, args],
29
28
  queryFn: async () => {
30
- const loadedData = await invokeLoader({ loaderKey, args });
31
- return yotpoProductReviewsLoaderOutputSchema.parse(loadedData);
29
+ const [loadedData, schemas] = await Promise.all([
30
+ invokeLoader({ loaderKey, args }),
31
+ import("./loader-schemas")
32
+ ]);
33
+ return schemas.yotpoProductReviewsLoaderOutputSchema.parse(loadedData);
32
34
  }
33
35
  });
34
36
  return /* @__PURE__ */ jsx(Fragment, { children: children(queryResult.data) });
package/money.d.ts CHANGED
@@ -6,4 +6,4 @@
6
6
  * APIs that speak decimal money.
7
7
  * @module
8
8
  */
9
- export { formatAmount, fromMinorUnitsToMajorUnits, fromMinorUnitsToMajorUnitsString, fromMajorUnitsToMinorUnits, } from "./_vendor/schemas/money";
9
+ export { formatAmount, fromMinorUnitsToMajorUnits, fromMinorUnitsToMajorUnitsString, fromMajorUnitsToMinorUnits, } from "./_vendor/schemas/moneyFormat";
package/money.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  fromMinorUnitsToMajorUnits,
4
4
  fromMinorUnitsToMajorUnitsString,
5
5
  fromMajorUnitsToMinorUnits
6
- } from "./_vendor/schemas/money.mjs";
6
+ } from "./_vendor/schemas/moneyFormat.mjs";
7
7
  export {
8
8
  formatAmount,
9
9
  fromMajorUnitsToMinorUnits,
package/next/config.js CHANGED
@@ -18,6 +18,8 @@ const PLATFORM_SERVER_ACTION_ORIGINS = [
18
18
  "*.preview.reploapi.com",
19
19
  "*.preview-staging.reploapi.com"
20
20
  ];
21
+ const PLATFORM_DEVICE_SIZES = [640, 828, 1080, 1200, 1920, 2048, 3840];
22
+ const PLATFORM_IMAGE_SIZES = [32, 48, 96, 128, 256, 384];
21
23
  const DEFAULT_PAGE_EXTENSIONS = ["tsx", "ts", "jsx", "js"];
22
24
  const DEVELOPMENT_ONLY_PAGE_EXTENSIONS = ["dev.jsx", "dev.tsx"];
23
25
  const BUILD_ONLY_PAGE_EXTENSIONS = ["published.tsx"];
@@ -66,6 +68,8 @@ function siteConfig(overrides = {}) {
66
68
  ),
67
69
  images: {
68
70
  ...overrideImages,
71
+ deviceSizes: overrideImages?.deviceSizes ?? PLATFORM_DEVICE_SIZES,
72
+ imageSizes: overrideImages?.imageSizes ?? PLATFORM_IMAGE_SIZES,
69
73
  loader: "custom",
70
74
  loaderFile: "./image-loader.ts",
71
75
  remotePatterns: overrideImages?.remotePatterns ?? [
@@ -2,9 +2,9 @@ const REPLO_IMAGE_CDN = "https://assets.replocdn.com";
2
2
  function isContentfulImagesCdn(hostname) {
3
3
  return /^images(?:\.[a-z]+)?\.ctfassets\.net$/i.test(hostname);
4
4
  }
5
- function isAvifSource(src) {
5
+ function isPassthroughSource(src) {
6
6
  try {
7
- return new URL(src, REPLO_IMAGE_CDN).pathname.toLowerCase().endsWith(".avif");
7
+ return /\.(avif|svg)$/i.test(new URL(src, REPLO_IMAGE_CDN).pathname);
8
8
  } catch {
9
9
  return false;
10
10
  }
@@ -27,7 +27,7 @@ function cloudflareLoader({
27
27
  width,
28
28
  quality
29
29
  }) {
30
- if (isAvifSource(src)) {
30
+ if (isPassthroughSource(src)) {
31
31
  return src;
32
32
  }
33
33
  const isDevelopment = process.env.NODE_ENV === "development";
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@replohq/sdk",
3
- "version": "1.21.1",
3
+ "version": "2.0.0",
4
4
  "reploBuild": {
5
5
  "packageName": "@replohq/sdk",
6
- "version": "1.21.1",
6
+ "version": "2.0.0",
7
7
  "branch": "HEAD",
8
- "commit": "c2722877665042cdbb579483c39be734395d2833",
9
- "builtAt": "2026-10-18T22:08:53.056Z"
8
+ "commit": "17bbe81f0395ba343461c4ec1df4662e1ede00bd",
9
+ "builtAt": "2026-10-19T23:10:20.892Z"
10
10
  },
11
11
  "description": "Replo SDK — cart, analytics, and data loaders for agent-built Next.js sites.",
12
12
  "license": "SEE LICENSE IN LICENSE",
@@ -89,6 +89,10 @@
89
89
  "types": "./analytics/analytics-provider.d.ts",
90
90
  "default": "./analytics/analytics-provider.js"
91
91
  },
92
+ "./analytics/analytics-sink": {
93
+ "types": "./analytics/analytics-sink.d.ts",
94
+ "default": "./analytics/analytics-sink.js"
95
+ },
92
96
  "./analytics/sinks/intelligems-sink": {
93
97
  "types": "./analytics/sinks/intelligems-sink.d.ts",
94
98
  "default": "./analytics/sinks/intelligems-sink.js"
@@ -1,166 +0,0 @@
1
- import { CONTENT_SEO_VALUE_KEYS, CONTENT_RELATED_VALUE_STORAGE_KEY, CONTENT_PRIVATE_VALUE_KEYS, isContentPrivateValueKey, LEGACY_CONTENT_ENTRY_STATUSES, getContentFieldValueSchema } from './chunk-RQ76VK3L.mjs';
2
- import { pickBy_default } from './chunk-ACQS4AG5.mjs';
3
- import { stringify, parseDocument } from 'yaml';
4
- import * as z2 from 'zod';
5
-
6
- var frontmatterDataSchema = z2.record(z2.string(), z2.unknown());
7
- var CONTENT_FRONTMATTER_PATTERN = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/u;
8
- function parseContentFrontmatterYaml(yamlText) {
9
- try {
10
- const document = parseDocument(yamlText, {
11
- merge: false,
12
- schema: "core",
13
- strict: true,
14
- uniqueKeys: true
15
- });
16
- if (document.errors.length > 0) {
17
- return null;
18
- }
19
- const parsed = frontmatterDataSchema.safeParse(
20
- document.toJS({ maxAliasCount: 20 })
21
- );
22
- return parsed.success ? parsed.data : null;
23
- } catch {
24
- return null;
25
- }
26
- }
27
- function parseContentFrontmatter(raw) {
28
- const match = raw.match(CONTENT_FRONTMATTER_PATTERN);
29
- if (!match) {
30
- return null;
31
- }
32
- const values = parseContentFrontmatterYaml(match[1] ?? "");
33
- if (values === null) {
34
- return null;
35
- }
36
- return {
37
- values,
38
- body: raw.slice(match[0].length).replace(/^\r?\n/u, "")
39
- };
40
- }
41
- var CONTENT_MANAGED_ENTRY_VALUE_KEYS = [
42
- "slug",
43
- "title",
44
- "status",
45
- "author",
46
- "authorInitials",
47
- "excerpt",
48
- "coverImage",
49
- "coverImageAlt",
50
- "tags",
51
- "updatedAt",
52
- "publishedAt",
53
- "archivedAt",
54
- ...CONTENT_SEO_VALUE_KEYS,
55
- CONTENT_RELATED_VALUE_STORAGE_KEY,
56
- ...CONTENT_PRIVATE_VALUE_KEYS
57
- ];
58
- var contentEntryFrontmatterSchema = z2.object({
59
- slug: z2.unknown().optional(),
60
- title: z2.string().nullish(),
61
- author: z2.string().nullish(),
62
- authorInitials: z2.string().nullish(),
63
- excerpt: z2.string().nullish(),
64
- coverImage: z2.string().nullish(),
65
- coverImageAlt: z2.string().nullish(),
66
- tags: z2.array(z2.string()).nullish(),
67
- updatedAt: z2.string().nullish(),
68
- publishedAt: z2.string().nullish(),
69
- archivedAt: z2.string().nullish(),
70
- seoTitle: z2.string().nullish(),
71
- seoDescription: z2.string().nullish(),
72
- related: z2.array(z2.string()).nullish(),
73
- scratchpad: z2.unknown().optional(),
74
- backlinks: z2.unknown().optional()
75
- }).passthrough();
76
- function parseContentEntryDocument(raw) {
77
- const frontmatter = parseContentFrontmatter(raw);
78
- if (!frontmatter) {
79
- return {
80
- status: "invalid",
81
- message: "Entry frontmatter is missing or contains invalid YAML."
82
- };
83
- }
84
- const parsedValues = contentEntryFrontmatterSchema.safeParse(
85
- frontmatter.values
86
- );
87
- if (!parsedValues.success) {
88
- const issue = parsedValues.error.issues[0];
89
- const field = issue?.path.join(".");
90
- return {
91
- status: "invalid",
92
- message: `${field ? `Invalid ${field}: ` : ""}${issue?.message ?? "Invalid entry fields."}`
93
- };
94
- }
95
- return {
96
- status: "ready",
97
- document: {
98
- values: parsedValues.data,
99
- body: frontmatter.body
100
- }
101
- };
102
- }
103
- function serializeContentEntryDocument({
104
- values,
105
- body
106
- }) {
107
- const yamlText = stringify(values).replace(/\n+$/u, "");
108
- const normalizedBody = `${body.replace(/\s+$/u, "")}
109
- `;
110
- return `---
111
- ${yamlText}
112
- ---
113
-
114
- ${normalizedBody}`;
115
- }
116
- function getContentRenderableEntryValues({
117
- document,
118
- slug
119
- }) {
120
- const publicFrontmatterValues = pickBy_default(document.values, (_value, fieldId) => {
121
- return !isContentPrivateValueKey(fieldId);
122
- });
123
- return {
124
- ...publicFrontmatterValues,
125
- relatedContent: publicFrontmatterValues[CONTENT_RELATED_VALUE_STORAGE_KEY] ?? [],
126
- body: document.body,
127
- slug
128
- };
129
- }
130
- function convertLegacyContentEntryDocument(raw) {
131
- const parsed = parseContentEntryDocument(raw);
132
- if (parsed.status === "invalid") {
133
- return null;
134
- }
135
- const { status, archivedAt, ...values } = parsed.document.values;
136
- if (status === void 0 && archivedAt === void 0) {
137
- return { legacyStatus: null, content: raw };
138
- }
139
- return {
140
- legacyStatus: LEGACY_CONTENT_ENTRY_STATUSES.find((candidate) => candidate === status) ?? "draft",
141
- content: serializeContentEntryDocument({
142
- values,
143
- body: parsed.document.body
144
- })
145
- };
146
- }
147
- function getContentEntryFieldValidationIssues({
148
- fields,
149
- values,
150
- requireRequiredFields
151
- }) {
152
- return fields.flatMap((field) => {
153
- if (!field.enabled || isContentPrivateValueKey(field.id)) {
154
- return [];
155
- }
156
- const value = values[field.id];
157
- const isMissing = value === void 0 || value === null || value === "";
158
- if (isMissing) {
159
- return requireRequiredFields && field.required ? [{ fieldId: field.id, message: "Required value is missing." }] : [];
160
- }
161
- const parsedValue = getContentFieldValueSchema(field.type).safeParse(value);
162
- return parsedValue.success ? [] : [{ fieldId: field.id, message: "Value has the wrong format." }];
163
- });
164
- }
165
-
166
- export { CONTENT_MANAGED_ENTRY_VALUE_KEYS, contentEntryFrontmatterSchema, convertLegacyContentEntryDocument, getContentEntryFieldValidationIssues, getContentRenderableEntryValues, parseContentEntryDocument, serializeContentEntryDocument };