@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.
- package/_vendor/replo-utils/lib/json.mjs +4 -5
- package/_vendor/replo-utils/lib/misc.mjs +4 -3
- package/_vendor/replo-utils/lib/object.d.ts +16 -1
- package/_vendor/replo-utils/lib/object.mjs +3 -4
- package/_vendor/schemas/contentEntry.mjs +3 -3
- package/_vendor/schemas/contentManifest.mjs +6 -6
- package/_vendor/schemas/errors.d.ts +3 -43
- package/_vendor/schemas/{money.d.ts → moneyFormat.d.ts} +1 -8
- package/_vendor/schemas/{money.mjs → moneyFormat.mjs} +5 -16
- package/_vendor/schemas/reploError.d.ts +43 -0
- package/_vendor/schemas/routing/locale.mjs +6 -4
- package/_vendor/schemas/routing/rules.mjs +6 -4
- package/analytics/analytics-sink.d.ts +126 -14
- package/analytics/combine-sinks.js +36 -13
- package/analytics/hooks/use-product-viewed-analytics.d.ts +1 -17
- package/analytics/hooks/use-product-viewed-analytics.js +5 -14
- package/analytics/legacy-checkout.d.ts +2 -0
- package/analytics/legacy-checkout.js +26 -0
- package/analytics/sinks/converge-event-mapper.d.ts +10 -11
- package/analytics/sinks/converge-event-mapper.js +50 -133
- package/analytics/sinks/converge-sink.d.ts +8 -7
- package/analytics/sinks/converge-sink.js +21 -3
- package/analytics/sinks/elevar-sink.d.ts +9 -7
- package/analytics/sinks/elevar-sink.js +37 -128
- package/analytics/sinks/ga4-sink.d.ts +9 -8
- package/analytics/sinks/ga4-sink.js +9 -8
- package/analytics/sinks/intelligems-sink.d.ts +9 -8
- package/analytics/sinks/intelligems-sink.js +3 -1
- package/analytics/sinks/meta-sink.d.ts +5 -4
- package/analytics/sinks/meta-sink.js +7 -3
- package/analytics/sinks/northbeam-sink.d.ts +1 -0
- package/analytics/sinks/northbeam-sink.js +2 -0
- package/analytics/sinks/pinterest-sink.d.ts +7 -6
- package/analytics/sinks/pinterest-sink.js +14 -20
- package/analytics/sinks/reddit-sink.d.ts +8 -7
- package/analytics/sinks/reddit-sink.js +13 -20
- package/analytics/sinks/replo-sink.d.ts +21 -9
- package/analytics/sinks/replo-sink.js +37 -39
- package/analytics/sinks/snapchat-sink.d.ts +6 -5
- package/analytics/sinks/snapchat-sink.js +8 -8
- package/analytics/sinks/tiktok-sink.d.ts +8 -7
- package/analytics/sinks/tiktok-sink.js +10 -15
- package/analytics/sinks/window-sink.d.ts +11 -9
- package/analytics/sinks/window-sink.js +5 -1
- package/analytics/sinks/x-sink.d.ts +5 -4
- package/analytics/sinks/x-sink.js +19 -50
- package/analytics/test-fixtures.d.ts +5 -0
- package/analytics/test-fixtures.js +18 -0
- package/analytics/utils/analytics-products.d.ts +0 -30
- package/analytics/utils/analytics-products.js +1 -51
- package/analytics/utils/collection-analytics.d.ts +2 -15
- package/analytics/utils/collection-analytics.js +14 -18
- package/analytics/utils/product-analytics.d.ts +23 -0
- package/analytics/utils/product-analytics.js +21 -0
- package/cart/hooks/use-add-to-cart.js +1 -1
- package/cart/utils/cart-analytics.d.ts +3 -23
- package/cart/utils/cart-analytics.js +1 -1
- package/cart/utils/cart-utils.js +1 -1
- package/cart/utils/variant-to-cart-line.js +1 -1
- package/chunk-CKRRL66R.mjs +28 -0
- package/{chunk-VVB7BEDE.mjs → chunk-O4QBR4QC.mjs} +9 -4
- package/{chunk-EUIVDITZ.mjs → chunk-OPKMOW43.mjs} +1 -1
- package/{chunk-C37TXOGI.mjs → chunk-PSYP2DYM.mjs} +1 -1
- package/{chunk-ACQS4AG5.mjs → chunk-TTEBDCWT.mjs} +272 -109
- package/{chunk-HFKL4ZR5.mjs → chunk-XGXJOHUY.mjs} +2 -1
- package/{chunk-AQG3256R.mjs → chunk-XSMYSAKY.mjs} +0 -26
- package/{chunk-SSBIMQES.mjs → chunk-XWWFRIXV.mjs} +36 -99
- package/chunk-ZPDXVFCR.mjs +66 -0
- package/hooks/use-formatted-price.js +1 -1
- package/lib/buildMetadata.js +3 -3
- package/loaders/collection-loader.js +8 -6
- package/loaders/collection-products-loader.js +8 -6
- package/loaders/contentful-entries-loader.js +5 -3
- package/loaders/contentful-entry-loader.js +5 -3
- package/loaders/integration-loader-schemas.d.ts +260 -0
- package/loaders/integration-loader-schemas.js +55 -0
- package/loaders/invoke-loader.d.ts +5 -0
- package/loaders/invoke-loader.js +1 -1
- package/loaders/judgeme-review-aggregate-loader.d.ts +1 -1
- package/loaders/judgeme-review-aggregate-loader.js +10 -6
- package/loaders/judgeme-reviews-loader.d.ts +1 -1
- package/loaders/judgeme-reviews-loader.js +5 -3
- package/loaders/kaching-bundles-loader.js +5 -3
- package/loaders/levanta-product-loader.js +8 -6
- package/loaders/loox-review-aggregate-loader.d.ts +1 -1
- package/loaders/loox-review-aggregate-loader.js +10 -6
- package/loaders/loox-reviews-loader.d.ts +1 -1
- package/loaders/loox-reviews-loader.js +8 -6
- package/loaders/metaobject-loader.js +5 -3
- package/loaders/metaobjects-loader.js +5 -3
- package/loaders/okendo-review-aggregate-loader.d.ts +2 -7
- package/loaders/okendo-review-aggregate-loader.js +8 -12
- package/loaders/okendo-reviews-loader.d.ts +2 -42
- package/loaders/okendo-reviews-loader.js +5 -8
- package/loaders/product-loader.js +5 -3
- package/loaders/rebuy-recommendations-loader.d.ts +2 -167
- package/loaders/rebuy-recommendations-loader.js +8 -10
- package/loaders/reviews-io-review-aggregate-loader.d.ts +1 -1
- package/loaders/reviews-io-review-aggregate-loader.js +5 -3
- package/loaders/reviews-io-reviews-loader.d.ts +1 -1
- package/loaders/reviews-io-reviews-loader.js +7 -3
- package/loaders/shopify-integration-details-loader.js +10 -6
- package/loaders/smile-earning-rules-loader.d.ts +2 -8
- package/loaders/smile-earning-rules-loader.js +8 -16
- package/loaders/smile-rewards-loader.d.ts +2 -8
- package/loaders/smile-rewards-loader.js +8 -16
- package/loaders/smile-vip-tiers-loader.d.ts +2 -7
- package/loaders/smile-vip-tiers-loader.js +8 -15
- package/loaders/statsig-experiment-loader.js +5 -3
- package/loaders/yotpo-review-aggregate-loader.d.ts +1 -1
- package/loaders/yotpo-review-aggregate-loader.js +10 -6
- package/loaders/yotpo-reviews-loader.d.ts +1 -1
- package/loaders/yotpo-reviews-loader.js +5 -3
- package/money.d.ts +1 -1
- package/money.js +1 -1
- package/next/config.js +4 -0
- package/next/image-loader.js +3 -3
- package/package.json +8 -4
- 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
|
|
31
|
-
|
|
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/
|
|
9
|
+
export { formatAmount, fromMinorUnitsToMajorUnits, fromMinorUnitsToMajorUnitsString, fromMajorUnitsToMinorUnits, } from "./_vendor/schemas/moneyFormat";
|
package/money.js
CHANGED
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 ?? [
|
package/next/image-loader.js
CHANGED
|
@@ -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
|
|
5
|
+
function isPassthroughSource(src) {
|
|
6
6
|
try {
|
|
7
|
-
return new URL(src, REPLO_IMAGE_CDN).pathname
|
|
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 (
|
|
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": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"reploBuild": {
|
|
5
5
|
"packageName": "@replohq/sdk",
|
|
6
|
-
"version": "
|
|
6
|
+
"version": "2.0.0",
|
|
7
7
|
"branch": "HEAD",
|
|
8
|
-
"commit": "
|
|
9
|
-
"builtAt": "2026-10-
|
|
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"
|
package/chunk-CQYCPDPI.mjs
DELETED
|
@@ -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 };
|