@felixgeelhaar/jira-sdk 0.3.0 → 1.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.
- package/README.md +214 -374
- package/dist/auth/index.cjs +400 -0
- package/dist/auth/index.cjs.map +1 -0
- package/dist/auth/index.d.cts +192 -0
- package/dist/auth/index.d.ts +192 -0
- package/dist/auth/index.js +386 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/errors/index.cjs +272 -0
- package/dist/errors/index.cjs.map +1 -0
- package/dist/errors/index.d.cts +203 -0
- package/dist/errors/index.d.ts +203 -0
- package/dist/errors/index.js +254 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/http-client-BSzRYQZa.d.cts +317 -0
- package/dist/http-client-erRvYNs-.d.ts +317 -0
- package/dist/index.cjs +9541 -13612
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1242 -76
- package/dist/index.d.ts +1242 -76
- package/dist/index.js +9118 -13450
- package/dist/index.js.map +1 -1
- package/dist/schemas/index.cjs +2429 -13094
- package/dist/schemas/index.cjs.map +1 -1
- package/dist/schemas/index.d.cts +351 -13
- package/dist/schemas/index.d.ts +351 -13
- package/dist/schemas/index.js +2096 -13052
- package/dist/schemas/index.js.map +1 -1
- package/dist/services/index.cjs +6346 -13497
- package/dist/services/index.cjs.map +1 -1
- package/dist/services/index.d.cts +3828 -358
- package/dist/services/index.d.ts +3828 -358
- package/dist/services/index.js +6330 -13504
- package/dist/services/index.js.map +1 -1
- package/dist/transport/index.cjs +1016 -0
- package/dist/transport/index.cjs.map +1 -0
- package/dist/transport/index.d.cts +372 -0
- package/dist/transport/index.d.ts +372 -0
- package/dist/transport/index.js +997 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/types-E6djPHpW.d.cts +95 -0
- package/dist/types-E6djPHpW.d.ts +95 -0
- package/dist/webhook-Bn8gme6Y.d.cts +6959 -0
- package/dist/webhook-Bn8gme6Y.d.ts +6959 -0
- package/package.json +73 -27
- package/dist/project-B1UelBH4.d.cts +0 -1810
- package/dist/project-B1UelBH4.d.ts +0 -1810
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/utils/runtime.ts
|
|
4
|
+
function captureStackTrace(target, constructor) {
|
|
5
|
+
const capture = Error.captureStackTrace;
|
|
6
|
+
capture?.(target, constructor);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// src/errors/base.error.ts
|
|
10
|
+
var JiraSdkError = class extends Error {
|
|
11
|
+
/** HTTP status code if applicable */
|
|
12
|
+
statusCode;
|
|
13
|
+
/** Original cause of the error */
|
|
14
|
+
cause;
|
|
15
|
+
/** Additional context/metadata */
|
|
16
|
+
context;
|
|
17
|
+
constructor(message, options) {
|
|
18
|
+
super(message, options?.cause !== void 0 ? { cause: options.cause } : void 0);
|
|
19
|
+
this.name = this.constructor.name;
|
|
20
|
+
if (options?.cause !== void 0) {
|
|
21
|
+
this.cause = options.cause;
|
|
22
|
+
}
|
|
23
|
+
if (options?.statusCode !== void 0) {
|
|
24
|
+
this.statusCode = options.statusCode;
|
|
25
|
+
}
|
|
26
|
+
if (options?.context !== void 0) {
|
|
27
|
+
this.context = options.context;
|
|
28
|
+
}
|
|
29
|
+
captureStackTrace(this, this.constructor);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Returns a JSON representation of the error
|
|
33
|
+
*/
|
|
34
|
+
toJSON() {
|
|
35
|
+
return {
|
|
36
|
+
name: this.name,
|
|
37
|
+
code: this.code,
|
|
38
|
+
message: this.message,
|
|
39
|
+
statusCode: this.statusCode,
|
|
40
|
+
context: this.context,
|
|
41
|
+
cause: this.cause?.message,
|
|
42
|
+
stack: this.stack
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// src/errors/api.error.ts
|
|
48
|
+
var ApiError = class extends JiraSdkError {
|
|
49
|
+
code = "JIRA_API_ERROR";
|
|
50
|
+
/** Parsed error details from Jira response */
|
|
51
|
+
details;
|
|
52
|
+
/** Raw response body */
|
|
53
|
+
responseBody;
|
|
54
|
+
constructor(message, statusCode, responseBody) {
|
|
55
|
+
const details = parseErrorBody(responseBody);
|
|
56
|
+
const finalMessage = details ? buildErrorMessage(message, details) : message;
|
|
57
|
+
super(finalMessage, { statusCode, context: { responseBody } });
|
|
58
|
+
this.details = details;
|
|
59
|
+
this.responseBody = responseBody;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns all error messages as a single array
|
|
63
|
+
*/
|
|
64
|
+
getAllMessages() {
|
|
65
|
+
const messages = [];
|
|
66
|
+
if (this.details?.errorMessages) {
|
|
67
|
+
messages.push(...this.details.errorMessages);
|
|
68
|
+
}
|
|
69
|
+
if (this.details?.errors) {
|
|
70
|
+
for (const [field, msg] of Object.entries(this.details.errors)) {
|
|
71
|
+
messages.push(`${field}: ${msg}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (messages.length === 0) {
|
|
75
|
+
messages.push(this.message);
|
|
76
|
+
}
|
|
77
|
+
return messages;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
var UnauthorizedError = class extends ApiError {
|
|
81
|
+
code = "JIRA_UNAUTHORIZED";
|
|
82
|
+
constructor(message = "Authentication required", responseBody) {
|
|
83
|
+
super(message, 401, responseBody);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
var ForbiddenError = class extends ApiError {
|
|
87
|
+
code = "JIRA_FORBIDDEN";
|
|
88
|
+
constructor(message = "Permission denied", responseBody) {
|
|
89
|
+
super(message, 403, responseBody);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
var NotFoundError = class extends ApiError {
|
|
93
|
+
code = "JIRA_NOT_FOUND";
|
|
94
|
+
constructor(message = "Resource not found", responseBody) {
|
|
95
|
+
super(message, 404, responseBody);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
var RateLimitError = class extends ApiError {
|
|
99
|
+
code = "JIRA_RATE_LIMITED";
|
|
100
|
+
/** When to retry (in milliseconds) */
|
|
101
|
+
retryAfter;
|
|
102
|
+
constructor(message = "Rate limit exceeded", responseBody, options) {
|
|
103
|
+
super(message, 429, responseBody);
|
|
104
|
+
this.retryAfter = options?.retryAfter;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
var ServerError = class extends ApiError {
|
|
108
|
+
code = "JIRA_SERVER_ERROR";
|
|
109
|
+
constructor(message = "Internal server error", responseBody, statusCode = 500) {
|
|
110
|
+
super(message, statusCode, responseBody);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
function parseErrorBody(body) {
|
|
114
|
+
if (!body || typeof body !== "object") {
|
|
115
|
+
return void 0;
|
|
116
|
+
}
|
|
117
|
+
const obj = body;
|
|
118
|
+
return {
|
|
119
|
+
errorMessages: Array.isArray(obj["errorMessages"]) ? obj["errorMessages"] : void 0,
|
|
120
|
+
errors: typeof obj["errors"] === "object" && obj["errors"] !== null ? obj["errors"] : void 0,
|
|
121
|
+
warningMessages: Array.isArray(obj["warningMessages"]) ? obj["warningMessages"] : void 0
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function buildErrorMessage(baseMessage, details) {
|
|
125
|
+
if (details.errorMessages?.length) {
|
|
126
|
+
return details.errorMessages.join("; ");
|
|
127
|
+
}
|
|
128
|
+
if (details.errors && Object.keys(details.errors).length > 0) {
|
|
129
|
+
const fieldErrors = Object.entries(details.errors).map(([field, msg]) => `${field}: ${msg}`).join("; ");
|
|
130
|
+
return `${baseMessage}: ${fieldErrors}`;
|
|
131
|
+
}
|
|
132
|
+
return baseMessage;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// src/errors/validation.error.ts
|
|
136
|
+
var ValidationError = class _ValidationError extends JiraSdkError {
|
|
137
|
+
code = "VALIDATION_ERROR";
|
|
138
|
+
/** Validation issues from Zod */
|
|
139
|
+
issues;
|
|
140
|
+
/**
|
|
141
|
+
* @param message Human-readable description of what failed.
|
|
142
|
+
* @param zodError The underlying Zod error, when the failure came from schema
|
|
143
|
+
* validation. Omit it for validation that is not schema-driven — for example
|
|
144
|
+
* a missing environment variable — in which case {@link issues} is empty.
|
|
145
|
+
*/
|
|
146
|
+
constructor(message, zodError) {
|
|
147
|
+
super(message, {
|
|
148
|
+
context: {
|
|
149
|
+
issues: zodError?.issues ?? []
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
this.issues = zodError?.issues ?? [];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Creates a ValidationError from a ZodError
|
|
156
|
+
*/
|
|
157
|
+
static fromZodError(zodError, prefix = "Validation failed") {
|
|
158
|
+
const message = `${prefix}: ${formatZodIssues(zodError.issues)}`;
|
|
159
|
+
return new _ValidationError(message, zodError);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Returns a flat list of all error paths and messages
|
|
163
|
+
*/
|
|
164
|
+
getFieldErrors() {
|
|
165
|
+
return this.issues.map((issue) => ({
|
|
166
|
+
path: issue.path.join("."),
|
|
167
|
+
message: issue.message
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
var ConfigValidationError = class _ConfigValidationError extends ValidationError {
|
|
172
|
+
code = "CONFIG_VALIDATION_ERROR";
|
|
173
|
+
static fromZodError(zodError) {
|
|
174
|
+
const message = `Configuration validation failed: ${formatZodIssues(zodError.issues)}`;
|
|
175
|
+
return new _ConfigValidationError(message, zodError);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
var ResponseValidationError = class _ResponseValidationError extends ValidationError {
|
|
179
|
+
code = "RESPONSE_VALIDATION_ERROR";
|
|
180
|
+
static fromZodError(zodError) {
|
|
181
|
+
const message = `Response validation failed: ${formatZodIssues(zodError.issues)}`;
|
|
182
|
+
return new _ResponseValidationError(message, zodError);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
function formatZodIssues(issues) {
|
|
186
|
+
return issues.map((issue) => {
|
|
187
|
+
const path = issue.path.length > 0 ? `${issue.path.join(".")}: ` : "";
|
|
188
|
+
return `${path}${issue.message}`;
|
|
189
|
+
}).join("; ");
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// src/errors/network.error.ts
|
|
193
|
+
var NetworkError = class extends JiraSdkError {
|
|
194
|
+
code = "NETWORK_ERROR";
|
|
195
|
+
constructor(message, options) {
|
|
196
|
+
super(message, { cause: options?.cause });
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Check if this error indicates a connection failure
|
|
200
|
+
*/
|
|
201
|
+
isConnectionError() {
|
|
202
|
+
const msg = this.message.toLowerCase();
|
|
203
|
+
return msg.includes("econnrefused") || msg.includes("econnreset") || msg.includes("enotfound") || msg.includes("fetch failed");
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Check if this error might be retryable
|
|
207
|
+
*/
|
|
208
|
+
isRetryable() {
|
|
209
|
+
const msg = this.message.toLowerCase();
|
|
210
|
+
return msg.includes("econnreset") || msg.includes("etimedout") || msg.includes("temporary");
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
var TimeoutError = class extends JiraSdkError {
|
|
214
|
+
code = "TIMEOUT_ERROR";
|
|
215
|
+
/** The timeout duration in milliseconds */
|
|
216
|
+
timeoutMs;
|
|
217
|
+
constructor(message, options) {
|
|
218
|
+
super(message, { cause: options?.cause });
|
|
219
|
+
this.timeoutMs = options?.timeoutMs;
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
var AbortError = class extends JiraSdkError {
|
|
223
|
+
code = "ABORT_ERROR";
|
|
224
|
+
constructor(message = "Request was aborted", options) {
|
|
225
|
+
super(message, { cause: options?.cause });
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
// src/errors/auth.error.ts
|
|
230
|
+
var AuthError = class extends JiraSdkError {
|
|
231
|
+
code = "AUTH_ERROR";
|
|
232
|
+
constructor(message, context) {
|
|
233
|
+
super(message, { statusCode: 401, ...context !== void 0 && { context } });
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
var TokenRefreshError = class extends AuthError {
|
|
237
|
+
code = "TOKEN_REFRESH_ERROR";
|
|
238
|
+
};
|
|
239
|
+
var TokenExpiredError = class extends AuthError {
|
|
240
|
+
code = "TOKEN_EXPIRED_ERROR";
|
|
241
|
+
constructor(message = "Access token has expired", context) {
|
|
242
|
+
super(message, context);
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
var AuthConfigError = class extends AuthError {
|
|
246
|
+
code = "AUTH_CONFIG_ERROR";
|
|
247
|
+
validationErrors;
|
|
248
|
+
constructor(message, validationErrors) {
|
|
249
|
+
super(message, validationErrors !== void 0 ? { validationErrors } : void 0);
|
|
250
|
+
this.validationErrors = validationErrors;
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
exports.AbortError = AbortError;
|
|
255
|
+
exports.ApiError = ApiError;
|
|
256
|
+
exports.AuthConfigError = AuthConfigError;
|
|
257
|
+
exports.AuthError = AuthError;
|
|
258
|
+
exports.ConfigValidationError = ConfigValidationError;
|
|
259
|
+
exports.ForbiddenError = ForbiddenError;
|
|
260
|
+
exports.JiraSdkError = JiraSdkError;
|
|
261
|
+
exports.NetworkError = NetworkError;
|
|
262
|
+
exports.NotFoundError = NotFoundError;
|
|
263
|
+
exports.RateLimitError = RateLimitError;
|
|
264
|
+
exports.ResponseValidationError = ResponseValidationError;
|
|
265
|
+
exports.ServerError = ServerError;
|
|
266
|
+
exports.TimeoutError = TimeoutError;
|
|
267
|
+
exports.TokenExpiredError = TokenExpiredError;
|
|
268
|
+
exports.TokenRefreshError = TokenRefreshError;
|
|
269
|
+
exports.UnauthorizedError = UnauthorizedError;
|
|
270
|
+
exports.ValidationError = ValidationError;
|
|
271
|
+
//# sourceMappingURL=index.cjs.map
|
|
272
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/runtime.ts","../../src/errors/base.error.ts","../../src/errors/api.error.ts","../../src/errors/validation.error.ts","../../src/errors/network.error.ts","../../src/errors/auth.error.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Feature detection for host globals that TypeScript's DOM/Node lib types\n * declare as always present, but which are genuinely absent in some runtimes\n * this SDK supports (browsers, Workers, Deno, edge functions).\n *\n * Reading them through a widened view of `globalThis` keeps the runtime guard —\n * removing it would crash outside Node — while letting the type system see that\n * the check is meaningful, so it no longer reports the guard as an unnecessary\n * condition.\n */\ninterface RuntimeGlobals {\n process?: { env?: Record<string, string | undefined> };\n console?: { warn?: (...args: unknown[]) => void };\n crypto?: { randomUUID?: () => string };\n}\n\nfunction runtime(): RuntimeGlobals {\n return globalThis;\n}\n\n/**\n * Read `process.env`, or an empty object where `process` is unavailable.\n */\nexport function processEnv(): Record<string, string | undefined> {\n return runtime().process?.env ?? {};\n}\n\n/**\n * Read a single environment variable, or `undefined` where unavailable.\n */\nexport function readEnvVar(name: string): string | undefined {\n return processEnv()[name];\n}\n\n/**\n * Emit a warning through `console.warn` where one exists, otherwise do nothing.\n */\nexport function warn(message: string): void {\n runtime().console?.warn?.(message);\n}\n\n/**\n * Generate a UUID using `crypto.randomUUID` where available, falling back to a\n * timestamp-and-random identifier. The fallback is not cryptographically\n * random and is only used for request correlation IDs.\n */\nexport function randomId(): string {\n const uuid = runtime().crypto?.randomUUID?.();\n if (uuid !== undefined) {\n return uuid;\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * V8-only API used to trim the constructor frame from error stacks. Absent on\n * SpiderMonkey and JavaScriptCore.\n */\ntype CaptureStackTrace = (target: object, constructor?: unknown) => void;\n\n/**\n * Trim the constructor frame from an error's stack where the engine supports\n * it; a no-op elsewhere.\n *\n * `constructor` is typed `unknown` rather than `Function` so the signature does\n * not widen to \"any callable\" for callers. V8 expects a constructor function\n * there, and every call site passes `this.constructor`.\n */\nexport function captureStackTrace(target: object, constructor?: unknown): void {\n const capture = (Error as unknown as { captureStackTrace?: CaptureStackTrace }).captureStackTrace;\n capture?.(target, constructor);\n}\n","import { captureStackTrace } from '../utils/runtime.js';\n/**\n * Base error class for all SDK errors.\n * Provides consistent error structure with error codes and cause chaining.\n */\nexport abstract class JiraSdkError extends Error {\n /** Unique error code for programmatic handling */\n abstract readonly code: string;\n\n /** HTTP status code if applicable */\n readonly statusCode?: number;\n\n /** Original cause of the error */\n readonly cause?: Error;\n\n /** Additional context/metadata */\n readonly context?: Record<string, unknown>;\n\n constructor(\n message: string,\n options?: {\n cause?: Error | undefined;\n statusCode?: number | undefined;\n context?: Record<string, unknown> | undefined;\n }\n ) {\n super(message, options?.cause !== undefined ? { cause: options.cause } : undefined);\n this.name = this.constructor.name;\n\n // Only assign properties when values are defined (for exactOptionalPropertyTypes)\n if (options?.cause !== undefined) {\n this.cause = options.cause;\n }\n if (options?.statusCode !== undefined) {\n this.statusCode = options.statusCode;\n }\n if (options?.context !== undefined) {\n this.context = options.context;\n }\n\n // Maintains proper stack trace for where our error was thrown (V8 only)\n captureStackTrace(this, this.constructor);\n }\n\n /**\n * Returns a JSON representation of the error\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n statusCode: this.statusCode,\n context: this.context,\n cause: this.cause?.message,\n stack: this.stack,\n };\n }\n}\n","import { JiraSdkError } from './base.error.js';\n\n/**\n * Error details returned by Jira API\n */\nexport interface JiraErrorDetail {\n errorMessages?: string[] | undefined;\n errors?: Record<string, string> | undefined;\n warningMessages?: string[] | undefined;\n}\n\n/**\n * Error thrown when Jira API returns an error response.\n */\nexport class ApiError extends JiraSdkError {\n readonly code: string = 'JIRA_API_ERROR';\n\n /** Parsed error details from Jira response */\n readonly details: JiraErrorDetail | undefined;\n\n /** Raw response body */\n readonly responseBody: unknown;\n\n constructor(message: string, statusCode: number, responseBody?: unknown) {\n const details = parseErrorBody(responseBody);\n const finalMessage = details ? buildErrorMessage(message, details) : message;\n super(finalMessage, { statusCode, context: { responseBody } });\n this.details = details;\n this.responseBody = responseBody;\n }\n\n /**\n * Returns all error messages as a single array\n */\n getAllMessages(): string[] {\n const messages: string[] = [];\n\n if (this.details?.errorMessages) {\n messages.push(...this.details.errorMessages);\n }\n\n if (this.details?.errors) {\n for (const [field, msg] of Object.entries(this.details.errors)) {\n messages.push(`${field}: ${msg}`);\n }\n }\n\n if (messages.length === 0) {\n messages.push(this.message);\n }\n\n return messages;\n }\n}\n\n/**\n * Error thrown when user is not authenticated\n */\nexport class UnauthorizedError extends ApiError {\n override readonly code: string = 'JIRA_UNAUTHORIZED';\n\n constructor(message = 'Authentication required', responseBody?: unknown) {\n super(message, 401, responseBody);\n }\n}\n\n/**\n * Error thrown when user lacks required permissions\n */\nexport class ForbiddenError extends ApiError {\n override readonly code: string = 'JIRA_FORBIDDEN';\n\n constructor(message = 'Permission denied', responseBody?: unknown) {\n super(message, 403, responseBody);\n }\n}\n\n/**\n * Error thrown when requested resource is not found\n */\nexport class NotFoundError extends ApiError {\n override readonly code: string = 'JIRA_NOT_FOUND';\n\n constructor(message = 'Resource not found', responseBody?: unknown) {\n super(message, 404, responseBody);\n }\n}\n\n/**\n * Rate limit error options\n */\nexport interface RateLimitErrorOptions {\n retryAfter?: number | undefined;\n}\n\n/**\n * Error thrown when rate limit is exceeded\n */\nexport class RateLimitError extends ApiError {\n override readonly code: string = 'JIRA_RATE_LIMITED';\n\n /** When to retry (in milliseconds) */\n readonly retryAfter: number | undefined;\n\n constructor(\n message = 'Rate limit exceeded',\n responseBody?: unknown,\n options?: RateLimitErrorOptions\n ) {\n super(message, 429, responseBody);\n this.retryAfter = options?.retryAfter;\n }\n}\n\n/**\n * Error thrown when server encounters an internal error\n */\nexport class ServerError extends ApiError {\n override readonly code: string = 'JIRA_SERVER_ERROR';\n\n constructor(message = 'Internal server error', responseBody?: unknown, statusCode = 500) {\n super(message, statusCode, responseBody);\n }\n}\n\n// Helper functions\nfunction parseErrorBody(body: unknown): JiraErrorDetail | undefined {\n if (!body || typeof body !== 'object') {\n return undefined;\n }\n\n const obj = body as Record<string, unknown>;\n\n return {\n errorMessages: Array.isArray(obj['errorMessages'])\n ? (obj['errorMessages'] as string[])\n : undefined,\n errors:\n typeof obj['errors'] === 'object' && obj['errors'] !== null\n ? (obj['errors'] as Record<string, string>)\n : undefined,\n warningMessages: Array.isArray(obj['warningMessages'])\n ? (obj['warningMessages'] as string[])\n : undefined,\n };\n}\n\nfunction buildErrorMessage(baseMessage: string, details: JiraErrorDetail): string {\n // First, try to use error messages from the response\n if (details.errorMessages?.length) {\n return details.errorMessages.join('; ');\n }\n\n // Then, try field-specific errors\n if (details.errors && Object.keys(details.errors).length > 0) {\n const fieldErrors = Object.entries(details.errors)\n .map(([field, msg]) => `${field}: ${msg}`)\n .join('; ');\n return `${baseMessage}: ${fieldErrors}`;\n }\n\n return baseMessage;\n}\n","import type { ZodError, z } from 'zod';\nimport { JiraSdkError } from './base.error.js';\n\n/**\n * Error thrown when validation fails (either request or response).\n */\nexport class ValidationError extends JiraSdkError {\n readonly code: string = 'VALIDATION_ERROR';\n\n /** Validation issues from Zod */\n readonly issues: z.core.$ZodIssue[];\n\n /**\n * @param message Human-readable description of what failed.\n * @param zodError The underlying Zod error, when the failure came from schema\n * validation. Omit it for validation that is not schema-driven — for example\n * a missing environment variable — in which case {@link issues} is empty.\n */\n constructor(message: string, zodError?: ZodError) {\n super(message, {\n context: {\n issues: zodError?.issues ?? [],\n },\n });\n this.issues = zodError?.issues ?? [];\n }\n\n /**\n * Creates a ValidationError from a ZodError\n */\n static fromZodError(zodError: ZodError, prefix = 'Validation failed'): ValidationError {\n const message = `${prefix}: ${formatZodIssues(zodError.issues)}`;\n return new ValidationError(message, zodError);\n }\n\n /**\n * Returns a flat list of all error paths and messages\n */\n getFieldErrors(): Array<{ path: string; message: string }> {\n return this.issues.map((issue) => ({\n path: issue.path.join('.'),\n message: issue.message,\n }));\n }\n}\n\n/**\n * Error thrown when configuration validation fails\n */\nexport class ConfigValidationError extends ValidationError {\n override readonly code = 'CONFIG_VALIDATION_ERROR';\n\n static override fromZodError(zodError: ZodError): ConfigValidationError {\n const message = `Configuration validation failed: ${formatZodIssues(zodError.issues)}`;\n return new ConfigValidationError(message, zodError);\n }\n}\n\n/**\n * Error thrown when response validation fails\n */\nexport class ResponseValidationError extends ValidationError {\n override readonly code = 'RESPONSE_VALIDATION_ERROR';\n\n static override fromZodError(zodError: ZodError): ResponseValidationError {\n const message = `Response validation failed: ${formatZodIssues(zodError.issues)}`;\n return new ResponseValidationError(message, zodError);\n }\n}\n\n// Helper function\nfunction formatZodIssues(issues: z.core.$ZodIssue[]): string {\n return issues\n .map((issue) => {\n const path = issue.path.length > 0 ? `${issue.path.join('.')}: ` : '';\n return `${path}${issue.message}`;\n })\n .join('; ');\n}\n","import { JiraSdkError } from './base.error.js';\n\n/**\n * Error thrown when a network-level error occurs.\n */\nexport class NetworkError extends JiraSdkError {\n readonly code = 'NETWORK_ERROR';\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { cause: options?.cause as Error | undefined });\n }\n\n /**\n * Check if this error indicates a connection failure\n */\n isConnectionError(): boolean {\n const msg = this.message.toLowerCase();\n return (\n msg.includes('econnrefused') ||\n msg.includes('econnreset') ||\n msg.includes('enotfound') ||\n msg.includes('fetch failed')\n );\n }\n\n /**\n * Check if this error might be retryable\n */\n isRetryable(): boolean {\n const msg = this.message.toLowerCase();\n return msg.includes('econnreset') || msg.includes('etimedout') || msg.includes('temporary');\n }\n}\n\n/**\n * Error thrown when a request times out.\n */\nexport class TimeoutError extends JiraSdkError {\n readonly code = 'TIMEOUT_ERROR';\n\n /** The timeout duration in milliseconds */\n readonly timeoutMs: number | undefined;\n\n constructor(message: string, options?: { cause?: unknown; timeoutMs?: number }) {\n super(message, { cause: options?.cause as Error | undefined });\n this.timeoutMs = options?.timeoutMs;\n }\n}\n\n/**\n * Error thrown when a request is aborted.\n */\nexport class AbortError extends JiraSdkError {\n readonly code = 'ABORT_ERROR';\n\n constructor(message = 'Request was aborted', options?: { cause?: unknown }) {\n super(message, { cause: options?.cause as Error | undefined });\n }\n}\n","import type { z } from 'zod';\nimport { JiraSdkError } from './base.error.js';\n\n/**\n * Error thrown when authentication fails or is misconfigured.\n */\nexport class AuthError extends JiraSdkError {\n readonly code: string = 'AUTH_ERROR';\n\n constructor(message: string, context?: Record<string, unknown>) {\n super(message, { statusCode: 401, ...(context !== undefined && { context }) });\n }\n}\n\n/**\n * Error thrown when OAuth2 token refresh fails.\n */\nexport class TokenRefreshError extends AuthError {\n override readonly code: string = 'TOKEN_REFRESH_ERROR';\n}\n\n/**\n * Error thrown when OAuth2 token is expired.\n */\nexport class TokenExpiredError extends AuthError {\n override readonly code: string = 'TOKEN_EXPIRED_ERROR';\n\n constructor(message = 'Access token has expired', context?: Record<string, unknown>) {\n super(message, context);\n }\n}\n\n/**\n * Error thrown when auth configuration is invalid.\n */\nexport class AuthConfigError extends AuthError {\n override readonly code: string = 'AUTH_CONFIG_ERROR';\n readonly validationErrors: z.core.$ZodIssue[] | undefined;\n\n constructor(message: string, validationErrors?: z.core.$ZodIssue[]) {\n super(message, validationErrors !== undefined ? { validationErrors } : undefined);\n this.validationErrors = validationErrors;\n }\n}\n"]}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { z, ZodError } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Base error class for all SDK errors.
|
|
5
|
+
* Provides consistent error structure with error codes and cause chaining.
|
|
6
|
+
*/
|
|
7
|
+
declare abstract class JiraSdkError extends Error {
|
|
8
|
+
/** Unique error code for programmatic handling */
|
|
9
|
+
abstract readonly code: string;
|
|
10
|
+
/** HTTP status code if applicable */
|
|
11
|
+
readonly statusCode?: number;
|
|
12
|
+
/** Original cause of the error */
|
|
13
|
+
readonly cause?: Error;
|
|
14
|
+
/** Additional context/metadata */
|
|
15
|
+
readonly context?: Record<string, unknown>;
|
|
16
|
+
constructor(message: string, options?: {
|
|
17
|
+
cause?: Error | undefined;
|
|
18
|
+
statusCode?: number | undefined;
|
|
19
|
+
context?: Record<string, unknown> | undefined;
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* Returns a JSON representation of the error
|
|
23
|
+
*/
|
|
24
|
+
toJSON(): Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Error details returned by Jira API
|
|
29
|
+
*/
|
|
30
|
+
interface JiraErrorDetail {
|
|
31
|
+
errorMessages?: string[] | undefined;
|
|
32
|
+
errors?: Record<string, string> | undefined;
|
|
33
|
+
warningMessages?: string[] | undefined;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Error thrown when Jira API returns an error response.
|
|
37
|
+
*/
|
|
38
|
+
declare class ApiError extends JiraSdkError {
|
|
39
|
+
readonly code: string;
|
|
40
|
+
/** Parsed error details from Jira response */
|
|
41
|
+
readonly details: JiraErrorDetail | undefined;
|
|
42
|
+
/** Raw response body */
|
|
43
|
+
readonly responseBody: unknown;
|
|
44
|
+
constructor(message: string, statusCode: number, responseBody?: unknown);
|
|
45
|
+
/**
|
|
46
|
+
* Returns all error messages as a single array
|
|
47
|
+
*/
|
|
48
|
+
getAllMessages(): string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Error thrown when user is not authenticated
|
|
52
|
+
*/
|
|
53
|
+
declare class UnauthorizedError extends ApiError {
|
|
54
|
+
readonly code: string;
|
|
55
|
+
constructor(message?: string, responseBody?: unknown);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Error thrown when user lacks required permissions
|
|
59
|
+
*/
|
|
60
|
+
declare class ForbiddenError extends ApiError {
|
|
61
|
+
readonly code: string;
|
|
62
|
+
constructor(message?: string, responseBody?: unknown);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Error thrown when requested resource is not found
|
|
66
|
+
*/
|
|
67
|
+
declare class NotFoundError extends ApiError {
|
|
68
|
+
readonly code: string;
|
|
69
|
+
constructor(message?: string, responseBody?: unknown);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Rate limit error options
|
|
73
|
+
*/
|
|
74
|
+
interface RateLimitErrorOptions {
|
|
75
|
+
retryAfter?: number | undefined;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Error thrown when rate limit is exceeded
|
|
79
|
+
*/
|
|
80
|
+
declare class RateLimitError extends ApiError {
|
|
81
|
+
readonly code: string;
|
|
82
|
+
/** When to retry (in milliseconds) */
|
|
83
|
+
readonly retryAfter: number | undefined;
|
|
84
|
+
constructor(message?: string, responseBody?: unknown, options?: RateLimitErrorOptions);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Error thrown when server encounters an internal error
|
|
88
|
+
*/
|
|
89
|
+
declare class ServerError extends ApiError {
|
|
90
|
+
readonly code: string;
|
|
91
|
+
constructor(message?: string, responseBody?: unknown, statusCode?: number);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Error thrown when validation fails (either request or response).
|
|
96
|
+
*/
|
|
97
|
+
declare class ValidationError extends JiraSdkError {
|
|
98
|
+
readonly code: string;
|
|
99
|
+
/** Validation issues from Zod */
|
|
100
|
+
readonly issues: z.core.$ZodIssue[];
|
|
101
|
+
/**
|
|
102
|
+
* @param message Human-readable description of what failed.
|
|
103
|
+
* @param zodError The underlying Zod error, when the failure came from schema
|
|
104
|
+
* validation. Omit it for validation that is not schema-driven — for example
|
|
105
|
+
* a missing environment variable — in which case {@link issues} is empty.
|
|
106
|
+
*/
|
|
107
|
+
constructor(message: string, zodError?: ZodError);
|
|
108
|
+
/**
|
|
109
|
+
* Creates a ValidationError from a ZodError
|
|
110
|
+
*/
|
|
111
|
+
static fromZodError(zodError: ZodError, prefix?: string): ValidationError;
|
|
112
|
+
/**
|
|
113
|
+
* Returns a flat list of all error paths and messages
|
|
114
|
+
*/
|
|
115
|
+
getFieldErrors(): Array<{
|
|
116
|
+
path: string;
|
|
117
|
+
message: string;
|
|
118
|
+
}>;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Error thrown when configuration validation fails
|
|
122
|
+
*/
|
|
123
|
+
declare class ConfigValidationError extends ValidationError {
|
|
124
|
+
readonly code = "CONFIG_VALIDATION_ERROR";
|
|
125
|
+
static fromZodError(zodError: ZodError): ConfigValidationError;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Error thrown when response validation fails
|
|
129
|
+
*/
|
|
130
|
+
declare class ResponseValidationError extends ValidationError {
|
|
131
|
+
readonly code = "RESPONSE_VALIDATION_ERROR";
|
|
132
|
+
static fromZodError(zodError: ZodError): ResponseValidationError;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Error thrown when a network-level error occurs.
|
|
137
|
+
*/
|
|
138
|
+
declare class NetworkError extends JiraSdkError {
|
|
139
|
+
readonly code = "NETWORK_ERROR";
|
|
140
|
+
constructor(message: string, options?: {
|
|
141
|
+
cause?: unknown;
|
|
142
|
+
});
|
|
143
|
+
/**
|
|
144
|
+
* Check if this error indicates a connection failure
|
|
145
|
+
*/
|
|
146
|
+
isConnectionError(): boolean;
|
|
147
|
+
/**
|
|
148
|
+
* Check if this error might be retryable
|
|
149
|
+
*/
|
|
150
|
+
isRetryable(): boolean;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Error thrown when a request times out.
|
|
154
|
+
*/
|
|
155
|
+
declare class TimeoutError extends JiraSdkError {
|
|
156
|
+
readonly code = "TIMEOUT_ERROR";
|
|
157
|
+
/** The timeout duration in milliseconds */
|
|
158
|
+
readonly timeoutMs: number | undefined;
|
|
159
|
+
constructor(message: string, options?: {
|
|
160
|
+
cause?: unknown;
|
|
161
|
+
timeoutMs?: number;
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Error thrown when a request is aborted.
|
|
166
|
+
*/
|
|
167
|
+
declare class AbortError extends JiraSdkError {
|
|
168
|
+
readonly code = "ABORT_ERROR";
|
|
169
|
+
constructor(message?: string, options?: {
|
|
170
|
+
cause?: unknown;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Error thrown when authentication fails or is misconfigured.
|
|
176
|
+
*/
|
|
177
|
+
declare class AuthError extends JiraSdkError {
|
|
178
|
+
readonly code: string;
|
|
179
|
+
constructor(message: string, context?: Record<string, unknown>);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Error thrown when OAuth2 token refresh fails.
|
|
183
|
+
*/
|
|
184
|
+
declare class TokenRefreshError extends AuthError {
|
|
185
|
+
readonly code: string;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Error thrown when OAuth2 token is expired.
|
|
189
|
+
*/
|
|
190
|
+
declare class TokenExpiredError extends AuthError {
|
|
191
|
+
readonly code: string;
|
|
192
|
+
constructor(message?: string, context?: Record<string, unknown>);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Error thrown when auth configuration is invalid.
|
|
196
|
+
*/
|
|
197
|
+
declare class AuthConfigError extends AuthError {
|
|
198
|
+
readonly code: string;
|
|
199
|
+
readonly validationErrors: z.core.$ZodIssue[] | undefined;
|
|
200
|
+
constructor(message: string, validationErrors?: z.core.$ZodIssue[]);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export { AbortError, ApiError, AuthConfigError, AuthError, ConfigValidationError, ForbiddenError, type JiraErrorDetail, JiraSdkError, NetworkError, NotFoundError, RateLimitError, ResponseValidationError, ServerError, TimeoutError, TokenExpiredError, TokenRefreshError, UnauthorizedError, ValidationError };
|