perspectapi-ts-sdk 5.0.0 → 5.0.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/dist/index.d.mts CHANGED
@@ -191,7 +191,6 @@ interface CreateNewsletterSubscriptionRequest {
191
191
  language?: string;
192
192
  source?: string;
193
193
  source_url?: string;
194
- double_opt_in?: boolean;
195
194
  metadata?: Record<string, any>;
196
195
  }
197
196
  interface NewsletterList {
@@ -2466,7 +2465,6 @@ declare class NewsletterManagementClient extends BaseClient {
2466
2465
  description?: string | null;
2467
2466
  is_public?: boolean;
2468
2467
  is_default?: boolean;
2469
- double_opt_in?: boolean;
2470
2468
  welcome_email_enabled?: boolean;
2471
2469
  }): Promise<ApiResponse<NewsletterManagementList>>;
2472
2470
  updateList(siteName: string, listId: string, data: Partial<{
@@ -2475,7 +2473,6 @@ declare class NewsletterManagementClient extends BaseClient {
2475
2473
  description: string | null;
2476
2474
  is_public: boolean;
2477
2475
  is_default: boolean;
2478
- double_opt_in: boolean;
2479
2476
  welcome_email_enabled: boolean;
2480
2477
  status: 'active' | 'archived';
2481
2478
  }>): Promise<ApiResponse<NewsletterManagementList>>;
@@ -3427,6 +3424,18 @@ declare abstract class BaseV2Client {
3427
3424
  protected buildPath(endpoint: string): string;
3428
3425
  protected sitePath(siteName: string, resource: string, suffix?: string): string;
3429
3426
  private toParams;
3427
+ /**
3428
+ * Extract v2 payload from HttpClient response.
3429
+ *
3430
+ * The shared HttpClient wraps responses in a v1-style { success, data } envelope.
3431
+ * v2 API responses don't have a `success` field — the HttpClient already throws
3432
+ * on HTTP errors, so if we reach this point the request succeeded.
3433
+ *
3434
+ * The HttpClient may return the v2 payload nested under `data` (when the response
3435
+ * JSON contains a `data` key, which v2 list responses do) or as a direct wrap.
3436
+ * We unwrap accordingly.
3437
+ */
3438
+ private extractData;
3430
3439
  /** GET a single resource. */
3431
3440
  protected getOne<T>(path: string, params?: object): Promise<T>;
3432
3441
  /** GET a list of resources with cursor pagination. */
@@ -3559,7 +3568,6 @@ declare class NewsletterV2Client extends BaseV2Client {
3559
3568
  email: string;
3560
3569
  name?: string;
3561
3570
  list_ids?: string[];
3562
- double_opt_in?: boolean;
3563
3571
  source?: string;
3564
3572
  source_url?: string;
3565
3573
  frequency?: 'instant' | 'daily' | 'weekly' | 'monthly';
package/dist/index.d.ts CHANGED
@@ -191,7 +191,6 @@ interface CreateNewsletterSubscriptionRequest {
191
191
  language?: string;
192
192
  source?: string;
193
193
  source_url?: string;
194
- double_opt_in?: boolean;
195
194
  metadata?: Record<string, any>;
196
195
  }
197
196
  interface NewsletterList {
@@ -2466,7 +2465,6 @@ declare class NewsletterManagementClient extends BaseClient {
2466
2465
  description?: string | null;
2467
2466
  is_public?: boolean;
2468
2467
  is_default?: boolean;
2469
- double_opt_in?: boolean;
2470
2468
  welcome_email_enabled?: boolean;
2471
2469
  }): Promise<ApiResponse<NewsletterManagementList>>;
2472
2470
  updateList(siteName: string, listId: string, data: Partial<{
@@ -2475,7 +2473,6 @@ declare class NewsletterManagementClient extends BaseClient {
2475
2473
  description: string | null;
2476
2474
  is_public: boolean;
2477
2475
  is_default: boolean;
2478
- double_opt_in: boolean;
2479
2476
  welcome_email_enabled: boolean;
2480
2477
  status: 'active' | 'archived';
2481
2478
  }>): Promise<ApiResponse<NewsletterManagementList>>;
@@ -3427,6 +3424,18 @@ declare abstract class BaseV2Client {
3427
3424
  protected buildPath(endpoint: string): string;
3428
3425
  protected sitePath(siteName: string, resource: string, suffix?: string): string;
3429
3426
  private toParams;
3427
+ /**
3428
+ * Extract v2 payload from HttpClient response.
3429
+ *
3430
+ * The shared HttpClient wraps responses in a v1-style { success, data } envelope.
3431
+ * v2 API responses don't have a `success` field — the HttpClient already throws
3432
+ * on HTTP errors, so if we reach this point the request succeeded.
3433
+ *
3434
+ * The HttpClient may return the v2 payload nested under `data` (when the response
3435
+ * JSON contains a `data` key, which v2 list responses do) or as a direct wrap.
3436
+ * We unwrap accordingly.
3437
+ */
3438
+ private extractData;
3430
3439
  /** GET a single resource. */
3431
3440
  protected getOne<T>(path: string, params?: object): Promise<T>;
3432
3441
  /** GET a list of resources with cursor pagination. */
@@ -3559,7 +3568,6 @@ declare class NewsletterV2Client extends BaseV2Client {
3559
3568
  email: string;
3560
3569
  name?: string;
3561
3570
  list_ids?: string[];
3562
- double_opt_in?: boolean;
3563
3571
  source?: string;
3564
3572
  source_url?: string;
3565
3573
  frequency?: 'instant' | 'daily' | 'weekly' | 'monthly';
package/dist/index.js CHANGED
@@ -3365,45 +3365,51 @@ var BaseV2Client = class {
3365
3365
  }
3366
3366
  return Object.keys(out).length > 0 ? out : void 0;
3367
3367
  }
3368
+ /**
3369
+ * Extract v2 payload from HttpClient response.
3370
+ *
3371
+ * The shared HttpClient wraps responses in a v1-style { success, data } envelope.
3372
+ * v2 API responses don't have a `success` field — the HttpClient already throws
3373
+ * on HTTP errors, so if we reach this point the request succeeded.
3374
+ *
3375
+ * The HttpClient may return the v2 payload nested under `data` (when the response
3376
+ * JSON contains a `data` key, which v2 list responses do) or as a direct wrap.
3377
+ * We unwrap accordingly.
3378
+ */
3379
+ extractData(response) {
3380
+ const payload = response.data;
3381
+ if (payload && typeof payload === "object" && "error" in payload) {
3382
+ const errObj = payload.error;
3383
+ if (errObj && typeof errObj === "object" && "type" in errObj) {
3384
+ throw this.toError(response);
3385
+ }
3386
+ }
3387
+ return payload;
3388
+ }
3368
3389
  /** GET a single resource. */
3369
3390
  async getOne(path, params) {
3370
3391
  const response = await this.http.get(path, this.toParams(params));
3371
- if (!response.success) {
3372
- throw this.toError(response);
3373
- }
3374
- return response.data;
3392
+ return this.extractData(response);
3375
3393
  }
3376
3394
  /** GET a list of resources with cursor pagination. */
3377
3395
  async getList(path, params) {
3378
3396
  const response = await this.http.get(path, this.toParams(params));
3379
- if (!response.success) {
3380
- throw this.toError(response);
3381
- }
3382
- return response.data;
3397
+ return this.extractData(response);
3383
3398
  }
3384
3399
  /** POST to create a resource. */
3385
3400
  async post(path, body) {
3386
3401
  const response = await this.http.post(path, body);
3387
- if (!response.success) {
3388
- throw this.toError(response);
3389
- }
3390
- return response.data;
3402
+ return this.extractData(response);
3391
3403
  }
3392
3404
  /** PATCH to update a resource. */
3393
3405
  async patchOne(path, body) {
3394
3406
  const response = await this.http.patch(path, body);
3395
- if (!response.success) {
3396
- throw this.toError(response);
3397
- }
3398
- return response.data;
3407
+ return this.extractData(response);
3399
3408
  }
3400
3409
  /** DELETE a resource. */
3401
3410
  async deleteOne(path) {
3402
3411
  const response = await this.http.delete(path);
3403
- if (!response.success) {
3404
- throw this.toError(response);
3405
- }
3406
- return response.data;
3412
+ return this.extractData(response);
3407
3413
  }
3408
3414
  /**
3409
3415
  * Auto-paginating async generator.
package/dist/index.mjs CHANGED
@@ -3298,45 +3298,51 @@ var BaseV2Client = class {
3298
3298
  }
3299
3299
  return Object.keys(out).length > 0 ? out : void 0;
3300
3300
  }
3301
+ /**
3302
+ * Extract v2 payload from HttpClient response.
3303
+ *
3304
+ * The shared HttpClient wraps responses in a v1-style { success, data } envelope.
3305
+ * v2 API responses don't have a `success` field — the HttpClient already throws
3306
+ * on HTTP errors, so if we reach this point the request succeeded.
3307
+ *
3308
+ * The HttpClient may return the v2 payload nested under `data` (when the response
3309
+ * JSON contains a `data` key, which v2 list responses do) or as a direct wrap.
3310
+ * We unwrap accordingly.
3311
+ */
3312
+ extractData(response) {
3313
+ const payload = response.data;
3314
+ if (payload && typeof payload === "object" && "error" in payload) {
3315
+ const errObj = payload.error;
3316
+ if (errObj && typeof errObj === "object" && "type" in errObj) {
3317
+ throw this.toError(response);
3318
+ }
3319
+ }
3320
+ return payload;
3321
+ }
3301
3322
  /** GET a single resource. */
3302
3323
  async getOne(path, params) {
3303
3324
  const response = await this.http.get(path, this.toParams(params));
3304
- if (!response.success) {
3305
- throw this.toError(response);
3306
- }
3307
- return response.data;
3325
+ return this.extractData(response);
3308
3326
  }
3309
3327
  /** GET a list of resources with cursor pagination. */
3310
3328
  async getList(path, params) {
3311
3329
  const response = await this.http.get(path, this.toParams(params));
3312
- if (!response.success) {
3313
- throw this.toError(response);
3314
- }
3315
- return response.data;
3330
+ return this.extractData(response);
3316
3331
  }
3317
3332
  /** POST to create a resource. */
3318
3333
  async post(path, body) {
3319
3334
  const response = await this.http.post(path, body);
3320
- if (!response.success) {
3321
- throw this.toError(response);
3322
- }
3323
- return response.data;
3335
+ return this.extractData(response);
3324
3336
  }
3325
3337
  /** PATCH to update a resource. */
3326
3338
  async patchOne(path, body) {
3327
3339
  const response = await this.http.patch(path, body);
3328
- if (!response.success) {
3329
- throw this.toError(response);
3330
- }
3331
- return response.data;
3340
+ return this.extractData(response);
3332
3341
  }
3333
3342
  /** DELETE a resource. */
3334
3343
  async deleteOne(path) {
3335
3344
  const response = await this.http.delete(path);
3336
- if (!response.success) {
3337
- throw this.toError(response);
3338
- }
3339
- return response.data;
3345
+ return this.extractData(response);
3340
3346
  }
3341
3347
  /**
3342
3348
  * Auto-paginating async generator.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "perspectapi-ts-sdk",
3
- "version": "5.0.0",
3
+ "version": "5.0.2",
4
4
  "description": "TypeScript SDK for PerspectAPI - Cloudflare Workers compatible",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -175,7 +175,6 @@ export class NewsletterManagementClient extends BaseClient {
175
175
  description?: string | null;
176
176
  is_public?: boolean;
177
177
  is_default?: boolean;
178
- double_opt_in?: boolean;
179
178
  welcome_email_enabled?: boolean;
180
179
  },
181
180
  ): Promise<ApiResponse<NewsletterManagementList>> {
@@ -191,7 +190,6 @@ export class NewsletterManagementClient extends BaseClient {
191
190
  description: string | null;
192
191
  is_public: boolean;
193
192
  is_default: boolean;
194
- double_opt_in: boolean;
195
193
  welcome_email_enabled: boolean;
196
194
  status: 'active' | 'archived';
197
195
  }>,
@@ -128,7 +128,6 @@ export interface CreateNewsletterSubscriptionRequest {
128
128
  language?: string;
129
129
  source?: string;
130
130
  source_url?: string;
131
- double_opt_in?: boolean;
132
131
  metadata?: Record<string, any>;
133
132
  }
134
133
 
@@ -52,13 +52,35 @@ export abstract class BaseV2Client {
52
52
  return Object.keys(out).length > 0 ? out : undefined;
53
53
  }
54
54
 
55
+ /**
56
+ * Extract v2 payload from HttpClient response.
57
+ *
58
+ * The shared HttpClient wraps responses in a v1-style { success, data } envelope.
59
+ * v2 API responses don't have a `success` field — the HttpClient already throws
60
+ * on HTTP errors, so if we reach this point the request succeeded.
61
+ *
62
+ * The HttpClient may return the v2 payload nested under `data` (when the response
63
+ * JSON contains a `data` key, which v2 list responses do) or as a direct wrap.
64
+ * We unwrap accordingly.
65
+ */
66
+ private extractData<T>(response: { data?: unknown; success?: boolean; error?: unknown; message?: string }): T {
67
+ const payload = response.data as any;
68
+
69
+ // Check if the API returned a v2 error body
70
+ if (payload && typeof payload === 'object' && 'error' in payload) {
71
+ const errObj = payload.error;
72
+ if (errObj && typeof errObj === 'object' && 'type' in errObj) {
73
+ throw this.toError(response);
74
+ }
75
+ }
76
+
77
+ return payload as T;
78
+ }
79
+
55
80
  /** GET a single resource. */
56
81
  protected async getOne<T>(path: string, params?: object): Promise<T> {
57
82
  const response = await this.http.get<T>(path, this.toParams(params));
58
- if (!response.success) {
59
- throw this.toError(response);
60
- }
61
- return response.data!;
83
+ return this.extractData<T>(response);
62
84
  }
63
85
 
64
86
  /** GET a list of resources with cursor pagination. */
@@ -67,37 +89,25 @@ export abstract class BaseV2Client {
67
89
  params?: object,
68
90
  ): Promise<V2List<T>> {
69
91
  const response = await this.http.get<V2List<T>>(path, this.toParams(params));
70
- if (!response.success) {
71
- throw this.toError(response);
72
- }
73
- return response.data!;
92
+ return this.extractData<V2List<T>>(response);
74
93
  }
75
94
 
76
95
  /** POST to create a resource. */
77
96
  protected async post<T>(path: string, body?: unknown): Promise<T> {
78
97
  const response = await this.http.post<T>(path, body);
79
- if (!response.success) {
80
- throw this.toError(response);
81
- }
82
- return response.data!;
98
+ return this.extractData<T>(response);
83
99
  }
84
100
 
85
101
  /** PATCH to update a resource. */
86
102
  protected async patchOne<T>(path: string, body?: unknown): Promise<T> {
87
103
  const response = await this.http.patch<T>(path, body);
88
- if (!response.success) {
89
- throw this.toError(response);
90
- }
91
- return response.data!;
104
+ return this.extractData<T>(response);
92
105
  }
93
106
 
94
107
  /** DELETE a resource. */
95
108
  protected async deleteOne(path: string): Promise<V2Deleted> {
96
109
  const response = await this.http.delete<V2Deleted>(path);
97
- if (!response.success) {
98
- throw this.toError(response);
99
- }
100
- return response.data!;
110
+ return this.extractData<V2Deleted>(response);
101
111
  }
102
112
 
103
113
  /**
@@ -18,7 +18,6 @@ export class NewsletterV2Client extends BaseV2Client {
18
18
  email: string;
19
19
  name?: string;
20
20
  list_ids?: string[];
21
- double_opt_in?: boolean;
22
21
  source?: string;
23
22
  source_url?: string;
24
23
  frequency?: 'instant' | 'daily' | 'weekly' | 'monthly';