@atlassian-dc-mcp/common 0.17.1 → 0.19.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 (46) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/build/__tests__/args.test.d.ts +2 -0
  3. package/build/__tests__/args.test.d.ts.map +1 -0
  4. package/build/__tests__/args.test.js +117 -0
  5. package/build/__tests__/args.test.js.map +1 -0
  6. package/build/__tests__/describe-error.test.d.ts +2 -0
  7. package/build/__tests__/describe-error.test.d.ts.map +1 -0
  8. package/build/__tests__/describe-error.test.js +54 -0
  9. package/build/__tests__/describe-error.test.js.map +1 -0
  10. package/build/__tests__/setup-cli.test.js +337 -44
  11. package/build/__tests__/setup-cli.test.js.map +1 -1
  12. package/build/config/source.d.ts +1 -0
  13. package/build/config/source.d.ts.map +1 -1
  14. package/build/config/source.js.map +1 -1
  15. package/build/index.d.ts +3 -1
  16. package/build/index.d.ts.map +1 -1
  17. package/build/index.js +3 -1
  18. package/build/index.js.map +1 -1
  19. package/build/setup/args.d.ts +14 -0
  20. package/build/setup/args.d.ts.map +1 -0
  21. package/build/setup/args.js +66 -0
  22. package/build/setup/args.js.map +1 -0
  23. package/build/setup/describe-error.d.ts +2 -0
  24. package/build/setup/describe-error.d.ts.map +1 -0
  25. package/build/setup/describe-error.js +50 -0
  26. package/build/setup/describe-error.js.map +1 -0
  27. package/build/setup/value-validator.d.ts +8 -0
  28. package/build/setup/value-validator.d.ts.map +1 -0
  29. package/build/setup/value-validator.js +57 -0
  30. package/build/setup/value-validator.js.map +1 -0
  31. package/build/setup-cli.d.ts +18 -0
  32. package/build/setup-cli.d.ts.map +1 -1
  33. package/build/setup-cli.js +241 -33
  34. package/build/setup-cli.js.map +1 -1
  35. package/jest.config.js +1 -0
  36. package/package.json +2 -2
  37. package/src/__tests__/args.test.ts +132 -0
  38. package/src/__tests__/describe-error.test.ts +70 -0
  39. package/src/__tests__/setup-cli.test.ts +393 -38
  40. package/src/config/source.ts +1 -0
  41. package/src/index.ts +3 -1
  42. package/src/setup/args.ts +78 -0
  43. package/src/setup/describe-error.ts +67 -0
  44. package/src/setup/value-validator.ts +59 -0
  45. package/src/setup-cli.ts +318 -36
  46. package/tsconfig.tsbuildinfo +1 -1
@@ -1,14 +1,40 @@
1
1
  import { confirm as inquirerConfirm, input as inquirerInput, password as inquirerPassword } from '@inquirer/prompts';
2
2
  import { buildDefaultRegistry } from './config/registry.js';
3
- import { getProductRuntimeConfig } from './config/runtime-config.js';
4
3
  import { HomeFileSource, getHomeFilePath } from './config/sources/home-file.js';
5
4
  import { MacosKeychainSource } from './config/sources/macos-keychain.js';
5
+ import { parseSetupArgs, printSetupHelp, SetupArgsError } from './setup/args.js';
6
+ import { SetupValueValidator } from './setup/value-validator.js';
6
7
  const FALLBACK_PAGE_SIZE = 25;
8
+ const MAX_VALIDATION_ATTEMPTS = 3;
7
9
  const DEFAULT_PROMPTS = {
8
10
  input: (opts) => inquirerInput(opts),
9
11
  password: (opts) => inquirerPassword(opts),
10
12
  confirm: (opts) => inquirerConfirm(opts),
11
13
  };
