@01.software/sdk 0.46.1 → 0.49.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 +96 -1
- package/README.md +145 -14
- package/dist/client.cjs +485 -81
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +7 -6
- package/dist/client.d.ts +7 -6
- package/dist/client.js +485 -81
- package/dist/client.js.map +1 -1
- package/dist/{collection-client-BEGXnfQe.d.ts → collection-client-DnDt6EQz.d.ts} +4 -4
- package/dist/{collection-client-L2rEgBaR.d.cts → collection-client-XfGLPuTf.d.cts} +4 -4
- package/dist/{const-y0eipvnQ.d.cts → const-CBba4lDo.d.cts} +4 -4
- package/dist/{const-GYVwlXLr.d.ts → const-DCNV5Kq7.d.ts} +4 -4
- package/dist/errors.cjs +112 -16
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.cts +13 -4
- package/dist/errors.d.ts +13 -4
- package/dist/errors.js +112 -16
- package/dist/errors.js.map +1 -1
- package/dist/{index-BfYL6Qb1.d.cts → index-CbKyoEzy.d.cts} +3 -3
- package/dist/{index-Bei4WlVw.d.ts → index-DUuIqUS8.d.ts} +3 -3
- package/dist/index.cjs +452 -104
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -8
- package/dist/index.d.ts +8 -8
- package/dist/index.js +452 -104
- package/dist/index.js.map +1 -1
- package/dist/{payload-types-3WNyC0gk.d.cts → payload-types-MKbx5MuJ.d.cts} +309 -17
- package/dist/{payload-types-3WNyC0gk.d.ts → payload-types-MKbx5MuJ.d.ts} +309 -17
- package/dist/query.cjs +165 -43
- 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 +165 -43
- 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 +566 -81
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +8 -7
- package/dist/server.d.ts +8 -7
- package/dist/server.js +566 -81
- package/dist/server.js.map +1 -1
- package/dist/storefront-cache.cjs +70 -1
- package/dist/storefront-cache.cjs.map +1 -1
- package/dist/storefront-cache.js +70 -1
- package/dist/storefront-cache.js.map +1 -1
- package/dist/{types-mIROvhhP.d.ts → types-1UeOk1Uy.d.cts} +110 -8
- package/dist/{types-CAicTn-o.d.cts → types-BKr_2avj.d.cts} +2 -2
- package/dist/{types-CDJ2M-MJ.d.cts → types-Du4s5anw.d.ts} +110 -8
- package/dist/{types-DpSyNTxy.d.ts → types-L_nh-ED7.d.ts} +2 -2
- package/dist/ui/form.d.cts +1 -1
- package/dist/ui/form.d.ts +1 -1
- package/dist/ui/video.d.cts +1 -1
- package/dist/ui/video.d.ts +1 -1
- package/dist/webhook.d.cts +4 -4
- package/dist/webhook.d.ts +4 -4
- package/package.json +6 -5
package/dist/client.js
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
import { stringify } from "qs-esm";
|
|
3
3
|
|
|
4
4
|
// src/core/errors.ts
|
|
5
|
+
var SDK_ERROR_BRAND = /* @__PURE__ */ Symbol.for("@01.software/sdk/SDKError");
|
|
6
|
+
var SDK_ERROR_TYPE_BRAND = /* @__PURE__ */ Symbol.for("@01.software/sdk/SDKError.type");
|
|
7
|
+
function defineSDKErrorBrand(error) {
|
|
8
|
+
Object.defineProperty(error, SDK_ERROR_BRAND, {
|
|
9
|
+
value: true,
|
|
10
|
+
enumerable: false,
|
|
11
|
+
configurable: false,
|
|
12
|
+
writable: false
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function defineSDKErrorType(error, type) {
|
|
16
|
+
Object.defineProperty(error, SDK_ERROR_TYPE_BRAND, {
|
|
17
|
+
value: type,
|
|
18
|
+
enumerable: false,
|
|
19
|
+
configurable: false,
|
|
20
|
+
writable: false
|
|
21
|
+
});
|
|
22
|
+
}
|
|
5
23
|
var SDKError = class extends Error {
|
|
6
24
|
constructor(code, message, status, details, userMessage, suggestion, requestId) {
|
|
7
25
|
super(message);
|
|
@@ -12,6 +30,7 @@ var SDKError = class extends Error {
|
|
|
12
30
|
this.userMessage = userMessage;
|
|
13
31
|
this.suggestion = suggestion;
|
|
14
32
|
this.requestId = requestId;
|
|
33
|
+
defineSDKErrorBrand(this);
|
|
15
34
|
if (Error.captureStackTrace) {
|
|
16
35
|
Error.captureStackTrace(this, new.target);
|
|
17
36
|
}
|
|
@@ -32,6 +51,7 @@ var SDKError = class extends Error {
|
|
|
32
51
|
...this.kind !== void 0 && { kind: this.kind },
|
|
33
52
|
...this.reason !== void 0 && { reason: this.reason },
|
|
34
53
|
...this.rawReason !== void 0 && { rawReason: this.rawReason },
|
|
54
|
+
...this.apiReason !== void 0 && { apiReason: this.apiReason },
|
|
35
55
|
...this.retryable !== void 0 && { retryable: this.retryable },
|
|
36
56
|
...this.retryAfter !== void 0 && { retryAfter: this.retryAfter }
|
|
37
57
|
};
|
|
@@ -39,34 +59,78 @@ var SDKError = class extends Error {
|
|
|
39
59
|
};
|
|
40
60
|
var COMMERCE_ERROR_CODES = [
|
|
41
61
|
"validation_failed",
|
|
62
|
+
"bad_request",
|
|
42
63
|
"unauthorized",
|
|
43
64
|
"forbidden",
|
|
65
|
+
"account_suspended",
|
|
66
|
+
"key_invalid",
|
|
67
|
+
"pat_tenant_header_forbidden",
|
|
68
|
+
"tenant_mismatch",
|
|
69
|
+
"test_tenant_expired",
|
|
70
|
+
"token_invalid",
|
|
44
71
|
"token_expired",
|
|
45
72
|
"origin_not_allowed",
|
|
46
73
|
"server_credentials_required",
|
|
74
|
+
"role_denied",
|
|
75
|
+
"scope_denied",
|
|
76
|
+
"feature_disabled",
|
|
47
77
|
"not_found",
|
|
48
78
|
"conflict",
|
|
79
|
+
"locked",
|
|
49
80
|
"cart_revision_conflict",
|
|
50
81
|
"rate_limit_exceeded",
|
|
51
82
|
"usage_limit_exceeded",
|
|
52
83
|
"service_unavailable",
|
|
53
84
|
"idempotency_conflict",
|
|
54
85
|
"idempotency_in_progress",
|
|
86
|
+
"idempotency_key_required",
|
|
87
|
+
"invalid_idempotency_key",
|
|
55
88
|
"cart_not_active",
|
|
56
89
|
"cart_locked",
|
|
57
90
|
"cart_empty",
|
|
58
91
|
"cart_market_unavailable",
|
|
59
92
|
"cart_market_mismatch",
|
|
60
93
|
"checkout_not_open",
|
|
94
|
+
"checkout_already_open",
|
|
61
95
|
"payment_slot_held",
|
|
62
96
|
"reservation_expired",
|
|
63
97
|
"payment_session_not_cancelable",
|
|
98
|
+
"payment_session_conflict",
|
|
64
99
|
"provider_identity_mismatch",
|
|
100
|
+
"payment_method_unavailable",
|
|
65
101
|
"provider_unavailable",
|
|
66
102
|
"lock_timeout",
|
|
67
103
|
"price_changed",
|
|
68
104
|
"pricing_fact_in_use",
|
|
69
105
|
"insufficient_stock",
|
|
106
|
+
"reservation_conflict",
|
|
107
|
+
"stock_lock_unavailable",
|
|
108
|
+
"variant_not_found",
|
|
109
|
+
"variant_stock_write_failed",
|
|
110
|
+
"stock_invariant_violation",
|
|
111
|
+
"payment_confirmation_in_flight",
|
|
112
|
+
"checkout_reservation_release_requires_transaction",
|
|
113
|
+
"admission_metadata_invalid",
|
|
114
|
+
"admission_metadata_required",
|
|
115
|
+
"capacity_exceeded",
|
|
116
|
+
"occurrence_lock_unavailable",
|
|
117
|
+
"occurrence_not_open",
|
|
118
|
+
"admission_type_capacity_exceeded",
|
|
119
|
+
"admission_type_occurrence_mismatch",
|
|
120
|
+
"admission_hold_expired",
|
|
121
|
+
"admission_hold_checkout_item_conflict",
|
|
122
|
+
"admission_hold_checkout_conflict",
|
|
123
|
+
"admission_hold_quantity_mismatch",
|
|
124
|
+
"admission_hold_unbound",
|
|
125
|
+
"admission_hold_missing",
|
|
126
|
+
"admission_hold_checkout_item_missing",
|
|
127
|
+
"admission_hold_expiry_failed",
|
|
128
|
+
"admission_hold_expiry_requires_transaction",
|
|
129
|
+
"admission_hold_line_item_mismatch",
|
|
130
|
+
"admission_materialization_failed",
|
|
131
|
+
"variant_inactive",
|
|
132
|
+
"variant_product_mismatch",
|
|
133
|
+
"product_not_public",
|
|
70
134
|
"market_not_found",
|
|
71
135
|
"market_shipping_currency_unsupported",
|
|
72
136
|
"missing_market_rate",
|
|
@@ -91,7 +155,11 @@ var COMMERCE_ERROR_CODES = [
|
|
|
91
155
|
"discount_min_order_amount",
|
|
92
156
|
"discount_currency_scope_required",
|
|
93
157
|
"discount_allocation_method_unsupported",
|
|
94
|
-
"currency_mismatch"
|
|
158
|
+
"currency_mismatch",
|
|
159
|
+
"customer_token_required",
|
|
160
|
+
"market_required",
|
|
161
|
+
"server_derived",
|
|
162
|
+
"internal_error"
|
|
95
163
|
];
|
|
96
164
|
var COMMERCE_ERROR_CODE_SET = new Set(
|
|
97
165
|
COMMERCE_ERROR_CODES
|
|
@@ -117,6 +185,12 @@ function commerceProtocolError(issue, trustedRequestId) {
|
|
|
117
185
|
);
|
|
118
186
|
}
|
|
119
187
|
function parseCommerceErrorEnvelope(body, headerRequestId) {
|
|
188
|
+
if (headerRequestId === void 0) {
|
|
189
|
+
throw commerceProtocolError("missing_request_id_header");
|
|
190
|
+
}
|
|
191
|
+
if (headerRequestId.length === 0) {
|
|
192
|
+
throw commerceProtocolError("empty_request_id_header");
|
|
193
|
+
}
|
|
120
194
|
if (!isPlainRecord(body)) {
|
|
121
195
|
throw commerceProtocolError("expected_object", headerRequestId);
|
|
122
196
|
}
|
|
@@ -126,7 +200,7 @@ function parseCommerceErrorEnvelope(body, headerRequestId) {
|
|
|
126
200
|
if (typeof body.error !== "string" || body.error.length === 0 || typeof body.reason !== "string" || body.reason.length === 0 || typeof body.requestId !== "string" || body.requestId.length === 0 || body.retryable !== void 0 && typeof body.retryable !== "boolean" || body.details !== void 0 && !isPlainRecord(body.details)) {
|
|
127
201
|
throw commerceProtocolError("invalid_field", headerRequestId);
|
|
128
202
|
}
|
|
129
|
-
if (headerRequestId && headerRequestId !== body.requestId) {
|
|
203
|
+
if (headerRequestId !== void 0 && headerRequestId !== body.requestId) {
|
|
130
204
|
throw commerceProtocolError("request_id_mismatch", headerRequestId);
|
|
131
205
|
}
|
|
132
206
|
return {
|
|
@@ -151,8 +225,16 @@ function enhanceCommerceError(error, body, headerRequestId) {
|
|
|
151
225
|
});
|
|
152
226
|
return error;
|
|
153
227
|
}
|
|
228
|
+
function enhanceNonCommerceError(error, reason) {
|
|
229
|
+
if (typeof reason === "string") Object.assign(error, { apiReason: reason });
|
|
230
|
+
return error;
|
|
231
|
+
}
|
|
232
|
+
function getSDKErrorReason(error) {
|
|
233
|
+
if (error.kind !== "commerce") return error.apiReason;
|
|
234
|
+
return error.reason === "unknown_commerce_error" ? error.rawReason : error.reason;
|
|
235
|
+
}
|
|
154
236
|
function isCommerceSDKError(error) {
|
|
155
|
-
if (!(error
|
|
237
|
+
if (!isSDKError(error) || error.kind !== "commerce") return false;
|
|
156
238
|
if (typeof error.requestId !== "string" || typeof error.retryable !== "boolean" || error.retryAfter !== void 0 && (!Number.isSafeInteger(error.retryAfter) || error.retryAfter < 0) || typeof error.reason !== "string") {
|
|
157
239
|
return false;
|
|
158
240
|
}
|
|
@@ -162,12 +244,14 @@ var NetworkError = class extends SDKError {
|
|
|
162
244
|
constructor(message, status, details, userMessage, suggestion) {
|
|
163
245
|
super("NETWORK_ERROR", message, status, details, userMessage, suggestion);
|
|
164
246
|
this.name = "NetworkError";
|
|
247
|
+
defineSDKErrorType(this, "NetworkError");
|
|
165
248
|
}
|
|
166
249
|
};
|
|
167
250
|
var ValidationError = class extends SDKError {
|
|
168
251
|
constructor(message, details, userMessage, suggestion, status = 400) {
|
|
169
252
|
super("VALIDATION_ERROR", message, status, details, userMessage, suggestion);
|
|
170
253
|
this.name = "ValidationError";
|
|
254
|
+
defineSDKErrorType(this, "ValidationError");
|
|
171
255
|
}
|
|
172
256
|
};
|
|
173
257
|
var ApiError = class extends SDKError {
|
|
@@ -182,24 +266,28 @@ var ApiError = class extends SDKError {
|
|
|
182
266
|
requestId
|
|
183
267
|
);
|
|
184
268
|
this.name = "ApiError";
|
|
269
|
+
defineSDKErrorType(this, "ApiError");
|
|
185
270
|
}
|
|
186
271
|
};
|
|
187
272
|
var ConfigError = class extends SDKError {
|
|
188
273
|
constructor(message, details, userMessage, suggestion) {
|
|
189
274
|
super("CONFIG_ERROR", message, void 0, details, userMessage, suggestion);
|
|
190
275
|
this.name = "ConfigError";
|
|
276
|
+
defineSDKErrorType(this, "ConfigError");
|
|
191
277
|
}
|
|
192
278
|
};
|
|
193
279
|
var TimeoutError = class extends SDKError {
|
|
194
280
|
constructor(message = "Request timed out.", details, userMessage, suggestion) {
|
|
195
281
|
super("TIMEOUT_ERROR", message, 408, details, userMessage, suggestion);
|
|
196
282
|
this.name = "TimeoutError";
|
|
283
|
+
defineSDKErrorType(this, "TimeoutError");
|
|
197
284
|
}
|
|
198
285
|
};
|
|
199
286
|
var GoneError = class extends SDKError {
|
|
200
287
|
constructor(message = "The requested resource is no longer available.", details, userMessage, suggestion) {
|
|
201
288
|
super("GONE_ERROR", message, 410, details, userMessage, suggestion);
|
|
202
289
|
this.name = "GoneError";
|
|
290
|
+
defineSDKErrorType(this, "GoneError");
|
|
203
291
|
}
|
|
204
292
|
};
|
|
205
293
|
var ServiceUnavailableError = class extends SDKError {
|
|
@@ -214,6 +302,7 @@ var ServiceUnavailableError = class extends SDKError {
|
|
|
214
302
|
);
|
|
215
303
|
this.name = "ServiceUnavailableError";
|
|
216
304
|
this.retryAfter = retryAfter;
|
|
305
|
+
defineSDKErrorType(this, "ServiceUnavailableError");
|
|
217
306
|
}
|
|
218
307
|
};
|
|
219
308
|
var UsageLimitError = class extends SDKError {
|
|
@@ -221,6 +310,7 @@ var UsageLimitError = class extends SDKError {
|
|
|
221
310
|
super("USAGE_LIMIT_ERROR", message, 429, details, userMessage, suggestion);
|
|
222
311
|
this.name = "UsageLimitError";
|
|
223
312
|
this.usage = usage;
|
|
313
|
+
defineSDKErrorType(this, "UsageLimitError");
|
|
224
314
|
}
|
|
225
315
|
toJSON() {
|
|
226
316
|
return {
|
|
@@ -241,6 +331,7 @@ var AuthError = class extends SDKError {
|
|
|
241
331
|
requestId
|
|
242
332
|
);
|
|
243
333
|
this.name = "AuthError";
|
|
334
|
+
defineSDKErrorType(this, "AuthError");
|
|
244
335
|
}
|
|
245
336
|
};
|
|
246
337
|
var PermissionError = class extends SDKError {
|
|
@@ -255,6 +346,7 @@ var PermissionError = class extends SDKError {
|
|
|
255
346
|
requestId
|
|
256
347
|
);
|
|
257
348
|
this.name = "PermissionError";
|
|
349
|
+
defineSDKErrorType(this, "PermissionError");
|
|
258
350
|
}
|
|
259
351
|
};
|
|
260
352
|
var NotFoundError = class extends SDKError {
|
|
@@ -269,12 +361,14 @@ var NotFoundError = class extends SDKError {
|
|
|
269
361
|
requestId
|
|
270
362
|
);
|
|
271
363
|
this.name = "NotFoundError";
|
|
364
|
+
defineSDKErrorType(this, "NotFoundError");
|
|
272
365
|
}
|
|
273
366
|
};
|
|
274
367
|
var ConflictError = class extends SDKError {
|
|
275
368
|
constructor(message, details, userMessage, suggestion, requestId) {
|
|
276
369
|
super("conflict", message, 409, details, userMessage, suggestion, requestId);
|
|
277
370
|
this.name = "ConflictError";
|
|
371
|
+
defineSDKErrorType(this, "ConflictError");
|
|
278
372
|
}
|
|
279
373
|
};
|
|
280
374
|
var RateLimitError = class extends SDKError {
|
|
@@ -290,8 +384,64 @@ var RateLimitError = class extends SDKError {
|
|
|
290
384
|
);
|
|
291
385
|
this.name = "RateLimitError";
|
|
292
386
|
this.retryAfter = retryAfter;
|
|
387
|
+
defineSDKErrorType(this, "RateLimitError");
|
|
293
388
|
}
|
|
294
389
|
};
|
|
390
|
+
function hasBrandedSDKErrorShape(error) {
|
|
391
|
+
if (error === null || typeof error !== "object") return false;
|
|
392
|
+
const candidate = error;
|
|
393
|
+
return candidate[SDK_ERROR_BRAND] === true && typeof candidate.name === "string" && typeof candidate.code === "string" && typeof candidate.message === "string" && (candidate.status === void 0 || typeof candidate.status === "number") && (candidate.userMessage === void 0 || typeof candidate.userMessage === "string") && (candidate.suggestion === void 0 || typeof candidate.suggestion === "string") && (candidate.requestId === void 0 || typeof candidate.requestId === "string") && (candidate.kind === void 0 || candidate.kind === "commerce") && (candidate.reason === void 0 || typeof candidate.reason === "string") && (candidate.rawReason === void 0 || typeof candidate.rawReason === "string") && (candidate.apiReason === void 0 || typeof candidate.apiReason === "string") && (candidate.retryable === void 0 || typeof candidate.retryable === "boolean") && (candidate.retryAfter === void 0 || typeof candidate.retryAfter === "number") && typeof candidate.getUserMessage === "function" && typeof candidate.toJSON === "function";
|
|
394
|
+
}
|
|
395
|
+
function hasSDKErrorType(error, type) {
|
|
396
|
+
return hasBrandedSDKErrorShape(error) && error[SDK_ERROR_TYPE_BRAND] === type;
|
|
397
|
+
}
|
|
398
|
+
function isSDKError(error) {
|
|
399
|
+
return error instanceof SDKError || hasBrandedSDKErrorShape(error);
|
|
400
|
+
}
|
|
401
|
+
function isNetworkError(error) {
|
|
402
|
+
return error instanceof NetworkError || hasSDKErrorType(error, "NetworkError");
|
|
403
|
+
}
|
|
404
|
+
function isValidationError(error) {
|
|
405
|
+
if (error instanceof ValidationError || hasSDKErrorType(error, "ValidationError")) {
|
|
406
|
+
return true;
|
|
407
|
+
}
|
|
408
|
+
if (error == null || typeof error !== "object") return false;
|
|
409
|
+
const candidate = error;
|
|
410
|
+
return candidate.name === "ValidationError" && candidate.code === "VALIDATION_ERROR" && typeof candidate.message === "string" && typeof candidate.getUserMessage === "function" && typeof candidate.toJSON === "function";
|
|
411
|
+
}
|
|
412
|
+
function isApiError(error) {
|
|
413
|
+
return error instanceof ApiError || hasSDKErrorType(error, "ApiError");
|
|
414
|
+
}
|
|
415
|
+
function isConfigError(error) {
|
|
416
|
+
return error instanceof ConfigError || hasSDKErrorType(error, "ConfigError");
|
|
417
|
+
}
|
|
418
|
+
function isTimeoutError(error) {
|
|
419
|
+
return error instanceof TimeoutError || hasSDKErrorType(error, "TimeoutError");
|
|
420
|
+
}
|
|
421
|
+
function isGoneError(error) {
|
|
422
|
+
return error instanceof GoneError || hasSDKErrorType(error, "GoneError");
|
|
423
|
+
}
|
|
424
|
+
function isServiceUnavailableError(error) {
|
|
425
|
+
return error instanceof ServiceUnavailableError || hasSDKErrorType(error, "ServiceUnavailableError");
|
|
426
|
+
}
|
|
427
|
+
function isUsageLimitError(error) {
|
|
428
|
+
return error instanceof UsageLimitError || hasSDKErrorType(error, "UsageLimitError");
|
|
429
|
+
}
|
|
430
|
+
function isAuthError(error) {
|
|
431
|
+
return error instanceof AuthError || hasSDKErrorType(error, "AuthError");
|
|
432
|
+
}
|
|
433
|
+
function isPermissionError(error) {
|
|
434
|
+
return error instanceof PermissionError || hasSDKErrorType(error, "PermissionError");
|
|
435
|
+
}
|
|
436
|
+
function isNotFoundError(error) {
|
|
437
|
+
return error instanceof NotFoundError || hasSDKErrorType(error, "NotFoundError");
|
|
438
|
+
}
|
|
439
|
+
function isConflictError(error) {
|
|
440
|
+
return error instanceof ConflictError || hasSDKErrorType(error, "ConflictError");
|
|
441
|
+
}
|
|
442
|
+
function isRateLimitError(error) {
|
|
443
|
+
return error instanceof RateLimitError || hasSDKErrorType(error, "RateLimitError");
|
|
444
|
+
}
|
|
295
445
|
var createNetworkError = (message, status, details, userMessage, suggestion) => new NetworkError(message, status, details, userMessage, suggestion);
|
|
296
446
|
var createValidationError = (message, details, userMessage, suggestion, status) => new ValidationError(message, details, userMessage, suggestion, status);
|
|
297
447
|
var createApiError = (message, status, details, userMessage, suggestion, requestId) => new ApiError(message, status, details, userMessage, suggestion, requestId);
|
|
@@ -501,7 +651,7 @@ function mapResponseToError(status, parsed, details, requestId, retryAfter, erro
|
|
|
501
651
|
if (retryAfter !== void 0) {
|
|
502
652
|
Object.assign(withRequestId, { retryAfter });
|
|
503
653
|
}
|
|
504
|
-
return errorFamily === "commerce" ? enhanceCommerceError(withRequestId, parsed.body, requestId) : withRequestId;
|
|
654
|
+
return errorFamily === "commerce" ? enhanceCommerceError(withRequestId, parsed.body, requestId) : enhanceNonCommerceError(withRequestId, parsed.reason);
|
|
505
655
|
};
|
|
506
656
|
if (status === 400 || status === 422) {
|
|
507
657
|
return finalize(
|
|
@@ -688,7 +838,7 @@ async function httpFetch(url, options) {
|
|
|
688
838
|
),
|
|
689
839
|
requestId
|
|
690
840
|
);
|
|
691
|
-
throw errorFamily === "commerce" ? enhanceCommerceError(usageError, parsed.body, requestId) : usageError;
|
|
841
|
+
throw errorFamily === "commerce" ? enhanceCommerceError(usageError, parsed.body, requestId) : enhanceNonCommerceError(usageError, parsed.reason);
|
|
692
842
|
}
|
|
693
843
|
if (response.status === 401 && onUnauthorized && customerToken && !hasRetried401 && (commerceEnvelope?.reason ?? parsed.reason) === "token_expired") {
|
|
694
844
|
hasRetried401 = true;
|
|
@@ -1103,7 +1253,10 @@ async function parseApiResponse(response, endpoint2, options = {}) {
|
|
|
1103
1253
|
return parsed;
|
|
1104
1254
|
}
|
|
1105
1255
|
const data = parsed;
|
|
1106
|
-
|
|
1256
|
+
const hasCommerceEnvelopeSignal = options.errorFamily === "commerce" && ["error", "reason", "requestId", "retryable", "details"].some(
|
|
1257
|
+
(key) => Object.prototype.hasOwnProperty.call(data, key)
|
|
1258
|
+
);
|
|
1259
|
+
if (data.error || hasCommerceEnvelopeSignal) {
|
|
1107
1260
|
const errorMessage = typeof data.error === "string" ? data.error : "Unknown API error";
|
|
1108
1261
|
const reason = typeof data.reason === "string" ? data.reason : void 0;
|
|
1109
1262
|
const requestId = response.headers.get("x-request-id") ?? void 0;
|
|
@@ -1132,19 +1285,21 @@ async function parseApiResponse(response, endpoint2, options = {}) {
|
|
|
1132
1285
|
}
|
|
1133
1286
|
const withRequestId = attachRequestId(error, requestId);
|
|
1134
1287
|
if (retryAfter !== void 0) Object.assign(withRequestId, { retryAfter });
|
|
1135
|
-
throw options.errorFamily === "commerce" ? enhanceCommerceError(withRequestId, data, requestId) : withRequestId;
|
|
1288
|
+
throw options.errorFamily === "commerce" ? enhanceCommerceError(withRequestId, data, requestId) : enhanceNonCommerceError(withRequestId, reason);
|
|
1136
1289
|
}
|
|
1137
1290
|
return data;
|
|
1138
1291
|
}
|
|
1139
1292
|
|
|
1140
1293
|
// ../../internal/http-contracts/src/index.ts
|
|
1141
1294
|
var operationBrand = /* @__PURE__ */ Symbol("sdk-http-operation");
|
|
1142
|
-
var operation = (collection, method, path) => Object.freeze({
|
|
1295
|
+
var operation = (collection, method, path, errorFamily) => Object.freeze({
|
|
1143
1296
|
[operationBrand]: true,
|
|
1144
1297
|
collection,
|
|
1145
1298
|
method,
|
|
1146
|
-
path
|
|
1299
|
+
path,
|
|
1300
|
+
...errorFamily && { errorFamily }
|
|
1147
1301
|
});
|
|
1302
|
+
var strictCommerceOperation = (collection, method, path) => operation(collection, method, path, "commerce");
|
|
1148
1303
|
var COMMERCE_ENDPOINT_OPERATIONS = {
|
|
1149
1304
|
products: {
|
|
1150
1305
|
detail: operation("products", "get", "/detail"),
|
|
@@ -1177,13 +1332,13 @@ var COMMERCE_ENDPOINT_OPERATIONS = {
|
|
|
1177
1332
|
byPayment: operation("orders", "get", "/by-payment"),
|
|
1178
1333
|
cancel: operation("orders", "post", "/cancel"),
|
|
1179
1334
|
resolveCancelRefund: operation("orders", "post", "/resolve-cancel-refund"),
|
|
1180
|
-
checkout:
|
|
1335
|
+
checkout: strictCommerceOperation("orders", "post", "/checkout"),
|
|
1181
1336
|
createFulfillment: operation("orders", "post", "/create-fulfillment"),
|
|
1182
1337
|
updateFulfillment: operation("orders", "post", "/update-fulfillment")
|
|
1183
1338
|
},
|
|
1184
1339
|
checkouts: {
|
|
1185
|
-
detail:
|
|
1186
|
-
query:
|
|
1340
|
+
detail: strictCommerceOperation("checkouts", "post", "/detail"),
|
|
1341
|
+
query: strictCommerceOperation("checkouts", "post", "/query")
|
|
1187
1342
|
},
|
|
1188
1343
|
transactions: {
|
|
1189
1344
|
update: operation("transactions", "post", "/update")
|
|
@@ -1204,29 +1359,58 @@ var COMMERCE_ENDPOINT_OPERATIONS = {
|
|
|
1204
1359
|
bulkImport: operation("fulfillments", "post", "/bulk-import")
|
|
1205
1360
|
},
|
|
1206
1361
|
carts: {
|
|
1207
|
-
create:
|
|
1208
|
-
retrieve:
|
|
1209
|
-
mine:
|
|
1210
|
-
merge:
|
|
1211
|
-
addItem:
|
|
1212
|
-
updateItem:
|
|
1213
|
-
removeItem:
|
|
1214
|
-
updateDiscountCodes:
|
|
1215
|
-
|
|
1216
|
-
|
|
1362
|
+
create: strictCommerceOperation("carts", "post", "/create"),
|
|
1363
|
+
retrieve: strictCommerceOperation("carts", "post", "/retrieve"),
|
|
1364
|
+
mine: strictCommerceOperation("carts", "post", "/mine"),
|
|
1365
|
+
merge: strictCommerceOperation("carts", "post", "/merge"),
|
|
1366
|
+
addItem: strictCommerceOperation("carts", "post", "/add-item"),
|
|
1367
|
+
updateItem: strictCommerceOperation("carts", "post", "/update-item"),
|
|
1368
|
+
removeItem: strictCommerceOperation("carts", "post", "/remove-item"),
|
|
1369
|
+
updateDiscountCodes: strictCommerceOperation(
|
|
1370
|
+
"carts",
|
|
1371
|
+
"post",
|
|
1372
|
+
"/update-discount-codes"
|
|
1373
|
+
),
|
|
1374
|
+
updateAttributes: strictCommerceOperation(
|
|
1375
|
+
"carts",
|
|
1376
|
+
"post",
|
|
1377
|
+
"/update-attributes"
|
|
1378
|
+
),
|
|
1379
|
+
clear: strictCommerceOperation("carts", "post", "/clear")
|
|
1217
1380
|
},
|
|
1218
1381
|
paymentSessions: {
|
|
1219
|
-
create:
|
|
1220
|
-
retrieve:
|
|
1221
|
-
cancel:
|
|
1382
|
+
create: strictCommerceOperation("payment-sessions", "post", "/create"),
|
|
1383
|
+
retrieve: strictCommerceOperation("payment-sessions", "post", "/retrieve"),
|
|
1384
|
+
cancel: strictCommerceOperation("payment-sessions", "post", "/cancel"),
|
|
1222
1385
|
server: {
|
|
1223
|
-
create:
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1386
|
+
create: strictCommerceOperation(
|
|
1387
|
+
"payment-sessions",
|
|
1388
|
+
"post",
|
|
1389
|
+
"/server/create"
|
|
1390
|
+
),
|
|
1391
|
+
retrieve: strictCommerceOperation(
|
|
1392
|
+
"payment-sessions",
|
|
1393
|
+
"post",
|
|
1394
|
+
"/server/retrieve"
|
|
1395
|
+
),
|
|
1396
|
+
cancel: strictCommerceOperation(
|
|
1397
|
+
"payment-sessions",
|
|
1398
|
+
"post",
|
|
1399
|
+
"/server/cancel"
|
|
1400
|
+
),
|
|
1401
|
+
confirm: strictCommerceOperation(
|
|
1402
|
+
"payment-sessions",
|
|
1403
|
+
"post",
|
|
1404
|
+
"/server/confirm"
|
|
1405
|
+
)
|
|
1227
1406
|
},
|
|
1228
1407
|
custom: {
|
|
1229
1408
|
create: operation("orders", "post", "/custom-payment-sessions"),
|
|
1409
|
+
retrieve: operation(
|
|
1410
|
+
"orders",
|
|
1411
|
+
"post",
|
|
1412
|
+
"/custom-payment-sessions/retrieve"
|
|
1413
|
+
),
|
|
1230
1414
|
confirm: operation("orders", "post", "/custom-payment-sessions/confirm")
|
|
1231
1415
|
}
|
|
1232
1416
|
},
|
|
@@ -1252,6 +1436,11 @@ var EVENTS_ENDPOINT_OPERATIONS = {
|
|
|
1252
1436
|
)
|
|
1253
1437
|
}
|
|
1254
1438
|
};
|
|
1439
|
+
var COMMUNITY_ENDPOINT_OPERATIONS = {
|
|
1440
|
+
posts: {
|
|
1441
|
+
detail: operation("posts", "get", "/detail")
|
|
1442
|
+
}
|
|
1443
|
+
};
|
|
1255
1444
|
function resolveOperationTemplate(descriptor) {
|
|
1256
1445
|
return descriptor.collection ? `/api/${descriptor.collection}${descriptor.path}` : `/api${descriptor.path}`;
|
|
1257
1446
|
}
|
|
@@ -1283,6 +1472,9 @@ var sharedEndpoint = (descriptor) => descriptor;
|
|
|
1283
1472
|
function resolveOperationMethod2(descriptor) {
|
|
1284
1473
|
return "collection" in descriptor ? resolveOperationMethod(descriptor) : descriptor.method;
|
|
1285
1474
|
}
|
|
1475
|
+
function resolveOperationErrorFamily(descriptor) {
|
|
1476
|
+
return "collection" in descriptor ? descriptor.errorFamily : void 0;
|
|
1477
|
+
}
|
|
1286
1478
|
function resolveOperationPath2(descriptor, options) {
|
|
1287
1479
|
if ("collection" in descriptor) {
|
|
1288
1480
|
return resolveOperationPath(descriptor, options);
|
|
@@ -1317,12 +1509,12 @@ var COMMERCE_ENDPOINTS = {
|
|
|
1317
1509
|
updateFulfillment: endpoint("POST", "/api/orders/update-fulfillment")
|
|
1318
1510
|
},
|
|
1319
1511
|
checkouts: {
|
|
1320
|
-
create:
|
|
1321
|
-
retrieve:
|
|
1512
|
+
create: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.orders.checkout),
|
|
1513
|
+
retrieve: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.checkouts.detail),
|
|
1322
1514
|
server: {
|
|
1323
|
-
create:
|
|
1324
|
-
retrieve:
|
|
1325
|
-
query:
|
|
1515
|
+
create: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.orders.checkout),
|
|
1516
|
+
retrieve: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.checkouts.detail),
|
|
1517
|
+
query: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.checkouts.query)
|
|
1326
1518
|
}
|
|
1327
1519
|
},
|
|
1328
1520
|
returns: {
|
|
@@ -1340,10 +1532,10 @@ var COMMERCE_ENDPOINTS = {
|
|
|
1340
1532
|
bulkImport: endpoint("POST", "/api/fulfillments/bulk-import")
|
|
1341
1533
|
},
|
|
1342
1534
|
carts: {
|
|
1343
|
-
create:
|
|
1535
|
+
create: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.carts.create),
|
|
1344
1536
|
retrieve: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.carts.retrieve),
|
|
1345
|
-
mine:
|
|
1346
|
-
merge:
|
|
1537
|
+
mine: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.carts.mine),
|
|
1538
|
+
merge: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.carts.merge),
|
|
1347
1539
|
server: {
|
|
1348
1540
|
// Server credentials are an authorization lane, not a second Cart
|
|
1349
1541
|
// transport. These must stay bound to the registered shared operations.
|
|
@@ -1363,29 +1555,46 @@ var COMMERCE_ENDPOINTS = {
|
|
|
1363
1555
|
clear: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.carts.clear)
|
|
1364
1556
|
},
|
|
1365
1557
|
addItem: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.carts.addItem),
|
|
1366
|
-
updateItem:
|
|
1367
|
-
removeItem:
|
|
1368
|
-
updateDiscountCodes:
|
|
1369
|
-
|
|
1370
|
-
|
|
1558
|
+
updateItem: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.carts.updateItem),
|
|
1559
|
+
removeItem: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.carts.removeItem),
|
|
1560
|
+
updateDiscountCodes: sharedEndpoint(
|
|
1561
|
+
COMMERCE_ENDPOINT_OPERATIONS.carts.updateDiscountCodes
|
|
1562
|
+
),
|
|
1563
|
+
updateAttributes: sharedEndpoint(
|
|
1564
|
+
COMMERCE_ENDPOINT_OPERATIONS.carts.updateAttributes
|
|
1565
|
+
),
|
|
1566
|
+
clear: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.carts.clear)
|
|
1371
1567
|
},
|
|
1372
1568
|
paymentSessions: {
|
|
1373
|
-
create:
|
|
1374
|
-
retrieve:
|
|
1375
|
-
|
|
1569
|
+
create: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.paymentSessions.create),
|
|
1570
|
+
retrieve: sharedEndpoint(
|
|
1571
|
+
COMMERCE_ENDPOINT_OPERATIONS.paymentSessions.retrieve
|
|
1572
|
+
),
|
|
1573
|
+
cancel: sharedEndpoint(COMMERCE_ENDPOINT_OPERATIONS.paymentSessions.cancel),
|
|
1376
1574
|
custom: {
|
|
1377
1575
|
create: sharedEndpoint(
|
|
1378
1576
|
COMMERCE_ENDPOINT_OPERATIONS.paymentSessions.custom.create
|
|
1379
1577
|
),
|
|
1578
|
+
retrieve: sharedEndpoint(
|
|
1579
|
+
COMMERCE_ENDPOINT_OPERATIONS.paymentSessions.custom.retrieve
|
|
1580
|
+
),
|
|
1380
1581
|
confirm: sharedEndpoint(
|
|
1381
1582
|
COMMERCE_ENDPOINT_OPERATIONS.paymentSessions.custom.confirm
|
|
1382
1583
|
)
|
|
1383
1584
|
},
|
|
1384
1585
|
server: {
|
|
1385
|
-
create:
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1586
|
+
create: sharedEndpoint(
|
|
1587
|
+
COMMERCE_ENDPOINT_OPERATIONS.paymentSessions.server.create
|
|
1588
|
+
),
|
|
1589
|
+
retrieve: sharedEndpoint(
|
|
1590
|
+
COMMERCE_ENDPOINT_OPERATIONS.paymentSessions.server.retrieve
|
|
1591
|
+
),
|
|
1592
|
+
cancel: sharedEndpoint(
|
|
1593
|
+
COMMERCE_ENDPOINT_OPERATIONS.paymentSessions.server.cancel
|
|
1594
|
+
),
|
|
1595
|
+
confirm: sharedEndpoint(
|
|
1596
|
+
COMMERCE_ENDPOINT_OPERATIONS.paymentSessions.server.confirm
|
|
1597
|
+
)
|
|
1389
1598
|
}
|
|
1390
1599
|
},
|
|
1391
1600
|
shippingPolicies: {
|
|
@@ -1476,7 +1685,8 @@ var CustomerScopedApi = class {
|
|
|
1476
1685
|
return this.transport.request(resolveOperationPath2(endpoint2, options), {
|
|
1477
1686
|
method: resolveOperationMethod2(endpoint2),
|
|
1478
1687
|
body,
|
|
1479
|
-
headers: options?.headers
|
|
1688
|
+
headers: options?.headers,
|
|
1689
|
+
errorFamily: resolveOperationErrorFamily(endpoint2)
|
|
1480
1690
|
});
|
|
1481
1691
|
}
|
|
1482
1692
|
};
|
|
@@ -1498,15 +1708,33 @@ function unwrapPayloadDoc(value) {
|
|
|
1498
1708
|
}
|
|
1499
1709
|
return value;
|
|
1500
1710
|
}
|
|
1711
|
+
function hasCanonicalNotFoundReason(error) {
|
|
1712
|
+
return getSDKErrorReason(error) === "not_found";
|
|
1713
|
+
}
|
|
1501
1714
|
var CommunityClient = class extends RawCustomerScopedApi {
|
|
1502
1715
|
constructor(options) {
|
|
1503
1716
|
super("CommunityClient", { ...options, requiresCredential: false });
|
|
1717
|
+
this.requiresSafePublicRawReads = !options.secretKey;
|
|
1504
1718
|
}
|
|
1505
1719
|
buildQuery(params) {
|
|
1506
1720
|
if (!params) return "";
|
|
1507
1721
|
const entries = Object.entries(params).filter((e) => e[1] !== void 0).map(([k, v]) => [k, String(v)]);
|
|
1508
1722
|
return entries.length ? `?${new URLSearchParams(entries).toString()}` : "";
|
|
1509
1723
|
}
|
|
1724
|
+
withSafePublicRawReadQuery(query) {
|
|
1725
|
+
if (!this.requiresSafePublicRawReads) return query;
|
|
1726
|
+
if (!query) return "?depth=0&joins=false";
|
|
1727
|
+
return `?depth=0&joins=false&${query.slice(1)}`;
|
|
1728
|
+
}
|
|
1729
|
+
buildSafePublicRawListQuery(params) {
|
|
1730
|
+
if (!this.requiresSafePublicRawReads) {
|
|
1731
|
+
return this.buildQuery(params);
|
|
1732
|
+
}
|
|
1733
|
+
const queryParams = {};
|
|
1734
|
+
if (params?.page !== void 0) queryParams.page = params.page;
|
|
1735
|
+
if (params?.limit !== void 0) queryParams.limit = params.limit;
|
|
1736
|
+
return this.withSafePublicRawReadQuery(this.buildQuery(queryParams));
|
|
1737
|
+
}
|
|
1510
1738
|
buildPostsListQuery(params) {
|
|
1511
1739
|
const urlParams = new URLSearchParams();
|
|
1512
1740
|
const sort = params?.sort ?? DEFAULT_POST_LIST_SORT;
|
|
@@ -1566,15 +1794,35 @@ var CommunityClient = class extends RawCustomerScopedApi {
|
|
|
1566
1794
|
"GET"
|
|
1567
1795
|
);
|
|
1568
1796
|
}
|
|
1797
|
+
/**
|
|
1798
|
+
* Public post detail projected by the same allowlist as the public feed.
|
|
1799
|
+
* Missing, hidden, and cross-tenant posts all resolve to `null`.
|
|
1800
|
+
*/
|
|
1801
|
+
async getPost(params) {
|
|
1802
|
+
const query = new URLSearchParams({ postId: params.postId });
|
|
1803
|
+
try {
|
|
1804
|
+
return await this.execute(
|
|
1805
|
+
resolveOperationPath(COMMUNITY_ENDPOINT_OPERATIONS.posts.detail, {
|
|
1806
|
+
query
|
|
1807
|
+
}),
|
|
1808
|
+
resolveOperationMethod(COMMUNITY_ENDPOINT_OPERATIONS.posts.detail)
|
|
1809
|
+
);
|
|
1810
|
+
} catch (error) {
|
|
1811
|
+
if (error instanceof NotFoundError && hasCanonicalNotFoundReason(error)) {
|
|
1812
|
+
return null;
|
|
1813
|
+
}
|
|
1814
|
+
throw error;
|
|
1815
|
+
}
|
|
1816
|
+
}
|
|
1569
1817
|
listPostCategories(params) {
|
|
1570
1818
|
return this.execute(
|
|
1571
|
-
`/api/post-categories${this.
|
|
1819
|
+
`/api/post-categories${this.buildSafePublicRawListQuery(params)}`,
|
|
1572
1820
|
"GET"
|
|
1573
1821
|
);
|
|
1574
1822
|
}
|
|
1575
1823
|
listPostTags(params) {
|
|
1576
1824
|
return this.execute(
|
|
1577
|
-
`/api/post-tags${this.
|
|
1825
|
+
`/api/post-tags${this.buildSafePublicRawListQuery(params)}`,
|
|
1578
1826
|
"GET"
|
|
1579
1827
|
);
|
|
1580
1828
|
}
|
|
@@ -1740,7 +1988,7 @@ var CommunityClient = class extends RawCustomerScopedApi {
|
|
|
1740
1988
|
}
|
|
1741
1989
|
getReactionTypes() {
|
|
1742
1990
|
return this.execute(
|
|
1743
|
-
|
|
1991
|
+
`/api/reaction-types${this.buildSafePublicRawListQuery({ limit: 100 })}`,
|
|
1744
1992
|
"GET"
|
|
1745
1993
|
);
|
|
1746
1994
|
}
|
|
@@ -1768,11 +2016,17 @@ var CommunityClient = class extends RawCustomerScopedApi {
|
|
|
1768
2016
|
}
|
|
1769
2017
|
// Profiles
|
|
1770
2018
|
listProfileLists(params) {
|
|
1771
|
-
return this.execute(
|
|
2019
|
+
return this.execute(
|
|
2020
|
+
`/api/customer-profile-lists${this.buildSafePublicRawListQuery(params)}`,
|
|
2021
|
+
"GET"
|
|
2022
|
+
);
|
|
1772
2023
|
}
|
|
1773
2024
|
async getProfileList(params) {
|
|
1774
2025
|
const query = "slug" in params ? `?where[slug][equals]=${encodeURIComponent(params.slug)}&limit=1` : `?where[id][equals]=${encodeURIComponent(params.id)}&limit=1`;
|
|
1775
|
-
const res = await this.execute(
|
|
2026
|
+
const res = await this.execute(
|
|
2027
|
+
`/api/customer-profile-lists${this.withSafePublicRawReadQuery(query)}`,
|
|
2028
|
+
"GET"
|
|
2029
|
+
);
|
|
1776
2030
|
return res.docs[0] ?? null;
|
|
1777
2031
|
}
|
|
1778
2032
|
updatePublicProfile(body) {
|
|
@@ -1885,7 +2139,7 @@ var ORDER_PRIMARY_DISPLAY_STATUSES = [
|
|
|
1885
2139
|
];
|
|
1886
2140
|
var CHECKOUT_STATUSES = ["open", "placed", "abandoned"];
|
|
1887
2141
|
var ABANDONED_REASONS = ["expired", "customer", "operator"];
|
|
1888
|
-
var PAYMENT_PROVIDERS = ["toss"];
|
|
2142
|
+
var PAYMENT_PROVIDERS = ["toss", "portone"];
|
|
1889
2143
|
var PAYMENT_PROVIDER_STATUSES = [
|
|
1890
2144
|
"requires_payment_method",
|
|
1891
2145
|
"requires_action",
|
|
@@ -3058,8 +3312,101 @@ function validateRequiredReconciliation(value, allowed, resource, path) {
|
|
|
3058
3312
|
previous = current;
|
|
3059
3313
|
});
|
|
3060
3314
|
}
|
|
3061
|
-
function validateNextAction(value, resource, path) {
|
|
3315
|
+
function validateNextAction(value, provider, resource, path) {
|
|
3062
3316
|
const action = record(value, resource, path);
|
|
3317
|
+
if (provider === "portone") {
|
|
3318
|
+
if (action.type === "portone_sdk") {
|
|
3319
|
+
exact(
|
|
3320
|
+
action,
|
|
3321
|
+
[
|
|
3322
|
+
"type",
|
|
3323
|
+
"version",
|
|
3324
|
+
"storeId",
|
|
3325
|
+
"channelKey",
|
|
3326
|
+
"paymentId",
|
|
3327
|
+
"orderName",
|
|
3328
|
+
"totalAmount",
|
|
3329
|
+
"currency",
|
|
3330
|
+
"payMethod",
|
|
3331
|
+
"redirectUrl"
|
|
3332
|
+
],
|
|
3333
|
+
[],
|
|
3334
|
+
resource,
|
|
3335
|
+
path
|
|
3336
|
+
);
|
|
3337
|
+
if (action.version !== "v2") fail(resource, `${path}.version`, "v2");
|
|
3338
|
+
for (const key of ["storeId", "channelKey"]) {
|
|
3339
|
+
boundedString(action[key], 255, resource, `${path}.${key}`);
|
|
3340
|
+
}
|
|
3341
|
+
const paymentId = boundedString(
|
|
3342
|
+
action.paymentId,
|
|
3343
|
+
40,
|
|
3344
|
+
resource,
|
|
3345
|
+
`${path}.paymentId`
|
|
3346
|
+
);
|
|
3347
|
+
if (!/^[A-Za-z0-9]{6,40}$/.test(paymentId)) {
|
|
3348
|
+
fail(
|
|
3349
|
+
resource,
|
|
3350
|
+
`${path}.paymentId`,
|
|
3351
|
+
"6-40 ASCII alphanumeric characters"
|
|
3352
|
+
);
|
|
3353
|
+
}
|
|
3354
|
+
boundedString(
|
|
3355
|
+
action.orderName,
|
|
3356
|
+
MAX_COMMERCE_SHORT_TEXT_LENGTH,
|
|
3357
|
+
resource,
|
|
3358
|
+
`${path}.orderName`
|
|
3359
|
+
);
|
|
3360
|
+
positiveInteger(action.totalAmount, resource, `${path}.totalAmount`);
|
|
3361
|
+
if (action.currency !== "CURRENCY_KRW") {
|
|
3362
|
+
fail(resource, `${path}.currency`, "CURRENCY_KRW");
|
|
3363
|
+
}
|
|
3364
|
+
if (action.payMethod !== "CARD")
|
|
3365
|
+
fail(resource, `${path}.payMethod`, "CARD");
|
|
3366
|
+
const redirectUrl = boundedString(
|
|
3367
|
+
action.redirectUrl,
|
|
3368
|
+
2048,
|
|
3369
|
+
resource,
|
|
3370
|
+
`${path}.redirectUrl`
|
|
3371
|
+
);
|
|
3372
|
+
try {
|
|
3373
|
+
const parsed = new URL(redirectUrl);
|
|
3374
|
+
const loopback = parsed.protocol === "http:" && (parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1");
|
|
3375
|
+
if (!loopback && parsed.protocol !== "https:" || parsed.username || parsed.password)
|
|
3376
|
+
throw new Error("unsafe redirect URL");
|
|
3377
|
+
} catch {
|
|
3378
|
+
fail(
|
|
3379
|
+
resource,
|
|
3380
|
+
`${path}.redirectUrl`,
|
|
3381
|
+
"HTTPS or loopback URL without embedded credentials"
|
|
3382
|
+
);
|
|
3383
|
+
}
|
|
3384
|
+
return;
|
|
3385
|
+
}
|
|
3386
|
+
exact(action, ["type", "checkoutUrl"], [], resource, path);
|
|
3387
|
+
if (action.type !== "portone_checkout") {
|
|
3388
|
+
fail(resource, `${path}.type`, "portone_checkout | portone_sdk");
|
|
3389
|
+
}
|
|
3390
|
+
const checkoutUrl = boundedString(
|
|
3391
|
+
action.checkoutUrl,
|
|
3392
|
+
2048,
|
|
3393
|
+
resource,
|
|
3394
|
+
`${path}.checkoutUrl`
|
|
3395
|
+
);
|
|
3396
|
+
try {
|
|
3397
|
+
const parsed = new URL(checkoutUrl);
|
|
3398
|
+
if (parsed.protocol !== "https:" || parsed.username !== "" || parsed.password !== "") {
|
|
3399
|
+
throw new Error("unsafe checkout URL");
|
|
3400
|
+
}
|
|
3401
|
+
} catch {
|
|
3402
|
+
fail(
|
|
3403
|
+
resource,
|
|
3404
|
+
`${path}.checkoutUrl`,
|
|
3405
|
+
"absolute HTTPS URL without embedded credentials"
|
|
3406
|
+
);
|
|
3407
|
+
}
|
|
3408
|
+
return;
|
|
3409
|
+
}
|
|
3063
3410
|
exact(
|
|
3064
3411
|
action,
|
|
3065
3412
|
[
|
|
@@ -3110,10 +3457,18 @@ function validateNextAction(value, resource, path) {
|
|
|
3110
3457
|
if (action.customerEmail !== void 0)
|
|
3111
3458
|
validateCustomer({ email: action.customerEmail }, resource, path);
|
|
3112
3459
|
}
|
|
3113
|
-
function validatePublicPaymentSession(value) {
|
|
3460
|
+
function validatePublicPaymentSession(value, expectedProvider) {
|
|
3114
3461
|
const resource = "PaymentSession";
|
|
3115
3462
|
const session = record(value, resource, "$");
|
|
3116
|
-
|
|
3463
|
+
const provider = enumValue(
|
|
3464
|
+
session.provider,
|
|
3465
|
+
PAYMENT_PROVIDERS,
|
|
3466
|
+
resource,
|
|
3467
|
+
"$.provider"
|
|
3468
|
+
);
|
|
3469
|
+
if (expectedProvider !== void 0 && provider !== expectedProvider) {
|
|
3470
|
+
fail(resource, "$.provider", expectedProvider);
|
|
3471
|
+
}
|
|
3117
3472
|
const status = enumValue(
|
|
3118
3473
|
session.providerStatus,
|
|
3119
3474
|
PAYMENT_PROVIDER_STATUSES,
|
|
@@ -3150,7 +3505,12 @@ function validatePublicPaymentSession(value) {
|
|
|
3150
3505
|
}
|
|
3151
3506
|
if (!("nextAction" in session))
|
|
3152
3507
|
fail(resource, "$.nextAction", "required field");
|
|
3153
|
-
validateNextAction(
|
|
3508
|
+
validateNextAction(
|
|
3509
|
+
session.nextAction,
|
|
3510
|
+
provider,
|
|
3511
|
+
resource,
|
|
3512
|
+
"$.nextAction"
|
|
3513
|
+
);
|
|
3154
3514
|
} else if (session.sessionRole === "residual") {
|
|
3155
3515
|
if (session.presentationStatus !== "suppressed" || session.finalizationStatus !== "not_ready") {
|
|
3156
3516
|
fail(resource, "$", "suppressed residual not-ready state");
|
|
@@ -3889,8 +4249,8 @@ var PaymentSessionApi = class extends CustomerScopedApi {
|
|
|
3889
4249
|
}
|
|
3890
4250
|
});
|
|
3891
4251
|
}
|
|
3892
|
-
async paymentSession(result) {
|
|
3893
|
-
return validatePublicPaymentSession(await result);
|
|
4252
|
+
async paymentSession(result, expectedProvider) {
|
|
4253
|
+
return validatePublicPaymentSession(await result, expectedProvider);
|
|
3894
4254
|
}
|
|
3895
4255
|
create(params) {
|
|
3896
4256
|
const { idempotencyKey, ...body } = params;
|
|
@@ -3900,18 +4260,53 @@ var PaymentSessionApi = class extends CustomerScopedApi {
|
|
|
3900
4260
|
this.serverTransport ? COMMERCE_ENDPOINTS.paymentSessions.server.create : COMMERCE_ENDPOINTS.paymentSessions.create,
|
|
3901
4261
|
body,
|
|
3902
4262
|
idempotencyKey
|
|
3903
|
-
)
|
|
4263
|
+
),
|
|
4264
|
+
"toss"
|
|
4265
|
+
);
|
|
4266
|
+
}
|
|
4267
|
+
createPortOne(params) {
|
|
4268
|
+
const { idempotencyKey, ...body } = params;
|
|
4269
|
+
assertCommerceIdempotencyKey(idempotencyKey);
|
|
4270
|
+
return this.paymentSession(
|
|
4271
|
+
this.post(
|
|
4272
|
+
this.serverTransport ? COMMERCE_ENDPOINTS.paymentSessions.server.create : COMMERCE_ENDPOINTS.paymentSessions.create,
|
|
4273
|
+
body,
|
|
4274
|
+
idempotencyKey
|
|
4275
|
+
),
|
|
4276
|
+
"portone"
|
|
3904
4277
|
);
|
|
3905
4278
|
}
|
|
3906
4279
|
retrieve(params) {
|
|
3907
4280
|
const endpoint2 = this.serverTransport ? COMMERCE_ENDPOINTS.paymentSessions.server.retrieve : COMMERCE_ENDPOINTS.paymentSessions.retrieve;
|
|
3908
|
-
return this.paymentSession(
|
|
4281
|
+
return this.paymentSession(
|
|
4282
|
+
this.post(endpoint2, params),
|
|
4283
|
+
"toss"
|
|
4284
|
+
);
|
|
4285
|
+
}
|
|
4286
|
+
retrievePortOne(params) {
|
|
4287
|
+
const endpoint2 = this.serverTransport ? COMMERCE_ENDPOINTS.paymentSessions.server.retrieve : COMMERCE_ENDPOINTS.paymentSessions.retrieve;
|
|
4288
|
+
return this.paymentSession(
|
|
4289
|
+
this.post(endpoint2, params),
|
|
4290
|
+
"portone"
|
|
4291
|
+
);
|
|
3909
4292
|
}
|
|
3910
4293
|
cancel(params) {
|
|
3911
4294
|
const { idempotencyKey, ...body } = params;
|
|
3912
4295
|
assertCommerceIdempotencyKey(idempotencyKey);
|
|
3913
4296
|
const endpoint2 = this.serverTransport ? COMMERCE_ENDPOINTS.paymentSessions.server.cancel : COMMERCE_ENDPOINTS.paymentSessions.cancel;
|
|
3914
|
-
return this.paymentSession(
|
|
4297
|
+
return this.paymentSession(
|
|
4298
|
+
this.post(endpoint2, body, idempotencyKey),
|
|
4299
|
+
"toss"
|
|
4300
|
+
);
|
|
4301
|
+
}
|
|
4302
|
+
cancelPortOne(params) {
|
|
4303
|
+
const { idempotencyKey, ...body } = params;
|
|
4304
|
+
assertCommerceIdempotencyKey(idempotencyKey);
|
|
4305
|
+
const endpoint2 = this.serverTransport ? COMMERCE_ENDPOINTS.paymentSessions.server.cancel : COMMERCE_ENDPOINTS.paymentSessions.cancel;
|
|
4306
|
+
return this.paymentSession(
|
|
4307
|
+
this.post(endpoint2, body, idempotencyKey),
|
|
4308
|
+
"portone"
|
|
4309
|
+
);
|
|
3915
4310
|
}
|
|
3916
4311
|
confirm(params) {
|
|
3917
4312
|
const { idempotencyKey, ...body } = params;
|
|
@@ -3921,7 +4316,8 @@ var PaymentSessionApi = class extends CustomerScopedApi {
|
|
|
3921
4316
|
COMMERCE_ENDPOINTS.paymentSessions.server.confirm,
|
|
3922
4317
|
body,
|
|
3923
4318
|
idempotencyKey
|
|
3924
|
-
)
|
|
4319
|
+
),
|
|
4320
|
+
"toss"
|
|
3925
4321
|
);
|
|
3926
4322
|
}
|
|
3927
4323
|
};
|
|
@@ -4952,21 +5348,11 @@ var PRODUCT_DETAIL_UNAVAILABLE_REASONS = /* @__PURE__ */ new Set([
|
|
|
4952
5348
|
"not_published",
|
|
4953
5349
|
"feature_disabled"
|
|
4954
5350
|
]);
|
|
4955
|
-
function isRecord(value) {
|
|
4956
|
-
return typeof value === "object" && value !== null;
|
|
4957
|
-
}
|
|
4958
|
-
function readProductDetailUnavailableReason(value) {
|
|
4959
|
-
if (!isRecord(value)) return void 0;
|
|
4960
|
-
const directReason = value.reason ?? value.code;
|
|
4961
|
-
if (typeof directReason === "string" && PRODUCT_DETAIL_UNAVAILABLE_REASONS.has(directReason)) {
|
|
4962
|
-
return directReason;
|
|
4963
|
-
}
|
|
4964
|
-
return readProductDetailUnavailableReason(value.body);
|
|
4965
|
-
}
|
|
4966
5351
|
function productDetailResultFromError(error) {
|
|
4967
5352
|
if (!(error instanceof SDKError) || error.status !== 404) return void 0;
|
|
4968
|
-
const reason =
|
|
4969
|
-
if (!reason
|
|
5353
|
+
const reason = getSDKErrorReason(error);
|
|
5354
|
+
if (!reason || !PRODUCT_DETAIL_UNAVAILABLE_REASONS.has(reason))
|
|
5355
|
+
return void 0;
|
|
4970
5356
|
return { found: false, reason };
|
|
4971
5357
|
}
|
|
4972
5358
|
var MARKET_PRICE_QUERY_UNSUPPORTED_MESSAGE = "Market listing pages do not support base price filters or price sorts.";
|
|
@@ -5175,8 +5561,11 @@ var CommerceClient = class {
|
|
|
5175
5561
|
};
|
|
5176
5562
|
this.paymentSessions = {
|
|
5177
5563
|
create: paymentSessionApi.create.bind(paymentSessionApi),
|
|
5564
|
+
createPortOne: paymentSessionApi.createPortOne.bind(paymentSessionApi),
|
|
5178
5565
|
retrieve: (params) => paymentSessionApi.retrieve(params),
|
|
5179
|
-
|
|
5566
|
+
retrievePortOne: (params) => paymentSessionApi.retrievePortOne(params),
|
|
5567
|
+
cancel: (params) => paymentSessionApi.cancel(params),
|
|
5568
|
+
cancelPortOne: (params) => paymentSessionApi.cancelPortOne(params)
|
|
5180
5569
|
};
|
|
5181
5570
|
this.discounts = {
|
|
5182
5571
|
validate: (params) => api.requestEndpoint(
|
|
@@ -5490,6 +5879,21 @@ function createClient(options) {
|
|
|
5490
5879
|
export {
|
|
5491
5880
|
Client,
|
|
5492
5881
|
ContentClient,
|
|
5493
|
-
createClient
|
|
5882
|
+
createClient,
|
|
5883
|
+
isApiError,
|
|
5884
|
+
isAuthError,
|
|
5885
|
+
isCommerceSDKError,
|
|
5886
|
+
isConfigError,
|
|
5887
|
+
isConflictError,
|
|
5888
|
+
isGoneError,
|
|
5889
|
+
isNetworkError,
|
|
5890
|
+
isNotFoundError,
|
|
5891
|
+
isPermissionError,
|
|
5892
|
+
isRateLimitError,
|
|
5893
|
+
isSDKError,
|
|
5894
|
+
isServiceUnavailableError,
|
|
5895
|
+
isTimeoutError,
|
|
5896
|
+
isUsageLimitError,
|
|
5897
|
+
isValidationError
|
|
5494
5898
|
};
|
|
5495
5899
|
//# sourceMappingURL=client.js.map
|