@01.software/sdk 0.65.1 → 0.68.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/CHANGELOG.md +81 -0
- package/README.md +201 -8
- package/dist/client.cjs +490 -338
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +11 -6
- package/dist/client.d.ts +11 -6
- package/dist/client.js +490 -338
- package/dist/client.js.map +1 -1
- package/dist/{collection-client-C2sMvfme.d.ts → collection-client-IOaWsTMI.d.ts} +4 -4
- package/dist/{collection-client-B7rsTtVj.d.cts → collection-client-MbIJ5KzW.d.cts} +4 -4
- package/dist/{const-CRxPTDGt.d.ts → const-Do27Udj6.d.ts} +2 -2
- package/dist/{const-D6ZRQLxI.d.cts → const-Dw5ElJs_.d.cts} +2 -2
- package/dist/embedded-admin/server.cjs +16 -1
- package/dist/embedded-admin/server.cjs.map +1 -1
- package/dist/embedded-admin/server.d.cts +4 -2
- package/dist/embedded-admin/server.d.ts +4 -2
- package/dist/embedded-admin/server.js +16 -1
- package/dist/embedded-admin/server.js.map +1 -1
- package/dist/embedded-admin.cjs +19 -0
- package/dist/embedded-admin.cjs.map +1 -1
- package/dist/embedded-admin.d.cts +7 -1
- package/dist/embedded-admin.d.ts +7 -1
- package/dist/embedded-admin.js +19 -0
- package/dist/embedded-admin.js.map +1 -1
- package/dist/errors.d.cts +2 -2
- package/dist/errors.d.ts +2 -2
- package/dist/{index-1auUEYrl.d.ts → index-DcYsLOja.d.ts} +3 -3
- package/dist/{index-Bbpf5t-l.d.cts → index-gnVxTKXu.d.cts} +3 -3
- package/dist/index.cjs +521 -367
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +521 -367
- package/dist/index.js.map +1 -1
- package/dist/{payload-types-BnIET0xU.d.cts → payload-types-BY1uZFRf.d.cts} +162 -50
- package/dist/{payload-types-BnIET0xU.d.ts → payload-types-BY1uZFRf.d.ts} +162 -50
- package/dist/query.cjs +22 -1
- package/dist/query.cjs.map +1 -1
- package/dist/query.d.cts +5 -5
- package/dist/query.d.ts +5 -5
- package/dist/query.js +22 -1
- package/dist/query.js.map +1 -1
- package/dist/realtime.d.cts +2 -2
- package/dist/realtime.d.ts +2 -2
- package/dist/server.cjs +1251 -1046
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +10 -9
- package/dist/server.d.ts +10 -9
- package/dist/server.js +1251 -1046
- package/dist/server.js.map +1 -1
- package/dist/{types-D1y4TgQm.d.ts → types-AWSVpuPE.d.ts} +2 -2
- package/dist/{types-DnRC3nLG.d.ts → types-CLRw0aDa.d.ts} +214 -42
- package/dist/{types-Dp1oYpD3.d.cts → types-DnIuxgu2.d.cts} +2 -2
- package/dist/{types-Dzn0LD2N.d.cts → types-csjaig4G.d.cts} +214 -42
- package/dist/ui/canvas.cjs +5 -1
- package/dist/ui/canvas.cjs.map +1 -1
- package/dist/ui/canvas.js +5 -1
- package/dist/ui/canvas.js.map +1 -1
- package/dist/ui/form.d.cts +1 -1
- package/dist/ui/form.d.ts +1 -1
- package/dist/ui/video.cjs +9 -2
- package/dist/ui/video.cjs.map +1 -1
- package/dist/ui/video.d.cts +1 -1
- package/dist/ui/video.d.ts +1 -1
- package/dist/ui/video.js +9 -2
- package/dist/ui/video.js.map +1 -1
- package/dist/webhook.d.cts +5 -5
- package/dist/webhook.d.ts +5 -5
- package/package.json +4 -4
package/dist/client.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
// src/core/collection/http-client.ts
|
|
2
|
-
import { stringify } from "qs-esm";
|
|
3
|
-
|
|
4
1
|
// src/core/errors.ts
|
|
5
2
|
var SDK_ERROR_BRAND = /* @__PURE__ */ Symbol.for("@01.software/sdk/SDKError");
|
|
6
3
|
var SDK_ERROR_TYPE_BRAND = /* @__PURE__ */ Symbol.for("@01.software/sdk/SDKError.type");
|
|
@@ -1004,281 +1001,6 @@ function stockSnapshotSearchParams(params) {
|
|
|
1004
1001
|
return `variantIds=${params.variantIds.map(encodeURIComponent).join(",")}`;
|
|
1005
1002
|
}
|
|
1006
1003
|
|
|
1007
|
-
// src/core/collection/http-client.ts
|
|
1008
|
-
function validateWhere(where) {
|
|
1009
|
-
if (where === void 0) return false;
|
|
1010
|
-
let hasNull = false;
|
|
1011
|
-
function visit(value, depth, key) {
|
|
1012
|
-
if (depth > 10) {
|
|
1013
|
-
throw createValidationError(
|
|
1014
|
-
"Collection where must not exceed nesting depth 10."
|
|
1015
|
-
);
|
|
1016
|
-
}
|
|
1017
|
-
if (value === null && (key === "equals" || key === "not_equals")) {
|
|
1018
|
-
hasNull = true;
|
|
1019
|
-
return;
|
|
1020
|
-
}
|
|
1021
|
-
if (value == null) {
|
|
1022
|
-
throw createValidationError(
|
|
1023
|
-
"Collection where must not contain null or undefined values."
|
|
1024
|
-
);
|
|
1025
|
-
}
|
|
1026
|
-
if (Array.isArray(value)) {
|
|
1027
|
-
if (value.length === 0) {
|
|
1028
|
-
throw createValidationError(
|
|
1029
|
-
"Collection where must not contain empty arrays, including and/or."
|
|
1030
|
-
);
|
|
1031
|
-
}
|
|
1032
|
-
if (value.length > 1e3) {
|
|
1033
|
-
throw createValidationError(
|
|
1034
|
-
"Collection where arrays must not contain more than 1000 elements."
|
|
1035
|
-
);
|
|
1036
|
-
}
|
|
1037
|
-
for (const item of value) visit(item, depth + 1);
|
|
1038
|
-
} else if (typeof value === "object" && !(value instanceof Date)) {
|
|
1039
|
-
const values = Object.entries(value);
|
|
1040
|
-
if (values.length === 0) {
|
|
1041
|
-
throw createValidationError(
|
|
1042
|
-
"Collection where must not contain empty condition objects."
|
|
1043
|
-
);
|
|
1044
|
-
}
|
|
1045
|
-
for (const [key2, item] of values) visit(item, depth + 1, key2);
|
|
1046
|
-
}
|
|
1047
|
-
}
|
|
1048
|
-
visit(where, 0);
|
|
1049
|
-
return hasNull;
|
|
1050
|
-
}
|
|
1051
|
-
var HttpClient = class {
|
|
1052
|
-
constructor(publishableKey, secretKey, getCustomerToken, onUnauthorized, onRequestId, apiUrl) {
|
|
1053
|
-
this.publishableKey = requirePublishableKeyForSecret(
|
|
1054
|
-
"CollectionClient",
|
|
1055
|
-
publishableKey,
|
|
1056
|
-
secretKey
|
|
1057
|
-
);
|
|
1058
|
-
this.secretKey = secretKey;
|
|
1059
|
-
this.getCustomerToken = getCustomerToken;
|
|
1060
|
-
this.onUnauthorized = onUnauthorized;
|
|
1061
|
-
this.onRequestId = onRequestId;
|
|
1062
|
-
this.apiUrl = apiUrl;
|
|
1063
|
-
}
|
|
1064
|
-
get defaultOptions() {
|
|
1065
|
-
const opts = {
|
|
1066
|
-
apiUrl: this.apiUrl,
|
|
1067
|
-
publishableKey: this.publishableKey,
|
|
1068
|
-
secretKey: this.secretKey
|
|
1069
|
-
};
|
|
1070
|
-
const token = this.getCustomerToken?.();
|
|
1071
|
-
if (token) {
|
|
1072
|
-
opts.customerToken = token;
|
|
1073
|
-
if (this.onUnauthorized) {
|
|
1074
|
-
opts.onUnauthorized = this.onUnauthorized;
|
|
1075
|
-
}
|
|
1076
|
-
}
|
|
1077
|
-
return opts;
|
|
1078
|
-
}
|
|
1079
|
-
async fetchWithTracking(url, opts) {
|
|
1080
|
-
try {
|
|
1081
|
-
const response = await httpFetch(url, opts);
|
|
1082
|
-
this.onRequestId?.(response.headers.get("x-request-id") ?? null);
|
|
1083
|
-
return response;
|
|
1084
|
-
} catch (err) {
|
|
1085
|
-
const id = err instanceof SDKError ? err.requestId ?? null : null;
|
|
1086
|
-
this.onRequestId?.(id);
|
|
1087
|
-
throw err;
|
|
1088
|
-
}
|
|
1089
|
-
}
|
|
1090
|
-
buildUrl(endpoint, options) {
|
|
1091
|
-
if (!options) return endpoint;
|
|
1092
|
-
const { fallbackLocale, ...rest } = options;
|
|
1093
|
-
const queryOptions = fallbackLocale === void 0 ? rest : {
|
|
1094
|
-
...rest,
|
|
1095
|
-
"fallback-locale": fallbackLocale === false ? "none" : fallbackLocale
|
|
1096
|
-
};
|
|
1097
|
-
const encodedOptions = validateWhere(queryOptions.where) ? { ...queryOptions, where: JSON.stringify(queryOptions.where) } : queryOptions;
|
|
1098
|
-
const queryString = stringify(encodedOptions, { addQueryPrefix: true });
|
|
1099
|
-
return queryString ? `${endpoint}${queryString}` : endpoint;
|
|
1100
|
-
}
|
|
1101
|
-
assertJsonResponse(response) {
|
|
1102
|
-
const contentType = response.headers.get("content-type");
|
|
1103
|
-
if (!contentType?.includes("application/json")) {
|
|
1104
|
-
throw createApiError("Response is not in JSON format.", response.status, {
|
|
1105
|
-
contentType
|
|
1106
|
-
});
|
|
1107
|
-
}
|
|
1108
|
-
}
|
|
1109
|
-
/**
|
|
1110
|
-
* Parse Payload CMS find response (list query)
|
|
1111
|
-
* Returns native Payload response structure
|
|
1112
|
-
*/
|
|
1113
|
-
async parseFindResponse(response) {
|
|
1114
|
-
const contentType = response.headers.get("content-type");
|
|
1115
|
-
try {
|
|
1116
|
-
this.assertJsonResponse(response);
|
|
1117
|
-
const jsonData = await response.json();
|
|
1118
|
-
if (jsonData.docs === void 0) {
|
|
1119
|
-
throw createApiError("Invalid find response.", response.status, {
|
|
1120
|
-
jsonData
|
|
1121
|
-
});
|
|
1122
|
-
}
|
|
1123
|
-
return {
|
|
1124
|
-
docs: jsonData.docs,
|
|
1125
|
-
totalDocs: jsonData.totalDocs ?? 0,
|
|
1126
|
-
limit: jsonData.limit || 20,
|
|
1127
|
-
totalPages: jsonData.totalPages ?? 0,
|
|
1128
|
-
page: jsonData.page || 1,
|
|
1129
|
-
pagingCounter: jsonData.pagingCounter || 1,
|
|
1130
|
-
hasPrevPage: jsonData.hasPrevPage ?? false,
|
|
1131
|
-
hasNextPage: jsonData.hasNextPage ?? false,
|
|
1132
|
-
prevPage: jsonData.prevPage ?? null,
|
|
1133
|
-
nextPage: jsonData.nextPage ?? null
|
|
1134
|
-
};
|
|
1135
|
-
} catch (error) {
|
|
1136
|
-
if (error instanceof SDKError) throw error;
|
|
1137
|
-
throw createApiError("Failed to parse response.", response.status, {
|
|
1138
|
-
contentType,
|
|
1139
|
-
error: error instanceof Error ? error.message : error
|
|
1140
|
-
});
|
|
1141
|
-
}
|
|
1142
|
-
}
|
|
1143
|
-
/**
|
|
1144
|
-
* Parse Payload CMS mutation response (create/update)
|
|
1145
|
-
* Returns native Payload response structure
|
|
1146
|
-
*/
|
|
1147
|
-
async parseMutationResponse(response) {
|
|
1148
|
-
const contentType = response.headers.get("content-type");
|
|
1149
|
-
try {
|
|
1150
|
-
this.assertJsonResponse(response);
|
|
1151
|
-
const jsonData = await response.json();
|
|
1152
|
-
if (jsonData.doc === void 0) {
|
|
1153
|
-
throw createApiError("Invalid mutation response.", response.status, {
|
|
1154
|
-
jsonData
|
|
1155
|
-
});
|
|
1156
|
-
}
|
|
1157
|
-
return {
|
|
1158
|
-
message: jsonData.message || "",
|
|
1159
|
-
doc: jsonData.doc,
|
|
1160
|
-
errors: jsonData.errors
|
|
1161
|
-
};
|
|
1162
|
-
} catch (error) {
|
|
1163
|
-
if (error instanceof SDKError) throw error;
|
|
1164
|
-
throw createApiError("Failed to parse response.", response.status, {
|
|
1165
|
-
contentType,
|
|
1166
|
-
error: error instanceof Error ? error.message : error
|
|
1167
|
-
});
|
|
1168
|
-
}
|
|
1169
|
-
}
|
|
1170
|
-
/**
|
|
1171
|
-
* Parse Payload CMS document response (findById/delete)
|
|
1172
|
-
* Returns document directly without wrapper
|
|
1173
|
-
*/
|
|
1174
|
-
async parseDocumentResponse(response) {
|
|
1175
|
-
const contentType = response.headers.get("content-type");
|
|
1176
|
-
try {
|
|
1177
|
-
this.assertJsonResponse(response);
|
|
1178
|
-
const jsonData = await response.json();
|
|
1179
|
-
return jsonData;
|
|
1180
|
-
} catch (error) {
|
|
1181
|
-
if (error instanceof SDKError) throw error;
|
|
1182
|
-
throw createApiError("Failed to parse response.", response.status, {
|
|
1183
|
-
contentType,
|
|
1184
|
-
error: error instanceof Error ? error.message : error
|
|
1185
|
-
});
|
|
1186
|
-
}
|
|
1187
|
-
}
|
|
1188
|
-
};
|
|
1189
|
-
|
|
1190
|
-
// src/core/collection/query-builder.ts
|
|
1191
|
-
var PUBLIC_READ_DEPTH_ERROR = "Publishable collection reads require depth: 0. Use a shaped commerce endpoint or server client for populated data.";
|
|
1192
|
-
var PUBLIC_READ_JOINS_ERROR = "Publishable collection reads require joins: false. Use a shaped commerce endpoint or server client for joined data.";
|
|
1193
|
-
var PUBLIC_READ_POPULATE_ERROR = "Publishable collection reads do not support populate. Use a shaped commerce endpoint or server client for populated data.";
|
|
1194
|
-
function withDefaultPublicReadOptions(options) {
|
|
1195
|
-
const rawOptions = options;
|
|
1196
|
-
if (rawOptions?.depth !== void 0 && rawOptions.depth !== 0) {
|
|
1197
|
-
throw createValidationError(PUBLIC_READ_DEPTH_ERROR);
|
|
1198
|
-
}
|
|
1199
|
-
if (rawOptions?.joins !== void 0 && rawOptions.joins !== false) {
|
|
1200
|
-
throw createValidationError(PUBLIC_READ_JOINS_ERROR);
|
|
1201
|
-
}
|
|
1202
|
-
if (rawOptions?.populate !== void 0) {
|
|
1203
|
-
throw createValidationError(PUBLIC_READ_POPULATE_ERROR);
|
|
1204
|
-
}
|
|
1205
|
-
return {
|
|
1206
|
-
...options,
|
|
1207
|
-
depth: options?.depth ?? 0,
|
|
1208
|
-
joins: options?.joins ?? false
|
|
1209
|
-
};
|
|
1210
|
-
}
|
|
1211
|
-
var ReadOnlyCollectionQueryBuilder = class {
|
|
1212
|
-
constructor(api, collection) {
|
|
1213
|
-
this.api = api;
|
|
1214
|
-
this.collection = collection;
|
|
1215
|
-
}
|
|
1216
|
-
async find(options) {
|
|
1217
|
-
return this.api.requestFind(
|
|
1218
|
-
`/api/${String(this.collection)}`,
|
|
1219
|
-
withDefaultPublicReadOptions(options)
|
|
1220
|
-
);
|
|
1221
|
-
}
|
|
1222
|
-
async findById(id, options) {
|
|
1223
|
-
return this.api.requestFindById(
|
|
1224
|
-
`/api/${String(this.collection)}/${String(id)}`,
|
|
1225
|
-
withDefaultPublicReadOptions(options)
|
|
1226
|
-
);
|
|
1227
|
-
}
|
|
1228
|
-
async count(options) {
|
|
1229
|
-
return this.api.requestCount(
|
|
1230
|
-
`/api/${String(this.collection)}/count`,
|
|
1231
|
-
withDefaultPublicReadOptions(options)
|
|
1232
|
-
);
|
|
1233
|
-
}
|
|
1234
|
-
};
|
|
1235
|
-
|
|
1236
|
-
// src/core/collection/collection-client.ts
|
|
1237
|
-
var ReadOnlyCollectionClient = class extends HttpClient {
|
|
1238
|
-
from(collection) {
|
|
1239
|
-
return new ReadOnlyCollectionQueryBuilder(this, collection);
|
|
1240
|
-
}
|
|
1241
|
-
async requestFind(endpoint, options) {
|
|
1242
|
-
const url = this.buildUrl(endpoint, options);
|
|
1243
|
-
const response = await this.fetchWithTracking(url, {
|
|
1244
|
-
...this.defaultOptions,
|
|
1245
|
-
method: "GET"
|
|
1246
|
-
});
|
|
1247
|
-
return this.parseFindResponse(response);
|
|
1248
|
-
}
|
|
1249
|
-
async requestFindEndpoint(endpoint, data) {
|
|
1250
|
-
const response = await this.fetchWithTracking(endpoint, {
|
|
1251
|
-
...this.defaultOptions,
|
|
1252
|
-
method: "POST",
|
|
1253
|
-
body: data ? JSON.stringify(data) : void 0
|
|
1254
|
-
});
|
|
1255
|
-
return this.parseFindResponse(response);
|
|
1256
|
-
}
|
|
1257
|
-
async requestFindEndpointGet(endpoint) {
|
|
1258
|
-
const response = await this.fetchWithTracking(endpoint, {
|
|
1259
|
-
...this.defaultOptions,
|
|
1260
|
-
method: "GET"
|
|
1261
|
-
});
|
|
1262
|
-
return this.parseFindResponse(response);
|
|
1263
|
-
}
|
|
1264
|
-
async requestFindById(endpoint, options) {
|
|
1265
|
-
const url = this.buildUrl(endpoint, options);
|
|
1266
|
-
const response = await this.fetchWithTracking(url, {
|
|
1267
|
-
...this.defaultOptions,
|
|
1268
|
-
method: "GET"
|
|
1269
|
-
});
|
|
1270
|
-
return this.parseDocumentResponse(response);
|
|
1271
|
-
}
|
|
1272
|
-
async requestCount(endpoint, options) {
|
|
1273
|
-
const url = this.buildUrl(endpoint, options);
|
|
1274
|
-
const response = await this.fetchWithTracking(url, {
|
|
1275
|
-
...this.defaultOptions,
|
|
1276
|
-
method: "GET"
|
|
1277
|
-
});
|
|
1278
|
-
return this.parseDocumentResponse(response);
|
|
1279
|
-
}
|
|
1280
|
-
};
|
|
1281
|
-
|
|
1282
1004
|
// src/core/api/parse-response.ts
|
|
1283
1005
|
async function parseApiResponse(response, endpoint, options = {}) {
|
|
1284
1006
|
if (response.status === 204 || response.headers.get("content-length") === "0") {
|
|
@@ -1375,7 +1097,9 @@ var COMMERCE_ENDPOINT_OPERATIONS = {
|
|
|
1375
1097
|
),
|
|
1376
1098
|
stockCheck: operation("products", "post", "/stock-check"),
|
|
1377
1099
|
stockSnapshot: operation("products", "get", "/stock"),
|
|
1378
|
-
upsert: operation("products", "post", "/upsert")
|
|
1100
|
+
upsert: operation("products", "post", "/upsert"),
|
|
1101
|
+
graphRevision: operation("products", "get", "/:id/graph-revision"),
|
|
1102
|
+
variantsPatch: operation("products", "patch", "/:id/variants")
|
|
1379
1103
|
},
|
|
1380
1104
|
orders: {
|
|
1381
1105
|
create: operation("orders", "post", "/create"),
|
|
@@ -1538,12 +1262,28 @@ var EXTERNAL_CUSTOMER_LINK_ENDPOINT_OPERATIONS = {
|
|
|
1538
1262
|
"/external-links/clear-previous-state"
|
|
1539
1263
|
)
|
|
1540
1264
|
};
|
|
1265
|
+
var BENEFIT_VOUCHER_ENDPOINT_OPERATIONS = {
|
|
1266
|
+
issue: operation("customers", "post", "/benefit-vouchers/issue"),
|
|
1267
|
+
get: operation("customers", "post", "/benefit-vouchers/get"),
|
|
1268
|
+
list: operation("customers", "post", "/benefit-vouchers/list"),
|
|
1269
|
+
redeem: operation("customers", "post", "/benefit-vouchers/redeem"),
|
|
1270
|
+
void: operation("customers", "post", "/benefit-vouchers/void"),
|
|
1271
|
+
listMine: operation("customers", "get", "/me/benefit-vouchers")
|
|
1272
|
+
};
|
|
1541
1273
|
var CUSTOMER_GROUP_ENDPOINT_OPERATIONS = {
|
|
1542
1274
|
members: operation("customer-groups", "get", "/:id/members"),
|
|
1543
1275
|
grant: operation("customer-groups", "post", "/:id/members/grant"),
|
|
1544
1276
|
revoke: operation("customer-groups", "post", "/:id/members/revoke")
|
|
1545
1277
|
};
|
|
1546
1278
|
var CUSTOMER_AUTH_ENDPOINT_OPERATIONS = {
|
|
1279
|
+
register: operation("customers", "post", "/register"),
|
|
1280
|
+
login: operation("customers", "post", "/login"),
|
|
1281
|
+
refresh: operation("customers", "post", "/refresh"),
|
|
1282
|
+
me: operation("customers", "get", "/me"),
|
|
1283
|
+
updateProfile: operation("customers", "patch", "/me"),
|
|
1284
|
+
forgotPassword: operation("customers", "post", "/forgot-password"),
|
|
1285
|
+
resetPassword: operation("customers", "post", "/reset-password"),
|
|
1286
|
+
changePassword: operation("customers", "post", "/change-password"),
|
|
1547
1287
|
revokeRefresh: operation("customers", "post", "/revoke-refresh"),
|
|
1548
1288
|
withdraw: operation("customers", "post", "/withdraw")
|
|
1549
1289
|
};
|
|
@@ -1553,6 +1293,9 @@ var EMBEDDED_ADMIN_ENDPOINT_OPERATIONS = {
|
|
|
1553
1293
|
disable: operation("tenants", "delete", "/embedded-admin-app")
|
|
1554
1294
|
};
|
|
1555
1295
|
var EVENTS_ENDPOINT_OPERATIONS = {
|
|
1296
|
+
registrations: {
|
|
1297
|
+
listMine: operation("event-registrations", "get", "/my")
|
|
1298
|
+
},
|
|
1556
1299
|
events: {
|
|
1557
1300
|
convertSchedule: operation("events", "post", "/:id/schedule")
|
|
1558
1301
|
},
|
|
@@ -1774,52 +1517,412 @@ var CustomerScopedTransport = class {
|
|
|
1774
1517
|
this.onUnauthorized = options.onUnauthorized;
|
|
1775
1518
|
this.onRequestId = options.onRequestId;
|
|
1776
1519
|
}
|
|
1777
|
-
async request(endpoint, options) {
|
|
1778
|
-
const token = typeof this.customerToken === "function" ? this.customerToken() : this.customerToken;
|
|
1520
|
+
async request(endpoint, options) {
|
|
1521
|
+
const token = typeof this.customerToken === "function" ? this.customerToken() : this.customerToken;
|
|
1522
|
+
try {
|
|
1523
|
+
const response = await httpFetch(endpoint, {
|
|
1524
|
+
method: options.method,
|
|
1525
|
+
apiUrl: this.apiUrl,
|
|
1526
|
+
publishableKey: this.publishableKey,
|
|
1527
|
+
secretKey: this.secretKey,
|
|
1528
|
+
customerToken: token ?? void 0,
|
|
1529
|
+
...token && this.onUnauthorized && { onUnauthorized: this.onUnauthorized },
|
|
1530
|
+
...options.body !== void 0 && {
|
|
1531
|
+
body: JSON.stringify(options.body)
|
|
1532
|
+
},
|
|
1533
|
+
...options.headers && { headers: options.headers },
|
|
1534
|
+
...options.errorFamily && { errorFamily: options.errorFamily }
|
|
1535
|
+
});
|
|
1536
|
+
this.onRequestId?.(response.headers.get("x-request-id") ?? null);
|
|
1537
|
+
return parseApiResponse(response, endpoint, {
|
|
1538
|
+
errorFamily: options.errorFamily
|
|
1539
|
+
});
|
|
1540
|
+
} catch (err) {
|
|
1541
|
+
const id = err instanceof SDKError ? err.requestId ?? null : null;
|
|
1542
|
+
this.onRequestId?.(id);
|
|
1543
|
+
throw err;
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
};
|
|
1547
|
+
var CustomerScopedApi = class {
|
|
1548
|
+
constructor(apiName, options) {
|
|
1549
|
+
this.transport = new CustomerScopedTransport(apiName, options);
|
|
1550
|
+
}
|
|
1551
|
+
requestEndpoint(endpoint, body, options) {
|
|
1552
|
+
return this.transport.request(resolveOperationPath(endpoint, options), {
|
|
1553
|
+
method: resolveOperationMethod(endpoint),
|
|
1554
|
+
body,
|
|
1555
|
+
headers: options?.headers,
|
|
1556
|
+
errorFamily: resolveOperationErrorFamily(endpoint)
|
|
1557
|
+
});
|
|
1558
|
+
}
|
|
1559
|
+
};
|
|
1560
|
+
var RawCustomerScopedApi = class {
|
|
1561
|
+
constructor(apiName, options) {
|
|
1562
|
+
this.transport = new CustomerScopedTransport(apiName, options);
|
|
1563
|
+
}
|
|
1564
|
+
request(endpoint, options) {
|
|
1565
|
+
return this.transport.request(endpoint, options);
|
|
1566
|
+
}
|
|
1567
|
+
};
|
|
1568
|
+
|
|
1569
|
+
// src/core/api/benefit-voucher-types.ts
|
|
1570
|
+
var BENEFIT_VOUCHER_VOID_REASONS = [
|
|
1571
|
+
"issued_in_error",
|
|
1572
|
+
"benefit_revoked",
|
|
1573
|
+
"customer_request",
|
|
1574
|
+
"other"
|
|
1575
|
+
];
|
|
1576
|
+
function invalidBenefitVoucherResponse() {
|
|
1577
|
+
throw createApiError("Invalid benefit voucher response", 200);
|
|
1578
|
+
}
|
|
1579
|
+
function object(value, keys) {
|
|
1580
|
+
if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).length !== keys.length || keys.some((key) => !(key in value)))
|
|
1581
|
+
invalidBenefitVoucherResponse();
|
|
1582
|
+
return value;
|
|
1583
|
+
}
|
|
1584
|
+
var uuid = (v) => typeof v === "string" && (/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(
|
|
1585
|
+
v
|
|
1586
|
+
) || v === "00000000-0000-0000-0000-000000000000" || v.toLowerCase() === "ffffffff-ffff-ffff-ffff-ffffffffffff");
|
|
1587
|
+
var time = (v) => typeof v === "string" && /^\d{4}-\d{2}-\d{2}T/.test(v) && Number.isFinite(Date.parse(v)) && new Date(Date.parse(v)).toISOString() === v;
|
|
1588
|
+
var actor = (v) => typeof v === "string" && /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(v);
|
|
1589
|
+
function parseBenefitVoucher(value, mine = false) {
|
|
1590
|
+
const v = object(value, [
|
|
1591
|
+
"id",
|
|
1592
|
+
"name",
|
|
1593
|
+
"description",
|
|
1594
|
+
"state",
|
|
1595
|
+
"issuedAt",
|
|
1596
|
+
"expiresAt",
|
|
1597
|
+
...mine ? ["closedAt"] : ["customerId", "definitionId", "source", "closed"]
|
|
1598
|
+
]);
|
|
1599
|
+
if (!uuid(v.id) || typeof v.name !== "string" || !v.name.length || v.name.length > 120 || v.description !== null && (typeof v.description !== "string" || v.description.length > 1e3) || !["issued", "redeemed", "expired", "voided"].includes(v.state) || !time(v.issuedAt) || !time(v.expiresAt))
|
|
1600
|
+
invalidBenefitVoucherResponse();
|
|
1601
|
+
if (mine) {
|
|
1602
|
+
if (v.closedAt !== null && !time(v.closedAt))
|
|
1603
|
+
invalidBenefitVoucherResponse();
|
|
1604
|
+
} else {
|
|
1605
|
+
if (!uuid(v.customerId) || !uuid(v.definitionId))
|
|
1606
|
+
invalidBenefitVoucherResponse();
|
|
1607
|
+
const source = object(v.source, ["namespace", "ref"]);
|
|
1608
|
+
if (typeof source.namespace !== "string" || !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(source.namespace) || typeof source.ref !== "string" || !source.ref.length || source.ref.length > 256)
|
|
1609
|
+
invalidBenefitVoucherResponse();
|
|
1610
|
+
if (v.closed !== null) {
|
|
1611
|
+
const closed = object(v.closed, [
|
|
1612
|
+
"at",
|
|
1613
|
+
"channel",
|
|
1614
|
+
"actor",
|
|
1615
|
+
"actorRef",
|
|
1616
|
+
"voidReason"
|
|
1617
|
+
]);
|
|
1618
|
+
const principal = object(closed.actor, ["type", "id"]);
|
|
1619
|
+
if (!time(closed.at) || !uuid(principal.id) || !["server", "console"].includes(closed.channel) || !["server_credential", "operator"].includes(principal.type) || closed.actorRef !== null && !actor(closed.actorRef) || closed.voidReason !== null && !BENEFIT_VOUCHER_VOID_REASONS.includes(closed.voidReason))
|
|
1620
|
+
invalidBenefitVoucherResponse();
|
|
1621
|
+
}
|
|
1622
|
+
}
|
|
1623
|
+
return value;
|
|
1624
|
+
}
|
|
1625
|
+
function parseBenefitVoucherList(value, mine = false) {
|
|
1626
|
+
const v = object(value, ["vouchers", "nextCursor", "evaluatedAt"]);
|
|
1627
|
+
if (!Array.isArray(v.vouchers) || v.vouchers.length > 100 || !time(v.evaluatedAt) || v.nextCursor !== null && (typeof v.nextCursor !== "string" || !v.nextCursor.length || v.nextCursor.length > 2048))
|
|
1628
|
+
invalidBenefitVoucherResponse();
|
|
1629
|
+
for (const row of v.vouchers) {
|
|
1630
|
+
if (mine) parseBenefitVoucher(row, true);
|
|
1631
|
+
else parseBenefitVoucher(row);
|
|
1632
|
+
}
|
|
1633
|
+
return value;
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
// src/core/api/customer-benefit-vouchers-api.ts
|
|
1637
|
+
var CustomerBenefitVouchersApi = class extends CustomerScopedApi {
|
|
1638
|
+
async listMine(params = {}) {
|
|
1639
|
+
const query = new URLSearchParams();
|
|
1640
|
+
for (const [key, value] of Object.entries(params))
|
|
1641
|
+
if (value !== void 0) query.set(key, String(value));
|
|
1642
|
+
return parseBenefitVoucherList(
|
|
1643
|
+
await this.requestEndpoint(
|
|
1644
|
+
BENEFIT_VOUCHER_ENDPOINT_OPERATIONS.listMine,
|
|
1645
|
+
void 0,
|
|
1646
|
+
{ query }
|
|
1647
|
+
),
|
|
1648
|
+
true
|
|
1649
|
+
);
|
|
1650
|
+
}
|
|
1651
|
+
};
|
|
1652
|
+
|
|
1653
|
+
// src/core/collection/http-client.ts
|
|
1654
|
+
import { stringify } from "qs-esm";
|
|
1655
|
+
function validateWhere(where) {
|
|
1656
|
+
if (where === void 0) return false;
|
|
1657
|
+
let hasNull = false;
|
|
1658
|
+
function visit(value, depth, key) {
|
|
1659
|
+
if (depth > 10) {
|
|
1660
|
+
throw createValidationError(
|
|
1661
|
+
"Collection where must not exceed nesting depth 10."
|
|
1662
|
+
);
|
|
1663
|
+
}
|
|
1664
|
+
if (value === null && (key === "equals" || key === "not_equals")) {
|
|
1665
|
+
hasNull = true;
|
|
1666
|
+
return;
|
|
1667
|
+
}
|
|
1668
|
+
if (value == null) {
|
|
1669
|
+
throw createValidationError(
|
|
1670
|
+
"Collection where must not contain null or undefined values."
|
|
1671
|
+
);
|
|
1672
|
+
}
|
|
1673
|
+
if (Array.isArray(value)) {
|
|
1674
|
+
if (value.length === 0) {
|
|
1675
|
+
throw createValidationError(
|
|
1676
|
+
"Collection where must not contain empty arrays, including and/or."
|
|
1677
|
+
);
|
|
1678
|
+
}
|
|
1679
|
+
if (value.length > 1e3) {
|
|
1680
|
+
throw createValidationError(
|
|
1681
|
+
"Collection where arrays must not contain more than 1000 elements."
|
|
1682
|
+
);
|
|
1683
|
+
}
|
|
1684
|
+
for (const item of value) visit(item, depth + 1);
|
|
1685
|
+
} else if (typeof value === "object" && !(value instanceof Date)) {
|
|
1686
|
+
const values = Object.entries(value);
|
|
1687
|
+
if (values.length === 0) {
|
|
1688
|
+
throw createValidationError(
|
|
1689
|
+
"Collection where must not contain empty condition objects."
|
|
1690
|
+
);
|
|
1691
|
+
}
|
|
1692
|
+
for (const [key2, item] of values) visit(item, depth + 1, key2);
|
|
1693
|
+
}
|
|
1694
|
+
}
|
|
1695
|
+
visit(where, 0);
|
|
1696
|
+
return hasNull;
|
|
1697
|
+
}
|
|
1698
|
+
var HttpClient = class {
|
|
1699
|
+
constructor(publishableKey, secretKey, getCustomerToken, onUnauthorized, onRequestId, apiUrl) {
|
|
1700
|
+
this.publishableKey = requirePublishableKeyForSecret(
|
|
1701
|
+
"CollectionClient",
|
|
1702
|
+
publishableKey,
|
|
1703
|
+
secretKey
|
|
1704
|
+
);
|
|
1705
|
+
this.secretKey = secretKey;
|
|
1706
|
+
this.getCustomerToken = getCustomerToken;
|
|
1707
|
+
this.onUnauthorized = onUnauthorized;
|
|
1708
|
+
this.onRequestId = onRequestId;
|
|
1709
|
+
this.apiUrl = apiUrl;
|
|
1710
|
+
}
|
|
1711
|
+
get defaultOptions() {
|
|
1712
|
+
const opts = {
|
|
1713
|
+
apiUrl: this.apiUrl,
|
|
1714
|
+
publishableKey: this.publishableKey,
|
|
1715
|
+
secretKey: this.secretKey
|
|
1716
|
+
};
|
|
1717
|
+
const token = this.getCustomerToken?.();
|
|
1718
|
+
if (token) {
|
|
1719
|
+
opts.customerToken = token;
|
|
1720
|
+
if (this.onUnauthorized) {
|
|
1721
|
+
opts.onUnauthorized = this.onUnauthorized;
|
|
1722
|
+
}
|
|
1723
|
+
}
|
|
1724
|
+
return opts;
|
|
1725
|
+
}
|
|
1726
|
+
async fetchWithTracking(url, opts) {
|
|
1779
1727
|
try {
|
|
1780
|
-
const response = await httpFetch(
|
|
1781
|
-
method: options.method,
|
|
1782
|
-
apiUrl: this.apiUrl,
|
|
1783
|
-
publishableKey: this.publishableKey,
|
|
1784
|
-
secretKey: this.secretKey,
|
|
1785
|
-
customerToken: token ?? void 0,
|
|
1786
|
-
...token && this.onUnauthorized && { onUnauthorized: this.onUnauthorized },
|
|
1787
|
-
...options.body !== void 0 && {
|
|
1788
|
-
body: JSON.stringify(options.body)
|
|
1789
|
-
},
|
|
1790
|
-
...options.headers && { headers: options.headers },
|
|
1791
|
-
...options.errorFamily && { errorFamily: options.errorFamily }
|
|
1792
|
-
});
|
|
1728
|
+
const response = await httpFetch(url, opts);
|
|
1793
1729
|
this.onRequestId?.(response.headers.get("x-request-id") ?? null);
|
|
1794
|
-
return
|
|
1795
|
-
errorFamily: options.errorFamily
|
|
1796
|
-
});
|
|
1730
|
+
return response;
|
|
1797
1731
|
} catch (err) {
|
|
1798
1732
|
const id = err instanceof SDKError ? err.requestId ?? null : null;
|
|
1799
1733
|
this.onRequestId?.(id);
|
|
1800
1734
|
throw err;
|
|
1801
1735
|
}
|
|
1802
1736
|
}
|
|
1737
|
+
buildUrl(endpoint, options) {
|
|
1738
|
+
if (!options) return endpoint;
|
|
1739
|
+
const { fallbackLocale, ...rest } = options;
|
|
1740
|
+
const queryOptions = fallbackLocale === void 0 ? rest : {
|
|
1741
|
+
...rest,
|
|
1742
|
+
"fallback-locale": fallbackLocale === false ? "none" : fallbackLocale
|
|
1743
|
+
};
|
|
1744
|
+
const encodedOptions = validateWhere(queryOptions.where) ? { ...queryOptions, where: JSON.stringify(queryOptions.where) } : queryOptions;
|
|
1745
|
+
const queryString = stringify(encodedOptions, { addQueryPrefix: true });
|
|
1746
|
+
return queryString ? `${endpoint}${queryString}` : endpoint;
|
|
1747
|
+
}
|
|
1748
|
+
assertJsonResponse(response) {
|
|
1749
|
+
const contentType = response.headers.get("content-type");
|
|
1750
|
+
if (!contentType?.includes("application/json")) {
|
|
1751
|
+
throw createApiError("Response is not in JSON format.", response.status, {
|
|
1752
|
+
contentType
|
|
1753
|
+
});
|
|
1754
|
+
}
|
|
1755
|
+
}
|
|
1756
|
+
/**
|
|
1757
|
+
* Parse Payload CMS find response (list query)
|
|
1758
|
+
* Returns native Payload response structure
|
|
1759
|
+
*/
|
|
1760
|
+
async parseFindResponse(response) {
|
|
1761
|
+
const contentType = response.headers.get("content-type");
|
|
1762
|
+
try {
|
|
1763
|
+
this.assertJsonResponse(response);
|
|
1764
|
+
const jsonData = await response.json();
|
|
1765
|
+
if (jsonData.docs === void 0) {
|
|
1766
|
+
throw createApiError("Invalid find response.", response.status, {
|
|
1767
|
+
jsonData
|
|
1768
|
+
});
|
|
1769
|
+
}
|
|
1770
|
+
return {
|
|
1771
|
+
docs: jsonData.docs,
|
|
1772
|
+
totalDocs: jsonData.totalDocs ?? 0,
|
|
1773
|
+
limit: jsonData.limit || 20,
|
|
1774
|
+
totalPages: jsonData.totalPages ?? 0,
|
|
1775
|
+
page: jsonData.page || 1,
|
|
1776
|
+
pagingCounter: jsonData.pagingCounter || 1,
|
|
1777
|
+
hasPrevPage: jsonData.hasPrevPage ?? false,
|
|
1778
|
+
hasNextPage: jsonData.hasNextPage ?? false,
|
|
1779
|
+
prevPage: jsonData.prevPage ?? null,
|
|
1780
|
+
nextPage: jsonData.nextPage ?? null
|
|
1781
|
+
};
|
|
1782
|
+
} catch (error) {
|
|
1783
|
+
if (error instanceof SDKError) throw error;
|
|
1784
|
+
throw createApiError("Failed to parse response.", response.status, {
|
|
1785
|
+
contentType,
|
|
1786
|
+
error: error instanceof Error ? error.message : error
|
|
1787
|
+
});
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1790
|
+
/**
|
|
1791
|
+
* Parse Payload CMS mutation response (create/update)
|
|
1792
|
+
* Returns native Payload response structure
|
|
1793
|
+
*/
|
|
1794
|
+
async parseMutationResponse(response) {
|
|
1795
|
+
const contentType = response.headers.get("content-type");
|
|
1796
|
+
try {
|
|
1797
|
+
this.assertJsonResponse(response);
|
|
1798
|
+
const jsonData = await response.json();
|
|
1799
|
+
if (jsonData.doc === void 0) {
|
|
1800
|
+
throw createApiError("Invalid mutation response.", response.status, {
|
|
1801
|
+
jsonData
|
|
1802
|
+
});
|
|
1803
|
+
}
|
|
1804
|
+
return {
|
|
1805
|
+
message: jsonData.message || "",
|
|
1806
|
+
doc: jsonData.doc,
|
|
1807
|
+
errors: jsonData.errors
|
|
1808
|
+
};
|
|
1809
|
+
} catch (error) {
|
|
1810
|
+
if (error instanceof SDKError) throw error;
|
|
1811
|
+
throw createApiError("Failed to parse response.", response.status, {
|
|
1812
|
+
contentType,
|
|
1813
|
+
error: error instanceof Error ? error.message : error
|
|
1814
|
+
});
|
|
1815
|
+
}
|
|
1816
|
+
}
|
|
1817
|
+
/**
|
|
1818
|
+
* Parse Payload CMS document response (findById/delete)
|
|
1819
|
+
* Returns document directly without wrapper
|
|
1820
|
+
*/
|
|
1821
|
+
async parseDocumentResponse(response) {
|
|
1822
|
+
const contentType = response.headers.get("content-type");
|
|
1823
|
+
try {
|
|
1824
|
+
this.assertJsonResponse(response);
|
|
1825
|
+
const jsonData = await response.json();
|
|
1826
|
+
return jsonData;
|
|
1827
|
+
} catch (error) {
|
|
1828
|
+
if (error instanceof SDKError) throw error;
|
|
1829
|
+
throw createApiError("Failed to parse response.", response.status, {
|
|
1830
|
+
contentType,
|
|
1831
|
+
error: error instanceof Error ? error.message : error
|
|
1832
|
+
});
|
|
1833
|
+
}
|
|
1834
|
+
}
|
|
1803
1835
|
};
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1836
|
+
|
|
1837
|
+
// src/core/collection/query-builder.ts
|
|
1838
|
+
var PUBLIC_READ_DEPTH_ERROR = "Publishable collection reads require depth: 0. Use a shaped commerce endpoint or server client for populated data.";
|
|
1839
|
+
var PUBLIC_READ_JOINS_ERROR = "Publishable collection reads require joins: false. Use a shaped commerce endpoint or server client for joined data.";
|
|
1840
|
+
var PUBLIC_READ_POPULATE_ERROR = "Publishable collection reads do not support populate. Use a shaped commerce endpoint or server client for populated data.";
|
|
1841
|
+
function withDefaultPublicReadOptions(options) {
|
|
1842
|
+
const rawOptions = options;
|
|
1843
|
+
if (rawOptions?.depth !== void 0 && rawOptions.depth !== 0) {
|
|
1844
|
+
throw createValidationError(PUBLIC_READ_DEPTH_ERROR);
|
|
1807
1845
|
}
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1846
|
+
if (rawOptions?.joins !== void 0 && rawOptions.joins !== false) {
|
|
1847
|
+
throw createValidationError(PUBLIC_READ_JOINS_ERROR);
|
|
1848
|
+
}
|
|
1849
|
+
if (rawOptions?.populate !== void 0) {
|
|
1850
|
+
throw createValidationError(PUBLIC_READ_POPULATE_ERROR);
|
|
1851
|
+
}
|
|
1852
|
+
return {
|
|
1853
|
+
...options,
|
|
1854
|
+
depth: options?.depth ?? 0,
|
|
1855
|
+
joins: options?.joins ?? false
|
|
1856
|
+
};
|
|
1857
|
+
}
|
|
1858
|
+
var ReadOnlyCollectionQueryBuilder = class {
|
|
1859
|
+
constructor(api, collection) {
|
|
1860
|
+
this.api = api;
|
|
1861
|
+
this.collection = collection;
|
|
1862
|
+
}
|
|
1863
|
+
async find(options) {
|
|
1864
|
+
return this.api.requestFind(
|
|
1865
|
+
`/api/${String(this.collection)}`,
|
|
1866
|
+
withDefaultPublicReadOptions(options)
|
|
1867
|
+
);
|
|
1868
|
+
}
|
|
1869
|
+
async findById(id, options) {
|
|
1870
|
+
return this.api.requestFindById(
|
|
1871
|
+
`/api/${String(this.collection)}/${String(id)}`,
|
|
1872
|
+
withDefaultPublicReadOptions(options)
|
|
1873
|
+
);
|
|
1874
|
+
}
|
|
1875
|
+
async count(options) {
|
|
1876
|
+
return this.api.requestCount(
|
|
1877
|
+
`/api/${String(this.collection)}/count`,
|
|
1878
|
+
withDefaultPublicReadOptions(options)
|
|
1879
|
+
);
|
|
1815
1880
|
}
|
|
1816
1881
|
};
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1882
|
+
|
|
1883
|
+
// src/core/collection/collection-client.ts
|
|
1884
|
+
var ReadOnlyCollectionClient = class extends HttpClient {
|
|
1885
|
+
from(collection) {
|
|
1886
|
+
return new ReadOnlyCollectionQueryBuilder(this, collection);
|
|
1820
1887
|
}
|
|
1821
|
-
|
|
1822
|
-
|
|
1888
|
+
async requestFind(endpoint, options) {
|
|
1889
|
+
const url = this.buildUrl(endpoint, options);
|
|
1890
|
+
const response = await this.fetchWithTracking(url, {
|
|
1891
|
+
...this.defaultOptions,
|
|
1892
|
+
method: "GET"
|
|
1893
|
+
});
|
|
1894
|
+
return this.parseFindResponse(response);
|
|
1895
|
+
}
|
|
1896
|
+
async requestFindEndpoint(endpoint, data) {
|
|
1897
|
+
const response = await this.fetchWithTracking(endpoint, {
|
|
1898
|
+
...this.defaultOptions,
|
|
1899
|
+
method: "POST",
|
|
1900
|
+
body: data ? JSON.stringify(data) : void 0
|
|
1901
|
+
});
|
|
1902
|
+
return this.parseFindResponse(response);
|
|
1903
|
+
}
|
|
1904
|
+
async requestFindEndpointGet(endpoint) {
|
|
1905
|
+
const response = await this.fetchWithTracking(endpoint, {
|
|
1906
|
+
...this.defaultOptions,
|
|
1907
|
+
method: "GET"
|
|
1908
|
+
});
|
|
1909
|
+
return this.parseFindResponse(response);
|
|
1910
|
+
}
|
|
1911
|
+
async requestFindById(endpoint, options) {
|
|
1912
|
+
const url = this.buildUrl(endpoint, options);
|
|
1913
|
+
const response = await this.fetchWithTracking(url, {
|
|
1914
|
+
...this.defaultOptions,
|
|
1915
|
+
method: "GET"
|
|
1916
|
+
});
|
|
1917
|
+
return this.parseDocumentResponse(response);
|
|
1918
|
+
}
|
|
1919
|
+
async requestCount(endpoint, options) {
|
|
1920
|
+
const url = this.buildUrl(endpoint, options);
|
|
1921
|
+
const response = await this.fetchWithTracking(url, {
|
|
1922
|
+
...this.defaultOptions,
|
|
1923
|
+
method: "GET"
|
|
1924
|
+
});
|
|
1925
|
+
return this.parseDocumentResponse(response);
|
|
1823
1926
|
}
|
|
1824
1927
|
};
|
|
1825
1928
|
|
|
@@ -3978,19 +4081,24 @@ var CustomerAuth = class {
|
|
|
3978
4081
|
* Register a new customer account
|
|
3979
4082
|
*/
|
|
3980
4083
|
async register(data) {
|
|
3981
|
-
return this.requestJson(
|
|
3982
|
-
|
|
3983
|
-
|
|
3984
|
-
|
|
4084
|
+
return this.requestJson(
|
|
4085
|
+
resolveOperationPath(CUSTOMER_AUTH_ENDPOINT_OPERATIONS.register),
|
|
4086
|
+
{
|
|
4087
|
+
method: resolveOperationMethod(
|
|
4088
|
+
CUSTOMER_AUTH_ENDPOINT_OPERATIONS.register
|
|
4089
|
+
),
|
|
4090
|
+
body: JSON.stringify(data)
|
|
4091
|
+
}
|
|
4092
|
+
);
|
|
3985
4093
|
}
|
|
3986
4094
|
/**
|
|
3987
4095
|
* Login with email and password. Stores the token internally.
|
|
3988
4096
|
*/
|
|
3989
4097
|
async login(data) {
|
|
3990
4098
|
const result = await this.requestJson(
|
|
3991
|
-
|
|
4099
|
+
resolveOperationPath(CUSTOMER_AUTH_ENDPOINT_OPERATIONS.login),
|
|
3992
4100
|
{
|
|
3993
|
-
method:
|
|
4101
|
+
method: resolveOperationMethod(CUSTOMER_AUTH_ENDPOINT_OPERATIONS.login),
|
|
3994
4102
|
body: JSON.stringify(data)
|
|
3995
4103
|
}
|
|
3996
4104
|
);
|
|
@@ -4236,14 +4344,18 @@ var CustomerAuth = class {
|
|
|
4236
4344
|
}
|
|
4237
4345
|
async _doRefreshToken(intended) {
|
|
4238
4346
|
const init = intended.refreshToken ? {
|
|
4239
|
-
method:
|
|
4347
|
+
method: resolveOperationMethod(
|
|
4348
|
+
CUSTOMER_AUTH_ENDPOINT_OPERATIONS.refresh
|
|
4349
|
+
),
|
|
4240
4350
|
body: JSON.stringify({ refreshToken: intended.refreshToken })
|
|
4241
4351
|
} : {
|
|
4242
|
-
method:
|
|
4352
|
+
method: resolveOperationMethod(
|
|
4353
|
+
CUSTOMER_AUTH_ENDPOINT_OPERATIONS.refresh
|
|
4354
|
+
),
|
|
4243
4355
|
headers: { Authorization: `Bearer ${intended.token}` }
|
|
4244
4356
|
};
|
|
4245
4357
|
const result = await this.requestJson(
|
|
4246
|
-
|
|
4358
|
+
resolveOperationPath(CUSTOMER_AUTH_ENDPOINT_OPERATIONS.refresh),
|
|
4247
4359
|
init
|
|
4248
4360
|
);
|
|
4249
4361
|
const state = this.classifyCanonicalState(intended);
|
|
@@ -4312,9 +4424,9 @@ var CustomerAuth = class {
|
|
|
4312
4424
|
if (!token) return null;
|
|
4313
4425
|
try {
|
|
4314
4426
|
const data = await this.requestJson(
|
|
4315
|
-
|
|
4427
|
+
resolveOperationPath(CUSTOMER_AUTH_ENDPOINT_OPERATIONS.me),
|
|
4316
4428
|
{
|
|
4317
|
-
method:
|
|
4429
|
+
method: resolveOperationMethod(CUSTOMER_AUTH_ENDPOINT_OPERATIONS.me),
|
|
4318
4430
|
headers: { Authorization: `Bearer ${token}` }
|
|
4319
4431
|
}
|
|
4320
4432
|
);
|
|
@@ -4331,19 +4443,29 @@ var CustomerAuth = class {
|
|
|
4331
4443
|
* Request a password reset email
|
|
4332
4444
|
*/
|
|
4333
4445
|
async forgotPassword(email) {
|
|
4334
|
-
await this.requestJson(
|
|
4335
|
-
|
|
4336
|
-
|
|
4337
|
-
|
|
4446
|
+
await this.requestJson(
|
|
4447
|
+
resolveOperationPath(CUSTOMER_AUTH_ENDPOINT_OPERATIONS.forgotPassword),
|
|
4448
|
+
{
|
|
4449
|
+
method: resolveOperationMethod(
|
|
4450
|
+
CUSTOMER_AUTH_ENDPOINT_OPERATIONS.forgotPassword
|
|
4451
|
+
),
|
|
4452
|
+
body: JSON.stringify({ email })
|
|
4453
|
+
}
|
|
4454
|
+
);
|
|
4338
4455
|
}
|
|
4339
4456
|
/**
|
|
4340
4457
|
* Reset password using a token from the reset email
|
|
4341
4458
|
*/
|
|
4342
4459
|
async resetPassword(token, password) {
|
|
4343
|
-
await this.requestJson(
|
|
4344
|
-
|
|
4345
|
-
|
|
4346
|
-
|
|
4460
|
+
await this.requestJson(
|
|
4461
|
+
resolveOperationPath(CUSTOMER_AUTH_ENDPOINT_OPERATIONS.resetPassword),
|
|
4462
|
+
{
|
|
4463
|
+
method: resolveOperationMethod(
|
|
4464
|
+
CUSTOMER_AUTH_ENDPOINT_OPERATIONS.resetPassword
|
|
4465
|
+
),
|
|
4466
|
+
body: JSON.stringify({ token, password })
|
|
4467
|
+
}
|
|
4468
|
+
);
|
|
4347
4469
|
}
|
|
4348
4470
|
/**
|
|
4349
4471
|
* Update the authenticated customer's profile (name, phone, marketingConsent)
|
|
@@ -4352,9 +4474,11 @@ var CustomerAuth = class {
|
|
|
4352
4474
|
const token = this.getToken();
|
|
4353
4475
|
if (!token) throw new ApiError("Not authenticated", 401);
|
|
4354
4476
|
const result = await this.requestJson(
|
|
4355
|
-
|
|
4477
|
+
resolveOperationPath(CUSTOMER_AUTH_ENDPOINT_OPERATIONS.updateProfile),
|
|
4356
4478
|
{
|
|
4357
|
-
method:
|
|
4479
|
+
method: resolveOperationMethod(
|
|
4480
|
+
CUSTOMER_AUTH_ENDPOINT_OPERATIONS.updateProfile
|
|
4481
|
+
),
|
|
4358
4482
|
headers: { Authorization: `Bearer ${token}` },
|
|
4359
4483
|
body: JSON.stringify(data)
|
|
4360
4484
|
}
|
|
@@ -4367,11 +4491,16 @@ var CustomerAuth = class {
|
|
|
4367
4491
|
async changePassword(currentPassword, newPassword) {
|
|
4368
4492
|
const token = this.getToken();
|
|
4369
4493
|
if (!token) throw new ApiError("Not authenticated", 401);
|
|
4370
|
-
await this.requestJson(
|
|
4371
|
-
|
|
4372
|
-
|
|
4373
|
-
|
|
4374
|
-
|
|
4494
|
+
await this.requestJson(
|
|
4495
|
+
resolveOperationPath(CUSTOMER_AUTH_ENDPOINT_OPERATIONS.changePassword),
|
|
4496
|
+
{
|
|
4497
|
+
method: resolveOperationMethod(
|
|
4498
|
+
CUSTOMER_AUTH_ENDPOINT_OPERATIONS.changePassword
|
|
4499
|
+
),
|
|
4500
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
4501
|
+
body: JSON.stringify({ currentPassword, newPassword })
|
|
4502
|
+
}
|
|
4503
|
+
);
|
|
4375
4504
|
}
|
|
4376
4505
|
/**
|
|
4377
4506
|
* Get the authenticated customer's orders with pagination and optional status filter
|
|
@@ -6169,6 +6298,18 @@ var EventsClient = class {
|
|
|
6169
6298
|
{ useCustomerAuth: false }
|
|
6170
6299
|
);
|
|
6171
6300
|
}
|
|
6301
|
+
listMyRegistrations(params = {}) {
|
|
6302
|
+
const query = new URLSearchParams();
|
|
6303
|
+
if (params.page !== void 0) query.set("page", String(params.page));
|
|
6304
|
+
if (params.limit !== void 0) query.set("limit", String(params.limit));
|
|
6305
|
+
const operation2 = EVENTS_ENDPOINT_OPERATIONS.registrations.listMine;
|
|
6306
|
+
return this.execute(
|
|
6307
|
+
resolveOperationPath(operation2, { query }),
|
|
6308
|
+
resolveOperationMethod(operation2),
|
|
6309
|
+
void 0,
|
|
6310
|
+
{ useCustomerAuth: true, noStore: true }
|
|
6311
|
+
);
|
|
6312
|
+
}
|
|
6172
6313
|
register(params) {
|
|
6173
6314
|
return this.execute(
|
|
6174
6315
|
"/api/event-registrations/register",
|
|
@@ -6199,6 +6340,7 @@ var EventsClient = class {
|
|
|
6199
6340
|
try {
|
|
6200
6341
|
const response = await httpFetch(endpoint, {
|
|
6201
6342
|
method,
|
|
6343
|
+
...options.noStore && { cache: "no-store" },
|
|
6202
6344
|
apiUrl: this.apiUrl,
|
|
6203
6345
|
publishableKey: this.publishableKey,
|
|
6204
6346
|
...useCustomerAuth && token ? { customerToken: token } : {},
|
|
@@ -6391,6 +6533,16 @@ var Client = class _Client {
|
|
|
6391
6533
|
this.markets = new MarketDiscovery(
|
|
6392
6534
|
(options2) => this.collections.from("markets").find(options2)
|
|
6393
6535
|
);
|
|
6536
|
+
this.benefitVouchers = new CustomerBenefitVouchersApi(
|
|
6537
|
+
"CustomerBenefitVouchersApi",
|
|
6538
|
+
{
|
|
6539
|
+
publishableKey: this.config.publishableKey,
|
|
6540
|
+
apiUrl: this.config.apiUrl,
|
|
6541
|
+
customerToken: () => this.customer.auth.getToken(),
|
|
6542
|
+
onUnauthorized,
|
|
6543
|
+
onRequestId
|
|
6544
|
+
}
|
|
6545
|
+
);
|
|
6394
6546
|
const membershipApi = new BrowserMembershipApi("MembershipApi", {
|
|
6395
6547
|
publishableKey: this.config.publishableKey,
|
|
6396
6548
|
apiUrl: this.config.apiUrl,
|