@ikatec/digisac-api-sdk 3.0.0 → 4.0.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 (37) hide show
  1. package/README.md +42 -7
  2. package/dist/apis/cards/types.d.ts +89 -7
  3. package/dist/apis/cards/types.d.ts.map +1 -1
  4. package/dist/apis/pipeline/types.d.ts +67 -3
  5. package/dist/apis/pipeline/types.d.ts.map +1 -1
  6. package/dist/core/BaseApiClient.cjs +25 -31
  7. package/dist/core/BaseApiClient.cjs.map +1 -1
  8. package/dist/core/BaseApiClient.d.ts +2 -11
  9. package/dist/core/BaseApiClient.d.ts.map +1 -1
  10. package/dist/core/BaseApiClient.mjs +27 -31
  11. package/dist/core/BaseApiClient.mjs.map +1 -1
  12. package/dist/core/errors.cjs +192 -0
  13. package/dist/core/errors.cjs.map +1 -0
  14. package/dist/core/errors.d.ts +117 -0
  15. package/dist/core/errors.d.ts.map +1 -0
  16. package/dist/core/errors.mjs +177 -0
  17. package/dist/core/errors.mjs.map +1 -0
  18. package/dist/core/index.cjs +16 -2
  19. package/dist/core/index.d.ts +3 -2
  20. package/dist/core/index.d.ts.map +1 -1
  21. package/dist/core/index.mjs +3 -2
  22. package/dist/incommingWebhooks/index.d.ts +3 -3
  23. package/dist/incommingWebhooks/index.d.ts.map +1 -1
  24. package/dist/index.cjs +16 -2
  25. package/dist/index.mjs +3 -2
  26. package/package.json +1 -1
  27. package/src/apis/cards/types.ts +104 -7
  28. package/src/apis/pipeline/types.ts +71 -3
  29. package/src/core/BaseApiClient.test.ts +221 -7
  30. package/src/core/BaseApiClient.ts +37 -50
  31. package/src/core/BaseCrudApi.test-d.ts +48 -0
  32. package/src/core/BaseCrudApi.test.ts +150 -0
  33. package/src/core/errors.test-d.ts +14 -0
  34. package/src/core/errors.test.ts +389 -0
  35. package/src/core/errors.ts +284 -0
  36. package/src/core/index.ts +18 -2
  37. package/src/incommingWebhooks/index.ts +3 -3
