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 +70 -32
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
# Paylio Node.js SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/paylio)
|
|
4
|
+
[](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
|
|
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
|
|
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
|
|
27
|
-
|
|
28
|
-
//
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -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) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -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":[]}
|