@atomic-solutions/woocommerce-api-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -0
  3. package/dist/client/index.d.mts +9 -0
  4. package/dist/client/index.d.ts +9 -0
  5. package/dist/client/index.js +1461 -0
  6. package/dist/client/index.js.map +1 -0
  7. package/dist/client/index.mjs +1455 -0
  8. package/dist/client/index.mjs.map +1 -0
  9. package/dist/http/index.d.mts +11 -0
  10. package/dist/http/index.d.ts +11 -0
  11. package/dist/http/index.js +638 -0
  12. package/dist/http/index.js.map +1 -0
  13. package/dist/http/index.mjs +631 -0
  14. package/dist/http/index.mjs.map +1 -0
  15. package/dist/index.d.mts +29 -0
  16. package/dist/index.d.ts +29 -0
  17. package/dist/index.js +2152 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/index.mjs +2105 -0
  20. package/dist/index.mjs.map +1 -0
  21. package/dist/pagination.schema-CdjWGZJr.d.mts +190 -0
  22. package/dist/pagination.schema-CdjWGZJr.d.ts +190 -0
  23. package/dist/products-Cxl54crz.d.mts +3412 -0
  24. package/dist/products-Cxl54crz.d.ts +3412 -0
  25. package/dist/schemas/admin-api/index.d.mts +5340 -0
  26. package/dist/schemas/admin-api/index.d.ts +5340 -0
  27. package/dist/schemas/admin-api/index.js +584 -0
  28. package/dist/schemas/admin-api/index.js.map +1 -0
  29. package/dist/schemas/admin-api/index.mjs +545 -0
  30. package/dist/schemas/admin-api/index.mjs.map +1 -0
  31. package/dist/schemas/index.d.mts +4 -0
  32. package/dist/schemas/index.d.ts +4 -0
  33. package/dist/schemas/index.js +887 -0
  34. package/dist/schemas/index.js.map +1 -0
  35. package/dist/schemas/index.mjs +844 -0
  36. package/dist/schemas/index.mjs.map +1 -0
  37. package/dist/schemas/store-api/index.d.mts +1076 -0
  38. package/dist/schemas/store-api/index.d.ts +1076 -0
  39. package/dist/schemas/store-api/index.js +887 -0
  40. package/dist/schemas/store-api/index.js.map +1 -0
  41. package/dist/schemas/store-api/index.mjs +844 -0
  42. package/dist/schemas/store-api/index.mjs.map +1 -0
  43. package/dist/types-B-zy1xrP.d.mts +183 -0
  44. package/dist/types-qKWtrw7A.d.ts +183 -0
  45. package/dist/utils/index.d.mts +17 -0
  46. package/dist/utils/index.d.ts +17 -0
  47. package/dist/utils/index.js +316 -0
  48. package/dist/utils/index.js.map +1 -0
  49. package/dist/utils/index.mjs +308 -0
  50. package/dist/utils/index.mjs.map +1 -0
  51. package/package.json +117 -0