@@ -0,0 +1,192 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ //#region src/core/errors.ts
4
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
5
+ /**
6
+ * Flattens the backend `errors` object — `{ <location>: { <field>: { messages: string[], types: string[] } } }`
7
+ * — into one {@link FieldError} per message. Returns `null` when there are no field errors.
8
+ */
9
+ function parseFieldErrors(errors) {
10
+ if (!isRecord(errors)) return null;
11
+ const parsed = [];
12
+ for (const [location, fields] of Object.entries(errors)) {
13
+ if (!isRecord(fields)) continue;
14
+ for (const [field, detail] of Object.entries(fields)) {
15
+ if (!isRecord(detail)) continue;
16
+ const messages = Array.isArray(detail.messages) ? detail.messages.map(String) : [];
17
+ const types = Array.isArray(detail.types) ? detail.types.map(String) : [];
18
+ messages.forEach((message, index) => {
19
+ parsed.push({
20
+ location,
21
+ field,
22
+ path: `${location}.${field}`,
23
+ message,
24
+ code: types[index] ?? types[0] ?? ""
25
+ });
26
+ });
27
+ }
28
+ }
29
+ return parsed.length ? parsed : null;
30
+ }
31
+ /** Base class of every error thrown by the SDK. */
32
+ var DigisacError = class extends Error {
33
+ constructor(message, options) {
34
+ super(message, options);
35
+ this.name = "DigisacError";
36
+ }
37
+ };
38
+ /** The request never got an HTTP response (network failure, DNS, connection refused, ...). */
39
+ var ApiConnectionError = class extends DigisacError {
40
+ constructor(message = "Connection error.", options) {
41
+ super(message, options);
42
+ this.name = "ApiConnectionError";
43
+ }
44
+ };
45
+ /**
46
+ * The API answered with a non-2xx status. Thrown as the subclass matching the status
47
+ * (`NotFoundError`, `BadRequestError`, ...) — or `ValidationError` for a 400 field validation
48
+ * failure — so callers can narrow with `instanceof`.
49
+ */
50
+ var ApiError = class extends DigisacError {
51
+ /** The backend error name (`error` in the body), e.g. `ValidationError` or `PaymentRequired`. */
52
+ errorClass;
53
+ status;
54
+ /** Field errors of a 400 `ValidationError`; `null` when the response carries none. */
55
+ validationErrors;
56
+ headers;
57
+ /** The parsed JSON error body (`{ error, message, status, errors?, extra? }`), or the raw text. */
58
+ body;
59
+ constructor(message, errorClass, status, validationErrors = null, options = {}) {
60
+ super(message);
61
+ this.name = "ApiError";
62
+ this.errorClass = errorClass;
63
+ this.status = status;
64
+ this.validationErrors = validationErrors;
65
+ this.headers = options.headers;
66
+ this.body = options.body;
67
+ }
68
+ /**
69
+ * Builds the `ApiError` subclass for a response and its (already read) body: `ValidationError`
70
+ * for a 400 `ValidationError`, else the class of the status.
71
+ */
72
+ static fromResponse(status, statusText, headers, body) {
73
+ let message = `HTTP Error ${status}: ${statusText}`;
74
+ let errorClass;
75
+ let validationErrors = null;
76
+ if (isRecord(body)) {
77
+ const apiMessage = typeof body.message === "string" ? body.message : void 0;
78
+ errorClass = typeof body.error === "string" ? body.error : void 0;
79
+ message = apiMessage || errorClass || message;
80
+ validationErrors = parseFieldErrors(body.errors);
81
+ }
82
+ return new (errorClassFor(status, errorClass))(message, errorClass, status, validationErrors, {
83
+ headers,
84
+ body
85
+ });
86
+ }
87
+ };
88
+ /** 400 (see {@link ValidationError} for field validation failures). */
89
+ var BadRequestError = class extends ApiError {
90
+ name = "BadRequestError";
91
+ };
92
+ /**
93
+ * 400 `ValidationError` — the request failed field validation. `validationErrors` is always an
94
+ * array here (empty when the backend sent no field details).
95
+ */
96
+ var ValidationError = class extends BadRequestError {
97
+ name = "ValidationError";
98
+ constructor(message, errorClass, status, validationErrors = null, options = {}) {
99
+ super(message, errorClass, status, validationErrors ?? [], options);
100
+ }
101
+ };
102
+ /** 401 — missing or invalid access token. */
103
+ var AuthenticationError = class extends ApiError {
104
+ name = "AuthenticationError";
105
+ };
106
+ /** 402 — the account is out of credits or over a plan limit. */
107
+ var PaymentRequiredError = class extends ApiError {
108
+ name = "PaymentRequiredError";
109
+ };
110
+ /** 403 — the user lacks the permission for this action. */
111
+ var PermissionDeniedError = class extends ApiError {
112
+ name = "PermissionDeniedError";
113
+ };
114
+ /** 404 */
115
+ var NotFoundError = class extends ApiError {
116
+ name = "NotFoundError";
117
+ };
118
+ /** 409 */
119
+ var ConflictError = class extends ApiError {
120
+ name = "ConflictError";
121
+ };
122
+ /** 422 */
123
+ var UnprocessableEntityError = class extends ApiError {
124
+ name = "UnprocessableEntityError";
125
+ };
126
+ /** 429 */
127
+ var RateLimitError = class extends ApiError {
128
+ name = "RateLimitError";
129
+ /**
130
+ * Seconds to wait before retrying, or `null` when the response does not say.
131
+ *
132
+ * Reads the standard `Retry-After` header (delay seconds or HTTP date) first, then the
133
+ * `X-RateLimit-Reset` header the Digisac backend sends (Unix time in seconds).
134
+ */
135
+ get retryAfter() {
136
+ return parseRetryAfter(this.headers?.get("Retry-After")) ?? parseRateLimitReset(this.headers?.get("X-RateLimit-Reset"));
137
+ }
138
+ };
139
+ const secondsUntil = (epochMs) => Math.max(0, Math.ceil((epochMs - Date.now()) / 1e3));
140
+ /** `Retry-After`: delay seconds or an HTTP date. */
141
+ function parseRetryAfter(value) {
142
+ if (!value?.trim()) return null;
143
+ const seconds = Number(value);
144
+ if (Number.isFinite(seconds)) return Math.max(0, seconds);
145
+ const date = Date.parse(value);
146
+ return Number.isNaN(date) ? null : secondsUntil(date);
147
+ }
148
+ /**
149
+ * `X-RateLimit-Reset`: Unix time in seconds (what the Digisac backend sends). Small values are
150
+ * read as delay seconds instead, the other convention in use for this header.
151
+ */
152
+ function parseRateLimitReset(value) {
153
+ if (!value?.trim()) return null;
154
+ const reset = Number(value);
155
+ if (!Number.isFinite(reset)) return null;
156
+ return reset < 1e9 ? Math.max(0, reset) : secondsUntil(reset * 1e3);
157
+ }
158
+ /** 5xx */
159
+ var InternalServerError = class extends ApiError {
160
+ name = "InternalServerError";
161
+ };
162
+ function errorClassFor(status, errorClass) {
163
+ if (status === 400 && errorClass === "ValidationError") return ValidationError;
164
+ switch (status) {
165
+ case 400: return BadRequestError;
166
+ case 401: return AuthenticationError;
167
+ case 402: return PaymentRequiredError;
168
+ case 403: return PermissionDeniedError;
169
+ case 404: return NotFoundError;
170
+ case 409: return ConflictError;
171
+ case 422: return UnprocessableEntityError;
172
+ case 429: return RateLimitError;
173
+ default: return status >= 500 ? InternalServerError : ApiError;
174
+ }
175
+ }
176
+
177
+ //#endregion
178
+ exports.ApiConnectionError = ApiConnectionError;
179
+ exports.ApiError = ApiError;
180
+ exports.AuthenticationError = AuthenticationError;
181
+ exports.BadRequestError = BadRequestError;
182
+ exports.ConflictError = ConflictError;
183
+ exports.DigisacError = DigisacError;
184
+ exports.InternalServerError = InternalServerError;
185
+ exports.NotFoundError = NotFoundError;
186
+ exports.PaymentRequiredError = PaymentRequiredError;
187
+ exports.PermissionDeniedError = PermissionDeniedError;
188
+ exports.RateLimitError = RateLimitError;
189
+ exports.UnprocessableEntityError = UnprocessableEntityError;
190
+ exports.ValidationError = ValidationError;
191
+ exports.parseFieldErrors = parseFieldErrors;
192
+ //# sourceMappingURL=errors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.cjs","names":[],"sources":["../../src/core/errors.ts"],"sourcesContent":["/**\n * A field-level error from the backend `validate` middleware — one entry per failed rule.\n */\nexport interface FieldError {\n /** Where the field was read from: `body`, `params`, `query`, `headers` or `cookies`. */\n location: string\n /** The field name, e.g. `name`. */\n field: string\n /** `<location>.<field>`, e.g. `body.name`. */\n path: string\n message: string\n /** The failed rule, e.g. `required` or `hasLengthLesserThanOrEqual`. */\n code: string\n}\n\n/**\n * The backend error name sent as `error` in the body (`ApiError.errorClass`). Known names are listed\n * for autocomplete; any other string is still accepted. `HttpError` is the generic one: most 400s\n * and every unexpected 500.\n */\nexport type ErrorClassName =\n | 'HttpError'\n | 'ValidationError'\n | 'BadRequestHttpError'\n | 'UnauthorizedHttpError'\n | 'PaymentRequired'\n | 'ForbiddenHttpError'\n | 'NotFoundHttpError'\n | 'TooManyRequestsHttpError'\n | (string & {})\n\nexport interface ApiErrorOptions {\n /** Response headers. */\n headers?: Headers\n /** The parsed JSON error body, or the raw text when it is not JSON. */\n body?: unknown\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\n/**\n * Flattens the backend `errors` object — `{ <location>: { <field>: { messages: string[], types: string[] } } }`\n * — into one {@link FieldError} per message. Returns `null` when there are no field errors.\n */\nexport function parseFieldErrors(errors: unknown): FieldError[] | null {\n if (!isRecord(errors)) {\n return null\n }\n\n const parsed: FieldError[] = []\n for (const [location, fields] of Object.entries(errors)) {\n if (!isRecord(fields)) {\n continue\n }\n for (const [field, detail] of Object.entries(fields)) {\n if (!isRecord(detail)) {\n continue\n }\n const messages = Array.isArray(detail.messages) ? detail.messages.map(String) : []\n const types = Array.isArray(detail.types) ? detail.types.map(String) : []\n messages.forEach((message, index) => {\n parsed.push({\n location,\n field,\n path: `${location}.${field}`,\n message,\n code: types[index] ?? types[0] ?? '',\n })\n })\n }\n }\n\n return parsed.length ? parsed : null\n}\n\n/** Base class of every error thrown by the SDK. */\nexport class DigisacError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options)\n this.name = 'DigisacError'\n }\n}\n\n/** The request never got an HTTP response (network failure, DNS, connection refused, ...). */\nexport class ApiConnectionError extends DigisacError {\n constructor(message = 'Connection error.', options?: { cause?: unknown }) {\n super(message, options)\n this.name = 'ApiConnectionError'\n }\n}\n\n/**\n * The API answered with a non-2xx status. Thrown as the subclass matching the status\n * (`NotFoundError`, `BadRequestError`, ...) — or `ValidationError` for a 400 field validation\n * failure — so callers can narrow with `instanceof`.\n */\nexport class ApiError extends DigisacError {\n /** The backend error name (`error` in the body), e.g. `ValidationError` or `PaymentRequired`. */\n public readonly errorClass?: ErrorClassName | undefined\n public readonly status?: number | undefined\n /** Field errors of a 400 `ValidationError`; `null` when the response carries none. */\n public readonly validationErrors: FieldError[] | null\n public readonly headers?: Headers | undefined\n /** The parsed JSON error body (`{ error, message, status, errors?, extra? }`), or the raw text. */\n public readonly body?: unknown\n\n constructor(\n message: string,\n errorClass?: ErrorClassName,\n status?: number,\n validationErrors: FieldError[] | null = null,\n options: ApiErrorOptions = {},\n ) {\n super(message)\n this.name = 'ApiError'\n this.errorClass = errorClass\n this.status = status\n this.validationErrors = validationErrors\n this.headers = options.headers\n this.body = options.body\n }\n\n /**\n * Builds the `ApiError` subclass for a response and its (already read) body: `ValidationError`\n * for a 400 `ValidationError`, else the class of the status.\n */\n static fromResponse(\n status: number,\n statusText: string,\n headers: Headers,\n body: unknown,\n ): ApiError {\n let message = `HTTP Error ${status}: ${statusText}`\n let errorClass: string | undefined\n let validationErrors: FieldError[] | null = null\n\n if (isRecord(body)) {\n const apiMessage = typeof body.message === 'string' ? body.message : undefined\n errorClass = typeof body.error === 'string' ? body.error : undefined\n message = apiMessage || errorClass || message\n validationErrors = parseFieldErrors(body.errors)\n }\n\n const ErrorClass = errorClassFor(status, errorClass)\n return new ErrorClass(message, errorClass, status, validationErrors, { headers, body })\n }\n}\n\n/** 400 (see {@link ValidationError} for field validation failures). */\nexport class BadRequestError extends ApiError {\n override name = 'BadRequestError'\n}\n\n/**\n * 400 `ValidationError` — the request failed field validation. `validationErrors` is always an\n * array here (empty when the backend sent no field details).\n */\nexport class ValidationError extends BadRequestError {\n override name = 'ValidationError'\n declare public readonly validationErrors: FieldError[]\n\n constructor(\n message: string,\n errorClass?: ErrorClassName,\n status?: number,\n validationErrors: FieldError[] | null = null,\n options: ApiErrorOptions = {},\n ) {\n super(message, errorClass, status, validationErrors ?? [], options)\n }\n}\n\n/** 401 — missing or invalid access token. */\nexport class AuthenticationError extends ApiError {\n override name = 'AuthenticationError'\n}\n\n/** 402 — the account is out of credits or over a plan limit. */\nexport class PaymentRequiredError extends ApiError {\n override name = 'PaymentRequiredError'\n}\n\n/** 403 — the user lacks the permission for this action. */\nexport class PermissionDeniedError extends ApiError {\n override name = 'PermissionDeniedError'\n}\n\n/** 404 */\nexport class NotFoundError extends ApiError {\n override name = 'NotFoundError'\n}\n\n/** 409 */\nexport class ConflictError extends ApiError {\n override name = 'ConflictError'\n}\n\n/** 422 */\nexport class UnprocessableEntityError extends ApiError {\n override name = 'UnprocessableEntityError'\n}\n\n/** 429 */\nexport class RateLimitError extends ApiError {\n override name = 'RateLimitError'\n\n /**\n * Seconds to wait before retrying, or `null` when the response does not say.\n *\n * Reads the standard `Retry-After` header (delay seconds or HTTP date) first, then the\n * `X-RateLimit-Reset` header the Digisac backend sends (Unix time in seconds).\n */\n get retryAfter(): number | null {\n return (\n parseRetryAfter(this.headers?.get('Retry-After')) ??\n parseRateLimitReset(this.headers?.get('X-RateLimit-Reset'))\n )\n }\n}\n\nconst secondsUntil = (epochMs: number): number =>\n Math.max(0, Math.ceil((epochMs - Date.now()) / 1000))\n\n/** `Retry-After`: delay seconds or an HTTP date. */\nfunction parseRetryAfter(value: string | null | undefined): number | null {\n if (!value?.trim()) {\n return null\n }\n const seconds = Number(value)\n if (Number.isFinite(seconds)) {\n return Math.max(0, seconds)\n }\n const date = Date.parse(value)\n return Number.isNaN(date) ? null : secondsUntil(date)\n}\n\n/**\n * `X-RateLimit-Reset`: Unix time in seconds (what the Digisac backend sends). Small values are\n * read as delay seconds instead, the other convention in use for this header.\n */\nfunction parseRateLimitReset(value: string | null | undefined): number | null {\n if (!value?.trim()) {\n return null\n }\n const reset = Number(value)\n if (!Number.isFinite(reset)) {\n return null\n }\n // Anything before 2001-09-09 (1e9 s) can't be a reset time, so it is a delay.\n return reset < 1e9 ? Math.max(0, reset) : secondsUntil(reset * 1000)\n}\n\n/** 5xx */\nexport class InternalServerError extends ApiError {\n override name = 'InternalServerError'\n}\n\nfunction errorClassFor(status: number, errorClass: string | undefined): typeof ApiError {\n if (status === 400 && errorClass === 'ValidationError') {\n return ValidationError\n }\n\n switch (status) {\n case 400:\n return BadRequestError\n case 401:\n return AuthenticationError\n case 402:\n return PaymentRequiredError\n case 403:\n return PermissionDeniedError\n case 404:\n return NotFoundError\n case 409:\n return ConflictError\n case 422:\n return UnprocessableEntityError\n case 429:\n return RateLimitError\n default:\n return status >= 500 ? InternalServerError : ApiError\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * A field-level error from the backend `validate` middleware — one entry per failed rule.
3
+ */
4
+ export interface FieldError {
5
+ /** Where the field was read from: `body`, `params`, `query`, `headers` or `cookies`. */
6
+ location: string;
7
+ /** The field name, e.g. `name`. */
8
+ field: string;
9
+ /** `<location>.<field>`, e.g. `body.name`. */
10
+ path: string;
11
+ message: string;
12
+ /** The failed rule, e.g. `required` or `hasLengthLesserThanOrEqual`. */
13
+ code: string;
14
+ }
15
+ /**
16
+ * The backend error name sent as `error` in the body (`ApiError.errorClass`). Known names are listed
17
+ * for autocomplete; any other string is still accepted. `HttpError` is the generic one: most 400s
18
+ * and every unexpected 500.
19
+ */
20
+ export type ErrorClassName = 'HttpError' | 'ValidationError' | 'BadRequestHttpError' | 'UnauthorizedHttpError' | 'PaymentRequired' | 'ForbiddenHttpError' | 'NotFoundHttpError' | 'TooManyRequestsHttpError' | (string & {});
21
+ export interface ApiErrorOptions {
22
+ /** Response headers. */
23
+ headers?: Headers;
24
+ /** The parsed JSON error body, or the raw text when it is not JSON. */
25
+ body?: unknown;
26
+ }
27
+ /**
28
+ * Flattens the backend `errors` object — `{ <location>: { <field>: { messages: string[], types: string[] } } }`
29
+ * — into one {@link FieldError} per message. Returns `null` when there are no field errors.
30
+ */
31
+ export declare function parseFieldErrors(errors: unknown): FieldError[] | null;
32
+ /** Base class of every error thrown by the SDK. */
33
+ export declare class DigisacError extends Error {
34
+ constructor(message: string, options?: {
35
+ cause?: unknown;
36
+ });
37
+ }
38
+ /** The request never got an HTTP response (network failure, DNS, connection refused, ...). */
39
+ export declare class ApiConnectionError extends DigisacError {
40
+ constructor(message?: string, options?: {
41
+ cause?: unknown;
42
+ });
43
+ }
44
+ /**
45
+ * The API answered with a non-2xx status. Thrown as the subclass matching the status
46
+ * (`NotFoundError`, `BadRequestError`, ...) — or `ValidationError` for a 400 field validation
47
+ * failure — so callers can narrow with `instanceof`.
48
+ */
49
+ export declare class ApiError extends DigisacError {
50
+ /** The backend error name (`error` in the body), e.g. `ValidationError` or `PaymentRequired`. */
51
+ readonly errorClass?: ErrorClassName | undefined;
52
+ readonly status?: number | undefined;
53
+ /** Field errors of a 400 `ValidationError`; `null` when the response carries none. */
54
+ readonly validationErrors: FieldError[] | null;
55
+ readonly headers?: Headers | undefined;
56
+ /** The parsed JSON error body (`{ error, message, status, errors?, extra? }`), or the raw text. */
57
+ readonly body?: unknown;
58
+ constructor(message: string, errorClass?: ErrorClassName, status?: number, validationErrors?: FieldError[] | null, options?: ApiErrorOptions);
59
+ /**
60
+ * Builds the `ApiError` subclass for a response and its (already read) body: `ValidationError`
61
+ * for a 400 `ValidationError`, else the class of the status.
62
+ */
63
+ static fromResponse(status: number, statusText: string, headers: Headers, body: unknown): ApiError;
64
+ }
65
+ /** 400 (see {@link ValidationError} for field validation failures). */
66
+ export declare class BadRequestError extends ApiError {
67
+ name: string;
68
+ }
69
+ /**
70
+ * 400 `ValidationError` — the request failed field validation. `validationErrors` is always an
71
+ * array here (empty when the backend sent no field details).
72
+ */
73
+ export declare class ValidationError extends BadRequestError {
74
+ name: string;
75
+ readonly validationErrors: FieldError[];
76
+ constructor(message: string, errorClass?: ErrorClassName, status?: number, validationErrors?: FieldError[] | null, options?: ApiErrorOptions);
77
+ }
78
+ /** 401 — missing or invalid access token. */
79
+ export declare class AuthenticationError extends ApiError {
80
+ name: string;
81
+ }
82
+ /** 402 — the account is out of credits or over a plan limit. */
83
+ export declare class PaymentRequiredError extends ApiError {
84
+ name: string;
85
+ }
86
+ /** 403 — the user lacks the permission for this action. */
87
+ export declare class PermissionDeniedError extends ApiError {
88
+ name: string;
89
+ }
90
+ /** 404 */
91
+ export declare class NotFoundError extends ApiError {
92
+ name: string;
93
+ }
94
+ /** 409 */
95
+ export declare class ConflictError extends ApiError {
96
+ name: string;
97
+ }
98
+ /** 422 */
99
+ export declare class UnprocessableEntityError extends ApiError {
100
+ name: string;
101
+ }
102
+ /** 429 */
103
+ export declare class RateLimitError extends ApiError {
104
+ name: string;
105
+ /**
106
+ * Seconds to wait before retrying, or `null` when the response does not say.
107
+ *
108
+ * Reads the standard `Retry-After` header (delay seconds or HTTP date) first, then the
109
+ * `X-RateLimit-Reset` header the Digisac backend sends (Unix time in seconds).
110
+ */
111
+ get retryAfter(): number | null;
112
+ }
113
+ /** 5xx */
114
+ export declare class InternalServerError extends ApiError {
115
+ name: string;
116
+ }
117
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ //#region src/core/errors.ts
2
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
3
+ /**
4
+ * Flattens the backend `errors` object — `{ <location>: { <field>: { messages: string[], types: string[] } } }`
5
+ * — into one {@link FieldError} per message. Returns `null` when there are no field errors.
6
+ */
7
+ function parseFieldErrors(errors) {
8
+ if (!isRecord(errors)) return null;
9
+ const parsed = [];
10
+ for (const [location, fields] of Object.entries(errors)) {
11
+ if (!isRecord(fields)) continue;
12
+ for (const [field, detail] of Object.entries(fields)) {
13
+ if (!isRecord(detail)) continue;
14
+ const messages = Array.isArray(detail.messages) ? detail.messages.map(String) : [];
15
+ const types = Array.isArray(detail.types) ? detail.types.map(String) : [];
16
+ messages.forEach((message, index) => {
17
+ parsed.push({
18
+ location,
19
+ field,
20
+ path: `${location}.${field}`,
21
+ message,
22
+ code: types[index] ?? types[0] ?? ""
23
+ });
24
+ });
25
+ }
26
+ }
27
+ return parsed.length ? parsed : null;
28
+ }
29
+ /** Base class of every error thrown by the SDK. */
30
+ var DigisacError = class extends Error {
31
+ constructor(message, options) {
32
+ super(message, options);
33
+ this.name = "DigisacError";
34
+ }
35
+ };
36
+ /** The request never got an HTTP response (network failure, DNS, connection refused, ...). */
37
+ var ApiConnectionError = class extends DigisacError {
38
+ constructor(message = "Connection error.", options) {
39
+ super(message, options);
40
+ this.name = "ApiConnectionError";
41
+ }
42
+ };
43
+ /**
44
+ * The API answered with a non-2xx status. Thrown as the subclass matching the status
45
+ * (`NotFoundError`, `BadRequestError`, ...) — or `ValidationError` for a 400 field validation
46
+ * failure — so callers can narrow with `instanceof`.
47
+ */
48
+ var ApiError = class extends DigisacError {
49
+ /** The backend error name (`error` in the body), e.g. `ValidationError` or `PaymentRequired`. */
50
+ errorClass;
51
+ status;
52
+ /** Field errors of a 400 `ValidationError`; `null` when the response carries none. */
53
+ validationErrors;
54
+ headers;
55
+ /** The parsed JSON error body (`{ error, message, status, errors?, extra? }`), or the raw text. */
56
+ body;
57
+ constructor(message, errorClass, status, validationErrors = null, options = {}) {
58
+ super(message);
59
+ this.name = "ApiError";
60
+ this.errorClass = errorClass;
61
+ this.status = status;
62
+ this.validationErrors = validationErrors;
63
+ this.headers = options.headers;
64
+ this.body = options.body;
65
+ }
66
+ /**
67
+ * Builds the `ApiError` subclass for a response and its (already read) body: `ValidationError`
68
+ * for a 400 `ValidationError`, else the class of the status.
69
+ */
70
+ static fromResponse(status, statusText, headers, body) {
71
+ let message = `HTTP Error ${status}: ${statusText}`;
72
+ let errorClass;
73
+ let validationErrors = null;
74
+ if (isRecord(body)) {
75
+ const apiMessage = typeof body.message === "string" ? body.message : void 0;
76
+ errorClass = typeof body.error === "string" ? body.error : void 0;
77
+ message = apiMessage || errorClass || message;
78
+ validationErrors = parseFieldErrors(body.errors);
79
+ }
80
+ return new (errorClassFor(status, errorClass))(message, errorClass, status, validationErrors, {
81
+ headers,
82
+ body
83
+ });
84
+ }
85
+ };
86
+ /** 400 (see {@link ValidationError} for field validation failures). */
87
+ var BadRequestError = class extends ApiError {
88
+ name = "BadRequestError";
89
+ };
90
+ /**
91
+ * 400 `ValidationError` — the request failed field validation. `validationErrors` is always an
92
+ * array here (empty when the backend sent no field details).
93
+ */
94
+ var ValidationError = class extends BadRequestError {
95
+ name = "ValidationError";
96
+ constructor(message, errorClass, status, validationErrors = null, options = {}) {
97
+ super(message, errorClass, status, validationErrors ?? [], options);
98
+ }
99
+ };
100
+ /** 401 — missing or invalid access token. */
101
+ var AuthenticationError = class extends ApiError {
102
+ name = "AuthenticationError";
103
+ };
104
+ /** 402 — the account is out of credits or over a plan limit. */
105
+ var PaymentRequiredError = class extends ApiError {
106
+ name = "PaymentRequiredError";
107
+ };
108
+ /** 403 — the user lacks the permission for this action. */
109
+ var PermissionDeniedError = class extends ApiError {
110
+ name = "PermissionDeniedError";
111
+ };
112
+ /** 404 */
113
+ var NotFoundError = class extends ApiError {
114
+ name = "NotFoundError";
115
+ };
116
+ /** 409 */
117
+ var ConflictError = class extends ApiError {
118
+ name = "ConflictError";
119
+ };
120
+ /** 422 */
121
+ var UnprocessableEntityError = class extends ApiError {
122
+ name = "UnprocessableEntityError";
123
+ };
124
+ /** 429 */
125
+ var RateLimitError = class extends ApiError {
126
+ name = "RateLimitError";
127
+ /**
128
+ * Seconds to wait before retrying, or `null` when the response does not say.
129
+ *
130
+ * Reads the standard `Retry-After` header (delay seconds or HTTP date) first, then the
131
+ * `X-RateLimit-Reset` header the Digisac backend sends (Unix time in seconds).
132
+ */
133
+ get retryAfter() {
134
+ return parseRetryAfter(this.headers?.get("Retry-After")) ?? parseRateLimitReset(this.headers?.get("X-RateLimit-Reset"));
135
+ }
136
+ };
137
+ const secondsUntil = (epochMs) => Math.max(0, Math.ceil((epochMs - Date.now()) / 1e3));
138
+ /** `Retry-After`: delay seconds or an HTTP date. */
139
+ function parseRetryAfter(value) {
140
+ if (!value?.trim()) return null;
141
+ const seconds = Number(value);
142
+ if (Number.isFinite(seconds)) return Math.max(0, seconds);
143
+ const date = Date.parse(value);
144
+ return Number.isNaN(date) ? null : secondsUntil(date);
145
+ }
146
+ /**
147
+ * `X-RateLimit-Reset`: Unix time in seconds (what the Digisac backend sends). Small values are
148
+ * read as delay seconds instead, the other convention in use for this header.
149
+ */
150
+ function parseRateLimitReset(value) {
151
+ if (!value?.trim()) return null;
152
+ const reset = Number(value);
153
+ if (!Number.isFinite(reset)) return null;
154
+ return reset < 1e9 ? Math.max(0, reset) : secondsUntil(reset * 1e3);
155
+ }
156
+ /** 5xx */
157
+ var InternalServerError = class extends ApiError {
158
+ name = "InternalServerError";
159
+ };
160
+ function errorClassFor(status, errorClass) {
161
+ if (status === 400 && errorClass === "ValidationError") return ValidationError;
162
+ switch (status) {
163
+ case 400: return BadRequestError;
164
+ case 401: return AuthenticationError;
165
+ case 402: return PaymentRequiredError;
166
+ case 403: return PermissionDeniedError;
167
+ case 404: return NotFoundError;
168
+ case 409: return ConflictError;
169
+ case 422: return UnprocessableEntityError;
170
+ case 429: return RateLimitError;
171
+ default: return status >= 500 ? InternalServerError : ApiError;
172
+ }
173
+ }
174
+
175
+ //#endregion
176
+ export { ApiConnectionError, ApiError, AuthenticationError, BadRequestError, ConflictError, DigisacError, InternalServerError, NotFoundError, PaymentRequiredError, PermissionDeniedError, RateLimitError, UnprocessableEntityError, ValidationError, parseFieldErrors };
177
+ //# sourceMappingURL=errors.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.mjs","names":[],"sources":["../../src/core/errors.ts"],"sourcesContent":["/**\n * A field-level error from the backend `validate` middleware — one entry per failed rule.\n */\nexport interface FieldError {\n /** Where the field was read from: `body`, `params`, `query`, `headers` or `cookies`. */\n location: string\n /** The field name, e.g. `name`. */\n field: string\n /** `<location>.<field>`, e.g. `body.name`. */\n path: string\n message: string\n /** The failed rule, e.g. `required` or `hasLengthLesserThanOrEqual`. */\n code: string\n}\n\n/**\n * The backend error name sent as `error` in the body (`ApiError.errorClass`). Known names are listed\n * for autocomplete; any other string is still accepted. `HttpError` is the generic one: most 400s\n * and every unexpected 500.\n */\nexport type ErrorClassName =\n | 'HttpError'\n | 'ValidationError'\n | 'BadRequestHttpError'\n | 'UnauthorizedHttpError'\n | 'PaymentRequired'\n | 'ForbiddenHttpError'\n | 'NotFoundHttpError'\n | 'TooManyRequestsHttpError'\n | (string & {})\n\nexport interface ApiErrorOptions {\n /** Response headers. */\n headers?: Headers\n /** The parsed JSON error body, or the raw text when it is not JSON. */\n body?: unknown\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\n/**\n * Flattens the backend `errors` object — `{ <location>: { <field>: { messages: string[], types: string[] } } }`\n * — into one {@link FieldError} per message. Returns `null` when there are no field errors.\n */\nexport function parseFieldErrors(errors: unknown): FieldError[] | null {\n if (!isRecord(errors)) {\n return null\n }\n\n const parsed: FieldError[] = []\n for (const [location, fields] of Object.entries(errors)) {\n if (!isRecord(fields)) {\n continue\n }\n for (const [field, detail] of Object.entries(fields)) {\n if (!isRecord(detail)) {\n continue\n }\n const messages = Array.isArray(detail.messages) ? detail.messages.map(String) : []\n const types = Array.isArray(detail.types) ? detail.types.map(String) : []\n messages.forEach((message, index) => {\n parsed.push({\n location,\n field,\n path: `${location}.${field}`,\n message,\n code: types[index] ?? types[0] ?? '',\n })\n })\n }\n }\n\n return parsed.length ? parsed : null\n}\n\n/** Base class of every error thrown by the SDK. */\nexport class DigisacError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options)\n this.name = 'DigisacError'\n }\n}\n\n/** The request never got an HTTP response (network failure, DNS, connection refused, ...). */\nexport class ApiConnectionError extends DigisacError {\n constructor(message = 'Connection error.', options?: { cause?: unknown }) {\n super(message, options)\n this.name = 'ApiConnectionError'\n }\n}\n\n/**\n * The API answered with a non-2xx status. Thrown as the subclass matching the status\n * (`NotFoundError`, `BadRequestError`, ...) — or `ValidationError` for a 400 field validation\n * failure — so callers can narrow with `instanceof`.\n */\nexport class ApiError extends DigisacError {\n /** The backend error name (`error` in the body), e.g. `ValidationError` or `PaymentRequired`. */\n public readonly errorClass?: ErrorClassName | undefined\n public readonly status?: number | undefined\n /** Field errors of a 400 `ValidationError`; `null` when the response carries none. */\n public readonly validationErrors: FieldError[] | null\n public readonly headers?: Headers | undefined\n /** The parsed JSON error body (`{ error, message, status, errors?, extra? }`), or the raw text. */\n public readonly body?: unknown\n\n constructor(\n message: string,\n errorClass?: ErrorClassName,\n status?: number,\n validationErrors: FieldError[] | null = null,\n options: ApiErrorOptions = {},\n ) {\n super(message)\n this.name = 'ApiError'\n this.errorClass = errorClass\n this.status = status\n this.validationErrors = validationErrors\n this.headers = options.headers\n this.body = options.body\n }\n\n /**\n * Builds the `ApiError` subclass for a response and its (already read) body: `ValidationError`\n * for a 400 `ValidationError`, else the class of the status.\n */\n static fromResponse(\n status: number,\n statusText: string,\n headers: Headers,\n body: unknown,\n ): ApiError {\n let message = `HTTP Error ${status}: ${statusText}`\n let errorClass: string | undefined\n let validationErrors: FieldError[] | null = null\n\n if (isRecord(body)) {\n const apiMessage = typeof body.message === 'string' ? body.message : undefined\n errorClass = typeof body.error === 'string' ? body.error : undefined\n message = apiMessage || errorClass || message\n validationErrors = parseFieldErrors(body.errors)\n }\n\n const ErrorClass = errorClassFor(status, errorClass)\n return new ErrorClass(message, errorClass, status, validationErrors, { headers, body })\n }\n}\n\n/** 400 (see {@link ValidationError} for field validation failures). */\nexport class BadRequestError extends ApiError {\n override name = 'BadRequestError'\n}\n\n/**\n * 400 `ValidationError` — the request failed field validation. `validationErrors` is always an\n * array here (empty when the backend sent no field details).\n */\nexport class ValidationError extends BadRequestError {\n override name = 'ValidationError'\n declare public readonly validationErrors: FieldError[]\n\n constructor(\n message: string,\n errorClass?: ErrorClassName,\n status?: number,\n validationErrors: FieldError[] | null = null,\n options: ApiErrorOptions = {},\n ) {\n super(message, errorClass, status, validationErrors ?? [], options)\n }\n}\n\n/** 401 — missing or invalid access token. */\nexport class AuthenticationError extends ApiError {\n override name = 'AuthenticationError'\n}\n\n/** 402 — the account is out of credits or over a plan limit. */\nexport class PaymentRequiredError extends ApiError {\n override name = 'PaymentRequiredError'\n}\n\n/** 403 — the user lacks the permission for this action. */\nexport class PermissionDeniedError extends ApiError {\n override name = 'PermissionDeniedError'\n}\n\n/** 404 */\nexport class NotFoundError extends ApiError {\n override name = 'NotFoundError'\n}\n\n/** 409 */\nexport class ConflictError extends ApiError {\n override name = 'ConflictError'\n}\n\n/** 422 */\nexport class UnprocessableEntityError extends ApiError {\n override name = 'UnprocessableEntityError'\n}\n\n/** 429 */\nexport class RateLimitError extends ApiError {\n override name = 'RateLimitError'\n\n /**\n * Seconds to wait before retrying, or `null` when the response does not say.\n *\n * Reads the standard `Retry-After` header (delay seconds or HTTP date) first, then the\n * `X-RateLimit-Reset` header the Digisac backend sends (Unix time in seconds).\n */\n get retryAfter(): number | null {\n return (\n parseRetryAfter(this.headers?.get('Retry-After')) ??\n parseRateLimitReset(this.headers?.get('X-RateLimit-Reset'))\n )\n }\n}\n\nconst secondsUntil = (epochMs: number): number =>\n Math.max(0, Math.ceil((epochMs - Date.now()) / 1000))\n\n/** `Retry-After`: delay seconds or an HTTP date. */\nfunction parseRetryAfter(value: string | null | undefined): number | null {\n if (!value?.trim()) {\n return null\n }\n const seconds = Number(value)\n if (Number.isFinite(seconds)) {\n return Math.max(0, seconds)\n }\n const date = Date.parse(value)\n return Number.isNaN(date) ? null : secondsUntil(date)\n}\n\n/**\n * `X-RateLimit-Reset`: Unix time in seconds (what the Digisac backend sends). Small values are\n * read as delay seconds instead, the other convention in use for this header.\n */\nfunction parseRateLimitReset(value: string | null | undefined): number | null {\n if (!value?.trim()) {\n return null\n }\n const reset = Number(value)\n if (!Number.isFinite(reset)) {\n return null\n }\n // Anything before 2001-09-09 (1e9 s) can't be a reset time, so it is a delay.\n return reset < 1e9 ? Math.max(0, reset) : secondsUntil(reset * 1000)\n}\n\n/** 5xx */\nexport class InternalServerError extends ApiError {\n override name = 'InternalServerError'\n}\n\nfunction errorClassFor(status: number, errorClass: string | undefined): typeof ApiError {\n if (status === 400 && errorClass === 'ValidationError') {\n return ValidationError\n }\n\n switch (status) {\n case 400:\n return BadRequestError\n case 401:\n return AuthenticationError\n case 402:\n return PaymentRequiredError\n case 403:\n return PermissionDeniedError\n case 404:\n return NotFoundError\n case 409:\n return ConflictError\n case 422:\n return UnprocessableEntityError\n case 429:\n return RateLimitError\n default:\n return status >= 500 ? InternalServerError : ApiError\n }\n}\n"],"mappings":"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"}
@@ -1,9 +1,23 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_core_errors = require('./errors.cjs');
2
3
  const require_core_BaseApiClient = require('./BaseApiClient.cjs');
