@waffo/pancake-ts 0.3.1 → 0.3.2
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 +6 -0
- package/README.md +66 -69
- package/dist/index.cjs +36 -64
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +36 -64
- package/dist/index.js.map +1 -1
- package/docs/api-reference.md +290 -289
- package/docs/graphql-guide.md +12 -12
- package/docs/webhook-guide.md +79 -82
- package/package.json +15 -2
package/dist/index.js
CHANGED
|
@@ -20,7 +20,7 @@ var BuyerHttpClient = class {
|
|
|
20
20
|
constructor(token, config) {
|
|
21
21
|
this.token = token;
|
|
22
22
|
this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
23
|
-
this._fetch = config.fetch ?? fetch;
|
|
23
|
+
this._fetch = config.fetch ?? globalThis.fetch.bind(globalThis);
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* Send a Bearer-authenticated POST request and return the parsed `data` field.
|
|
@@ -35,7 +35,7 @@ var BuyerHttpClient = class {
|
|
|
35
35
|
method: "POST",
|
|
36
36
|
headers: {
|
|
37
37
|
"Content-Type": "application/json",
|
|
38
|
-
|
|
38
|
+
Authorization: `Bearer ${this.token}`
|
|
39
39
|
},
|
|
40
40
|
body: JSON.stringify(body)
|
|
41
41
|
});
|
|
@@ -62,9 +62,7 @@ var PKCS1_PUB_HEADER = "-----BEGIN RSA PUBLIC KEY-----";
|
|
|
62
62
|
var PKCS1_PUB_FOOTER = "-----END RSA PUBLIC KEY-----";
|
|
63
63
|
function normalizePrivateKey(raw) {
|
|
64
64
|
if (!raw || !raw.trim()) {
|
|
65
|
-
throw new Error(
|
|
66
|
-
"Private key is empty. Provide an RSA private key in PEM format."
|
|
67
|
-
);
|
|
65
|
+
throw new Error("Private key is empty. Provide an RSA private key in PEM format.");
|
|
68
66
|
}
|
|
69
67
|
let pem = raw.replace(/\\n/g, "\n").replace(/\r\n/g, "\n");
|
|
70
68
|
pem = pem.trim();
|
|
@@ -74,9 +72,7 @@ function normalizePrivateKey(raw) {
|
|
|
74
72
|
if (hasHeader) {
|
|
75
73
|
const base64 = pem.replace(/-----BEGIN (?:RSA )?PRIVATE KEY-----/g, "").replace(/-----END (?:RSA )?PRIVATE KEY-----/g, "").replace(/\s+/g, "");
|
|
76
74
|
if (!base64) {
|
|
77
|
-
throw new Error(
|
|
78
|
-
"Private key contains PEM headers but no key data. Check the key content."
|
|
79
|
-
);
|
|
75
|
+
throw new Error("Private key contains PEM headers but no key data. Check the key content.");
|
|
80
76
|
}
|
|
81
77
|
const header = hasPkcs1Header ? PKCS1_HEADER : PKCS8_HEADER;
|
|
82
78
|
const footer = hasPkcs1Header ? PKCS1_FOOTER : PKCS8_FOOTER;
|
|
@@ -87,9 +83,7 @@ ${footer}`;
|
|
|
87
83
|
} else {
|
|
88
84
|
const base64 = pem.replace(/\s+/g, "");
|
|
89
85
|
if (!/^[A-Za-z0-9+/]+=*$/.test(base64)) {
|
|
90
|
-
throw new Error(
|
|
91
|
-
"Private key is not valid PEM or base64. Expected an RSA private key in PEM format or raw base64."
|
|
92
|
-
);
|
|
86
|
+
throw new Error("Private key is not valid PEM or base64. Expected an RSA private key in PEM format or raw base64.");
|
|
93
87
|
}
|
|
94
88
|
const wrapped = base64.match(/.{1,64}/g).join("\n");
|
|
95
89
|
pem = `${PKCS8_HEADER}
|
|
@@ -99,17 +93,13 @@ ${PKCS8_FOOTER}`;
|
|
|
99
93
|
try {
|
|
100
94
|
createPrivateKey(pem);
|
|
101
95
|
} catch {
|
|
102
|
-
throw new Error(
|
|
103
|
-
"Private key could not be parsed. Ensure it is a valid RSA private key in PKCS#8 or PKCS#1 (PEM) format."
|
|
104
|
-
);
|
|
96
|
+
throw new Error("Private key could not be parsed. Ensure it is a valid RSA private key in PKCS#8 or PKCS#1 (PEM) format.");
|
|
105
97
|
}
|
|
106
98
|
return pem;
|
|
107
99
|
}
|
|
108
100
|
function normalizePublicKey(raw) {
|
|
109
101
|
if (!raw || !raw.trim()) {
|
|
110
|
-
throw new Error(
|
|
111
|
-
"Public key is empty. Provide an RSA public key in PEM format."
|
|
112
|
-
);
|
|
102
|
+
throw new Error("Public key is empty. Provide an RSA public key in PEM format.");
|
|
113
103
|
}
|
|
114
104
|
let pem = raw.replace(/\\n/g, "\n").replace(/\r\n/g, "\n");
|
|
115
105
|
pem = pem.trim();
|
|
@@ -119,9 +109,7 @@ function normalizePublicKey(raw) {
|
|
|
119
109
|
if (hasHeader) {
|
|
120
110
|
const base64 = pem.replace(/-----BEGIN (?:RSA )?PUBLIC KEY-----/g, "").replace(/-----END (?:RSA )?PUBLIC KEY-----/g, "").replace(/\s+/g, "");
|
|
121
111
|
if (!base64) {
|
|
122
|
-
throw new Error(
|
|
123
|
-
"Public key contains PEM headers but no key data. Check the key content."
|
|
124
|
-
);
|
|
112
|
+
throw new Error("Public key contains PEM headers but no key data. Check the key content.");
|
|
125
113
|
}
|
|
126
114
|
const header = hasPkcs1PubHeader ? PKCS1_PUB_HEADER : SPKI_HEADER;
|
|
127
115
|
const footer = hasPkcs1PubHeader ? PKCS1_PUB_FOOTER : SPKI_FOOTER;
|
|
@@ -132,9 +120,7 @@ ${footer}`;
|
|
|
132
120
|
} else {
|
|
133
121
|
const base64 = pem.replace(/\s+/g, "");
|
|
134
122
|
if (!/^[A-Za-z0-9+/]+=*$/.test(base64)) {
|
|
135
|
-
throw new Error(
|
|
136
|
-
"Public key is not valid PEM or base64. Expected an RSA public key in PEM format or raw base64."
|
|
137
|
-
);
|
|
123
|
+
throw new Error("Public key is not valid PEM or base64. Expected an RSA public key in PEM format or raw base64.");
|
|
138
124
|
}
|
|
139
125
|
const wrapped = base64.match(/.{1,64}/g).join("\n");
|
|
140
126
|
pem = `${SPKI_HEADER}
|
|
@@ -144,9 +130,7 @@ ${SPKI_FOOTER}`;
|
|
|
144
130
|
try {
|
|
145
131
|
createPublicKey(pem);
|
|
146
132
|
} catch {
|
|
147
|
-
throw new Error(
|
|
148
|
-
"Public key could not be parsed. Ensure it is a valid RSA public key in SPKI or PKCS#1 (PEM) format."
|
|
149
|
-
);
|
|
133
|
+
throw new Error("Public key could not be parsed. Ensure it is a valid RSA public key in SPKI or PKCS#1 (PEM) format.");
|
|
150
134
|
}
|
|
151
135
|
return pem;
|
|
152
136
|
}
|
|
@@ -172,7 +156,7 @@ var HttpClient = class {
|
|
|
172
156
|
this.merchantId = config.merchantId;
|
|
173
157
|
this.privateKey = normalizePrivateKey(config.privateKey);
|
|
174
158
|
this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL2).replace(/\/+$/, "");
|
|
175
|
-
this._fetch = config.fetch ?? fetch;
|
|
159
|
+
this._fetch = config.fetch ?? globalThis.fetch.bind(globalThis);
|
|
176
160
|
}
|
|
177
161
|
/**
|
|
178
162
|
* Send a signed POST request and return the parsed `data` field.
|
|
@@ -342,9 +326,7 @@ var AuthResource = class {
|
|
|
342
326
|
*/
|
|
343
327
|
async issueSessionToken(params) {
|
|
344
328
|
if (!params.storeId && !params.productId) {
|
|
345
|
-
throw new WaffoPancakeError(400, [
|
|
346
|
-
{ message: "Missing required field: provide storeId or productId", layer: "sdk" }
|
|
347
|
-
]);
|
|
329
|
+
throw new WaffoPancakeError(400, [{ message: "Missing required field: provide storeId or productId", layer: "sdk" }]);
|
|
348
330
|
}
|
|
349
331
|
if (params.storeId) {
|
|
350
332
|
validateShortId("storeId", params.storeId, "STO");
|
|
@@ -377,10 +359,7 @@ var BuyerSession = class {
|
|
|
377
359
|
*/
|
|
378
360
|
async cancelSubscription(params) {
|
|
379
361
|
validateShortId("orderId", params.orderId, "ORD");
|
|
380
|
-
return this.http.post(
|
|
381
|
-
"/v1/actions/subscription-order/cancel-order",
|
|
382
|
-
params
|
|
383
|
-
);
|
|
362
|
+
return this.http.post("/v1/actions/subscription-order/cancel-order", params);
|
|
384
363
|
}
|
|
385
364
|
/**
|
|
386
365
|
* Cancel a one-time order (only while payment is still pending).
|
|
@@ -393,10 +372,7 @@ var BuyerSession = class {
|
|
|
393
372
|
*/
|
|
394
373
|
async cancelOnetimeOrder(params) {
|
|
395
374
|
validateShortId("orderId", params.orderId, "ORD");
|
|
396
|
-
return this.http.post(
|
|
397
|
-
"/v1/actions/onetime-order/cancel-order",
|
|
398
|
-
params
|
|
399
|
-
);
|
|
375
|
+
return this.http.post("/v1/actions/onetime-order/cancel-order", params);
|
|
400
376
|
}
|
|
401
377
|
/**
|
|
402
378
|
* Reactivate a subscription that is in `canceling` status.
|
|
@@ -410,10 +386,7 @@ var BuyerSession = class {
|
|
|
410
386
|
*/
|
|
411
387
|
async reactivateSubscription(params) {
|
|
412
388
|
validateShortId("orderId", params.orderId, "ORD");
|
|
413
|
-
return this.http.post(
|
|
414
|
-
"/v1/actions/subscription-order/reactivate-order",
|
|
415
|
-
params
|
|
416
|
-
);
|
|
389
|
+
return this.http.post("/v1/actions/subscription-order/reactivate-order", params);
|
|
417
390
|
}
|
|
418
391
|
/**
|
|
419
392
|
* Submit a refund request for a payment.
|
|
@@ -433,10 +406,7 @@ var BuyerSession = class {
|
|
|
433
406
|
validateRequired("reason", params.reason);
|
|
434
407
|
validateAmountString("requestedAmount.amount", params.requestedAmount.amount);
|
|
435
408
|
validateCurrencyCode("requestedAmount.currency", params.requestedAmount.currency);
|
|
436
|
-
return this.http.post(
|
|
437
|
-
"/v1/actions/refund-ticket/create-ticket",
|
|
438
|
-
params
|
|
439
|
-
);
|
|
409
|
+
return this.http.post("/v1/actions/refund-ticket/create-ticket", params);
|
|
440
410
|
}
|
|
441
411
|
/**
|
|
442
412
|
* Resubmit a previously rejected refund ticket with updated details.
|
|
@@ -458,10 +428,7 @@ var BuyerSession = class {
|
|
|
458
428
|
validateRequired("reason", params.reason);
|
|
459
429
|
validateAmountString("requestedAmount.amount", params.requestedAmount.amount);
|
|
460
430
|
validateCurrencyCode("requestedAmount.currency", params.requestedAmount.currency);
|
|
461
|
-
return this.http.post(
|
|
462
|
-
"/v1/actions/refund-ticket/resubmit-ticket",
|
|
463
|
-
params
|
|
464
|
-
);
|
|
431
|
+
return this.http.post("/v1/actions/refund-ticket/resubmit-ticket", params);
|
|
465
432
|
}
|
|
466
433
|
};
|
|
467
434
|
var BuyerGraphQL = class {
|
|
@@ -505,11 +472,7 @@ var CheckoutAnonymousResource = class {
|
|
|
505
472
|
*/
|
|
506
473
|
async create(params) {
|
|
507
474
|
validateCheckoutCommon(params);
|
|
508
|
-
return this.http.post(
|
|
509
|
-
"/v1/actions/checkout/create-session",
|
|
510
|
-
params,
|
|
511
|
-
{ idempotencyWindow: 60 }
|
|
512
|
-
);
|
|
475
|
+
return this.http.post("/v1/actions/checkout/create-session", params, { idempotencyWindow: 60 });
|
|
513
476
|
}
|
|
514
477
|
};
|
|
515
478
|
|
|
@@ -543,14 +506,22 @@ var CheckoutAuthenticatedResource = class {
|
|
|
543
506
|
validateRequired("buyerIdentity", params.buyerIdentity);
|
|
544
507
|
const { buyerIdentity, buyerEmail, ...sessionFields } = params;
|
|
545
508
|
const [tokenResult, sessionResult] = await Promise.all([
|
|
546
|
-
this.http.post(
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
509
|
+
this.http.post(
|
|
510
|
+
"/v1/actions/auth/issue-session-token",
|
|
511
|
+
{
|
|
512
|
+
productId: params.productId,
|
|
513
|
+
buyerIdentity
|
|
514
|
+
},
|
|
515
|
+
{ idempotencyWindow: 60 }
|
|
516
|
+
),
|
|
517
|
+
this.http.post(
|
|
518
|
+
"/v1/actions/checkout/create-session",
|
|
519
|
+
{
|
|
520
|
+
...sessionFields,
|
|
521
|
+
buyerEmail: buyerEmail ?? buyerIdentity
|
|
522
|
+
},
|
|
523
|
+
{ idempotencyWindow: 60 }
|
|
524
|
+
)
|
|
554
525
|
]);
|
|
555
526
|
return {
|
|
556
527
|
sessionId: sessionResult.sessionId,
|
|
@@ -961,7 +932,8 @@ var SubscriptionProductsResource = class {
|
|
|
961
932
|
async update(params) {
|
|
962
933
|
validateShortId("id", params.id, "PROD");
|
|
963
934
|
if (params.name !== void 0) validateRequired("name", params.name);
|
|
964
|
-
if (params.billingPeriod !== void 0)
|
|
935
|
+
if (params.billingPeriod !== void 0)
|
|
936
|
+
validateEnum("billingPeriod", params.billingPeriod, ["weekly", "monthly", "quarterly", "yearly"]);
|
|
965
937
|
if (params.prices) validatePrices("prices", params.prices);
|
|
966
938
|
return this.http.post("/v1/actions/subscription-product/update-product", params);
|
|
967
939
|
}
|