14
+ export async function runSetupCli(product, deps = {}) {
15
+ const rawArgv = process.argv.slice(2);
16
+ const argv = rawArgv[0] === 'setup' ? rawArgv.slice(1) : rawArgv;
17
+ const exit = deps.exit ?? ((code) => { process.exit(code); });
18
+ let args;
19
+ try {
20
+ args = parseSetupArgs(argv);
21
+ }
22
+ catch (error) {
23
+ if (error instanceof SetupArgsError) {
24
+ process.stderr.write(`${error.message}\n\n`);
25
+ printSetupHelp(product.id, (m) => process.stderr.write(`${m}\n`));
26
+ exit(1);
27
+ return;
28
+ }
29
+ throw error;
30
+ }
31
+ if (args.help) {
32
+ printSetupHelp(product.id, (m) => process.stdout.write(`${m}\n`));
33
+ exit(0);
34
+ return;
35
+ }
36
+ await runSetup(product, { ...deps, args });
37
+ }
12
38
  export async function runSetup(product, deps = {}) {
13
39
  const registry = deps.registry ?? buildDefaultRegistry();
14
40
  const log = deps.log ?? ((message) => process.stdout.write(`${message}\n`));
@@ -17,24 +43,157 @@ export async function runSetup(product, deps = {}) {
17
43
  registry.initialize();
18
44
  log(`Atlassian DC MCP setup — ${product.id}`);
19
45
  log('');
20
- const current = getProductRuntimeConfig(product);
46
+ const current = readCurrentConfig(registry, product);
21
47
  printCurrent(log, registry, product, current);
22
- let answers;
23
- try {
24
- answers = await promptForValues(prompts, product, current);
25
- }
26
- catch (error) {
27
- if (isUserCancel(error)) {
28
- exit(130);
29
- return;
30
- }
31
- throw error;
48
+ const answers = deps.args?.nonInteractive
49
+ ? await runNonInteractive(product, deps, current, log, exit, deps.args)
50
+ : await collectAnswersWithValidation(product, deps, prompts, current, log, exit, deps.args);
51
+ if (!answers) {
52
+ return;
32
53
  }
33
54
  const homeFile = requireHomeFile(registry);
34
55
  writeNonSecretFields(registry, product, answers, homeFile, log);
35
- const tokenWriter = await writeToken(registry, product, answers.token, homeFile, log, prompts);
56
+ const tokenWriter = await writeToken(registry, product, answers.tokenToWrite, homeFile, log, prompts);
36
57
  printSummary(log, product, answers, tokenWriter);
37
58
  }
59
+ async function collectAnswersWithValidation(product, deps, prompts, current, log, exit, args) {
60
+ let defaults = current;
61
+ for (let attempt = 1;; attempt++) {
62
+ let answers;
63
+ try {
64
+ answers = await promptForValues(prompts, product, defaults, args);
65
+ }
66
+ catch (error) {
67
+ if (isUserCancel(error)) {
68
+ exit(130);
69
+ return undefined;
70
+ }
71
+ throw error;
72
+ }
73
+ const answerErrors = validateAnswers(product, answers);
74
+ if (answerErrors.length > 0) {
75
+ for (const message of answerErrors) {
76
+ log(`Validation failed: ${message}`);
77
+ }
78
+ const retry = await confirmRetry(prompts, 'Try again?');
79
+ if (retry) {
80
+ defaults = answersAsDefaults(answers);
81
+ continue;
82
+ }
83
+ exit(1);
84
+ return undefined;
85
+ }
86
+ if (!deps.validateCredentials || !answers.tokenForValidation) {
87
+ return answers;
88
+ }
89
+ const result = await deps.validateCredentials({
90
+ host: answers.host,
91
+ apiBasePath: answers.apiBasePath,
92
+ token: answers.tokenForValidation,
93
+ });
94
+ if (result.ok) {
95
+ log(result.detail ? `Validation succeeded: ${result.detail}` : 'Validation succeeded.');
96
+ return answers;
97
+ }
98
+ log(`Validation failed: ${result.message}`);
99
+ const outcome = await offerRetryAfterFailure(prompts, attempt);
100
+ if (outcome === 'retry') {
101
+ defaults = answersAsDefaults(answers);
102
+ continue;
103
+ }
104
+ if (outcome === 'save-anyway') {
105
+ return answers;
106
+ }
107
+ exit(1);
108
+ return undefined;
109
+ }
110
+ }
111
+ async function runNonInteractive(product, deps, current, log, exit, args) {
112
+ let tokenToWrite;
113
+ let tokenForValidation;
114
+ if (args.token) {
115
+ tokenToWrite = args.token;
116
+ tokenForValidation = args.token;
117
+ }
118
+ else if (current.token) {
119
+ tokenForValidation = current.token;
120
+ }
121
+ const answers = {
122
+ host: args.host ?? current.host ?? '',
123
+ apiBasePath: args.apiBasePath ?? current.apiBasePath ?? product.defaultApiBasePath ?? '',
124
+ defaultPageSize: args.defaultPageSize ?? String(current.defaultPageSize ?? FALLBACK_PAGE_SIZE),
125
+ tokenToWrite,
126
+ tokenForValidation,
127
+ };
128
+ const formatErrors = validateAnswers(product, answers);
129
+ if (formatErrors.length > 0) {
130
+ for (const message of formatErrors) {
131
+ log(`Validation failed: ${message}`);
132
+ }
133
+ exit(1);
134
+ return undefined;
135
+ }
136
+ if (deps.validateCredentials && answers.tokenForValidation) {
137
+ const result = await deps.validateCredentials({
138
+ host: answers.host,
139
+ apiBasePath: answers.apiBasePath,
140
+ token: answers.tokenForValidation,
141
+ });
142
+ if (!result.ok) {
143
+ log(`Validation failed: ${result.message}`);
144
+ exit(1);
145
+ return undefined;
146
+ }
147
+ log(result.detail ? `Validation succeeded: ${result.detail}` : 'Validation succeeded.');
148
+ }
149
+ return answers;
150
+ }
151
+ function answersAsDefaults(answers) {
152
+ const pageSize = Number.parseInt(answers.defaultPageSize, 10);
153
+ return {
154
+ host: answers.host,
155
+ apiBasePath: answers.apiBasePath,
156
+ token: answers.tokenForValidation,
157
+ defaultPageSize: Number.isFinite(pageSize) && pageSize > 0 ? pageSize : undefined,
158
+ };
159
+ }
160
+ async function confirmRetry(prompts, message) {
161
+ return prompts.confirm({ message, default: true });
162
+ }
163
+ async function offerRetryAfterFailure(prompts, attempt) {
164
+ if (attempt < MAX_VALIDATION_ATTEMPTS) {
165
+ const retry = await confirmRetry(prompts, 'Try again with different values?');
166
+ if (retry) {
167
+ return 'retry';
168
+ }
169
+ }
170
+ const saveAnyway = await prompts.confirm({
171
+ message: 'Save configuration anyway?',
172
+ default: false,
173
+ });
174
+ return saveAnyway ? 'save-anyway' : 'abort';
175
+ }
176
+ function readCurrentConfig(registry, product) {
177
+ const pageSizeRaw = registry.resolve(product, 'defaultPageSize').value;
178
+ const pageSize = parsePositiveInteger(pageSizeRaw) ?? FALLBACK_PAGE_SIZE;
179
+ return {
180
+ host: registry.resolve(product, 'host').value,
181
+ apiBasePath: registry.resolve(product, 'apiBasePath').value,
182
+ token: registry.resolve(product, 'token').value,
183
+ defaultPageSize: pageSize,
184
+ };
185
+ }
186
+ function parsePositiveInteger(value) {
187
+ if (!value) {
188
+ return undefined;
189
+ }
190
+ const trimmed = value.trim();
191
+ if (!/^\d+$/.test(trimmed)) {
192
+ return undefined;
193
+ }
194
+ const parsed = Number.parseInt(trimmed, 10);
195
+ return parsed > 0 ? parsed : undefined;
196
+ }
38
197
  function requireHomeFile(registry) {
39
198
  const homeFile = registry.getWritableSource((s) => s instanceof HomeFileSource);
40
199
  if (!homeFile) {
@@ -53,36 +212,82 @@ function printCurrent(log, registry, product, current) {
53
212
  }
54
213
  log('');
55
214
  }
56
- async function promptForValues(prompts, product, current) {
57
- const host = await prompts.input({
215
+ async function promptForValues(prompts, product, defaults, args) {
216
+ const host = args?.host ?? await prompts.input({
58
217
  message: 'Host (e.g. jira.example.com):',
59
- default: current.host ?? '',
218
+ default: defaults.host ?? '',
219
+ validate: SetupValueValidator.host,
60
220
  });
61
- const apiBasePath = await prompts.input({
221
+ const apiBasePath = args?.apiBasePath ?? await prompts.input({
62
222
  message: 'API base path:',
63
- default: current.apiBasePath ?? product.defaultApiBasePath ?? '',
223
+ default: defaults.apiBasePath ?? product.defaultApiBasePath ?? '',
224
+ validate: SetupValueValidator.apiBasePath,
64
225
  });
65
- const defaultPageSize = await prompts.input({
226
+ const defaultPageSize = args?.defaultPageSize ?? await prompts.input({
66
227
  message: 'Default page size:',
67
- default: String(current.defaultPageSize ?? FALLBACK_PAGE_SIZE),
68
- validate: (raw) => /^\d+$/.test(raw.trim()) && Number.parseInt(raw.trim(), 10) > 0
69
- ? true
70
- : 'Enter a positive integer',
228
+ default: String(defaults.defaultPageSize ?? FALLBACK_PAGE_SIZE),
229
+ validate: SetupValueValidator.pageSize,
71
230
  });
72
- const token = await promptForToken(prompts, current.token);
73
- return { host: host.trim(), apiBasePath: apiBasePath.trim(), defaultPageSize: defaultPageSize.trim(), token };
231
+ const token = await promptForToken(prompts, defaults.token, args?.token);
232
+ return {
233
+ host: host.trim(),
234
+ apiBasePath: apiBasePath.trim(),
235
+ defaultPageSize: defaultPageSize.trim(),
236
+ ...token,
237
+ };
74
238
  }
75
- async function promptForToken(prompts, existing) {
76
- const entered = await prompts.password({ message: 'API token:', mask: '*' });
239
+ async function promptForToken(prompts, existing, fromArgs) {
240
+ if (fromArgs) {
241
+ return { tokenToWrite: fromArgs, tokenForValidation: fromArgs };
242
+ }
243
+ const entered = await prompts.password({
244
+ message: 'API token:',
245
+ mask: '*',
246
+ validate: SetupValueValidator.token,
247
+ });
77
248
  const trimmed = entered.trim();
78
249
  if (trimmed.length > 0) {
79
- return trimmed;
250
+ return { tokenToWrite: trimmed, tokenForValidation: trimmed };
80
251
  }
81
252
  if (!existing) {
82
- return undefined;
253
+ return { tokenToWrite: undefined, tokenForValidation: undefined };
254
+ }
255
+ const keepExisting = await prompts.confirm({ message: 'Keep existing token?', default: true });
256
+ return {
257
+ tokenToWrite: undefined,
258
+ tokenForValidation: keepExisting ? existing : undefined,
259
+ };
260
+ }
261
+ function validateAnswers(product, answers) {
262
+ const errors = [];
263
+ for (const [label, value, validator] of [
264
+ ['host', answers.host, SetupValueValidator.host],
265
+ ['API base path', answers.apiBasePath, SetupValueValidator.apiBasePath],
266
+ ]) {
267
+ const result = validator(value);
268
+ if (result !== true) {
269
+ errors.push(`${label}: ${result}`);
270
+ }
271
+ }
272
+ const pageSize = SetupValueValidator.pageSize(answers.defaultPageSize);
273
+ if (pageSize !== true) {
274
+ errors.push(`default page size: ${pageSize}`);
275
+ }
276
+ if (!answers.tokenForValidation) {
277
+ errors.push(`API token is required (${product.envVars.token}).`);
278
+ }
279
+ else {
280
+ const tokenResult = SetupValueValidator.token(answers.tokenForValidation);
281
+ if (tokenResult !== true) {
282
+ errors.push(`API token: ${tokenResult}`);
283
+ }
83
284
  }
84
- await prompts.confirm({ message: 'Keep existing token?', default: true });
85
- return undefined;
285
+ const hasHost = answers.host.length > 0;
286
+ const hasFullApiBasePath = /^https?:\/\//i.test(answers.apiBasePath);
287
+ if (!hasHost && !hasFullApiBasePath) {
288
+ errors.push(`Enter ${product.envVars.host}, or enter a full URL for ${product.envVars.apiBasePath}.`);
289
+ }
290
+ return errors;
86
291
  }
87
292
  function writeNonSecretFields(registry, product, answers, homeFile, log) {
88
293
  for (const key of ['host', 'apiBasePath', 'defaultPageSize']) {
@@ -131,7 +336,10 @@ async function tryWrite(writer, product, token, log, prompts) {
131
336
  message: 'Fall back to plaintext home file with mode 0600?',
132
337
  default: false,
133
338
  });
134
- return !fallback;
339
+ if (fallback) {
340
+ return false;
341
+ }
342
+ throw new Error('Token was not saved because keychain write failed and plaintext fallback was declined');
135
343
  }
136
344
  return false;
137
345
  }
@@ -164,7 +372,7 @@ function printSummary(log, product, answers, tokenWriter) {
164
372
  log(` apiBasePath: ${answers.apiBasePath || '(unchanged)'}`);
165
373
  log(` defaultPageSize: ${answers.defaultPageSize || '(unchanged)'}`);
166
374
  if (tokenWriter) {
167
- log(` token: ${maskToken(answers.token)} (stored in ${describeWriter(tokenWriter, product)})`);
375
+ log(` token: ${maskToken(answers.tokenToWrite)} (stored in ${describeWriter(tokenWriter, product)})`);
168
376
  }
169
377
  else {
170
378
  log(' token: (unchanged)');
@@ -1 +1 @@
1
- {"version":3,"file":"setup-cli.js","sourceRoot":"","sources":["../src/setup-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup-cli.js","sourceRoot":"","sources":["../src/setup-cli.ts"],"names":[],"mappings":"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"}
package/jest.config.js CHANGED
@@ -10,6 +10,7 @@ export default {
10
10
  }],
11
11
  },
12
12
  testEnvironment: 'node',
13
+ watchman: false,
13
14
  testMatch: ['**/__tests__/**/*.test.ts'],
14
15
  collectCoverageFrom: [
15
16
  'src/**/*.ts',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlassian-dc-mcp/common",
3
- "version": "0.17.1",
3
+ "version": "0.19.0",
4
4
  "main": "build/index.js",
5
5
  "type": "module",
6
6
  "private": false,
@@ -39,5 +39,5 @@
39
39
  "publishConfig": {
40
40
  "access": "public"
41
41
  },
42
- "gitHead": "eb8dccc2a1ba6eebf65925209f23ed269fec3550"
42
+ "gitHead": "52e09da2cb0b75291b41452e4e283f7eae598392"
43
43
  }
@@ -0,0 +1,132 @@
1
+ import { parseSetupArgs, printSetupHelp, SetupArgsError } from '../setup/args.js';
2
+
3
+ describe('parseSetupArgs', () => {
4
+ it('returns defaults for an empty argv', () => {
5
+ const args = parseSetupArgs([]);
6
+ expect(args).toEqual({
7
+ host: undefined,
8
+ apiBasePath: undefined,
9
+ token: undefined,
10
+ defaultPageSize: undefined,
11
+ nonInteractive: false,
12
+ help: false,
13
+ });
14
+ });
15
+
16
+ it('parses every supported flag with = form and space form', () => {
17
+ const args = parseSetupArgs([
18
+ '--host=jira.example.com',
19
+ '--api-base-path',
20
+ '/rest/api/2',
21
+ '--token=secret',
22
+ '--default-page-size=50',
23
+ '--non-interactive',
24
+ ]);
25
+ expect(args).toEqual({
26
+ host: 'jira.example.com',
27
+ apiBasePath: '/rest/api/2',
28
+ token: 'secret',
29
+ defaultPageSize: '50',
30
+ nonInteractive: true,
31
+ help: false,
32
+ });
33
+ });
34
+
35
+ it('treats whitespace-only and empty values as not provided', () => {
36
+ const args = parseSetupArgs(['--host=', '--token= ']);
37
+ expect(args.host).toBeUndefined();
38
+ expect(args.token).toBeUndefined();
39
+ });
40
+
41
+ it('supports -h as short alias for --help', () => {
42
+ expect(parseSetupArgs(['-h']).help).toBe(true);
43
+ expect(parseSetupArgs(['--help']).help).toBe(true);
44
+ });
45
+
46
+ it('supports short aliases for every flag', () => {
47
+ const args = parseSetupArgs([
48
+ '-H', 'jira.example.com',
49
+ '-b', '/rest/api/2',
50
+ '-t', 'short-token',
51
+ '-s', '50',
52
+ '-n',
53
+ ]);
54
+ expect(args).toEqual({
55
+ host: 'jira.example.com',
56
+ apiBasePath: '/rest/api/2',
57
+ token: 'short-token',
58
+ defaultPageSize: '50',
59
+ nonInteractive: true,
60
+ help: false,
61
+ });
62
+ });
63
+
64
+ describe('short alias mapping', () => {
65
+ it('-H sets host', () => {
66
+ expect(parseSetupArgs(['-H', 'jira.example.com']).host).toBe('jira.example.com');
67
+ });
68
+
69
+ it('-b sets api-base-path', () => {
70
+ expect(parseSetupArgs(['-b', '/rest/api/2']).apiBasePath).toBe('/rest/api/2');
71
+ });
72
+
73
+ it('-t sets token', () => {
74
+ expect(parseSetupArgs(['-t', 'secret']).token).toBe('secret');
75
+ });
76
+
77
+ it('-s sets default-page-size', () => {
78
+ expect(parseSetupArgs(['-s', '100']).defaultPageSize).toBe('100');
79
+ });
80
+
81
+ it('-n sets non-interactive', () => {
82
+ expect(parseSetupArgs(['-n']).nonInteractive).toBe(true);
83
+ });
84
+
85
+ it('short and long forms produce identical output', () => {
86
+ const short = parseSetupArgs([
87
+ '-H', 'jira.example.com',
88
+ '-b', '/rest',
89
+ '-t', 'tok',
90
+ '-s', '25',
91
+ '-n',
92
+ ]);
93
+ const long = parseSetupArgs([
94
+ '--host', 'jira.example.com',
95
+ '--api-base-path', '/rest',
96
+ '--token', 'tok',
97
+ '--default-page-size', '25',
98
+ '--non-interactive',
99
+ ]);
100
+ expect(short).toEqual(long);
101
+ });
102
+
103
+ it('-H is not aliased to help (lowercase -h is help, uppercase -H is host)', () => {
104
+ expect(parseSetupArgs(['-H', 'jira.example.com']).help).toBe(false);
105
+ expect(parseSetupArgs(['-h']).help).toBe(true);
106
+ expect(parseSetupArgs(['-h']).host).toBeUndefined();
107
+ });
108
+
109
+ it('rejects unknown single-letter flags', () => {
110
+ expect(() => parseSetupArgs(['-x'])).toThrow(SetupArgsError);
111
+ });
112
+ });
113
+
114
+ it('throws SetupArgsError on an unknown flag', () => {
115
+ expect(() => parseSetupArgs(['--unknown'])).toThrow(SetupArgsError);
116
+ });
117
+
118
+ it('throws SetupArgsError on a stray positional', () => {
119
+ expect(() => parseSetupArgs(['extra'])).toThrow(SetupArgsError);
120
+ });
121
+ });
122
+
123
+ describe('printSetupHelp', () => {
124
+ it('emits product-aware lines including the home file path', () => {
125
+ const out: string[] = [];
126
+ printSetupHelp('jira', (m) => out.push(m));
127
+ const joined = out.join('\n');
128
+ expect(joined).toContain('@atlassian-dc-mcp/jira setup');
129
+ expect(joined).toContain('--non-interactive');
130
+ expect(joined).toContain('~/.atlassian-dc-mcp/jira.env');
131
+ });
132
+ });
@@ -0,0 +1,70 @@
1
+ import { describeValidationError } from '../setup/describe-error.js';
2
+
3
+ describe('describeValidationError', () => {
4
+ it('formats HTTP errors with status, URL, and a 401 hint', () => {
5
+ const apiError = {
6
+ name: 'ApiError',
7
+ status: 401,
8
+ statusText: 'Unauthorized',
9
+ url: 'https://jira.example.com/rest/api/2/myself',
10
+ body: {},
11
+ };
12
+ expect(describeValidationError(apiError)).toBe(
13
+ 'https://jira.example.com/rest/api/2/myself returned 401 Unauthorized. Check the host, API base path, and API token.',
14
+ );
15
+ });
16
+
17
+ it('formats non-auth HTTP errors without the auth hint', () => {
18
+ const apiError = {
19
+ name: 'ApiError',
20
+ status: 500,
21
+ statusText: 'Internal Server Error',
22
+ url: 'https://jira.example.com/rest/api/2/myself',
23
+ };
24
+ expect(describeValidationError(apiError)).toBe(
25
+ 'https://jira.example.com/rest/api/2/myself returned 500 Internal Server Error.',
26
+ );
27
+ });
28
+
29
+ it('unwraps Node fetch TypeErrors with ECONNREFUSED via cause', () => {
30
+ const error = Object.assign(new TypeError('fetch failed'), {
31
+ cause: Object.assign(new Error('connect ECONNREFUSED 127.0.0.1:443'), {
32
+ code: 'ECONNREFUSED',
33
+ }),
34
+ });
35
+ expect(describeValidationError(error)).toBe(
36
+ 'connection refused (ECONNREFUSED: connect ECONNREFUSED 127.0.0.1:443)',
37
+ );
38
+ });
39
+
40
+ it('unwraps DNS failures as ENOTFOUND', () => {
41
+ const error = Object.assign(new TypeError('fetch failed'), {
42
+ cause: Object.assign(new Error('getaddrinfo ENOTFOUND jira.nope'), {
43
+ code: 'ENOTFOUND',
44
+ }),
45
+ });
46
+ expect(describeValidationError(error)).toBe(
47
+ 'could not resolve host (ENOTFOUND: getaddrinfo ENOTFOUND jira.nope)',
48
+ );
49
+ });
50
+
51
+ it('recognises self-signed certificate errors', () => {
52
+ const error = Object.assign(new TypeError('fetch failed'), {
53
+ cause: Object.assign(new Error('self-signed certificate'), {
54
+ code: 'DEPTH_ZERO_SELF_SIGNED_CERT',
55
+ }),
56
+ });
57
+ expect(describeValidationError(error)).toBe(
58
+ 'server uses a self-signed TLS certificate (DEPTH_ZERO_SELF_SIGNED_CERT: self-signed certificate)',
59
+ );
60
+ });
61
+
62
+ it('describes aborted requests', () => {
63
+ const error = Object.assign(new Error('aborted'), { name: 'AbortError' });
64
+ expect(describeValidationError(error)).toBe('request was aborted (possibly timed out)');
65
+ });
66
+
67
+ it('falls back to the raw message when nothing else matches', () => {
68
+ expect(describeValidationError(new Error('something weird'))).toBe('something weird');
69
+ });
70
+ });