3
4
  const require_core_BaseCrudApi = require('./BaseCrudApi.cjs');
4
5
  const require_core_ArchivableCrudApi = require('./ArchivableCrudApi.cjs');
5
6
 
6
- exports.ApiError = require_core_BaseApiClient.ApiError;
7
+ exports.ApiConnectionError = require_core_errors.ApiConnectionError;
8
+ exports.ApiError = require_core_errors.ApiError;
7
9
  exports.ArchivableCrudApi = require_core_ArchivableCrudApi.ArchivableCrudApi;
10
+ exports.AuthenticationError = require_core_errors.AuthenticationError;
11
+ exports.BadRequestError = require_core_errors.BadRequestError;
8
12
  exports.BaseApiClient = require_core_BaseApiClient.BaseApiClient;
9
- exports.BaseCrudApi = require_core_BaseCrudApi.BaseCrudApi;
13
+ exports.BaseCrudApi = require_core_BaseCrudApi.BaseCrudApi;
14
+ exports.ConflictError = require_core_errors.ConflictError;
15
+ exports.DigisacError = require_core_errors.DigisacError;
16
+ exports.InternalServerError = require_core_errors.InternalServerError;
17
+ exports.NotFoundError = require_core_errors.NotFoundError;
18
+ exports.PaymentRequiredError = require_core_errors.PaymentRequiredError;
19
+ exports.PermissionDeniedError = require_core_errors.PermissionDeniedError;
20
+ exports.RateLimitError = require_core_errors.RateLimitError;
21
+ exports.UnprocessableEntityError = require_core_errors.UnprocessableEntityError;
22
+ exports.ValidationError = require_core_errors.ValidationError;
23
+ exports.parseFieldErrors = require_core_errors.parseFieldErrors;
@@ -1,6 +1,7 @@
1
1
  export type { ApiClient, HttpMethod } from './ApiClient';