@@ -0,0 +1,316 @@
1
+ 'use strict';
2
+
3
+ // src/errors/classes/BaseError.ts
4
+ var BaseError = class extends Error {
5
+ constructor(options) {
6
+ super(options.message);
7
+ this.options = options;
8
+ Object.setPrototypeOf(this, new.target.prototype);
9
+ this.name = this.constructor.name;
10
+ if (Error.captureStackTrace) {
11
+ Error.captureStackTrace(this, this.constructor);
12
+ }
13
+ if (this.options.cause instanceof Error && this.options.cause.stack) {
14
+ this.stack = `${this.stack}
15
+ Caused by: ${this.options.cause.stack}`;
16
+ }
17
+ }
18
+ /**
19
+ * Get reportable data for error tracking/logging
20
+ * Subclasses should override this to add their own reportable fields
21
+ */
22
+ getReportableData() {
23
+ const { code, operation, userMessage, retryable } = this.options;
24
+ return {
25
+ code,
26
+ operation,
27
+ userMessage,
28
+ retryable
29
+ };
30
+ }
31
+ /**
32
+ * Custom JSON serialization
33
+ * Makes the error properly serializable for logging/reporting
34
+ */
35
+ toJSON() {
36
+ return {
37
+ ...this.getReportableData(),
38
+ name: this.name,
39
+ message: this.message,
40
+ stack: this.stack
41
+ };
42
+ }
43
+ };
44
+
45
+ // src/errors/classes/WooCommerceDataValidationError.ts
46
+ var WooCommerceDataValidationError = class _WooCommerceDataValidationError extends BaseError {
47
+ constructor(options) {
48
+ const fieldErrors = options.zodError ? _WooCommerceDataValidationError.extractFieldErrorsFromZod(options.zodError) : void 0;
49
+ super({
50
+ code: "validation_error",
51
+ message: options.message,
52
+ operation: options.operation,
53
+ userMessage: options.userMessage || "Received unexpected data from WooCommerce",
54
+ retryable: false,
55
+ cause: options.cause,
56
+ url: options.url,
57
+ zodError: options.zodError,
58
+ value: options.value,
59
+ fieldErrors
60
+ });
61
+ }
62
+ // Convenient getters for validation-specific fields (no duplication)
63
+ get url() {
64
+ return this.options.url;
65
+ }
66
+ get zodError() {
67
+ return this.options.zodError;
68
+ }
69
+ get invalidValue() {
70
+ return this.options.value;
71
+ }
72
+ get fieldErrors() {
73
+ return this.options.fieldErrors;
74
+ }
75
+ /**
76
+ * Get reportable data for error tracking/logging
77
+ * Includes validation-specific fields
78
+ */
79
+ getReportableData() {
80
+ return {
81
+ code: this.options.code,
82
+ operation: this.options.operation,
83
+ userMessage: this.options.userMessage,
84
+ retryable: false,
85
+ fieldErrors: this.options.fieldErrors,
86
+ url: this.options.url
87
+ };
88
+ }
89
+ /**
90
+ * Extract field errors from Zod error
91
+ */
92
+ static extractFieldErrorsFromZod(zodError) {
93
+ if (!zodError?.errors) {
94
+ return void 0;
95
+ }
96
+ const fieldErrors = {};
97
+ for (const issue of zodError.errors) {
98
+ const path = issue.path.join(".");
99
+ if (!fieldErrors[path]) {
100
+ fieldErrors[path] = [];
101
+ }
102
+ fieldErrors[path].push(issue.message);
103
+ }
104
+ return fieldErrors;
105
+ }
106
+ /**
107
+ * Get all error messages as a flat array
108
+ */
109
+ getMessages() {
110
+ if (!this.fieldErrors) {
111
+ return [this.message];
112
+ }
113
+ const messages = [];
114
+ for (const fieldMessages of Object.values(this.fieldErrors)) {
115
+ messages.push(...fieldMessages);
116
+ }
117
+ return messages;
118
+ }
119
+ /**
120
+ * Check if a specific field has errors
121
+ */
122
+ hasFieldError(field) {
123
+ return this.fieldErrors ? field in this.fieldErrors : false;
124
+ }
125
+ /**
126
+ * Get error messages for a specific field
127
+ */
128
+ getFieldError(field) {
129
+ return this.fieldErrors?.[field];
130
+ }
131
+ };
132
+
133
+ // src/http/handleApiResponse.ts
134
+ var handleApiResponse = (response, schema, options) => {
135
+ const validationMode = options?.validationMode ?? "strict";
136
+ if (validationMode === "warn") {
137
+ const result = schema.safeParse(response.data);
138
+ if (!result.success) {
139
+ const validationError = new WooCommerceDataValidationError({
140
+ message: `WooCommerce API response validation failed for ${response.config.url || "unknown endpoint"}`,
141
+ url: response.config.url,
142
+ zodError: result.error,
143
+ value: response.data,
144
+ userMessage: "Received unexpected data from WooCommerce"
145
+ });
146
+ options?.onValidationError?.(validationError);
147
+ options?.errorReporter?.(validationError);
148
+ console.warn("[woocommerce-utils] Validation warning:", validationError.message);
149
+ return response.data;
150
+ }
151
+ return result.data;
152
+ }
153
+ try {
154
+ return schema.parse(response.data);
155
+ } catch (error) {
156
+ if (error && typeof error === "object" && "issues" in error) {
157
+ const validationError = new WooCommerceDataValidationError({
158
+ message: `WooCommerce API response validation failed for ${response.config.url || "unknown endpoint"}`,
159
+ url: response.config.url,
160
+ zodError: error,
161
+ value: response.data,
162
+ userMessage: "Received unexpected data from WooCommerce"
163
+ });
164
+ options?.onValidationError?.(validationError);
165
+ options?.errorReporter?.(validationError);
166
+ throw validationError;
167
+ }
168
+ throw error;
169
+ }
170
+ };
171
+ var isZodError = (error) => {
172
+ return error instanceof Error && error.name === "ZodError";
173
+ };
174
+
175
+ // src/utils/calculatePagination.ts
176
+ var calculatePagination = (input) => {
177
+ const { page, perPage, total, totalPages } = input;
178
+ const hasNextPage = page < totalPages;
179
+ const hasPrevPage = page > 1;
180
+ return {
181
+ page,
182
+ perPage,
183
+ total,
184
+ totalPages,
185
+ hasNextPage,
186
+ hasPrevPage,
187
+ nextPage: hasNextPage ? page + 1 : null,
188
+ prevPage: hasPrevPage ? page - 1 : null
189
+ };
190
+ };
191
+
192
+ // src/utils/getPaginationMeta.ts
193
+ var getPaginationMeta = (headers) => {
194
+ if (!headers) {
195
+ return {
196
+ total: 0,
197
+ totalPages: 0
198
+ };
199
+ }
200
+ const wpTotal = headers["x-wp-total"];
201
+ const wpTotalPages = headers["x-wp-totalpages"];
202
+ if (!wpTotal || !wpTotalPages) {
203
+ return {
204
+ total: 0,
205
+ totalPages: 0
206
+ };
207
+ }
208
+ const total = parseInt(wpTotal, 10);
209
+ const totalPages = parseInt(wpTotalPages, 10);
210
+ return {
211
+ total,
212
+ totalPages
213
+ };
214
+ };
215
+
216
+ // src/http/handlePaginatedApiResponse.ts
217
+ var handlePaginatedApiResponse = (response, schema, params = {}, options) => {
218
+ const validationMode = options?.validationMode ?? "strict";
219
+ let data;
220
+ if (validationMode === "warn") {
221
+ const result = schema.safeParse(response.data);
222
+ if (!result.success) {
223
+ const validationError = new WooCommerceDataValidationError({
224
+ message: `WooCommerce API response validation failed for ${response.config.url || "unknown endpoint"}`,
225
+ url: response.config.url,
226
+ zodError: result.error,
227
+ value: response.data,
228
+ userMessage: "Received unexpected data from WooCommerce"
229
+ });
230
+ options?.onValidationError?.(validationError);
231
+ options?.errorReporter?.(validationError);
232
+ console.warn("[woocommerce-utils] Validation warning:", validationError.message);
233
+ data = Array.isArray(response.data) ? response.data : [];
234
+ } else {
235
+ data = result.data;
236
+ }
237
+ } else {
238
+ try {
239
+ data = schema.parse(response.data);
240
+ } catch (error) {
241
+ if (error && typeof error === "object" && "issues" in error) {
242
+ const validationError = new WooCommerceDataValidationError({
243
+ message: `WooCommerce API response validation failed for ${response.config.url || "unknown endpoint"}`,
244
+ url: response.config.url,
245
+ zodError: error,
246
+ value: response.data,
247
+ userMessage: "Received unexpected data from WooCommerce"
248
+ });
249
+ options?.onValidationError?.(validationError);
250
+ options?.errorReporter?.(validationError);
251
+ throw validationError;
252
+ }
253
+ throw error;
254
+ }
255
+ }
256
+ const { total, totalPages } = getPaginationMeta(response.headers);
257
+ const page = params.page || 1;
258
+ const perPage = params.per_page || 10;
259
+ const pagination = calculatePagination({
260
+ page,
261
+ perPage,
262
+ total,
263
+ totalPages
264
+ });
265
+ return {
266
+ data,
267
+ pagination
268
+ };
269
+ };
270
+
271
+ // src/logging/logger.ts
272
+ var DEBUG_PREFIX = "[woocommerce-utils]";
273
+ var isDebugEnabled = () => {
274
+ if (typeof process !== "undefined" && process.env) {
275
+ return process.env.DEBUG === "true" || process.env.DEBUG === "1";
276
+ }
277
+ return false;
278
+ };
279
+ var debug = (...args) => {
280
+ if (isDebugEnabled()) {
281
+ console.log(DEBUG_PREFIX, ...args);
282
+ }
283
+ };
284
+
285
+ // src/utils/initializeCartSession.ts
286
+ var initializeCartSession = async (client, cartHeaders) => {
287
+ try {
288
+ debug("session", "Initializing cart session");
289
+ const response = await client.get("/wc/store/v1/cart");
290
+ const nonce = response.headers["nonce"] || response.headers["Nonce"];
291
+ const cartToken = response.headers["cart-token"] || response.headers["Cart-Token"];
292
+ if (nonce || cartToken) {
293
+ await cartHeaders.save({
294
+ nonce: nonce || void 0,
295
+ cartToken: cartToken || void 0
296
+ });
297
+ debug("session", "Cart session initialized", {
298
+ hasNonce: !!nonce,
299
+ hasCartToken: !!cartToken
300
+ });
301
+ }
302
+ } catch (error) {
303
+ debug("session", "Failed to initialize cart session", error);
304
+ throw error;
305
+ }
306
+ };
307
+
308
+ exports.calculatePagination = calculatePagination;
309
+ exports.debug = debug;
310
+ exports.getPaginationMeta = getPaginationMeta;
311
+ exports.handleApiResponse = handleApiResponse;
312
+ exports.handlePaginatedApiResponse = handlePaginatedApiResponse;
313
+ exports.initializeCartSession = initializeCartSession;
314
+ exports.isZodError = isZodError;
315
+ //# sourceMappingURL=index.js.map
316
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/errors/classes/BaseError.ts","../../src/errors/classes/WooCommerceDataValidationError.ts","../../src/http/handleApiResponse.ts","../../src/utils/calculatePagination.ts","../../src/utils/getPaginationMeta.ts","../../src/http/handlePaginatedApiResponse.ts","../../src/logging/logger.ts","../../src/utils/initializeCartSession.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base error class for all package errors\n *\n * Generic over:\n * - TOptions: The options type for this error class\n * - TReportable: The reportable data structure for error tracking\n */\nimport type { BaseErrorOptions, BaseReportableData } from './types';\n\nexport class BaseError<\n TOptions extends BaseErrorOptions = BaseErrorOptions,\n TReportable extends BaseReportableData = BaseReportableData,\n> extends Error {\n constructor(public readonly options: TOptions) {\n super(options.message);\n\n // Maintain proper prototype chain\n Object.setPrototypeOf(this, new.target.prototype);\n\n // Set error name\n this.name = this.constructor.name;\n\n // Capture stack trace (excluding constructor call)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n\n // If there's a cause with a stack, preserve it\n if (this.options.cause instanceof Error && this.options.cause.stack) {\n this.stack = `${this.stack}\\nCaused by: ${this.options.cause.stack}`;\n }\n }\n\n /**\n * Get reportable data for error tracking/logging\n * Subclasses should override this to add their own reportable fields\n */\n getReportableData(): TReportable {\n const { code, operation, userMessage, retryable } = this.options;\n return {\n code,\n operation,\n userMessage,\n retryable,\n } as TReportable;\n }\n\n /**\n * Custom JSON serialization\n * Makes the error properly serializable for logging/reporting\n */\n toJSON(): Record<string, unknown> {\n return {\n ...this.getReportableData(),\n name: this.name,\n message: this.message,\n stack: this.stack,\n } as unknown as Record<string, unknown>;\n }\n}\n","/**\n * WooCommerce validation error class\n * Thrown when API response validation fails\n */\n\nimport type { ZodError } from 'zod';\n\nimport { BaseError } from './BaseError';\nimport type {\n BaseErrorOptions,\n ValidationReportableData,\n WooCommerceDataValidationErrorOptions,\n} from './types';\n\n/**\n * Internal options type that combines user options with computed fields\n */\ninterface WooCommerceDataValidationErrorInternalOptions extends BaseErrorOptions {\n url?: string;\n zodError?: ZodError;\n value?: unknown;\n fieldErrors?: Record<string, string[]>;\n}\n\n/**\n * WooCommerce validation error\n *\n * Thrown when API response validation fails using Zod schemas\n */\nexport class WooCommerceDataValidationError extends BaseError<\n WooCommerceDataValidationErrorInternalOptions,\n ValidationReportableData\n> {\n constructor(options: WooCommerceDataValidationErrorOptions) {\n // Extract field errors from Zod error if provided\n const fieldErrors = options.zodError\n ? WooCommerceDataValidationError.extractFieldErrorsFromZod(options.zodError)\n : undefined;\n\n super({\n code: 'validation_error',\n message: options.message,\n operation: options.operation,\n userMessage: options.userMessage || 'Received unexpected data from WooCommerce',\n retryable: false,\n cause: options.cause,\n url: options.url,\n zodError: options.zodError,\n value: options.value,\n fieldErrors,\n });\n }\n\n // Convenient getters for validation-specific fields (no duplication)\n get url(): string | undefined {\n return this.options.url;\n }\n\n get zodError(): ZodError | undefined {\n return this.options.zodError;\n }\n\n get invalidValue(): unknown | undefined {\n return this.options.value;\n }\n\n get fieldErrors(): Record<string, string[]> | undefined {\n return this.options.fieldErrors;\n }\n\n /**\n * Get reportable data for error tracking/logging\n * Includes validation-specific fields\n */\n override getReportableData(): ValidationReportableData {\n return {\n code: this.options.code,\n operation: this.options.operation,\n userMessage: this.options.userMessage,\n retryable: false,\n fieldErrors: this.options.fieldErrors,\n url: this.options.url,\n };\n }\n\n /**\n * Extract field errors from Zod error\n */\n private static extractFieldErrorsFromZod(\n zodError: ZodError\n ): Record<string, string[]> | undefined {\n if (!zodError?.errors) {\n return undefined;\n }\n\n const fieldErrors: Record<string, string[]> = {};\n\n for (const issue of zodError.errors) {\n const path = issue.path.join('.');\n if (!fieldErrors[path]) {\n fieldErrors[path] = [];\n }\n fieldErrors[path].push(issue.message);\n }\n\n return fieldErrors;\n }\n\n /**\n * Get all error messages as a flat array\n */\n getMessages(): string[] {\n if (!this.fieldErrors) {\n return [this.message];\n }\n\n const messages: string[] = [];\n for (const fieldMessages of Object.values(this.fieldErrors)) {\n messages.push(...fieldMessages);\n }\n\n return messages;\n }\n\n /**\n * Check if a specific field has errors\n */\n hasFieldError(field: string): boolean {\n return this.fieldErrors ? field in this.fieldErrors : false;\n }\n\n /**\n * Get error messages for a specific field\n */\n getFieldError(field: string): string[] | undefined {\n return this.fieldErrors?.[field];\n }\n}\n","/**\n * Response validation utilities\n */\n\nimport type { AxiosResponse } from 'axios';\nimport type { ZodError, ZodSchema } from 'zod';\n\nimport { WooCommerceDataValidationError } from '@/errors';\n\n/**\n * Validation mode for API responses\n * - 'strict': Throw error on validation failure (default)\n * - 'warn': Log warning and continue on validation failure\n */\nexport type ValidationMode = 'strict' | 'warn';\n\n/**\n * Options for response handling\n */\nexport interface ResponseOptions {\n /** Validation mode */\n validationMode?: ValidationMode;\n\n /** Error reporter for validation errors */\n errorReporter?: (error: Error) => void;\n\n /** Optional validation error handler (called before errorReporter) */\n onValidationError?: (error: Error) => void;\n}\n\n/**\n * Handle and validate API response\n *\n * @param response - Axios response\n * @param schema - Zod schema for validation\n * @param options - Response handling options\n * @returns Validated data\n * @throws ValidationError if validation fails in strict mode\n */\nexport const handleApiResponse = <T>(\n response: AxiosResponse,\n schema: ZodSchema<T>,\n options?: ResponseOptions\n): T => {\n const validationMode = options?.validationMode ?? 'strict';\n\n // Warn mode - use safeParse and continue on validation failure\n if (validationMode === 'warn') {\n const result = schema.safeParse(response.data);\n\n if (!result.success) {\n const validationError = new WooCommerceDataValidationError({\n message: `WooCommerce API response validation failed for ${response.config.url || 'unknown endpoint'}`,\n url: response.config.url,\n zodError: result.error,\n value: response.data,\n userMessage: 'Received unexpected data from WooCommerce',\n });\n\n // Call optional validation error handler\n options?.onValidationError?.(validationError);\n\n // Report to error tracker (if provided)\n options?.errorReporter?.(validationError);\n\n // Log warning to console in warn mode\n console.warn('[woocommerce-utils] Validation warning:', validationError.message);\n\n // Return raw data to allow app to continue\n return response.data as T;\n }\n\n return result.data;\n }\n\n // Strict mode - throw on validation failure\n try {\n return schema.parse(response.data);\n } catch (error) {\n if (error && typeof error === 'object' && 'issues' in error) {\n const validationError = new WooCommerceDataValidationError({\n message: `WooCommerce API response validation failed for ${response.config.url || 'unknown endpoint'}`,\n url: response.config.url,\n zodError: error as ZodError,\n value: response.data,\n userMessage: 'Received unexpected data from WooCommerce',\n });\n\n // Call optional validation error handler\n options?.onValidationError?.(validationError);\n\n // Report to error tracker (if provided)\n options?.errorReporter?.(validationError);\n\n throw validationError;\n }\n throw error;\n }\n};\n\n/**\n * Check if error is a Zod validation error\n */\nexport const isZodError = (error: unknown): error is ZodError => {\n return error instanceof Error && error.name === 'ZodError';\n};\n","/**\n * Calculate pagination navigation\n */\n\nexport interface Pagination {\n page: number;\n perPage: number;\n total: number;\n totalPages: number;\n hasNextPage: boolean;\n hasPrevPage: boolean;\n nextPage: number | null;\n prevPage: number | null;\n}\n\nexport interface CalculatePaginationInput {\n page: number;\n perPage: number;\n total: number;\n totalPages: number;\n}\n\n/**\n * Calculate pagination navigation from WooCommerce pagination metadata\n *\n * @param input - Current pagination state\n * @returns Full pagination object with navigation helpers\n */\nexport const calculatePagination = (input: CalculatePaginationInput): Pagination => {\n const { page, perPage, total, totalPages } = input;\n\n const hasNextPage = page < totalPages;\n const hasPrevPage = page > 1;\n\n return {\n page,\n perPage,\n total,\n totalPages,\n hasNextPage,\n hasPrevPage,\n nextPage: hasNextPage ? page + 1 : null,\n prevPage: hasPrevPage ? page - 1 : null,\n };\n};\n","/**\n * Extract pagination metadata from WooCommerce response headers\n */\n\nimport type { AxiosResponse } from 'axios';\n\nexport interface PaginationMeta {\n total: number;\n totalPages: number;\n}\n\nexport const getPaginationMeta = (headers: AxiosResponse['headers']): PaginationMeta => {\n // Handle undefined/null headers\n if (!headers) {\n return {\n total: 0,\n totalPages: 0,\n };\n }\n\n const wpTotal = headers['x-wp-total'];\n const wpTotalPages = headers['x-wp-totalpages'];\n\n if (!wpTotal || !wpTotalPages) {\n return {\n total: 0,\n totalPages: 0,\n };\n }\n\n const total = parseInt(wpTotal, 10);\n const totalPages = parseInt(wpTotalPages, 10);\n\n return {\n total,\n totalPages,\n };\n};\n","/**\n * Pagination utilities for WooCommerce API responses\n */\n\nimport type { AxiosResponse } from 'axios';\nimport type { ZodError, ZodSchema } from 'zod';\n\nimport { WooCommerceDataValidationError } from '../errors';\nimport { calculatePagination, type Pagination } from '../utils/calculatePagination';\nimport { getPaginationMeta } from '../utils/getPaginationMeta';\nimport type { ResponseOptions } from './handleApiResponse';\n\n/**\n * Paginated response wrapper\n */\nexport interface PaginatedResponse<T> {\n data: T[];\n pagination: Pagination;\n}\n\n/**\n * Handle paginated API response\n *\n * @param response - Axios response\n * @param schema - Zod schema for validating array items\n * @param params - Request parameters (page, per_page)\n * @param options - Response handling options\n * @returns Paginated response with validated data\n * @throws ValidationError if validation fails in strict mode\n */\nexport const handlePaginatedApiResponse = <T>(\n response: AxiosResponse,\n schema: ZodSchema<T[]>,\n params: { page?: number; per_page?: number } = {},\n options?: ResponseOptions\n): PaginatedResponse<T> => {\n const validationMode = options?.validationMode ?? 'strict';\n let data: T[];\n\n // Warn mode - use safeParse and continue on validation failure\n if (validationMode === 'warn') {\n const result = schema.safeParse(response.data);\n\n if (!result.success) {\n const validationError = new WooCommerceDataValidationError({\n message: `WooCommerce API response validation failed for ${response.config.url || 'unknown endpoint'}`,\n url: response.config.url,\n zodError: result.error,\n value: response.data,\n userMessage: 'Received unexpected data from WooCommerce',\n });\n\n // Call optional validation error handler\n options?.onValidationError?.(validationError);\n\n // Report to error tracker (if provided)\n options?.errorReporter?.(validationError);\n\n // Log warning to console in warn mode\n console.warn('[woocommerce-utils] Validation warning:', validationError.message);\n\n // Return raw data as array (best effort)\n data = Array.isArray(response.data) ? response.data : [];\n } else {\n data = result.data;\n }\n } else {\n // Strict mode - throw on validation failure\n try {\n data = schema.parse(response.data);\n } catch (error) {\n if (error && typeof error === 'object' && 'issues' in error) {\n const validationError = new WooCommerceDataValidationError({\n message: `WooCommerce API response validation failed for ${response.config.url || 'unknown endpoint'}`,\n url: response.config.url,\n zodError: error as ZodError,\n value: response.data,\n userMessage: 'Received unexpected data from WooCommerce',\n });\n\n // Call optional validation error handler\n options?.onValidationError?.(validationError);\n\n // Report to error tracker (if provided)\n options?.errorReporter?.(validationError);\n\n throw validationError;\n }\n throw error;\n }\n }\n\n const { total, totalPages } = getPaginationMeta(response.headers);\n const page = params.page || 1;\n const perPage = params.per_page || 10;\n\n const pagination = calculatePagination({\n page,\n perPage,\n total,\n totalPages,\n });\n\n return {\n data,\n pagination,\n };\n};\n","/**\n * Debug logger for WooCommerce utils\n */\n\nconst DEBUG_PREFIX = '[woocommerce-utils]';\n\n/**\n * Check if debug mode is enabled\n */\nexport const isDebugEnabled = (): boolean => {\n if (typeof process !== 'undefined' && process.env) {\n return process.env.DEBUG === 'true' || process.env.DEBUG === '1';\n }\n return false;\n};\n\n/**\n * Log debug message (only if DEBUG is enabled)\n */\nexport const debug = (...args: unknown[]): void => {\n if (isDebugEnabled()) {\n console.log(DEBUG_PREFIX, ...args);\n }\n};\n\n/**\n * Log warning message\n */\nexport const warn = (...args: unknown[]): void => {\n console.warn(DEBUG_PREFIX, ...args);\n};\n\n/**\n * Log error message\n */\nexport const error = (...args: unknown[]): void => {\n console.error(DEBUG_PREFIX, ...args);\n};\n","/**\n * Cart session initialization utility\n */\n\nimport type { AxiosInstance } from 'axios';\n\nimport type { CartHeadersAdapter } from '../client/types';\nimport { debug } from '../logging/logger';\n\n/**\n * Initialize cart session by fetching cart and saving headers\n *\n * This is called when nonce errors occur to get a fresh nonce/cart-token\n *\n * @param client - Axios instance\n * @param cartHeaders - Cart headers adapter\n */\nexport const initializeCartSession = async (\n client: AxiosInstance,\n cartHeaders: CartHeadersAdapter\n): Promise<void> => {\n try {\n debug('session', 'Initializing cart session');\n\n // Make GET request to cart endpoint\n const response = await client.get('/wc/store/v1/cart');\n\n // Extract headers\n const nonce = response.headers['nonce'] || response.headers['Nonce'];\n const cartToken = response.headers['cart-token'] || response.headers['Cart-Token'];\n\n // Save headers\n if (nonce || cartToken) {\n await cartHeaders.save({\n nonce: nonce || undefined,\n cartToken: cartToken || undefined,\n });\n\n debug('session', 'Cart session initialized', {\n hasNonce: !!nonce,\n hasCartToken: !!cartToken,\n });\n }\n } catch (error) {\n debug('session', 'Failed to initialize cart session', error);\n throw error;\n }\n};\n"]}
@@ -0,0 +1,308 @@
1
+ // src/errors/classes/BaseError.ts
2
+ var BaseError = class extends Error {
3
+ constructor(options) {
4
+ super(options.message);
5
+ this.options = options;
6
+ Object.setPrototypeOf(this, new.target.prototype);
7
+ this.name = this.constructor.name;
8
+ if (Error.captureStackTrace) {
9
+ Error.captureStackTrace(this, this.constructor);
10
+ }
11
+ if (this.options.cause instanceof Error && this.options.cause.stack) {
12
+ this.stack = `${this.stack}
13
+ Caused by: ${this.options.cause.stack}`;
14
+ }
15
+ }
16
+ /**
17
+ * Get reportable data for error tracking/logging
18
+ * Subclasses should override this to add their own reportable fields
19
+ */
20
+ getReportableData() {
21
+ const { code, operation, userMessage, retryable } = this.options;
22
+ return {
23
+ code,
24
+ operation,
25
+ userMessage,
26
+ retryable
27
+ };
28
+ }
29
+ /**
30
+ * Custom JSON serialization
31
+ * Makes the error properly serializable for logging/reporting
32
+ */
33
+ toJSON() {
34
+ return {
35
+ ...this.getReportableData(),
36
+ name: this.name,
37
+ message: this.message,
38
+ stack: this.stack
39
+ };
40
+ }
41
+ };
42
+
43
+ // src/errors/classes/WooCommerceDataValidationError.ts
44
+ var WooCommerceDataValidationError = class _WooCommerceDataValidationError extends BaseError {
45
+ constructor(options) {
46
+ const fieldErrors = options.zodError ? _WooCommerceDataValidationError.extractFieldErrorsFromZod(options.zodError) : void 0;
47
+ super({
48
+ code: "validation_error",
49
+ message: options.message,
50
+ operation: options.operation,
51
+ userMessage: options.userMessage || "Received unexpected data from WooCommerce",
52
+ retryable: false,
53
+ cause: options.cause,
54
+ url: options.url,
55
+ zodError: options.zodError,
56
+ value: options.value,
57
+ fieldErrors
58
+ });
59
+ }
60
+ // Convenient getters for validation-specific fields (no duplication)
61
+ get url() {
62
+ return this.options.url;
63
+ }
64
+ get zodError() {
65
+ return this.options.zodError;
66
+ }
67
+ get invalidValue() {
68
+ return this.options.value;
69
+ }
70
+ get fieldErrors() {
71
+ return this.options.fieldErrors;
72
+ }
73
+ /**
74
+ * Get reportable data for error tracking/logging
75
+ * Includes validation-specific fields
76
+ */
77
+ getReportableData() {
78
+ return {
79
+ code: this.options.code,
80
+ operation: this.options.operation,
81
+ userMessage: this.options.userMessage,
82
+ retryable: false,
83
+ fieldErrors: this.options.fieldErrors,
84
+ url: this.options.url
85
+ };
86
+ }
87
+ /**
88
+ * Extract field errors from Zod error
89
+ */
90
+ static extractFieldErrorsFromZod(zodError) {
91
+ if (!zodError?.errors) {
92
+ return void 0;
93
+ }
94
+ const fieldErrors = {};
95
+ for (const issue of zodError.errors) {
96
+ const path = issue.path.join(".");
97
+ if (!fieldErrors[path]) {
98
+ fieldErrors[path] = [];
99
+ }
100
+ fieldErrors[path].push(issue.message);
101
+ }
102
+ return fieldErrors;
103
+ }
104
+ /**
105
+ * Get all error messages as a flat array
106
+ */
107
+ getMessages() {
108
+ if (!this.fieldErrors) {
109
+ return [this.message];
110
+ }
111
+ const messages = [];
112
+ for (const fieldMessages of Object.values(this.fieldErrors)) {
113
+ messages.push(...fieldMessages);
114
+ }
115
+ return messages;
116
+ }
117
+ /**
118
+ * Check if a specific field has errors
119
+ */
120
+ hasFieldError(field) {
121
+ return this.fieldErrors ? field in this.fieldErrors : false;
122
+ }
123
+ /**
124
+ * Get error messages for a specific field
125
+ */
126
+ getFieldError(field) {
127
+ return this.fieldErrors?.[field];
128
+ }
129
+ };
130
+
131
+ // src/http/handleApiResponse.ts
132
+ var handleApiResponse = (response, schema, options) => {
133
+ const validationMode = options?.validationMode ?? "strict";
134
+ if (validationMode === "warn") {
135
+ const result = schema.safeParse(response.data);
136
+ if (!result.success) {
137
+ const validationError = new WooCommerceDataValidationError({
138
+ message: `WooCommerce API response validation failed for ${response.config.url || "unknown endpoint"}`,
139
+ url: response.config.url,
140
+ zodError: result.error,
141
+ value: response.data,
142
+ userMessage: "Received unexpected data from WooCommerce"
143
+ });
144
+ options?.onValidationError?.(validationError);
145
+ options?.errorReporter?.(validationError);
146
+ console.warn("[woocommerce-utils] Validation warning:", validationError.message);
147
+ return response.data;
148
+ }
149
+ return result.data;
150
+ }
151
+ try {
152
+ return schema.parse(response.data);
153
+ } catch (error) {
154
+ if (error && typeof error === "object" && "issues" in error) {
155
+ const validationError = new WooCommerceDataValidationError({
156
+ message: `WooCommerce API response validation failed for ${response.config.url || "unknown endpoint"}`,
157
+ url: response.config.url,
158
+ zodError: error,
159
+ value: response.data,
160
+ userMessage: "Received unexpected data from WooCommerce"
161
+ });
162
+ options?.onValidationError?.(validationError);
163
+ options?.errorReporter?.(validationError);
164
+ throw validationError;
165
+ }
166
+ throw error;
167
+ }
168
+ };
169
+ var isZodError = (error) => {
170
+ return error instanceof Error && error.name === "ZodError";
171
+ };
172
+
173
+ // src/utils/calculatePagination.ts
174
+ var calculatePagination = (input) => {
175
+ const { page, perPage, total, totalPages } = input;
176
+ const hasNextPage = page < totalPages;
177
+ const hasPrevPage = page > 1;
178
+ return {
179
+ page,
180
+ perPage,
181
+ total,
182
+ totalPages,
183
+ hasNextPage,
184
+ hasPrevPage,
185
+ nextPage: hasNextPage ? page + 1 : null,
186
+ prevPage: hasPrevPage ? page - 1 : null
187
+ };
188
+ };
189
+
190
+ // src/utils/getPaginationMeta.ts
191
+ var getPaginationMeta = (headers) => {
192
+ if (!headers) {
193
+ return {
194
+ total: 0,
195
+ totalPages: 0
196
+ };
197
+ }
198
+ const wpTotal = headers["x-wp-total"];
199
+ const wpTotalPages = headers["x-wp-totalpages"];
200
+ if (!wpTotal || !wpTotalPages) {
201
+ return {
202
+ total: 0,
203
+ totalPages: 0
204
+ };
205
+ }
206
+ const total = parseInt(wpTotal, 10);
207
+ const totalPages = parseInt(wpTotalPages, 10);
208
+ return {
209
+ total,
210
+ totalPages
211
+ };
212
+ };
213
+
214
+ // src/http/handlePaginatedApiResponse.ts
215
+ var handlePaginatedApiResponse = (response, schema, params = {}, options) => {
216
+ const validationMode = options?.validationMode ?? "strict";
217
+ let data;
218
+ if (validationMode === "warn") {
219
+ const result = schema.safeParse(response.data);
220
+ if (!result.success) {
221
+ const validationError = new WooCommerceDataValidationError({
222
+ message: `WooCommerce API response validation failed for ${response.config.url || "unknown endpoint"}`,
223
+ url: response.config.url,
224
+ zodError: result.error,
225
+ value: response.data,
226
+ userMessage: "Received unexpected data from WooCommerce"
227
+ });
228
+ options?.onValidationError?.(validationError);
229
+ options?.errorReporter?.(validationError);
230
+ console.warn("[woocommerce-utils] Validation warning:", validationError.message);
231
+ data = Array.isArray(response.data) ? response.data : [];
232
+ } else {
233
+ data = result.data;
234
+ }
235
+ } else {
236
+ try {
237
+ data = schema.parse(response.data);
238
+ } catch (error) {
239
+ if (error && typeof error === "object" && "issues" in error) {
240
+ const validationError = new WooCommerceDataValidationError({
241
+ message: `WooCommerce API response validation failed for ${response.config.url || "unknown endpoint"}`,
242
+ url: response.config.url,
243
+ zodError: error,
244
+ value: response.data,
245
+ userMessage: "Received unexpected data from WooCommerce"
246
+ });
247
+ options?.onValidationError?.(validationError);
248
+ options?.errorReporter?.(validationError);
249
+ throw validationError;
250
+ }
251
+ throw error;
252
+ }
253
+ }
254
+ const { total, totalPages } = getPaginationMeta(response.headers);
255
+ const page = params.page || 1;
256
+ const perPage = params.per_page || 10;
257
+ const pagination = calculatePagination({
258
+ page,
259
+ perPage,
260
+ total,
261
+ totalPages
262
+ });
263
+ return {
264
+ data,
265
+ pagination
266
+ };
267
+ };
268
+
269
+ // src/logging/logger.ts
270
+ var DEBUG_PREFIX = "[woocommerce-utils]";
271
+ var isDebugEnabled = () => {
272
+ if (typeof process !== "undefined" && process.env) {
273
+ return process.env.DEBUG === "true" || process.env.DEBUG === "1";
274
+ }
275
+ return false;
276
+ };
277
+ var debug = (...args) => {
278
+ if (isDebugEnabled()) {
279
+ console.log(DEBUG_PREFIX, ...args);
280
+ }
281
+ };
282
+
283
+ // src/utils/initializeCartSession.ts
284
+ var initializeCartSession = async (client, cartHeaders) => {
285
+ try {
286
+ debug("session", "Initializing cart session");
287
+ const response = await client.get("/wc/store/v1/cart");
288
+ const nonce = response.headers["nonce"] || response.headers["Nonce"];
289
+ const cartToken = response.headers["cart-token"] || response.headers["Cart-Token"];
290
+ if (nonce || cartToken) {
291
+ await cartHeaders.save({
292
+ nonce: nonce || void 0,
293
+ cartToken: cartToken || void 0
294
+ });
295
+ debug("session", "Cart session initialized", {
296
+ hasNonce: !!nonce,
297
+ hasCartToken: !!cartToken
298
+ });
299
+ }
300
+ } catch (error) {
301
+ debug("session", "Failed to initialize cart session", error);
302
+ throw error;
303
+ }
304
+ };
305
+
306
+ export { calculatePagination, debug, getPaginationMeta, handleApiResponse, handlePaginatedApiResponse, initializeCartSession, isZodError };
307
+ //# sourceMappingURL=index.mjs.map
308
+ //# sourceMappingURL=index.mjs.map