@paykit-sdk/paystack 1.2.1 → 1.3.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/dist/index.js CHANGED
@@ -4121,20 +4121,10 @@ var Checkout$inboundSchema = (init, transaction) => {
4121
4121
  type: core.billingModeSchema.optional()
4122
4122
  })
4123
4123
  );
4124
- if (paykitMeta && typeof paykitMeta === "string") {
4125
- const parsed = core.parseJSON(
4126
- paykitMeta,
4127
- core.Schema.object({
4128
- item_id: core.Schema.string().optional(),
4129
- quantity: core.Schema.number().optional(),
4130
- type: core.billingModeSchema.optional()
4131
- })
4132
- );
4133
- if (parsed) {
4134
- itemId = parsed.item_id ?? "";
4135
- quantity = parsed.quantity ?? 1;
4136
- type = parsed.type ?? null;
4137
- }
4124
+ if (paykitMeta) {
4125
+ itemId = paykitMeta.item_id ?? "";
4126
+ quantity = paykitMeta.quantity ?? 1;
4127
+ type = paykitMeta.type ?? null;
4138
4128
  }
4139
4129
  let customer = null;
4140
4130
  if (transaction.customer?.email) {
@@ -4293,7 +4283,11 @@ var PaystackProvider = class extends core.AbstractPayKitProvider {
4293
4283
  { provider: this.providerName, method: "createCheckout" }
4294
4284
  );
4295
4285
  }
4296
- const { amount, currency = "NGN" } = data.provider_metadata ?? {};
4286
+ const { amount, currency = "NGN" } = core.validateRequiredKeys(
4287
+ ["amount", "currency"],
4288
+ data.provider_metadata ?? {},
4289
+ "Missing required provider metadata: {keys}"
4290
+ );
4297
4291
  const metadata = {
4298
4292
  ...core.stringifyMetadataValues(data.metadata ?? {}),
4299
4293
  [core.PAYKIT_METADATA_KEY]: JSON.stringify({
@@ -4304,8 +4298,8 @@ var PaystackProvider = class extends core.AbstractPayKitProvider {
4304
4298
  };
4305
4299
  const body = {
4306
4300
  email: data.customer.email,
4307
- amount: amount ?? 0,
4308
- currency,
4301
+ amount: parseInt(amount, 10),
4302
+ currency: currency.toUpperCase(),
4309
4303
  reference: crypto.randomUUID(),
4310
4304
  callback_url: data.success_url,
4311
4305
  metadata: core.stringifyMetadataValues(metadata),
@@ -4617,7 +4611,9 @@ var PaystackProvider = class extends core.AbstractPayKitProvider {
4617
4611
  });
4618
4612
  }
4619
4613
  const expectedSignature = crypto$1.createHmac("sha512", webhookSecret).update(body).digest("hex");
4620
- if (expectedSignature !== signature) {
4614
+ const expectedBuf = Buffer.from(expectedSignature, "hex");
4615
+ const receivedBuf = Buffer.from(signature, "hex");
4616
+ if (expectedBuf.length !== receivedBuf.length || !crypto$1.timingSafeEqual(expectedBuf, receivedBuf)) {
4621
4617
  throw new core.WebhookError("Invalid Paystack webhook signature", {
4622
4618
  provider: this.providerName
4623
4619
  });
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { schema, AbstractPayKitProvider, HTTPClient, OperationFailedError, createCheckoutSchema, ValidationError, isEmailCustomer, InvalidTypeError, PAYKIT_METADATA_KEY, stringifyMetadataValues, ProviderNotSupportedError, createCustomerSchema, parseCustomerName, isIdCustomer, ResourceNotFoundError, createPaymentSchema, createRefundSchema, WebhookError, paykitEvent$InboundSchema, validateRequiredKeys, parseJSON, Schema, omitInternalMetadata, billingModeSchema } from '@paykit-sdk/core';
2
- import { createHmac } from 'crypto';
1
+ import { schema, AbstractPayKitProvider, HTTPClient, OperationFailedError, createCheckoutSchema, ValidationError, isEmailCustomer, InvalidTypeError, validateRequiredKeys, PAYKIT_METADATA_KEY, stringifyMetadataValues, ProviderNotSupportedError, createCustomerSchema, parseCustomerName, isIdCustomer, ResourceNotFoundError, createPaymentSchema, createRefundSchema, WebhookError, paykitEvent$InboundSchema, parseJSON, Schema, omitInternalMetadata, billingModeSchema } from '@paykit-sdk/core';
2
+ import { createHmac, timingSafeEqual } from 'crypto';
3
3
 
4
4
  var __defProp = Object.defineProperty;
5
5
  var __export = (target, all) => {
@@ -4119,20 +4119,10 @@ var Checkout$inboundSchema = (init, transaction) => {
4119
4119
  type: billingModeSchema.optional()
4120
4120
  })
4121
4121
  );
4122
- if (paykitMeta && typeof paykitMeta === "string") {
4123
- const parsed = parseJSON(
4124
- paykitMeta,
4125
- Schema.object({
4126
- item_id: Schema.string().optional(),
4127
- quantity: Schema.number().optional(),
4128
- type: billingModeSchema.optional()
4129
- })
4130
- );
4131
- if (parsed) {
4132
- itemId = parsed.item_id ?? "";
4133
- quantity = parsed.quantity ?? 1;
4134
- type = parsed.type ?? null;
4135
- }
4122
+ if (paykitMeta) {
4123
+ itemId = paykitMeta.item_id ?? "";
4124
+ quantity = paykitMeta.quantity ?? 1;
4125
+ type = paykitMeta.type ?? null;
4136
4126
  }
4137
4127
  let customer = null;
4138
4128
  if (transaction.customer?.email) {
@@ -4291,7 +4281,11 @@ var PaystackProvider = class extends AbstractPayKitProvider {
4291
4281
  { provider: this.providerName, method: "createCheckout" }
4292
4282
  );
4293
4283
  }
4294
- const { amount, currency = "NGN" } = data.provider_metadata ?? {};
4284
+ const { amount, currency = "NGN" } = validateRequiredKeys(
4285
+ ["amount", "currency"],
4286
+ data.provider_metadata ?? {},
4287
+ "Missing required provider metadata: {keys}"
4288
+ );
4295
4289
  const metadata = {
4296
4290
  ...stringifyMetadataValues(data.metadata ?? {}),
4297
4291
  [PAYKIT_METADATA_KEY]: JSON.stringify({
@@ -4302,8 +4296,8 @@ var PaystackProvider = class extends AbstractPayKitProvider {
4302
4296
  };
4303
4297
  const body = {
4304
4298
  email: data.customer.email,
4305
- amount: amount ?? 0,
4306
- currency,
4299
+ amount: parseInt(amount, 10),
4300
+ currency: currency.toUpperCase(),
4307
4301
  reference: crypto.randomUUID(),
4308
4302
  callback_url: data.success_url,
4309
4303
  metadata: stringifyMetadataValues(metadata),
@@ -4615,7 +4609,9 @@ var PaystackProvider = class extends AbstractPayKitProvider {
4615
4609
  });
4616
4610
  }
4617
4611
  const expectedSignature = createHmac("sha512", webhookSecret).update(body).digest("hex");
4618
- if (expectedSignature !== signature) {
4612
+ const expectedBuf = Buffer.from(expectedSignature, "hex");
4613
+ const receivedBuf = Buffer.from(signature, "hex");
4614
+ if (expectedBuf.length !== receivedBuf.length || !timingSafeEqual(expectedBuf, receivedBuf)) {
4619
4615
  throw new WebhookError("Invalid Paystack webhook signature", {
4620
4616
  provider: this.providerName
4621
4617
  });
@@ -4121,20 +4121,10 @@ var Checkout$inboundSchema = (init, transaction) => {
4121
4121
  type: core.billingModeSchema.optional()
4122
4122
  })
4123
4123
  );
4124
- if (paykitMeta && typeof paykitMeta === "string") {
4125
- const parsed = core.parseJSON(
4126
- paykitMeta,
4127
- core.Schema.object({
4128
- item_id: core.Schema.string().optional(),
4129
- quantity: core.Schema.number().optional(),
4130
- type: core.billingModeSchema.optional()
4131
- })
4132
- );
4133
- if (parsed) {
4134
- itemId = parsed.item_id ?? "";
4135
- quantity = parsed.quantity ?? 1;
4136
- type = parsed.type ?? null;
4137
- }
4124
+ if (paykitMeta) {
4125
+ itemId = paykitMeta.item_id ?? "";
4126
+ quantity = paykitMeta.quantity ?? 1;
4127
+ type = paykitMeta.type ?? null;
4138
4128
  }
4139
4129
  let customer = null;
4140
4130
  if (transaction.customer?.email) {
@@ -4293,7 +4283,11 @@ var PaystackProvider = class extends core.AbstractPayKitProvider {
4293
4283
  { provider: this.providerName, method: "createCheckout" }
4294
4284
  );
4295
4285
  }
4296
- const { amount, currency = "NGN" } = data.provider_metadata ?? {};
4286
+ const { amount, currency = "NGN" } = core.validateRequiredKeys(
4287
+ ["amount", "currency"],
4288
+ data.provider_metadata ?? {},
4289
+ "Missing required provider metadata: {keys}"
4290
+ );
4297
4291
  const metadata = {
4298
4292
  ...core.stringifyMetadataValues(data.metadata ?? {}),
4299
4293
  [core.PAYKIT_METADATA_KEY]: JSON.stringify({
@@ -4304,8 +4298,8 @@ var PaystackProvider = class extends core.AbstractPayKitProvider {
4304
4298
  };
4305
4299
  const body = {
4306
4300
  email: data.customer.email,
4307
- amount: amount ?? 0,
4308
- currency,
4301
+ amount: parseInt(amount, 10),
4302
+ currency: currency.toUpperCase(),
4309
4303
  reference: crypto.randomUUID(),
4310
4304
  callback_url: data.success_url,
4311
4305
  metadata: core.stringifyMetadataValues(metadata),
@@ -4617,7 +4611,9 @@ var PaystackProvider = class extends core.AbstractPayKitProvider {
4617
4611
  });
4618
4612
  }
4619
4613
  const expectedSignature = crypto$1.createHmac("sha512", webhookSecret).update(body).digest("hex");
4620
- if (expectedSignature !== signature) {
4614
+ const expectedBuf = Buffer.from(expectedSignature, "hex");
4615
+ const receivedBuf = Buffer.from(signature, "hex");
4616
+ if (expectedBuf.length !== receivedBuf.length || !crypto$1.timingSafeEqual(expectedBuf, receivedBuf)) {
4621
4617
  throw new core.WebhookError("Invalid Paystack webhook signature", {
4622
4618
  provider: this.providerName
4623
4619
  });
@@ -1,5 +1,5 @@
1
- import { schema, AbstractPayKitProvider, HTTPClient, OperationFailedError, createCheckoutSchema, ValidationError, isEmailCustomer, InvalidTypeError, PAYKIT_METADATA_KEY, stringifyMetadataValues, ProviderNotSupportedError, createCustomerSchema, parseCustomerName, isIdCustomer, ResourceNotFoundError, createPaymentSchema, createRefundSchema, WebhookError, paykitEvent$InboundSchema, parseJSON, Schema, omitInternalMetadata, billingModeSchema } from '@paykit-sdk/core';
2
- import { createHmac } from 'crypto';
1
+ import { schema, AbstractPayKitProvider, HTTPClient, OperationFailedError, createCheckoutSchema, ValidationError, isEmailCustomer, InvalidTypeError, validateRequiredKeys, PAYKIT_METADATA_KEY, stringifyMetadataValues, ProviderNotSupportedError, createCustomerSchema, parseCustomerName, isIdCustomer, ResourceNotFoundError, createPaymentSchema, createRefundSchema, WebhookError, paykitEvent$InboundSchema, parseJSON, Schema, omitInternalMetadata, billingModeSchema } from '@paykit-sdk/core';
2
+ import { createHmac, timingSafeEqual } from 'crypto';
3
3
 
4
4
  var __defProp = Object.defineProperty;
5
5
  var __export = (target, all) => {
@@ -4119,20 +4119,10 @@ var Checkout$inboundSchema = (init, transaction) => {
4119
4119
  type: billingModeSchema.optional()
4120
4120
  })
4121
4121
  );
4122
- if (paykitMeta && typeof paykitMeta === "string") {
4123
- const parsed = parseJSON(
4124
- paykitMeta,
4125
- Schema.object({
4126
- item_id: Schema.string().optional(),
4127
- quantity: Schema.number().optional(),
4128
- type: billingModeSchema.optional()
4129
- })
4130
- );
4131
- if (parsed) {
4132
- itemId = parsed.item_id ?? "";
4133
- quantity = parsed.quantity ?? 1;
4134
- type = parsed.type ?? null;
4135
- }
4122
+ if (paykitMeta) {
4123
+ itemId = paykitMeta.item_id ?? "";
4124
+ quantity = paykitMeta.quantity ?? 1;
4125
+ type = paykitMeta.type ?? null;
4136
4126
  }
4137
4127
  let customer = null;
4138
4128
  if (transaction.customer?.email) {
@@ -4291,7 +4281,11 @@ var PaystackProvider = class extends AbstractPayKitProvider {
4291
4281
  { provider: this.providerName, method: "createCheckout" }
4292
4282
  );
4293
4283
  }
4294
- const { amount, currency = "NGN" } = data.provider_metadata ?? {};
4284
+ const { amount, currency = "NGN" } = validateRequiredKeys(
4285
+ ["amount", "currency"],
4286
+ data.provider_metadata ?? {},
4287
+ "Missing required provider metadata: {keys}"
4288
+ );
4295
4289
  const metadata = {
4296
4290
  ...stringifyMetadataValues(data.metadata ?? {}),
4297
4291
  [PAYKIT_METADATA_KEY]: JSON.stringify({
@@ -4302,8 +4296,8 @@ var PaystackProvider = class extends AbstractPayKitProvider {
4302
4296
  };
4303
4297
  const body = {
4304
4298
  email: data.customer.email,
4305
- amount: amount ?? 0,
4306
- currency,
4299
+ amount: parseInt(amount, 10),
4300
+ currency: currency.toUpperCase(),
4307
4301
  reference: crypto.randomUUID(),
4308
4302
  callback_url: data.success_url,
4309
4303
  metadata: stringifyMetadataValues(metadata),
@@ -4615,7 +4609,9 @@ var PaystackProvider = class extends AbstractPayKitProvider {
4615
4609
  });
4616
4610
  }
4617
4611
  const expectedSignature = createHmac("sha512", webhookSecret).update(body).digest("hex");
4618
- if (expectedSignature !== signature) {
4612
+ const expectedBuf = Buffer.from(expectedSignature, "hex");
4613
+ const receivedBuf = Buffer.from(signature, "hex");
4614
+ if (expectedBuf.length !== receivedBuf.length || !timingSafeEqual(expectedBuf, receivedBuf)) {
4619
4615
  throw new WebhookError("Invalid Paystack webhook signature", {
4620
4616
  provider: this.providerName
4621
4617
  });
@@ -76,20 +76,10 @@ var Checkout$inboundSchema = (init, transaction) => {
76
76
  type: core.billingModeSchema.optional()
77
77
  })
78
78
  );
79
- if (paykitMeta && typeof paykitMeta === "string") {
80
- const parsed = core.parseJSON(
81
- paykitMeta,
82
- core.Schema.object({
83
- item_id: core.Schema.string().optional(),
84
- quantity: core.Schema.number().optional(),
85
- type: core.billingModeSchema.optional()
86
- })
87
- );
88
- if (parsed) {
89
- itemId = parsed.item_id ?? "";
90
- quantity = parsed.quantity ?? 1;
91
- type = parsed.type ?? null;
92
- }
79
+ if (paykitMeta) {
80
+ itemId = paykitMeta.item_id ?? "";
81
+ quantity = paykitMeta.quantity ?? 1;
82
+ type = paykitMeta.type ?? null;
93
83
  }
94
84
  let customer = null;
95
85
  if (transaction.customer?.email) {
@@ -74,20 +74,10 @@ var Checkout$inboundSchema = (init, transaction) => {
74
74
  type: billingModeSchema.optional()
75
75
  })
76
76
  );
77
- if (paykitMeta && typeof paykitMeta === "string") {
78
- const parsed = parseJSON(
79
- paykitMeta,
80
- Schema.object({
81
- item_id: Schema.string().optional(),
82
- quantity: Schema.number().optional(),
83
- type: billingModeSchema.optional()
84
- })
85
- );
86
- if (parsed) {
87
- itemId = parsed.item_id ?? "";
88
- quantity = parsed.quantity ?? 1;
89
- type = parsed.type ?? null;
90
- }
77
+ if (paykitMeta) {
78
+ itemId = paykitMeta.item_id ?? "";
79
+ quantity = paykitMeta.quantity ?? 1;
80
+ type = paykitMeta.type ?? null;
91
81
  }
92
82
  let customer = null;
93
83
  if (transaction.customer?.email) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paykit-sdk/paystack",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "Paystack provider for PayKit",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -11,9 +11,6 @@
11
11
  "paykit": {
12
12
  "type": "provider"
13
13
  },
14
- "scripts": {
15
- "build": "tsup"
16
- },
17
14
  "keywords": [
18
15
  "paystack",
19
16
  "paykit",
@@ -23,13 +20,13 @@
23
20
  "author": "Emmanuel Odii",
24
21
  "license": "ISC",
25
22
  "peerDependencies": {
26
- "@paykit-sdk/core": ">=1.2.2"
23
+ "@paykit-sdk/core": "^1.2.3"
27
24
  },
28
25
  "devDependencies": {
29
- "@paykit-sdk/core": "workspace:*",
30
26
  "tsup": "^8.5.0",
31
27
  "typescript": "^5.9.2",
32
- "zod": "^3.24.2"
28
+ "zod": "^3.24.2",
29
+ "@paykit-sdk/core": "1.3.0"
33
30
  },
34
31
  "publishConfig": {
35
32
  "access": "public"
@@ -40,5 +37,10 @@
40
37
  },
41
38
  "bugs": {
42
39
  "url": "https://github.com/usepaykit/paykit-sdk/issues"
40
+ },
41
+ "scripts": {
42
+ "build": "tsup",
43
+ "test": "vitest run --config ../../vitest.config.ts packages/paystack/src",
44
+ "typecheck": "tsc --noEmit"
43
45
  }
44
- }
46
+ }