@jazadev/node 0.1.0 → 0.1.1

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/README.md CHANGED
@@ -27,18 +27,22 @@ const customer = await jaza.createCustomer({
27
27
 
28
28
  // 2. Issue a top-up JWT for your frontend SDK
29
29
  const session = await jaza.topUp({ customerId: customer.id });
30
- // Pass session.token + jaza.publicKey to the client.
30
+ // Pass session.token + jaza.publicKey to @jazadev/react-native (JazaProvider + JazaTopUpButton).
31
31
  // Frontend: X-Jaza-Public-Key + Authorization: Bearer <token>
32
- // → GET /v1/public/bundles (PawaPay deposits come later)
32
+ // → bundles, predict, quote, deposits via @jazadev/react-native
33
33
 
34
- // 3. Meter usage
34
+ // 3. Read balance (for your app’s getBalance BFF → @jazadev/react-native)
35
+ const wallet = await jaza.getBalance({ customerId: customer.id });
36
+ console.log(wallet.balanceCredits);
37
+
38
+ // 4. Meter usage
35
39
  await jaza.consume({
36
40
  customerId: customer.id,
37
41
  featureCode: 'SEND_MESSAGE',
38
42
  idempotencyKey: `msg_${Date.now()}`,
39
43
  });
40
44
 
41
- // 4. Poll top-up session status
45
+ // 5. Poll top-up session status
42
46
  const status = await jaza.check({ topUpId: session.id });
43
47
  console.log(status.status); // PENDING until deposits complete
44
48
  ```
@@ -49,6 +53,7 @@ console.log(status.status); // PENDING until deposits complete
49
53
  |--------|-------------|
50
54
  | `createCustomer({ name, email?, phoneNumber? })` | Returns `cus_…` |
51
55
  | `topUp({ customerId })` | Returns session + JWT `token` |
56
+ | `getBalance({ customerId })` | Wallet with `balanceCredits` |
52
57
  | `consume({ customerId, featureCode \| credits, idempotencyKey })` | Debit wallet |
53
58
  | `check({ topUpId })` | Session status |
54
59
 
package/dist/index.cjs CHANGED
@@ -191,6 +191,22 @@ var Jaza = class {
191
191
  customerId: params.customerId
192
192
  });
193
193
  }
194
+ /**
195
+ * Get a customer's wallet (including `balanceCredits`).
196
+ * For customers from `createCustomer`, the wallet is keyed by `customerId`.
197
+ */
198
+ getBalance(params) {
199
+ if (!params?.customerId?.trim()) {
200
+ throw new JazaError("customerId is required", {
201
+ statusCode: 0,
202
+ code: "invalid_request"
203
+ });
204
+ }
205
+ return this.http.request(
206
+ "GET",
207
+ `/v1/wallets/by-user/${encodeURIComponent(params.customerId)}`
208
+ );
209
+ }
194
210
  /** Debit credits for a customer (feature code or raw credits). */
195
211
  consume(params) {
196
212
  assertConsume(params);
@@ -202,7 +218,7 @@ var Jaza = class {
202
218
  reason: params.reason
203
219
  });
204
220
  }
205
- /** Check whether a top-up session completed (PENDING until PawaPay deposits land). */
221
+ /** Check whether a top-up session completed (PENDING until deposits land). */
206
222
  check(params) {
207
223
  if (!params?.topUpId?.trim()) {
208
224
  throw new JazaError("topUpId is required", {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/version.ts","../src/client.ts","../src/jaza.ts"],"sourcesContent":["export { Jaza } from './jaza.js';\nexport { JazaError } from './errors.js';\nexport { DEFAULT_API_BASE_URL, VERSION } from './version.js';\nexport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n JazaErrorBody,\n LedgerEntry,\n TopUpSession,\n TopUpSessionStatus,\n Wallet,\n} from './types.js';\n","import type { JazaErrorBody } from './types.js';\n\nexport class JazaError extends Error {\n readonly statusCode: number;\n readonly code: string;\n readonly raw: unknown;\n\n constructor(message: string, options: {\n statusCode: number;\n code?: string;\n raw?: unknown;\n }) {\n super(message);\n this.name = 'JazaError';\n this.statusCode = options.statusCode;\n this.code = options.code ?? 'api_error';\n this.raw = options.raw ?? null;\n }\n\n static fromResponse(statusCode: number, body: unknown): JazaError {\n const parsed = (body ?? {}) as JazaErrorBody;\n const message =\n typeof parsed.message === 'string'\n ? parsed.message\n : `Jaza API request failed with status ${statusCode}`;\n const code =\n typeof parsed.error === 'string'\n ? parsed.error\n : statusCode === 401\n ? 'unauthorized'\n : statusCode === 404\n ? 'not_found'\n : statusCode === 409\n ? 'conflict'\n : statusCode === 400\n ? 'bad_request'\n : 'api_error';\n return new JazaError(message, { statusCode, code, raw: body });\n }\n}\n","export const VERSION = '0.1.0';\n\nexport const DEFAULT_API_BASE_URL = 'https://api.jaza.dev';\n","import { JazaError } from './errors.js';\nimport { VERSION } from './version.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport class HttpClient {\n constructor(\n private readonly apiBaseUrl: string,\n private readonly secretKey: string,\n ) {}\n\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const url = `${this.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n Accept: 'application/json',\n 'User-Agent': `@jazadev/node/${VERSION}`,\n };\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n const text = await response.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = { message: text };\n }\n }\n\n if (!response.ok) {\n throw JazaError.fromResponse(response.status, parsed);\n }\n\n return parsed as T;\n }\n}\n","import { HttpClient } from './client.js';\nimport { JazaError } from './errors.js';\nimport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n TopUpSession,\n} from './types.js';\nimport { DEFAULT_API_BASE_URL } from './version.js';\n\nfunction assertConfig(config: JazaConfig): void {\n if (!config?.secretKey || typeof config.secretKey !== 'string') {\n throw new JazaError('secretKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.secretKey.includes('_sk_')) {\n throw new JazaError('secretKey must be a merchant secret key (jz_*_sk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config?.publicKey || typeof config.publicKey !== 'string') {\n throw new JazaError('publicKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.publicKey.includes('_pk_')) {\n throw new JazaError('publicKey must be a merchant public key (jz_*_pk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n}\n\nfunction assertCreateCustomer(params: CreateCustomerParams): void {\n if (!params?.name?.trim()) {\n throw new JazaError('name is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.email && !params.phoneNumber) {\n throw new JazaError('email or phoneNumber is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\nfunction assertConsume(params: ConsumeParams): void {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.idempotencyKey?.trim()) {\n throw new JazaError('idempotencyKey is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n const hasFeature = Boolean(params.featureCode);\n const hasCredits = params.credits !== undefined;\n if (!hasFeature && !hasCredits) {\n throw new JazaError('featureCode or credits is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (hasFeature && hasCredits) {\n throw new JazaError('Provide featureCode or credits, not both', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\n/**\n * Official Node.js client for Jaza.\n *\n * @example\n * ```ts\n * const jaza = new Jaza({ secretKey, publicKey });\n * const customer = await jaza.createCustomer({ name: 'Amina', email: 'a@x.com' });\n * const session = await jaza.topUp({ customerId: customer.id });\n * // hand session.token + publicKey to your frontend SDK\n * await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });\n * await jaza.check({ topUpId: session.id });\n * ```\n */\nexport class Jaza {\n readonly publicKey: string;\n private readonly http: HttpClient;\n\n constructor(config: JazaConfig) {\n assertConfig(config);\n this.publicKey = config.publicKey;\n this.http = new HttpClient(\n config.apiBaseUrl ?? DEFAULT_API_BASE_URL,\n config.secretKey,\n );\n }\n\n /** Create a Stripe-like customer (`cus_…`) and zero-balance wallet. */\n createCustomer(params: CreateCustomerParams): Promise<Customer> {\n assertCreateCustomer(params);\n return this.http.request<Customer>('POST', '/v1/customers', {\n name: params.name,\n email: params.email,\n phoneNumber: params.phoneNumber,\n });\n }\n\n /** Issue a top-up session JWT for the frontend (bundles / future deposits). */\n topUp(params: { customerId: string }): Promise<TopUpSession> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>('POST', '/v1/top-ups', {\n customerId: params.customerId,\n });\n }\n\n /** Debit credits for a customer (feature code or raw credits). */\n consume(params: ConsumeParams): Promise<ConsumeResult> {\n assertConsume(params);\n return this.http.request<ConsumeResult>('POST', '/v1/credits/consume', {\n customerId: params.customerId,\n idempotencyKey: params.idempotencyKey,\n featureCode: params.featureCode,\n credits: params.credits,\n reason: params.reason,\n });\n }\n\n /** Check whether a top-up session completed (PENDING until PawaPay deposits land). */\n check(params: { topUpId: string }): Promise<TopUpSession> {\n if (!params?.topUpId?.trim()) {\n throw new JazaError('topUpId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>(\n 'GET',\n `/v1/top-ups/${encodeURIComponent(params.topUpId)}`,\n );\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/version.ts","../src/client.ts","../src/jaza.ts"],"sourcesContent":["export { Jaza } from './jaza.js';\nexport { JazaError } from './errors.js';\nexport { DEFAULT_API_BASE_URL, VERSION } from './version.js';\nexport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n JazaErrorBody,\n LedgerEntry,\n TopUpSession,\n TopUpSessionStatus,\n Wallet,\n} from './types.js';\n","import type { JazaErrorBody } from './types.js';\n\nexport class JazaError extends Error {\n readonly statusCode: number;\n readonly code: string;\n readonly raw: unknown;\n\n constructor(message: string, options: {\n statusCode: number;\n code?: string;\n raw?: unknown;\n }) {\n super(message);\n this.name = 'JazaError';\n this.statusCode = options.statusCode;\n this.code = options.code ?? 'api_error';\n this.raw = options.raw ?? null;\n }\n\n static fromResponse(statusCode: number, body: unknown): JazaError {\n const parsed = (body ?? {}) as JazaErrorBody;\n const message =\n typeof parsed.message === 'string'\n ? parsed.message\n : `Jaza API request failed with status ${statusCode}`;\n const code =\n typeof parsed.error === 'string'\n ? parsed.error\n : statusCode === 401\n ? 'unauthorized'\n : statusCode === 404\n ? 'not_found'\n : statusCode === 409\n ? 'conflict'\n : statusCode === 400\n ? 'bad_request'\n : 'api_error';\n return new JazaError(message, { statusCode, code, raw: body });\n }\n}\n","export const VERSION = '0.1.0';\n\nexport const DEFAULT_API_BASE_URL = 'https://api.jaza.dev';\n","import { JazaError } from './errors.js';\nimport { VERSION } from './version.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport class HttpClient {\n constructor(\n private readonly apiBaseUrl: string,\n private readonly secretKey: string,\n ) {}\n\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const url = `${this.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n Accept: 'application/json',\n 'User-Agent': `@jazadev/node/${VERSION}`,\n };\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n const text = await response.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = { message: text };\n }\n }\n\n if (!response.ok) {\n throw JazaError.fromResponse(response.status, parsed);\n }\n\n return parsed as T;\n }\n}\n","import { HttpClient } from './client.js';\nimport { JazaError } from './errors.js';\nimport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n TopUpSession,\n Wallet,\n} from './types.js';\nimport { DEFAULT_API_BASE_URL } from './version.js';\n\nfunction assertConfig(config: JazaConfig): void {\n if (!config?.secretKey || typeof config.secretKey !== 'string') {\n throw new JazaError('secretKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.secretKey.includes('_sk_')) {\n throw new JazaError('secretKey must be a merchant secret key (jz_*_sk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config?.publicKey || typeof config.publicKey !== 'string') {\n throw new JazaError('publicKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.publicKey.includes('_pk_')) {\n throw new JazaError('publicKey must be a merchant public key (jz_*_pk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n}\n\nfunction assertCreateCustomer(params: CreateCustomerParams): void {\n if (!params?.name?.trim()) {\n throw new JazaError('name is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.email && !params.phoneNumber) {\n throw new JazaError('email or phoneNumber is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\nfunction assertConsume(params: ConsumeParams): void {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.idempotencyKey?.trim()) {\n throw new JazaError('idempotencyKey is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n const hasFeature = Boolean(params.featureCode);\n const hasCredits = params.credits !== undefined;\n if (!hasFeature && !hasCredits) {\n throw new JazaError('featureCode or credits is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (hasFeature && hasCredits) {\n throw new JazaError('Provide featureCode or credits, not both', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\n/**\n * Official Node.js client for Jaza.\n *\n * @example\n * ```ts\n * const jaza = new Jaza({ secretKey, publicKey });\n * const customer = await jaza.createCustomer({ name: 'Amina', email: 'a@x.com' });\n * const session = await jaza.topUp({ customerId: customer.id });\n * // hand session.token + publicKey to your frontend SDK\n * await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });\n * const wallet = await jaza.getBalance({ customerId: customer.id });\n * await jaza.check({ topUpId: session.id });\n * ```\n */\nexport class Jaza {\n readonly publicKey: string;\n private readonly http: HttpClient;\n\n constructor(config: JazaConfig) {\n assertConfig(config);\n this.publicKey = config.publicKey;\n this.http = new HttpClient(\n config.apiBaseUrl ?? DEFAULT_API_BASE_URL,\n config.secretKey,\n );\n }\n\n /** Create a Stripe-like customer (`cus_…`) and zero-balance wallet. */\n createCustomer(params: CreateCustomerParams): Promise<Customer> {\n assertCreateCustomer(params);\n return this.http.request<Customer>('POST', '/v1/customers', {\n name: params.name,\n email: params.email,\n phoneNumber: params.phoneNumber,\n });\n }\n\n /** Issue a top-up session JWT for the frontend (bundles / future deposits). */\n topUp(params: { customerId: string }): Promise<TopUpSession> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>('POST', '/v1/top-ups', {\n customerId: params.customerId,\n });\n }\n\n /**\n * Get a customer's wallet (including `balanceCredits`).\n * For customers from `createCustomer`, the wallet is keyed by `customerId`.\n */\n getBalance(params: { customerId: string }): Promise<Wallet> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<Wallet>(\n 'GET',\n `/v1/wallets/by-user/${encodeURIComponent(params.customerId)}`,\n );\n }\n\n /** Debit credits for a customer (feature code or raw credits). */\n consume(params: ConsumeParams): Promise<ConsumeResult> {\n assertConsume(params);\n return this.http.request<ConsumeResult>('POST', '/v1/credits/consume', {\n customerId: params.customerId,\n idempotencyKey: params.idempotencyKey,\n featureCode: params.featureCode,\n credits: params.credits,\n reason: params.reason,\n });\n }\n\n /** Check whether a top-up session completed (PENDING until deposits land). */\n check(params: { topUpId: string }): Promise<TopUpSession> {\n if (!params?.topUpId?.trim()) {\n throw new JazaError('topUpId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>(\n 'GET',\n `/v1/top-ups/${encodeURIComponent(params.topUpId)}`,\n );\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -77,6 +77,7 @@ type JazaErrorBody = {
77
77
  * const session = await jaza.topUp({ customerId: customer.id });
78
78
  * // hand session.token + publicKey to your frontend SDK
79
79
  * await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });
80
+ * const wallet = await jaza.getBalance({ customerId: customer.id });
80
81
  * await jaza.check({ topUpId: session.id });
81
82
  * ```
82
83
  */
@@ -90,9 +91,16 @@ declare class Jaza {
90
91
  topUp(params: {
91
92
  customerId: string;
92
93
  }): Promise<TopUpSession>;
94
+ /**
95
+ * Get a customer's wallet (including `balanceCredits`).
96
+ * For customers from `createCustomer`, the wallet is keyed by `customerId`.
97
+ */
98
+ getBalance(params: {
99
+ customerId: string;
100
+ }): Promise<Wallet>;
93
101
  /** Debit credits for a customer (feature code or raw credits). */
94
102
  consume(params: ConsumeParams): Promise<ConsumeResult>;
95
- /** Check whether a top-up session completed (PENDING until PawaPay deposits land). */
103
+ /** Check whether a top-up session completed (PENDING until deposits land). */
96
104
  check(params: {
97
105
  topUpId: string;
98
106
  }): Promise<TopUpSession>;
package/dist/index.d.ts CHANGED
@@ -77,6 +77,7 @@ type JazaErrorBody = {
77
77
  * const session = await jaza.topUp({ customerId: customer.id });
78
78
  * // hand session.token + publicKey to your frontend SDK
79
79
  * await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });
80
+ * const wallet = await jaza.getBalance({ customerId: customer.id });
80
81
  * await jaza.check({ topUpId: session.id });
81
82
  * ```
82
83
  */
@@ -90,9 +91,16 @@ declare class Jaza {
90
91
  topUp(params: {
91
92
  customerId: string;
92
93
  }): Promise<TopUpSession>;
94
+ /**
95
+ * Get a customer's wallet (including `balanceCredits`).
96
+ * For customers from `createCustomer`, the wallet is keyed by `customerId`.
97
+ */
98
+ getBalance(params: {
99
+ customerId: string;
100
+ }): Promise<Wallet>;
93
101
  /** Debit credits for a customer (feature code or raw credits). */
94
102
  consume(params: ConsumeParams): Promise<ConsumeResult>;
95
- /** Check whether a top-up session completed (PENDING until PawaPay deposits land). */
103
+ /** Check whether a top-up session completed (PENDING until deposits land). */
96
104
  check(params: {
97
105
  topUpId: string;
98
106
  }): Promise<TopUpSession>;
package/dist/index.js CHANGED
@@ -162,6 +162,22 @@ var Jaza = class {
162
162
  customerId: params.customerId
163
163
  });
164
164
  }
165
+ /**
166
+ * Get a customer's wallet (including `balanceCredits`).
167
+ * For customers from `createCustomer`, the wallet is keyed by `customerId`.
168
+ */
169
+ getBalance(params) {
170
+ if (!params?.customerId?.trim()) {
171
+ throw new JazaError("customerId is required", {
172
+ statusCode: 0,
173
+ code: "invalid_request"
174
+ });
175
+ }
176
+ return this.http.request(
177
+ "GET",
178
+ `/v1/wallets/by-user/${encodeURIComponent(params.customerId)}`
179
+ );
180
+ }
165
181
  /** Debit credits for a customer (feature code or raw credits). */
166
182
  consume(params) {
167
183
  assertConsume(params);
@@ -173,7 +189,7 @@ var Jaza = class {
173
189
  reason: params.reason
174
190
  });
175
191
  }
176
- /** Check whether a top-up session completed (PENDING until PawaPay deposits land). */
192
+ /** Check whether a top-up session completed (PENDING until deposits land). */
177
193
  check(params) {
178
194
  if (!params?.topUpId?.trim()) {
179
195
  throw new JazaError("topUpId is required", {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/client.ts","../src/jaza.ts"],"sourcesContent":["import type { JazaErrorBody } from './types.js';\n\nexport class JazaError extends Error {\n readonly statusCode: number;\n readonly code: string;\n readonly raw: unknown;\n\n constructor(message: string, options: {\n statusCode: number;\n code?: string;\n raw?: unknown;\n }) {\n super(message);\n this.name = 'JazaError';\n this.statusCode = options.statusCode;\n this.code = options.code ?? 'api_error';\n this.raw = options.raw ?? null;\n }\n\n static fromResponse(statusCode: number, body: unknown): JazaError {\n const parsed = (body ?? {}) as JazaErrorBody;\n const message =\n typeof parsed.message === 'string'\n ? parsed.message\n : `Jaza API request failed with status ${statusCode}`;\n const code =\n typeof parsed.error === 'string'\n ? parsed.error\n : statusCode === 401\n ? 'unauthorized'\n : statusCode === 404\n ? 'not_found'\n : statusCode === 409\n ? 'conflict'\n : statusCode === 400\n ? 'bad_request'\n : 'api_error';\n return new JazaError(message, { statusCode, code, raw: body });\n }\n}\n","export const VERSION = '0.1.0';\n\nexport const DEFAULT_API_BASE_URL = 'https://api.jaza.dev';\n","import { JazaError } from './errors.js';\nimport { VERSION } from './version.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport class HttpClient {\n constructor(\n private readonly apiBaseUrl: string,\n private readonly secretKey: string,\n ) {}\n\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const url = `${this.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n Accept: 'application/json',\n 'User-Agent': `@jazadev/node/${VERSION}`,\n };\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n const text = await response.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = { message: text };\n }\n }\n\n if (!response.ok) {\n throw JazaError.fromResponse(response.status, parsed);\n }\n\n return parsed as T;\n }\n}\n","import { HttpClient } from './client.js';\nimport { JazaError } from './errors.js';\nimport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n TopUpSession,\n} from './types.js';\nimport { DEFAULT_API_BASE_URL } from './version.js';\n\nfunction assertConfig(config: JazaConfig): void {\n if (!config?.secretKey || typeof config.secretKey !== 'string') {\n throw new JazaError('secretKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.secretKey.includes('_sk_')) {\n throw new JazaError('secretKey must be a merchant secret key (jz_*_sk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config?.publicKey || typeof config.publicKey !== 'string') {\n throw new JazaError('publicKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.publicKey.includes('_pk_')) {\n throw new JazaError('publicKey must be a merchant public key (jz_*_pk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n}\n\nfunction assertCreateCustomer(params: CreateCustomerParams): void {\n if (!params?.name?.trim()) {\n throw new JazaError('name is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.email && !params.phoneNumber) {\n throw new JazaError('email or phoneNumber is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\nfunction assertConsume(params: ConsumeParams): void {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.idempotencyKey?.trim()) {\n throw new JazaError('idempotencyKey is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n const hasFeature = Boolean(params.featureCode);\n const hasCredits = params.credits !== undefined;\n if (!hasFeature && !hasCredits) {\n throw new JazaError('featureCode or credits is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (hasFeature && hasCredits) {\n throw new JazaError('Provide featureCode or credits, not both', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\n/**\n * Official Node.js client for Jaza.\n *\n * @example\n * ```ts\n * const jaza = new Jaza({ secretKey, publicKey });\n * const customer = await jaza.createCustomer({ name: 'Amina', email: 'a@x.com' });\n * const session = await jaza.topUp({ customerId: customer.id });\n * // hand session.token + publicKey to your frontend SDK\n * await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });\n * await jaza.check({ topUpId: session.id });\n * ```\n */\nexport class Jaza {\n readonly publicKey: string;\n private readonly http: HttpClient;\n\n constructor(config: JazaConfig) {\n assertConfig(config);\n this.publicKey = config.publicKey;\n this.http = new HttpClient(\n config.apiBaseUrl ?? DEFAULT_API_BASE_URL,\n config.secretKey,\n );\n }\n\n /** Create a Stripe-like customer (`cus_…`) and zero-balance wallet. */\n createCustomer(params: CreateCustomerParams): Promise<Customer> {\n assertCreateCustomer(params);\n return this.http.request<Customer>('POST', '/v1/customers', {\n name: params.name,\n email: params.email,\n phoneNumber: params.phoneNumber,\n });\n }\n\n /** Issue a top-up session JWT for the frontend (bundles / future deposits). */\n topUp(params: { customerId: string }): Promise<TopUpSession> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>('POST', '/v1/top-ups', {\n customerId: params.customerId,\n });\n }\n\n /** Debit credits for a customer (feature code or raw credits). */\n consume(params: ConsumeParams): Promise<ConsumeResult> {\n assertConsume(params);\n return this.http.request<ConsumeResult>('POST', '/v1/credits/consume', {\n customerId: params.customerId,\n idempotencyKey: params.idempotencyKey,\n featureCode: params.featureCode,\n credits: params.credits,\n reason: params.reason,\n });\n }\n\n /** Check whether a top-up session completed (PENDING until PawaPay deposits land). */\n check(params: { topUpId: string }): Promise<TopUpSession> {\n if (!params?.topUpId?.trim()) {\n throw new JazaError('topUpId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>(\n 'GET',\n `/v1/top-ups/${encodeURIComponent(params.topUpId)}`,\n );\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/client.ts","../src/jaza.ts"],"sourcesContent":["import type { JazaErrorBody } from './types.js';\n\nexport class JazaError extends Error {\n readonly statusCode: number;\n readonly code: string;\n readonly raw: unknown;\n\n constructor(message: string, options: {\n statusCode: number;\n code?: string;\n raw?: unknown;\n }) {\n super(message);\n this.name = 'JazaError';\n this.statusCode = options.statusCode;\n this.code = options.code ?? 'api_error';\n this.raw = options.raw ?? null;\n }\n\n static fromResponse(statusCode: number, body: unknown): JazaError {\n const parsed = (body ?? {}) as JazaErrorBody;\n const message =\n typeof parsed.message === 'string'\n ? parsed.message\n : `Jaza API request failed with status ${statusCode}`;\n const code =\n typeof parsed.error === 'string'\n ? parsed.error\n : statusCode === 401\n ? 'unauthorized'\n : statusCode === 404\n ? 'not_found'\n : statusCode === 409\n ? 'conflict'\n : statusCode === 400\n ? 'bad_request'\n : 'api_error';\n return new JazaError(message, { statusCode, code, raw: body });\n }\n}\n","export const VERSION = '0.1.0';\n\nexport const DEFAULT_API_BASE_URL = 'https://api.jaza.dev';\n","import { JazaError } from './errors.js';\nimport { VERSION } from './version.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport class HttpClient {\n constructor(\n private readonly apiBaseUrl: string,\n private readonly secretKey: string,\n ) {}\n\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const url = `${this.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n Accept: 'application/json',\n 'User-Agent': `@jazadev/node/${VERSION}`,\n };\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n const text = await response.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = { message: text };\n }\n }\n\n if (!response.ok) {\n throw JazaError.fromResponse(response.status, parsed);\n }\n\n return parsed as T;\n }\n}\n","import { HttpClient } from './client.js';\nimport { JazaError } from './errors.js';\nimport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n TopUpSession,\n Wallet,\n} from './types.js';\nimport { DEFAULT_API_BASE_URL } from './version.js';\n\nfunction assertConfig(config: JazaConfig): void {\n if (!config?.secretKey || typeof config.secretKey !== 'string') {\n throw new JazaError('secretKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.secretKey.includes('_sk_')) {\n throw new JazaError('secretKey must be a merchant secret key (jz_*_sk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config?.publicKey || typeof config.publicKey !== 'string') {\n throw new JazaError('publicKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.publicKey.includes('_pk_')) {\n throw new JazaError('publicKey must be a merchant public key (jz_*_pk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n}\n\nfunction assertCreateCustomer(params: CreateCustomerParams): void {\n if (!params?.name?.trim()) {\n throw new JazaError('name is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.email && !params.phoneNumber) {\n throw new JazaError('email or phoneNumber is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\nfunction assertConsume(params: ConsumeParams): void {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.idempotencyKey?.trim()) {\n throw new JazaError('idempotencyKey is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n const hasFeature = Boolean(params.featureCode);\n const hasCredits = params.credits !== undefined;\n if (!hasFeature && !hasCredits) {\n throw new JazaError('featureCode or credits is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (hasFeature && hasCredits) {\n throw new JazaError('Provide featureCode or credits, not both', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\n/**\n * Official Node.js client for Jaza.\n *\n * @example\n * ```ts\n * const jaza = new Jaza({ secretKey, publicKey });\n * const customer = await jaza.createCustomer({ name: 'Amina', email: 'a@x.com' });\n * const session = await jaza.topUp({ customerId: customer.id });\n * // hand session.token + publicKey to your frontend SDK\n * await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });\n * const wallet = await jaza.getBalance({ customerId: customer.id });\n * await jaza.check({ topUpId: session.id });\n * ```\n */\nexport class Jaza {\n readonly publicKey: string;\n private readonly http: HttpClient;\n\n constructor(config: JazaConfig) {\n assertConfig(config);\n this.publicKey = config.publicKey;\n this.http = new HttpClient(\n config.apiBaseUrl ?? DEFAULT_API_BASE_URL,\n config.secretKey,\n );\n }\n\n /** Create a Stripe-like customer (`cus_…`) and zero-balance wallet. */\n createCustomer(params: CreateCustomerParams): Promise<Customer> {\n assertCreateCustomer(params);\n return this.http.request<Customer>('POST', '/v1/customers', {\n name: params.name,\n email: params.email,\n phoneNumber: params.phoneNumber,\n });\n }\n\n /** Issue a top-up session JWT for the frontend (bundles / future deposits). */\n topUp(params: { customerId: string }): Promise<TopUpSession> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>('POST', '/v1/top-ups', {\n customerId: params.customerId,\n });\n }\n\n /**\n * Get a customer's wallet (including `balanceCredits`).\n * For customers from `createCustomer`, the wallet is keyed by `customerId`.\n */\n getBalance(params: { customerId: string }): Promise<Wallet> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<Wallet>(\n 'GET',\n `/v1/wallets/by-user/${encodeURIComponent(params.customerId)}`,\n );\n }\n\n /** Debit credits for a customer (feature code or raw credits). */\n consume(params: ConsumeParams): Promise<ConsumeResult> {\n assertConsume(params);\n return this.http.request<ConsumeResult>('POST', '/v1/credits/consume', {\n customerId: params.customerId,\n idempotencyKey: params.idempotencyKey,\n featureCode: params.featureCode,\n credits: params.credits,\n reason: params.reason,\n });\n }\n\n /** Check whether a top-up session completed (PENDING until deposits land). */\n check(params: { topUpId: string }): Promise<TopUpSession> {\n if (!params?.topUpId?.trim()) {\n throw new JazaError('topUpId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>(\n 'GET',\n `/v1/top-ups/${encodeURIComponent(params.topUpId)}`,\n );\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jazadev/node",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Official Node.js SDK for Jaza prepaid / metered billing",
5
5
  "license": "MIT",
6
6
  "author": "Jaza",
@@ -47,7 +47,7 @@
47
47
  },
48
48
  "repository": {
49
49
  "type": "git",
50
- "url": "https://github.com/josumung999/jaza-packages.git",
50
+ "url": "git+https://github.com/josumung999/jaza-packages.git",
51
51
  "directory": "@jaza-node"
52
52
  },
53
53
  "homepage": "https://github.com/josumung999/jaza-packages/tree/main/@jaza-node",