2
- export { BaseApiClient, ApiError } from './BaseApiClient';
3
- export type { ValidationError } from './BaseApiClient';
2
+ export { BaseApiClient } from './BaseApiClient';
3
+ export { DigisacError, ApiConnectionError, ApiError, BadRequestError, ValidationError, AuthenticationError, PaymentRequiredError, PermissionDeniedError, NotFoundError, ConflictError, UnprocessableEntityError, RateLimitError, InternalServerError, parseFieldErrors, } from './errors';
4
+ export type { FieldError, ErrorClassName, ApiErrorOptions } from './errors';
4
5
  export { BaseCrudApi } from './BaseCrudApi';
5
6
  export { ArchivableCrudApi } from './ArchivableCrudApi';
6
7
  export type { WhereClause, IncludeItem, ListQuery, GetByIdQuery, Paginated } from './types';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,UAAU,CAAA;AACjB,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA"}
@@ -1,5 +1,6 @@
1
- import { ApiError, BaseApiClient } from "./BaseApiClient.mjs";
1
+ import { ApiConnectionError, ApiError, AuthenticationError, BadRequestError, ConflictError, DigisacError, InternalServerError, NotFoundError, PaymentRequiredError, PermissionDeniedError, RateLimitError, UnprocessableEntityError, ValidationError, parseFieldErrors } from "./errors.mjs";
2
+ import { BaseApiClient } from "./BaseApiClient.mjs";
2
3
  import { BaseCrudApi } from "./BaseCrudApi.mjs";
