paylio 0.1.0 → 0.1.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/README.md CHANGED
@@ -1,10 +1,17 @@
1
1
  # Paylio Node.js SDK
2
2
 
3
- Official Node.js/TypeScript client library for the [Paylio API](https://api.paylio.pro).
3
+ [![npm version](https://img.shields.io/npm/v/paylio.svg)](https://www.npmjs.com/package/paylio)
4
+ [![CI](https://github.com/paylio-org/paylio-node/actions/workflows/ci.yml/badge.svg)](https://github.com/paylio-org/paylio-node/actions/workflows/ci.yml)
5
+
6
+ The Paylio Node.js SDK provides convenient access to the Paylio API from applications written in server-side JavaScript and TypeScript.
7
+
8
+ ## Documentation
9
+
10
+ See the [Paylio API docs](https://paylio.pro/docs).
4
11
 
5
12
  ## Requirements
6
13
 
7
- - Node.js 18 or later
14
+ - Node.js 18+
8
15
 
9
16
  ## Installation
10
17
 
@@ -17,27 +24,15 @@ npm install paylio
17
24
  ### TypeScript
18
25
 
19
26
  ```typescript
20
- import { PaylioClient, AuthenticationError } from "paylio";
27
+ import { PaylioClient } from "paylio";
21
28
 
22
29
  const client = new PaylioClient("sk_live_xxx");
23
30
 
24
31
  // Retrieve current subscription
25
32
  const sub = await client.subscription.retrieve("user_123");
26
- console.log(sub.status, sub.plan.name);
27
-
28
- // List subscription history
29
- const history = await client.subscription.list("user_123", { page: 1, pageSize: 10 });
30
- for (const item of history.items) {
31
- console.log(item.plan_name);
32
- }
33
- console.log(history.hasMore);
34
-
35
- // Cancel a subscription (safe default: at end of billing period)
36
- const result = await client.subscription.cancel("sub_uuid");
37
- console.log(result.success);
38
-
39
- // Cancel immediately
40
- await client.subscription.cancel("sub_uuid", { cancelNow: true });
33
+ console.log(sub.status); // "active"
34
+ console.log(sub.plan.name); // "Pro Plan"
35
+ console.log(sub.plan.amount); // 999
41
36
 
42
37
  client.close();
43
38
  ```
@@ -53,10 +48,51 @@ console.log(sub.status);
53
48
  client.close();
54
49
  ```
55
50
 
56
- ### Error Handling
51
+ ### List subscription history
52
+
53
+ ```typescript
54
+ const history = await client.subscription.list("user_123", {
55
+ page: 1,
56
+ pageSize: 10,
57
+ });
58
+
59
+ for (const item of history.items) {
60
+ console.log(item.plan_name, item.status);
61
+ }
62
+
63
+ console.log(history.hasMore);
64
+ ```
65
+
66
+ ### Cancel a subscription
67
+
68
+ ```typescript
69
+ // Cancel at end of billing period (safe default)
70
+ const result = await client.subscription.cancel("sub_uuid");
71
+ console.log(result.success);
72
+
73
+ // Cancel immediately
74
+ await client.subscription.cancel("sub_uuid", { cancelNow: true });
75
+ ```
76
+
77
+ ### Configuration
57
78
 
58
79
  ```typescript
59
- import { PaylioClient, AuthenticationError, NotFoundError, PaylioError } from "paylio";
80
+ const client = new PaylioClient("sk_live_xxx", {
81
+ baseUrl: "https://custom-api.example.com/v1",
82
+ timeout: 60_000, // 60 seconds
83
+ });
84
+ ```
85
+
86
+ ### Error handling
87
+
88
+ ```typescript
89
+ import {
90
+ PaylioClient,
91
+ AuthenticationError,
92
+ NotFoundError,
93
+ RateLimitError,
94
+ PaylioError,
95
+ } from "paylio";
60
96
 
61
97
  const client = new PaylioClient("sk_live_xxx");
62
98
 
@@ -67,6 +103,8 @@ try {
67
103
  console.error("Invalid API key:", error.message);
68
104
  } else if (error instanceof NotFoundError) {
69
105
  console.error("Subscription not found:", error.message);
106
+ } else if (error instanceof RateLimitError) {
107
+ console.error("Rate limited, try again later");
70
108
  } else if (error instanceof PaylioError) {
71
109
  console.error(`API error ${error.httpStatus}: ${error.message}`);
72
110
  }
@@ -75,28 +113,28 @@ try {
75
113
  client.close();
76
114
  ```
77
115
 
78
- ### Custom Configuration
79
-
80
- ```typescript
81
- const client = new PaylioClient("sk_live_xxx", {
82
- baseUrl: "https://custom.api.com/v1",
83
- timeout: 60_000, // 60 seconds
84
- });
85
- ```
86
-
87
- ## Error Types
116
+ ## Error types
88
117
 
89
118
  | Error | HTTP Status | Description |
90
- |---|---|---|
119
+ |-------|-------------|-------------|
91
120
  | `AuthenticationError` | 401 | Invalid or missing API key |
92
121
  | `InvalidRequestError` | 400 | Bad request parameters |
93
122
  | `NotFoundError` | 404 | Resource not found |
94
123
  | `RateLimitError` | 429 | Rate limit exceeded |
95
- | `APIError` | 5xx | Server error or unexpected response |
124
+ | `APIError` | 5xx | Server error |
96
125
  | `APIConnectionError` | — | Network or connection failure |
97
126
 
98
127
  All errors extend `PaylioError`, which extends `Error`.
99
128
 
129
+ ## Development
130
+
131
+ ```bash
132
+ npm install
133
+ npm test
134
+ npm run typecheck
135
+ npm run lint
136
+ ```
137
+
100
138
  ## License
101
139
 
102
140
  MIT
package/dist/index.cjs CHANGED
@@ -124,7 +124,8 @@ var HTTPClient = class {
124
124
  "X-API-Key": this._apiKey,
125
125
  "Content-Type": "application/json",
126
126
  Accept: "application/json",
127
- "User-Agent": `paylio-node/${VERSION}`
127
+ "User-Agent": `paylio-node/${VERSION}`,
128
+ "X-SDK-Source": "node"
128
129
  };
129
130
  }
130
131
  async _handleResponse(response) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/version.ts","../src/httpClient.ts","../src/paylioObject.ts","../src/resources/subscription.ts","../src/services/subscriptionService.ts","../src/client.ts"],"sourcesContent":["export { PaylioClient } from \"./client.js\";\nexport type { PaylioClientOptions } from \"./client.js\";\n\nexport {\n PaylioError,\n APIError,\n APIConnectionError,\n AuthenticationError,\n InvalidRequestError,\n NotFoundError,\n RateLimitError,\n} from \"./errors.js\";\nexport type { PaylioErrorParams } from \"./errors.js\";\n\nexport { PaylioObject } from \"./paylioObject.js\";\n\nexport {\n Subscription,\n SubscriptionCancel,\n SubscriptionHistoryItem,\n PaginatedList,\n} from \"./resources/subscription.js\";\n\nexport { VERSION } from \"./version.js\";\n","export interface PaylioErrorParams {\n message?: string;\n httpStatus?: number;\n httpBody?: string;\n jsonBody?: Record<string, unknown>;\n headers?: Record<string, string>;\n code?: string;\n}\n\nexport class PaylioError extends Error {\n readonly httpStatus: number | undefined;\n readonly httpBody: string | undefined;\n readonly jsonBody: Record<string, unknown> | undefined;\n readonly headers: Record<string, string>;\n readonly code: string | undefined;\n\n constructor(params?: PaylioErrorParams) {\n const msg = params?.message ?? \"\";\n super(msg);\n this.name = this.constructor.name;\n this.message = msg;\n this.httpStatus = params?.httpStatus;\n this.httpBody = params?.httpBody;\n this.jsonBody = params?.jsonBody;\n this.headers = params?.headers ?? {};\n this.code = params?.code;\n }\n\n override toString(): string {\n return this.message;\n }\n}\n\n/** General API error (5xx or unexpected responses). */\nexport class APIError extends PaylioError {}\n\n/** Invalid or missing API key (401). */\nexport class AuthenticationError extends PaylioError {}\n\n/** Bad request parameters (400). */\nexport class InvalidRequestError extends PaylioError {}\n\n/** Resource not found (404). */\nexport class NotFoundError extends PaylioError {}\n\n/** Rate limit exceeded (429). */\nexport class RateLimitError extends PaylioError {}\n\n/** Network/connection failure. */\nexport class APIConnectionError extends PaylioError {}\n","export const VERSION = \"0.1.0\";\n","import {\n APIConnectionError,\n APIError,\n AuthenticationError,\n InvalidRequestError,\n NotFoundError,\n PaylioError,\n RateLimitError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\nexport const DEFAULT_BASE_URL = \"https://api.paylio.pro/flying/v1\";\nexport const DEFAULT_TIMEOUT = 30_000;\n\nexport interface HTTPClientOptions {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n fetchFn?: typeof fetch;\n}\n\nexport class HTTPClient {\n private readonly _apiKey: string;\n private readonly _baseUrl: string;\n private readonly _timeout: number;\n private readonly _fetchFn: typeof fetch;\n\n constructor(options: HTTPClientOptions) {\n this._apiKey = options.apiKey;\n this._baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this._timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this._fetchFn = options.fetchFn ?? globalThis.fetch;\n }\n\n async request(\n method: string,\n path: string,\n options?: {\n params?: Record<string, string | number>;\n jsonBody?: Record<string, unknown>;\n },\n ): Promise<Record<string, unknown>> {\n const url = new URL(`${this._baseUrl}${path}`);\n if (options?.params) {\n for (const [key, value] of Object.entries(options.params)) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const headers = this._buildHeaders();\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n let response: Response;\n try {\n response = await this._fetchFn(url.toString(), {\n method,\n headers,\n body: options?.jsonBody ? JSON.stringify(options.jsonBody) : undefined,\n signal: controller.signal,\n });\n } catch (error: unknown) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new APIConnectionError({ message: \"Request timed out\" });\n }\n throw new APIConnectionError({\n message: `Connection error: ${error instanceof Error ? error.message : String(error)}`,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n\n return this._handleResponse(response);\n }\n\n private _buildHeaders(): Record<string, string> {\n return {\n \"X-API-Key\": this._apiKey,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": `paylio-node/${VERSION}`,\n };\n }\n\n private async _handleResponse(response: Response): Promise<Record<string, unknown>> {\n const httpStatus = response.status;\n const httpBody = await response.text();\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n let jsonBody: Record<string, unknown> | undefined;\n try {\n jsonBody = JSON.parse(httpBody) as Record<string, unknown>;\n } catch {\n jsonBody = undefined;\n }\n\n if (httpStatus >= 200 && httpStatus < 300) {\n if (!jsonBody) {\n throw new APIError({\n message: \"Invalid JSON in response body\",\n httpStatus,\n httpBody,\n });\n }\n return jsonBody;\n }\n\n // Extract error details — handle all 3 backend response formats:\n // {\"error\": {\"code\": \"...\", \"message\": \"...\"}} (public API v1)\n // {\"error\": \"string\"} (legacy API)\n // {\"detail\": \"string\"} (FastAPI / dashboard)\n let errorCode: string | undefined;\n let errorMessage: string = httpBody;\n\n if (jsonBody) {\n const err = jsonBody[\"error\"];\n if (err && typeof err === \"object\" && !Array.isArray(err)) {\n const errObj = err as Record<string, unknown>;\n errorCode = typeof errObj[\"code\"] === \"string\" ? errObj[\"code\"] : undefined;\n errorMessage =\n typeof errObj[\"message\"] === \"string\" ? (errObj[\"message\"] as string) : httpBody;\n } else if (typeof err === \"string\") {\n errorMessage = err;\n } else if (typeof jsonBody[\"detail\"] === \"string\") {\n errorMessage = jsonBody[\"detail\"] as string;\n }\n }\n\n const ErrorClass = errorClassForStatus(httpStatus);\n throw new ErrorClass({\n message: errorMessage,\n httpStatus,\n httpBody,\n jsonBody,\n headers,\n code: errorCode,\n });\n }\n\n close(): void {\n // No-op for fetch-based client. Included for API parity with Python SDK.\n }\n}\n\nfunction errorClassForStatus(status: number): typeof PaylioError {\n switch (status) {\n case 401:\n return AuthenticationError;\n case 400:\n return InvalidRequestError;\n case 404:\n return NotFoundError;\n case 429:\n return RateLimitError;\n default:\n return APIError;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Base class for Paylio API response objects.\n *\n * Supports both dot-style and bracket-style access:\n * (obj as any).status // dot access\n * obj[\"status\"] // bracket access (via Proxy)\n */\nexport class PaylioObject {\n /** @internal */\n readonly _data: Record<string, unknown>;\n\n constructor(data?: Record<string, unknown>) {\n this._data = {};\n if (data) {\n for (const [key, value] of Object.entries(data)) {\n this._data[key] = PaylioObject._wrap(value);\n }\n }\n\n return new Proxy(this, {\n get(target, prop, receiver) {\n // Let class methods and internals resolve normally via prototype chain\n if (typeof prop === \"symbol\" || typeof prop !== \"string\") {\n return Reflect.get(target, prop, receiver);\n }\n // Prioritize own methods over data keys\n if (prop in target && typeof (target as any)[prop] === \"function\") {\n return (target as any)[prop].bind(target);\n }\n // Internal properties (starting with _) go to the real object\n if (prop.startsWith(\"_\")) {\n return Reflect.get(target, prop, receiver);\n }\n // Data keys\n if (prop in target._data) {\n return target._data[prop];\n }\n // Fallback to prototype chain (constructor, etc.)\n return Reflect.get(target, prop, receiver);\n },\n set(target, prop, value) {\n if (typeof prop === \"string\" && !prop.startsWith(\"_\")) {\n target._data[prop] = value;\n return true;\n }\n return Reflect.set(target, prop, value);\n },\n });\n }\n\n static _wrap(value: unknown): unknown {\n if (value instanceof PaylioObject) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => {\n if (item instanceof PaylioObject) return item;\n if (item !== null && typeof item === \"object\" && !Array.isArray(item)) {\n return new PaylioObject(item as Record<string, unknown>);\n }\n return item;\n });\n }\n if (value !== null && typeof value === \"object\") {\n return new PaylioObject(value as Record<string, unknown>);\n }\n return value;\n }\n\n get(key: string, defaultValue?: unknown): unknown {\n return key in this._data ? this._data[key] : defaultValue;\n }\n\n toDict(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(this._data)) {\n if (value instanceof PaylioObject) {\n result[key] = value.toDict();\n } else if (Array.isArray(value)) {\n result[key] = value.map((item: any) =>\n item instanceof PaylioObject ? item.toDict() : item,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n static constructFrom(data: Record<string, unknown>): PaylioObject {\n return new PaylioObject(data);\n }\n\n toString(): string {\n const id = this._data[\"id\"];\n if (id !== undefined && id !== null) {\n return `<${this.constructor.name} id=${id}>`;\n }\n return `<${this.constructor.name} ${JSON.stringify(this._data)}>`;\n }\n}\n","import { PaylioObject } from \"../paylioObject.js\";\n\nexport class Subscription extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription\";\n}\n\nexport class SubscriptionCancel extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription_cancel\";\n}\n\nexport class SubscriptionHistoryItem extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription_history_item\";\n}\n\nexport class PaginatedList extends PaylioObject {\n static readonly OBJECT_NAME = \"list\";\n\n get hasMore(): boolean {\n const page = this.get(\"page\", 1) as number;\n const totalPages = this.get(\"total_pages\", 1) as number;\n return page < totalPages;\n }\n}\n","import type { HTTPClient } from \"../httpClient.js\";\nimport {\n PaginatedList,\n Subscription,\n SubscriptionCancel,\n SubscriptionHistoryItem,\n} from \"../resources/subscription.js\";\n\nexport class SubscriptionService {\n private readonly _http: HTTPClient;\n\n constructor(httpClient: HTTPClient) {\n this._http = httpClient;\n }\n\n async retrieve(userId: string): Promise<Subscription> {\n if (!userId || !userId.trim()) {\n throw new Error(\"userId is required\");\n }\n const data = await this._http.request(\"GET\", `/subscription/${userId}`);\n return new Subscription(data);\n }\n\n async list(\n userId: string,\n options?: { page?: number; pageSize?: number },\n ): Promise<PaginatedList> {\n if (!userId || !userId.trim()) {\n throw new Error(\"userId is required\");\n }\n\n const params = {\n page: options?.page ?? 1,\n page_size: options?.pageSize ?? 20,\n };\n\n const data = await this._http.request(\"GET\", `/users/${userId}/subscriptions`, { params });\n\n // Convert items to typed objects\n if (data[\"items\"] && Array.isArray(data[\"items\"])) {\n data[\"items\"] = (data[\"items\"] as Record<string, unknown>[]).map(\n (item) => new SubscriptionHistoryItem(item),\n );\n }\n\n return new PaginatedList(data);\n }\n\n async cancel(\n subscriptionId: string,\n options?: { cancelNow?: boolean },\n ): Promise<SubscriptionCancel> {\n if (!subscriptionId || !subscriptionId.trim()) {\n throw new Error(\"subscriptionId is required\");\n }\n\n const cancelNow = options?.cancelNow ?? false;\n const data = await this._http.request(\"POST\", `/subscription/${subscriptionId}/cancel`, {\n jsonBody: { cancel_at_period_end: !cancelNow },\n });\n return new SubscriptionCancel(data);\n }\n}\n","import { AuthenticationError } from \"./errors.js\";\nimport { DEFAULT_BASE_URL, DEFAULT_TIMEOUT, HTTPClient } from \"./httpClient.js\";\nimport { SubscriptionService } from \"./services/subscriptionService.js\";\n\nexport interface PaylioClientOptions {\n baseUrl?: string;\n timeout?: number;\n fetchFn?: typeof fetch;\n}\n\nexport class PaylioClient {\n private readonly _http: HTTPClient;\n readonly subscription: SubscriptionService;\n\n constructor(apiKey: string, options?: PaylioClientOptions) {\n if (!apiKey) {\n throw new AuthenticationError({\n message:\n \"No API key provided. Set your API key when creating \" +\n \"the PaylioClient: new PaylioClient('sk_live_xxx')\",\n });\n }\n\n this._http = new HTTPClient({\n apiKey,\n baseUrl: options?.baseUrl ?? DEFAULT_BASE_URL,\n timeout: options?.timeout ?? DEFAULT_TIMEOUT,\n fetchFn: options?.fetchFn,\n });\n\n this.subscription = new SubscriptionService(this._http);\n }\n\n close(): void {\n this._http.close();\n }\n\n [Symbol.dispose](): void {\n this.close();\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/version.ts","../src/httpClient.ts","../src/paylioObject.ts","../src/resources/subscription.ts","../src/services/subscriptionService.ts","../src/client.ts"],"sourcesContent":["export { PaylioClient } from \"./client.js\";\nexport type { PaylioClientOptions } from \"./client.js\";\n\nexport {\n PaylioError,\n APIError,\n APIConnectionError,\n AuthenticationError,\n InvalidRequestError,\n NotFoundError,\n RateLimitError,\n} from \"./errors.js\";\nexport type { PaylioErrorParams } from \"./errors.js\";\n\nexport { PaylioObject } from \"./paylioObject.js\";\n\nexport {\n Subscription,\n SubscriptionCancel,\n SubscriptionHistoryItem,\n PaginatedList,\n} from \"./resources/subscription.js\";\n\nexport { VERSION } from \"./version.js\";\n","export interface PaylioErrorParams {\n message?: string;\n httpStatus?: number;\n httpBody?: string;\n jsonBody?: Record<string, unknown>;\n headers?: Record<string, string>;\n code?: string;\n}\n\nexport class PaylioError extends Error {\n readonly httpStatus: number | undefined;\n readonly httpBody: string | undefined;\n readonly jsonBody: Record<string, unknown> | undefined;\n readonly headers: Record<string, string>;\n readonly code: string | undefined;\n\n constructor(params?: PaylioErrorParams) {\n const msg = params?.message ?? \"\";\n super(msg);\n this.name = this.constructor.name;\n this.message = msg;\n this.httpStatus = params?.httpStatus;\n this.httpBody = params?.httpBody;\n this.jsonBody = params?.jsonBody;\n this.headers = params?.headers ?? {};\n this.code = params?.code;\n }\n\n override toString(): string {\n return this.message;\n }\n}\n\n/** General API error (5xx or unexpected responses). */\nexport class APIError extends PaylioError {}\n\n/** Invalid or missing API key (401). */\nexport class AuthenticationError extends PaylioError {}\n\n/** Bad request parameters (400). */\nexport class InvalidRequestError extends PaylioError {}\n\n/** Resource not found (404). */\nexport class NotFoundError extends PaylioError {}\n\n/** Rate limit exceeded (429). */\nexport class RateLimitError extends PaylioError {}\n\n/** Network/connection failure. */\nexport class APIConnectionError extends PaylioError {}\n","export const VERSION = \"0.1.0\";\n","import {\n APIConnectionError,\n APIError,\n AuthenticationError,\n InvalidRequestError,\n NotFoundError,\n PaylioError,\n RateLimitError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\nexport const DEFAULT_BASE_URL = \"https://api.paylio.pro/flying/v1\";\nexport const DEFAULT_TIMEOUT = 30_000;\n\nexport interface HTTPClientOptions {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n fetchFn?: typeof fetch;\n}\n\nexport class HTTPClient {\n private readonly _apiKey: string;\n private readonly _baseUrl: string;\n private readonly _timeout: number;\n private readonly _fetchFn: typeof fetch;\n\n constructor(options: HTTPClientOptions) {\n this._apiKey = options.apiKey;\n this._baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this._timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this._fetchFn = options.fetchFn ?? globalThis.fetch;\n }\n\n async request(\n method: string,\n path: string,\n options?: {\n params?: Record<string, string | number>;\n jsonBody?: Record<string, unknown>;\n },\n ): Promise<Record<string, unknown>> {\n const url = new URL(`${this._baseUrl}${path}`);\n if (options?.params) {\n for (const [key, value] of Object.entries(options.params)) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const headers = this._buildHeaders();\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n let response: Response;\n try {\n response = await this._fetchFn(url.toString(), {\n method,\n headers,\n body: options?.jsonBody ? JSON.stringify(options.jsonBody) : undefined,\n signal: controller.signal,\n });\n } catch (error: unknown) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new APIConnectionError({ message: \"Request timed out\" });\n }\n throw new APIConnectionError({\n message: `Connection error: ${error instanceof Error ? error.message : String(error)}`,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n\n return this._handleResponse(response);\n }\n\n private _buildHeaders(): Record<string, string> {\n return {\n \"X-API-Key\": this._apiKey,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": `paylio-node/${VERSION}`,\n \"X-SDK-Source\": \"node\",\n };\n }\n\n private async _handleResponse(response: Response): Promise<Record<string, unknown>> {\n const httpStatus = response.status;\n const httpBody = await response.text();\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n let jsonBody: Record<string, unknown> | undefined;\n try {\n jsonBody = JSON.parse(httpBody) as Record<string, unknown>;\n } catch {\n jsonBody = undefined;\n }\n\n if (httpStatus >= 200 && httpStatus < 300) {\n if (!jsonBody) {\n throw new APIError({\n message: \"Invalid JSON in response body\",\n httpStatus,\n httpBody,\n });\n }\n return jsonBody;\n }\n\n // Extract error details — handle all 3 backend response formats:\n // {\"error\": {\"code\": \"...\", \"message\": \"...\"}} (public API v1)\n // {\"error\": \"string\"} (legacy API)\n // {\"detail\": \"string\"} (FastAPI / dashboard)\n let errorCode: string | undefined;\n let errorMessage: string = httpBody;\n\n if (jsonBody) {\n const err = jsonBody[\"error\"];\n if (err && typeof err === \"object\" && !Array.isArray(err)) {\n const errObj = err as Record<string, unknown>;\n errorCode = typeof errObj[\"code\"] === \"string\" ? errObj[\"code\"] : undefined;\n errorMessage =\n typeof errObj[\"message\"] === \"string\" ? (errObj[\"message\"] as string) : httpBody;\n } else if (typeof err === \"string\") {\n errorMessage = err;\n } else if (typeof jsonBody[\"detail\"] === \"string\") {\n errorMessage = jsonBody[\"detail\"] as string;\n }\n }\n\n const ErrorClass = errorClassForStatus(httpStatus);\n throw new ErrorClass({\n message: errorMessage,\n httpStatus,\n httpBody,\n jsonBody,\n headers,\n code: errorCode,\n });\n }\n\n close(): void {\n // No-op for fetch-based client. Included for API parity with Python SDK.\n }\n}\n\nfunction errorClassForStatus(status: number): typeof PaylioError {\n switch (status) {\n case 401:\n return AuthenticationError;\n case 400:\n return InvalidRequestError;\n case 404:\n return NotFoundError;\n case 429:\n return RateLimitError;\n default:\n return APIError;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Base class for Paylio API response objects.\n *\n * Supports both dot-style and bracket-style access:\n * (obj as any).status // dot access\n * obj[\"status\"] // bracket access (via Proxy)\n */\nexport class PaylioObject {\n /** @internal */\n readonly _data: Record<string, unknown>;\n\n constructor(data?: Record<string, unknown>) {\n this._data = {};\n if (data) {\n for (const [key, value] of Object.entries(data)) {\n this._data[key] = PaylioObject._wrap(value);\n }\n }\n\n return new Proxy(this, {\n get(target, prop, receiver) {\n // Let class methods and internals resolve normally via prototype chain\n if (typeof prop === \"symbol\" || typeof prop !== \"string\") {\n return Reflect.get(target, prop, receiver);\n }\n // Prioritize own methods over data keys\n if (prop in target && typeof (target as any)[prop] === \"function\") {\n return (target as any)[prop].bind(target);\n }\n // Internal properties (starting with _) go to the real object\n if (prop.startsWith(\"_\")) {\n return Reflect.get(target, prop, receiver);\n }\n // Data keys\n if (prop in target._data) {\n return target._data[prop];\n }\n // Fallback to prototype chain (constructor, etc.)\n return Reflect.get(target, prop, receiver);\n },\n set(target, prop, value) {\n if (typeof prop === \"string\" && !prop.startsWith(\"_\")) {\n target._data[prop] = value;\n return true;\n }\n return Reflect.set(target, prop, value);\n },\n });\n }\n\n static _wrap(value: unknown): unknown {\n if (value instanceof PaylioObject) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => {\n if (item instanceof PaylioObject) return item;\n if (item !== null && typeof item === \"object\" && !Array.isArray(item)) {\n return new PaylioObject(item as Record<string, unknown>);\n }\n return item;\n });\n }\n if (value !== null && typeof value === \"object\") {\n return new PaylioObject(value as Record<string, unknown>);\n }\n return value;\n }\n\n get(key: string, defaultValue?: unknown): unknown {\n return key in this._data ? this._data[key] : defaultValue;\n }\n\n toDict(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(this._data)) {\n if (value instanceof PaylioObject) {\n result[key] = value.toDict();\n } else if (Array.isArray(value)) {\n result[key] = value.map((item: any) =>\n item instanceof PaylioObject ? item.toDict() : item,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n static constructFrom(data: Record<string, unknown>): PaylioObject {\n return new PaylioObject(data);\n }\n\n toString(): string {\n const id = this._data[\"id\"];\n if (id !== undefined && id !== null) {\n return `<${this.constructor.name} id=${id}>`;\n }\n return `<${this.constructor.name} ${JSON.stringify(this._data)}>`;\n }\n}\n","import { PaylioObject } from \"../paylioObject.js\";\n\nexport class Subscription extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription\";\n}\n\nexport class SubscriptionCancel extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription_cancel\";\n}\n\nexport class SubscriptionHistoryItem extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription_history_item\";\n}\n\nexport class PaginatedList extends PaylioObject {\n static readonly OBJECT_NAME = \"list\";\n\n get hasMore(): boolean {\n const page = this.get(\"page\", 1) as number;\n const totalPages = this.get(\"total_pages\", 1) as number;\n return page < totalPages;\n }\n}\n","import type { HTTPClient } from \"../httpClient.js\";\nimport {\n PaginatedList,\n Subscription,\n SubscriptionCancel,\n SubscriptionHistoryItem,\n} from \"../resources/subscription.js\";\n\nexport class SubscriptionService {\n private readonly _http: HTTPClient;\n\n constructor(httpClient: HTTPClient) {\n this._http = httpClient;\n }\n\n async retrieve(userId: string): Promise<Subscription> {\n if (!userId || !userId.trim()) {\n throw new Error(\"userId is required\");\n }\n const data = await this._http.request(\"GET\", `/subscription/${userId}`);\n return new Subscription(data);\n }\n\n async list(\n userId: string,\n options?: { page?: number; pageSize?: number },\n ): Promise<PaginatedList> {\n if (!userId || !userId.trim()) {\n throw new Error(\"userId is required\");\n }\n\n const params = {\n page: options?.page ?? 1,\n page_size: options?.pageSize ?? 20,\n };\n\n const data = await this._http.request(\"GET\", `/users/${userId}/subscriptions`, { params });\n\n // Convert items to typed objects\n if (data[\"items\"] && Array.isArray(data[\"items\"])) {\n data[\"items\"] = (data[\"items\"] as Record<string, unknown>[]).map(\n (item) => new SubscriptionHistoryItem(item),\n );\n }\n\n return new PaginatedList(data);\n }\n\n async cancel(\n subscriptionId: string,\n options?: { cancelNow?: boolean },\n ): Promise<SubscriptionCancel> {\n if (!subscriptionId || !subscriptionId.trim()) {\n throw new Error(\"subscriptionId is required\");\n }\n\n const cancelNow = options?.cancelNow ?? false;\n const data = await this._http.request(\"POST\", `/subscription/${subscriptionId}/cancel`, {\n jsonBody: { cancel_at_period_end: !cancelNow },\n });\n return new SubscriptionCancel(data);\n }\n}\n","import { AuthenticationError } from \"./errors.js\";\nimport { DEFAULT_BASE_URL, DEFAULT_TIMEOUT, HTTPClient } from \"./httpClient.js\";\nimport { SubscriptionService } from \"./services/subscriptionService.js\";\n\nexport interface PaylioClientOptions {\n baseUrl?: string;\n timeout?: number;\n fetchFn?: typeof fetch;\n}\n\nexport class PaylioClient {\n private readonly _http: HTTPClient;\n readonly subscription: SubscriptionService;\n\n constructor(apiKey: string, options?: PaylioClientOptions) {\n if (!apiKey) {\n throw new AuthenticationError({\n message:\n \"No API key provided. Set your API key when creating \" +\n \"the PaylioClient: new PaylioClient('sk_live_xxx')\",\n });\n }\n\n this._http = new HTTPClient({\n apiKey,\n baseUrl: options?.baseUrl ?? DEFAULT_BASE_URL,\n timeout: options?.timeout ?? DEFAULT_TIMEOUT,\n fetchFn: options?.fetchFn,\n });\n\n this.subscription = new SubscriptionService(this._http);\n }\n\n close(): void {\n this._http.close();\n }\n\n [Symbol.dispose](): void {\n this.close();\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -85,7 +85,8 @@ var HTTPClient = class {
85
85
  "X-API-Key": this._apiKey,
86
86
  "Content-Type": "application/json",
87
87
  Accept: "application/json",
88
- "User-Agent": `paylio-node/${VERSION}`
88
+ "User-Agent": `paylio-node/${VERSION}`,
89
+ "X-SDK-Source": "node"
89
90
  };
90
91
  }
91
92
  async _handleResponse(response) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/httpClient.ts","../src/paylioObject.ts","../src/resources/subscription.ts","../src/services/subscriptionService.ts","../src/client.ts"],"sourcesContent":["export interface PaylioErrorParams {\n message?: string;\n httpStatus?: number;\n httpBody?: string;\n jsonBody?: Record<string, unknown>;\n headers?: Record<string, string>;\n code?: string;\n}\n\nexport class PaylioError extends Error {\n readonly httpStatus: number | undefined;\n readonly httpBody: string | undefined;\n readonly jsonBody: Record<string, unknown> | undefined;\n readonly headers: Record<string, string>;\n readonly code: string | undefined;\n\n constructor(params?: PaylioErrorParams) {\n const msg = params?.message ?? \"\";\n super(msg);\n this.name = this.constructor.name;\n this.message = msg;\n this.httpStatus = params?.httpStatus;\n this.httpBody = params?.httpBody;\n this.jsonBody = params?.jsonBody;\n this.headers = params?.headers ?? {};\n this.code = params?.code;\n }\n\n override toString(): string {\n return this.message;\n }\n}\n\n/** General API error (5xx or unexpected responses). */\nexport class APIError extends PaylioError {}\n\n/** Invalid or missing API key (401). */\nexport class AuthenticationError extends PaylioError {}\n\n/** Bad request parameters (400). */\nexport class InvalidRequestError extends PaylioError {}\n\n/** Resource not found (404). */\nexport class NotFoundError extends PaylioError {}\n\n/** Rate limit exceeded (429). */\nexport class RateLimitError extends PaylioError {}\n\n/** Network/connection failure. */\nexport class APIConnectionError extends PaylioError {}\n","export const VERSION = \"0.1.0\";\n","import {\n APIConnectionError,\n APIError,\n AuthenticationError,\n InvalidRequestError,\n NotFoundError,\n PaylioError,\n RateLimitError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\nexport const DEFAULT_BASE_URL = \"https://api.paylio.pro/flying/v1\";\nexport const DEFAULT_TIMEOUT = 30_000;\n\nexport interface HTTPClientOptions {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n fetchFn?: typeof fetch;\n}\n\nexport class HTTPClient {\n private readonly _apiKey: string;\n private readonly _baseUrl: string;\n private readonly _timeout: number;\n private readonly _fetchFn: typeof fetch;\n\n constructor(options: HTTPClientOptions) {\n this._apiKey = options.apiKey;\n this._baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this._timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this._fetchFn = options.fetchFn ?? globalThis.fetch;\n }\n\n async request(\n method: string,\n path: string,\n options?: {\n params?: Record<string, string | number>;\n jsonBody?: Record<string, unknown>;\n },\n ): Promise<Record<string, unknown>> {\n const url = new URL(`${this._baseUrl}${path}`);\n if (options?.params) {\n for (const [key, value] of Object.entries(options.params)) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const headers = this._buildHeaders();\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n let response: Response;\n try {\n response = await this._fetchFn(url.toString(), {\n method,\n headers,\n body: options?.jsonBody ? JSON.stringify(options.jsonBody) : undefined,\n signal: controller.signal,\n });\n } catch (error: unknown) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new APIConnectionError({ message: \"Request timed out\" });\n }\n throw new APIConnectionError({\n message: `Connection error: ${error instanceof Error ? error.message : String(error)}`,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n\n return this._handleResponse(response);\n }\n\n private _buildHeaders(): Record<string, string> {\n return {\n \"X-API-Key\": this._apiKey,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": `paylio-node/${VERSION}`,\n };\n }\n\n private async _handleResponse(response: Response): Promise<Record<string, unknown>> {\n const httpStatus = response.status;\n const httpBody = await response.text();\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n let jsonBody: Record<string, unknown> | undefined;\n try {\n jsonBody = JSON.parse(httpBody) as Record<string, unknown>;\n } catch {\n jsonBody = undefined;\n }\n\n if (httpStatus >= 200 && httpStatus < 300) {\n if (!jsonBody) {\n throw new APIError({\n message: \"Invalid JSON in response body\",\n httpStatus,\n httpBody,\n });\n }\n return jsonBody;\n }\n\n // Extract error details — handle all 3 backend response formats:\n // {\"error\": {\"code\": \"...\", \"message\": \"...\"}} (public API v1)\n // {\"error\": \"string\"} (legacy API)\n // {\"detail\": \"string\"} (FastAPI / dashboard)\n let errorCode: string | undefined;\n let errorMessage: string = httpBody;\n\n if (jsonBody) {\n const err = jsonBody[\"error\"];\n if (err && typeof err === \"object\" && !Array.isArray(err)) {\n const errObj = err as Record<string, unknown>;\n errorCode = typeof errObj[\"code\"] === \"string\" ? errObj[\"code\"] : undefined;\n errorMessage =\n typeof errObj[\"message\"] === \"string\" ? (errObj[\"message\"] as string) : httpBody;\n } else if (typeof err === \"string\") {\n errorMessage = err;\n } else if (typeof jsonBody[\"detail\"] === \"string\") {\n errorMessage = jsonBody[\"detail\"] as string;\n }\n }\n\n const ErrorClass = errorClassForStatus(httpStatus);\n throw new ErrorClass({\n message: errorMessage,\n httpStatus,\n httpBody,\n jsonBody,\n headers,\n code: errorCode,\n });\n }\n\n close(): void {\n // No-op for fetch-based client. Included for API parity with Python SDK.\n }\n}\n\nfunction errorClassForStatus(status: number): typeof PaylioError {\n switch (status) {\n case 401:\n return AuthenticationError;\n case 400:\n return InvalidRequestError;\n case 404:\n return NotFoundError;\n case 429:\n return RateLimitError;\n default:\n return APIError;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Base class for Paylio API response objects.\n *\n * Supports both dot-style and bracket-style access:\n * (obj as any).status // dot access\n * obj[\"status\"] // bracket access (via Proxy)\n */\nexport class PaylioObject {\n /** @internal */\n readonly _data: Record<string, unknown>;\n\n constructor(data?: Record<string, unknown>) {\n this._data = {};\n if (data) {\n for (const [key, value] of Object.entries(data)) {\n this._data[key] = PaylioObject._wrap(value);\n }\n }\n\n return new Proxy(this, {\n get(target, prop, receiver) {\n // Let class methods and internals resolve normally via prototype chain\n if (typeof prop === \"symbol\" || typeof prop !== \"string\") {\n return Reflect.get(target, prop, receiver);\n }\n // Prioritize own methods over data keys\n if (prop in target && typeof (target as any)[prop] === \"function\") {\n return (target as any)[prop].bind(target);\n }\n // Internal properties (starting with _) go to the real object\n if (prop.startsWith(\"_\")) {\n return Reflect.get(target, prop, receiver);\n }\n // Data keys\n if (prop in target._data) {\n return target._data[prop];\n }\n // Fallback to prototype chain (constructor, etc.)\n return Reflect.get(target, prop, receiver);\n },\n set(target, prop, value) {\n if (typeof prop === \"string\" && !prop.startsWith(\"_\")) {\n target._data[prop] = value;\n return true;\n }\n return Reflect.set(target, prop, value);\n },\n });\n }\n\n static _wrap(value: unknown): unknown {\n if (value instanceof PaylioObject) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => {\n if (item instanceof PaylioObject) return item;\n if (item !== null && typeof item === \"object\" && !Array.isArray(item)) {\n return new PaylioObject(item as Record<string, unknown>);\n }\n return item;\n });\n }\n if (value !== null && typeof value === \"object\") {\n return new PaylioObject(value as Record<string, unknown>);\n }\n return value;\n }\n\n get(key: string, defaultValue?: unknown): unknown {\n return key in this._data ? this._data[key] : defaultValue;\n }\n\n toDict(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(this._data)) {\n if (value instanceof PaylioObject) {\n result[key] = value.toDict();\n } else if (Array.isArray(value)) {\n result[key] = value.map((item: any) =>\n item instanceof PaylioObject ? item.toDict() : item,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n static constructFrom(data: Record<string, unknown>): PaylioObject {\n return new PaylioObject(data);\n }\n\n toString(): string {\n const id = this._data[\"id\"];\n if (id !== undefined && id !== null) {\n return `<${this.constructor.name} id=${id}>`;\n }\n return `<${this.constructor.name} ${JSON.stringify(this._data)}>`;\n }\n}\n","import { PaylioObject } from \"../paylioObject.js\";\n\nexport class Subscription extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription\";\n}\n\nexport class SubscriptionCancel extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription_cancel\";\n}\n\nexport class SubscriptionHistoryItem extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription_history_item\";\n}\n\nexport class PaginatedList extends PaylioObject {\n static readonly OBJECT_NAME = \"list\";\n\n get hasMore(): boolean {\n const page = this.get(\"page\", 1) as number;\n const totalPages = this.get(\"total_pages\", 1) as number;\n return page < totalPages;\n }\n}\n","import type { HTTPClient } from \"../httpClient.js\";\nimport {\n PaginatedList,\n Subscription,\n SubscriptionCancel,\n SubscriptionHistoryItem,\n} from \"../resources/subscription.js\";\n\nexport class SubscriptionService {\n private readonly _http: HTTPClient;\n\n constructor(httpClient: HTTPClient) {\n this._http = httpClient;\n }\n\n async retrieve(userId: string): Promise<Subscription> {\n if (!userId || !userId.trim()) {\n throw new Error(\"userId is required\");\n }\n const data = await this._http.request(\"GET\", `/subscription/${userId}`);\n return new Subscription(data);\n }\n\n async list(\n userId: string,\n options?: { page?: number; pageSize?: number },\n ): Promise<PaginatedList> {\n if (!userId || !userId.trim()) {\n throw new Error(\"userId is required\");\n }\n\n const params = {\n page: options?.page ?? 1,\n page_size: options?.pageSize ?? 20,\n };\n\n const data = await this._http.request(\"GET\", `/users/${userId}/subscriptions`, { params });\n\n // Convert items to typed objects\n if (data[\"items\"] && Array.isArray(data[\"items\"])) {\n data[\"items\"] = (data[\"items\"] as Record<string, unknown>[]).map(\n (item) => new SubscriptionHistoryItem(item),\n );\n }\n\n return new PaginatedList(data);\n }\n\n async cancel(\n subscriptionId: string,\n options?: { cancelNow?: boolean },\n ): Promise<SubscriptionCancel> {\n if (!subscriptionId || !subscriptionId.trim()) {\n throw new Error(\"subscriptionId is required\");\n }\n\n const cancelNow = options?.cancelNow ?? false;\n const data = await this._http.request(\"POST\", `/subscription/${subscriptionId}/cancel`, {\n jsonBody: { cancel_at_period_end: !cancelNow },\n });\n return new SubscriptionCancel(data);\n }\n}\n","import { AuthenticationError } from \"./errors.js\";\nimport { DEFAULT_BASE_URL, DEFAULT_TIMEOUT, HTTPClient } from \"./httpClient.js\";\nimport { SubscriptionService } from \"./services/subscriptionService.js\";\n\nexport interface PaylioClientOptions {\n baseUrl?: string;\n timeout?: number;\n fetchFn?: typeof fetch;\n}\n\nexport class PaylioClient {\n private readonly _http: HTTPClient;\n readonly subscription: SubscriptionService;\n\n constructor(apiKey: string, options?: PaylioClientOptions) {\n if (!apiKey) {\n throw new AuthenticationError({\n message:\n \"No API key provided. Set your API key when creating \" +\n \"the PaylioClient: new PaylioClient('sk_live_xxx')\",\n });\n }\n\n this._http = new HTTPClient({\n apiKey,\n baseUrl: options?.baseUrl ?? DEFAULT_BASE_URL,\n timeout: options?.timeout ?? DEFAULT_TIMEOUT,\n fetchFn: options?.fetchFn,\n });\n\n this.subscription = new SubscriptionService(this._http);\n }\n\n close(): void {\n this._http.close();\n }\n\n [Symbol.dispose](): void {\n this.close();\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/httpClient.ts","../src/paylioObject.ts","../src/resources/subscription.ts","../src/services/subscriptionService.ts","../src/client.ts"],"sourcesContent":["export interface PaylioErrorParams {\n message?: string;\n httpStatus?: number;\n httpBody?: string;\n jsonBody?: Record<string, unknown>;\n headers?: Record<string, string>;\n code?: string;\n}\n\nexport class PaylioError extends Error {\n readonly httpStatus: number | undefined;\n readonly httpBody: string | undefined;\n readonly jsonBody: Record<string, unknown> | undefined;\n readonly headers: Record<string, string>;\n readonly code: string | undefined;\n\n constructor(params?: PaylioErrorParams) {\n const msg = params?.message ?? \"\";\n super(msg);\n this.name = this.constructor.name;\n this.message = msg;\n this.httpStatus = params?.httpStatus;\n this.httpBody = params?.httpBody;\n this.jsonBody = params?.jsonBody;\n this.headers = params?.headers ?? {};\n this.code = params?.code;\n }\n\n override toString(): string {\n return this.message;\n }\n}\n\n/** General API error (5xx or unexpected responses). */\nexport class APIError extends PaylioError {}\n\n/** Invalid or missing API key (401). */\nexport class AuthenticationError extends PaylioError {}\n\n/** Bad request parameters (400). */\nexport class InvalidRequestError extends PaylioError {}\n\n/** Resource not found (404). */\nexport class NotFoundError extends PaylioError {}\n\n/** Rate limit exceeded (429). */\nexport class RateLimitError extends PaylioError {}\n\n/** Network/connection failure. */\nexport class APIConnectionError extends PaylioError {}\n","export const VERSION = \"0.1.0\";\n","import {\n APIConnectionError,\n APIError,\n AuthenticationError,\n InvalidRequestError,\n NotFoundError,\n PaylioError,\n RateLimitError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\nexport const DEFAULT_BASE_URL = \"https://api.paylio.pro/flying/v1\";\nexport const DEFAULT_TIMEOUT = 30_000;\n\nexport interface HTTPClientOptions {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n fetchFn?: typeof fetch;\n}\n\nexport class HTTPClient {\n private readonly _apiKey: string;\n private readonly _baseUrl: string;\n private readonly _timeout: number;\n private readonly _fetchFn: typeof fetch;\n\n constructor(options: HTTPClientOptions) {\n this._apiKey = options.apiKey;\n this._baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this._timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this._fetchFn = options.fetchFn ?? globalThis.fetch;\n }\n\n async request(\n method: string,\n path: string,\n options?: {\n params?: Record<string, string | number>;\n jsonBody?: Record<string, unknown>;\n },\n ): Promise<Record<string, unknown>> {\n const url = new URL(`${this._baseUrl}${path}`);\n if (options?.params) {\n for (const [key, value] of Object.entries(options.params)) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const headers = this._buildHeaders();\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n let response: Response;\n try {\n response = await this._fetchFn(url.toString(), {\n method,\n headers,\n body: options?.jsonBody ? JSON.stringify(options.jsonBody) : undefined,\n signal: controller.signal,\n });\n } catch (error: unknown) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new APIConnectionError({ message: \"Request timed out\" });\n }\n throw new APIConnectionError({\n message: `Connection error: ${error instanceof Error ? error.message : String(error)}`,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n\n return this._handleResponse(response);\n }\n\n private _buildHeaders(): Record<string, string> {\n return {\n \"X-API-Key\": this._apiKey,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": `paylio-node/${VERSION}`,\n \"X-SDK-Source\": \"node\",\n };\n }\n\n private async _handleResponse(response: Response): Promise<Record<string, unknown>> {\n const httpStatus = response.status;\n const httpBody = await response.text();\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n let jsonBody: Record<string, unknown> | undefined;\n try {\n jsonBody = JSON.parse(httpBody) as Record<string, unknown>;\n } catch {\n jsonBody = undefined;\n }\n\n if (httpStatus >= 200 && httpStatus < 300) {\n if (!jsonBody) {\n throw new APIError({\n message: \"Invalid JSON in response body\",\n httpStatus,\n httpBody,\n });\n }\n return jsonBody;\n }\n\n // Extract error details — handle all 3 backend response formats:\n // {\"error\": {\"code\": \"...\", \"message\": \"...\"}} (public API v1)\n // {\"error\": \"string\"} (legacy API)\n // {\"detail\": \"string\"} (FastAPI / dashboard)\n let errorCode: string | undefined;\n let errorMessage: string = httpBody;\n\n if (jsonBody) {\n const err = jsonBody[\"error\"];\n if (err && typeof err === \"object\" && !Array.isArray(err)) {\n const errObj = err as Record<string, unknown>;\n errorCode = typeof errObj[\"code\"] === \"string\" ? errObj[\"code\"] : undefined;\n errorMessage =\n typeof errObj[\"message\"] === \"string\" ? (errObj[\"message\"] as string) : httpBody;\n } else if (typeof err === \"string\") {\n errorMessage = err;\n } else if (typeof jsonBody[\"detail\"] === \"string\") {\n errorMessage = jsonBody[\"detail\"] as string;\n }\n }\n\n const ErrorClass = errorClassForStatus(httpStatus);\n throw new ErrorClass({\n message: errorMessage,\n httpStatus,\n httpBody,\n jsonBody,\n headers,\n code: errorCode,\n });\n }\n\n close(): void {\n // No-op for fetch-based client. Included for API parity with Python SDK.\n }\n}\n\nfunction errorClassForStatus(status: number): typeof PaylioError {\n switch (status) {\n case 401:\n return AuthenticationError;\n case 400:\n return InvalidRequestError;\n case 404:\n return NotFoundError;\n case 429:\n return RateLimitError;\n default:\n return APIError;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Base class for Paylio API response objects.\n *\n * Supports both dot-style and bracket-style access:\n * (obj as any).status // dot access\n * obj[\"status\"] // bracket access (via Proxy)\n */\nexport class PaylioObject {\n /** @internal */\n readonly _data: Record<string, unknown>;\n\n constructor(data?: Record<string, unknown>) {\n this._data = {};\n if (data) {\n for (const [key, value] of Object.entries(data)) {\n this._data[key] = PaylioObject._wrap(value);\n }\n }\n\n return new Proxy(this, {\n get(target, prop, receiver) {\n // Let class methods and internals resolve normally via prototype chain\n if (typeof prop === \"symbol\" || typeof prop !== \"string\") {\n return Reflect.get(target, prop, receiver);\n }\n // Prioritize own methods over data keys\n if (prop in target && typeof (target as any)[prop] === \"function\") {\n return (target as any)[prop].bind(target);\n }\n // Internal properties (starting with _) go to the real object\n if (prop.startsWith(\"_\")) {\n return Reflect.get(target, prop, receiver);\n }\n // Data keys\n if (prop in target._data) {\n return target._data[prop];\n }\n // Fallback to prototype chain (constructor, etc.)\n return Reflect.get(target, prop, receiver);\n },\n set(target, prop, value) {\n if (typeof prop === \"string\" && !prop.startsWith(\"_\")) {\n target._data[prop] = value;\n return true;\n }\n return Reflect.set(target, prop, value);\n },\n });\n }\n\n static _wrap(value: unknown): unknown {\n if (value instanceof PaylioObject) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => {\n if (item instanceof PaylioObject) return item;\n if (item !== null && typeof item === \"object\" && !Array.isArray(item)) {\n return new PaylioObject(item as Record<string, unknown>);\n }\n return item;\n });\n }\n if (value !== null && typeof value === \"object\") {\n return new PaylioObject(value as Record<string, unknown>);\n }\n return value;\n }\n\n get(key: string, defaultValue?: unknown): unknown {\n return key in this._data ? this._data[key] : defaultValue;\n }\n\n toDict(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(this._data)) {\n if (value instanceof PaylioObject) {\n result[key] = value.toDict();\n } else if (Array.isArray(value)) {\n result[key] = value.map((item: any) =>\n item instanceof PaylioObject ? item.toDict() : item,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n static constructFrom(data: Record<string, unknown>): PaylioObject {\n return new PaylioObject(data);\n }\n\n toString(): string {\n const id = this._data[\"id\"];\n if (id !== undefined && id !== null) {\n return `<${this.constructor.name} id=${id}>`;\n }\n return `<${this.constructor.name} ${JSON.stringify(this._data)}>`;\n }\n}\n","import { PaylioObject } from \"../paylioObject.js\";\n\nexport class Subscription extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription\";\n}\n\nexport class SubscriptionCancel extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription_cancel\";\n}\n\nexport class SubscriptionHistoryItem extends PaylioObject {\n static readonly OBJECT_NAME = \"subscription_history_item\";\n}\n\nexport class PaginatedList extends PaylioObject {\n static readonly OBJECT_NAME = \"list\";\n\n get hasMore(): boolean {\n const page = this.get(\"page\", 1) as number;\n const totalPages = this.get(\"total_pages\", 1) as number;\n return page < totalPages;\n }\n}\n","import type { HTTPClient } from \"../httpClient.js\";\nimport {\n PaginatedList,\n Subscription,\n SubscriptionCancel,\n SubscriptionHistoryItem,\n} from \"../resources/subscription.js\";\n\nexport class SubscriptionService {\n private readonly _http: HTTPClient;\n\n constructor(httpClient: HTTPClient) {\n this._http = httpClient;\n }\n\n async retrieve(userId: string): Promise<Subscription> {\n if (!userId || !userId.trim()) {\n throw new Error(\"userId is required\");\n }\n const data = await this._http.request(\"GET\", `/subscription/${userId}`);\n return new Subscription(data);\n }\n\n async list(\n userId: string,\n options?: { page?: number; pageSize?: number },\n ): Promise<PaginatedList> {\n if (!userId || !userId.trim()) {\n throw new Error(\"userId is required\");\n }\n\n const params = {\n page: options?.page ?? 1,\n page_size: options?.pageSize ?? 20,\n };\n\n const data = await this._http.request(\"GET\", `/users/${userId}/subscriptions`, { params });\n\n // Convert items to typed objects\n if (data[\"items\"] && Array.isArray(data[\"items\"])) {\n data[\"items\"] = (data[\"items\"] as Record<string, unknown>[]).map(\n (item) => new SubscriptionHistoryItem(item),\n );\n }\n\n return new PaginatedList(data);\n }\n\n async cancel(\n subscriptionId: string,\n options?: { cancelNow?: boolean },\n ): Promise<SubscriptionCancel> {\n if (!subscriptionId || !subscriptionId.trim()) {\n throw new Error(\"subscriptionId is required\");\n }\n\n const cancelNow = options?.cancelNow ?? false;\n const data = await this._http.request(\"POST\", `/subscription/${subscriptionId}/cancel`, {\n jsonBody: { cancel_at_period_end: !cancelNow },\n });\n return new SubscriptionCancel(data);\n }\n}\n","import { AuthenticationError } from \"./errors.js\";\nimport { DEFAULT_BASE_URL, DEFAULT_TIMEOUT, HTTPClient } from \"./httpClient.js\";\nimport { SubscriptionService } from \"./services/subscriptionService.js\";\n\nexport interface PaylioClientOptions {\n baseUrl?: string;\n timeout?: number;\n fetchFn?: typeof fetch;\n}\n\nexport class PaylioClient {\n private readonly _http: HTTPClient;\n readonly subscription: SubscriptionService;\n\n constructor(apiKey: string, options?: PaylioClientOptions) {\n if (!apiKey) {\n throw new AuthenticationError({\n message:\n \"No API key provided. Set your API key when creating \" +\n \"the PaylioClient: new PaylioClient('sk_live_xxx')\",\n });\n }\n\n this._http = new HTTPClient({\n apiKey,\n baseUrl: options?.baseUrl ?? DEFAULT_BASE_URL,\n timeout: options?.timeout ?? DEFAULT_TIMEOUT,\n fetchFn: options?.fetchFn,\n });\n\n this.subscription = new SubscriptionService(this._http);\n }\n\n close(): void {\n this._http.close();\n }\n\n [Symbol.dispose](): void {\n this.close();\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paylio",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Node.js/TypeScript client library for the Paylio API",
5
5
  "type": "module",
6
6
  "exports": {