3
4
  import { ArchivableCrudApi } from "./ArchivableCrudApi.mjs";
4
5
 
5
- export { ApiError, ArchivableCrudApi, BaseApiClient, BaseCrudApi };
6
+ export { ApiConnectionError, ApiError, ArchivableCrudApi, AuthenticationError, BadRequestError, BaseApiClient, BaseCrudApi, ConflictError, DigisacError, InternalServerError, NotFoundError, PaymentRequiredError, PermissionDeniedError, RateLimitError, UnprocessableEntityError, ValidationError, parseFieldErrors };
@@ -5,7 +5,7 @@ import type { Department, DepartmentRelationships } from '../apis/departments';
5
5
  import type { Message, MessageRelationships } from '../apis/messages';
6
6
  import type { Organization, OrganizationRelationships } from '../apis/organizations';
7
7
  import type { Person, PersonRelationships } from '../apis/people';
8
- import type { Pipeline, PipelineRelationships } from '../apis/pipeline';
8
+ import type { PipelineRecord } from '../apis/pipeline';
9
9
  import type { QuickReply, QuickReplyRelationships } from '../apis/quickReplies';
10
10
  import type { Role, RoleRelationships } from '../apis/roles';
11
11
  import type { Service, ServiceRelationships } from '../apis/services';
@@ -66,8 +66,8 @@ export interface WebhookEventPayloadMap {
66
66
  'campaign.created': Omit<Campaign, CampaignRelationships>;
67
67
  'campaign.updated': Omit<Campaign, CampaignRelationships>;
68
68
  'campaign.destroyed': Omit<Campaign, CampaignRelationships>;
69
- 'pipeline.created': Omit<Pipeline, PipelineRelationships>;
70
- 'pipeline.updated': Omit<Pipeline, PipelineRelationships>;
69
+ 'pipeline.created': PipelineRecord;
70
+ 'pipeline.updated': PipelineRecord;
71
71
  }
72
72
  export type WebhookPayload<E extends WebhookEvent = WebhookEvent> = {
73
73
  event: E;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/incommingWebhooks/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/incommingWebhooks/index.ts"],"names":[],"mappings":"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"}