@atlassian-dc-mcp/common 0.17.1 → 0.18.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/CHANGELOG.md +11 -0
- package/build/__tests__/describe-error.test.d.ts +2 -0
- package/build/__tests__/describe-error.test.d.ts.map +1 -0
- package/build/__tests__/describe-error.test.js +54 -0
- package/build/__tests__/describe-error.test.js.map +1 -0
- package/build/__tests__/setup-cli.test.js +151 -44
- package/build/__tests__/setup-cli.test.js.map +1 -1
- package/build/config/source.d.ts +1 -0
- package/build/config/source.d.ts.map +1 -1
- package/build/config/source.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/setup/describe-error.d.ts +2 -0
- package/build/setup/describe-error.d.ts.map +1 -0
- package/build/setup/describe-error.js +50 -0
- package/build/setup/describe-error.js.map +1 -0
- package/build/setup/value-validator.d.ts +8 -0
- package/build/setup/value-validator.d.ts.map +1 -0
- package/build/setup/value-validator.js +57 -0
- package/build/setup/value-validator.js.map +1 -0
- package/build/setup-cli.d.ts +15 -0
- package/build/setup-cli.d.ts.map +1 -1
- package/build/setup-cli.js +140 -27
- package/build/setup-cli.js.map +1 -1
- package/jest.config.js +1 -0
- package/package.json +2 -2
- package/src/__tests__/describe-error.test.ts +70 -0
- package/src/__tests__/setup-cli.test.ts +181 -38
- package/src/config/source.ts +1 -0
- package/src/index.ts +1 -0
- package/src/setup/describe-error.ts +67 -0
- package/src/setup/value-validator.ts +59 -0
- package/src/setup-cli.ts +191 -30
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [0.18.0](https://github.com/b1ff/atlassian-dc-mcp/compare/v0.17.1...v0.18.0) (2026-04-24)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **setup:** validate credentials via product services with retry and friendly errors ([6056320](https://github.com/b1ff/atlassian-dc-mcp/commit/60563200e62b513fe8f3b5b4a190edfa1be25a13))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## [0.17.1](https://github.com/b1ff/atlassian-dc-mcp/compare/v0.17.0...v0.17.1) (2026-04-23)
|
|
7
18
|
|
|
8
19
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-error.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/describe-error.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describeValidationError } from '../setup/describe-error.js';
|
|
2
|
+
describe('describeValidationError', () => {
|
|
3
|
+
it('formats HTTP errors with status, URL, and a 401 hint', () => {
|
|
4
|
+
const apiError = {
|
|
5
|
+
name: 'ApiError',
|
|
6
|
+
status: 401,
|
|
7
|
+
statusText: 'Unauthorized',
|
|
8
|
+
url: 'https://jira.example.com/rest/api/2/myself',
|
|
9
|
+
body: {},
|
|
10
|
+
};
|
|
11
|
+
expect(describeValidationError(apiError)).toBe('https://jira.example.com/rest/api/2/myself returned 401 Unauthorized. Check the host, API base path, and API token.');
|
|
12
|
+
});
|
|
13
|
+
it('formats non-auth HTTP errors without the auth hint', () => {
|
|
14
|
+
const apiError = {
|
|
15
|
+
name: 'ApiError',
|
|
16
|
+
status: 500,
|
|
17
|
+
statusText: 'Internal Server Error',
|
|
18
|
+
url: 'https://jira.example.com/rest/api/2/myself',
|
|
19
|
+
};
|
|
20
|
+
expect(describeValidationError(apiError)).toBe('https://jira.example.com/rest/api/2/myself returned 500 Internal Server Error.');
|
|
21
|
+
});
|
|
22
|
+
it('unwraps Node fetch TypeErrors with ECONNREFUSED via cause', () => {
|
|
23
|
+
const error = Object.assign(new TypeError('fetch failed'), {
|
|
24
|
+
cause: Object.assign(new Error('connect ECONNREFUSED 127.0.0.1:443'), {
|
|
25
|
+
code: 'ECONNREFUSED',
|
|
26
|
+
}),
|
|
27
|
+
});
|
|
28
|
+
expect(describeValidationError(error)).toBe('connection refused (ECONNREFUSED: connect ECONNREFUSED 127.0.0.1:443)');
|
|
29
|
+
});
|
|
30
|
+
it('unwraps DNS failures as ENOTFOUND', () => {
|
|
31
|
+
const error = Object.assign(new TypeError('fetch failed'), {
|
|
32
|
+
cause: Object.assign(new Error('getaddrinfo ENOTFOUND jira.nope'), {
|
|
33
|
+
code: 'ENOTFOUND',
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
expect(describeValidationError(error)).toBe('could not resolve host (ENOTFOUND: getaddrinfo ENOTFOUND jira.nope)');
|
|
37
|
+
});
|
|
38
|
+
it('recognises self-signed certificate errors', () => {
|
|
39
|
+
const error = Object.assign(new TypeError('fetch failed'), {
|
|
40
|
+
cause: Object.assign(new Error('self-signed certificate'), {
|
|
41
|
+
code: 'DEPTH_ZERO_SELF_SIGNED_CERT',
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
expect(describeValidationError(error)).toBe('server uses a self-signed TLS certificate (DEPTH_ZERO_SELF_SIGNED_CERT: self-signed certificate)');
|
|
45
|
+
});
|
|
46
|
+
it('describes aborted requests', () => {
|
|
47
|
+
const error = Object.assign(new Error('aborted'), { name: 'AbortError' });
|
|
48
|
+
expect(describeValidationError(error)).toBe('request was aborted (possibly timed out)');
|
|
49
|
+
});
|
|
50
|
+
it('falls back to the raw message when nothing else matches', () => {
|
|
51
|
+
expect(describeValidationError(new Error('something weird'))).toBe('something weird');
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=describe-error.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-error.test.js","sourceRoot":"","sources":["../../src/__tests__/describe-error.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,QAAQ,GAAG;YACf,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,cAAc;YAC1B,GAAG,EAAE,4CAA4C;YACjD,IAAI,EAAE,EAAE;SACT,CAAC;QACF,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAC5C,qHAAqH,CACtH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,QAAQ,GAAG;YACf,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,uBAAuB;YACnC,GAAG,EAAE,4CAA4C;SAClD,CAAC;QACF,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAC5C,gFAAgF,CACjF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE;YACzD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,EAAE;gBACpE,IAAI,EAAE,cAAc;aACrB,CAAC;SACH,CAAC,CAAC;QACH,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CACzC,uEAAuE,CACxE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE;YACzD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,EAAE;gBACjE,IAAI,EAAE,WAAW;aAClB,CAAC;SACH,CAAC,CAAC;QACH,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CACzC,qEAAqE,CACtE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE;YACzD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,EAAE;gBACzD,IAAI,EAAE,6BAA6B;aACpC,CAAC;SACH,CAAC,CAAC;QACH,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CACzC,kGAAkG,CACnG,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAC1E,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,uBAAuB,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { DefaultConfigRegistry } from '../config/registry.js';
|
|
|
2
2
|
import { HomeFileSource } from '../config/sources/home-file.js';
|
|
3
3
|
import { MacosKeychainSource } from '../config/sources/macos-keychain.js';
|
|
4
4
|
import { ProcessEnvSource } from '../config/sources/process-env.js';
|
|
5
|
-
import { runSetup } from '../setup-cli.js';
|
|
5
|
+
import { runSetup, } from '../setup-cli.js';
|
|
6
6
|
const JIRA = {
|
|
7
7
|
id: 'jira',
|
|
8
8
|
envVars: {
|
|
@@ -67,14 +67,58 @@ class FakeHomeFile extends HomeFileSource {
|
|
|
67
67
|
return `home-file-fake(${product.id})`;
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
|
+
class StubCredentialValidator {
|
|
71
|
+
calls = [];
|
|
72
|
+
queue = [];
|
|
73
|
+
fallback = { ok: true };
|
|
74
|
+
returns(result) {
|
|
75
|
+
this.fallback = result;
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
reject(message) {
|
|
79
|
+
return this.returns({ ok: false, message });
|
|
80
|
+
}
|
|
81
|
+
enqueue(...results) {
|
|
82
|
+
this.queue.push(...results);
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
asFn() {
|
|
86
|
+
return async (ctx) => {
|
|
87
|
+
this.calls.push(ctx);
|
|
88
|
+
return this.queue.shift() ?? this.fallback;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function scriptedConfirms(script) {
|
|
93
|
+
return (message, fallbackDefault) => {
|
|
94
|
+
for (const [prefix, answer] of Object.entries(script)) {
|
|
95
|
+
if (message.startsWith(prefix))
|
|
96
|
+
return answer;
|
|
97
|
+
}
|
|
98
|
+
return fallbackDefault ?? false;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
70
101
|
function makeRegistry(keychain, home) {
|
|
71
102
|
return new DefaultConfigRegistry([new ProcessEnvSource(), home, keychain]);
|
|
72
103
|
}
|
|
73
|
-
|
|
104
|
+
const standardAnswers = {
|
|
105
|
+
host: 'j-host',
|
|
106
|
+
apiBasePath: '/rest/api/2',
|
|
107
|
+
pageSize: '25',
|
|
108
|
+
token: 'secret',
|
|
109
|
+
};
|
|
110
|
+
function makePrompts(overrides = {}, answers = {}, confirms) {
|
|
111
|
+
const filled = { ...standardAnswers, ...answers };
|
|
74
112
|
return {
|
|
75
|
-
input: async (opts) =>
|
|
76
|
-
|
|
77
|
-
|
|
113
|
+
input: async (opts) => {
|
|
114
|
+
if (opts.message.startsWith('Host'))
|
|
115
|
+
return filled.host;
|
|
116
|
+
if (opts.message.startsWith('API base path'))
|
|
117
|
+
return filled.apiBasePath;
|
|
118
|
+
return filled.pageSize;
|
|
119
|
+
},
|
|
120
|
+
password: async () => filled.token,
|
|
121
|
+
confirm: async (opts) => (confirms ?? ((_m, d) => d ?? false))(opts.message, opts.default),
|
|
78
122
|
...overrides,
|
|
79
123
|
};
|
|
80
124
|
}
|
|
@@ -95,18 +139,13 @@ describe('runSetup', () => {
|
|
|
95
139
|
process.env = originalEnv;
|
|
96
140
|
});
|
|
97
141
|
it('writes the token to keychain first on darwin and clears home file token', async () => {
|
|
98
|
-
const prompts = makePrompts({
|
|
99
|
-
input: async (opts) => {
|
|
100
|
-
if (opts.message.startsWith('Host'))
|
|
101
|
-
return 'j-host';
|
|
102
|
-
if (opts.message.startsWith('API base path'))
|
|
103
|
-
return '/rest/api/2';
|
|
104
|
-
return '25';
|
|
105
|
-
},
|
|
106
|
-
password: async () => 'secret',
|
|
107
|
-
});
|
|
108
142
|
const registry = makeRegistry(keychain, home);
|
|
109
|
-
await runSetup(JIRA, {
|
|
143
|
+
await runSetup(JIRA, {
|
|
144
|
+
registry,
|
|
145
|
+
log: (m) => logs.push(m),
|
|
146
|
+
exit: () => undefined,
|
|
147
|
+
prompts: makePrompts(),
|
|
148
|
+
});
|
|
110
149
|
expect(keychain.writeCalls).toBe(1);
|
|
111
150
|
expect(keychain.store).toBe('secret');
|
|
112
151
|
expect(home.clears).toContainEqual(['jira', 'token']);
|
|
@@ -114,50 +153,118 @@ describe('runSetup', () => {
|
|
|
114
153
|
});
|
|
115
154
|
it('falls back to home file when keychain is unavailable', async () => {
|
|
116
155
|
keychain.available = false;
|
|
117
|
-
const prompts = makePrompts({
|
|
118
|
-
input: async (opts) => {
|
|
119
|
-
if (opts.message.startsWith('Host'))
|
|
120
|
-
return 'j-host';
|
|
121
|
-
if (opts.message.startsWith('API base path'))
|
|
122
|
-
return '/rest/api/2';
|
|
123
|
-
return '25';
|
|
124
|
-
},
|
|
125
|
-
password: async () => 'secret',
|
|
126
|
-
});
|
|
127
156
|
const registry = makeRegistry(keychain, home);
|
|
128
|
-
await runSetup(JIRA, {
|
|
157
|
+
await runSetup(JIRA, {
|
|
158
|
+
registry,
|
|
159
|
+
log: (m) => logs.push(m),
|
|
160
|
+
exit: () => undefined,
|
|
161
|
+
prompts: makePrompts(),
|
|
162
|
+
});
|
|
129
163
|
expect(keychain.writeCalls).toBe(0);
|
|
130
164
|
const tokenWrites = home.writes.filter(([, k]) => k === 'token');
|
|
131
165
|
expect(tokenWrites).toHaveLength(1);
|
|
132
166
|
});
|
|
133
167
|
it('prints shadowing warning when env var is set higher than target', async () => {
|
|
134
168
|
process.env.JIRA_API_TOKEN = 'shadow';
|
|
135
|
-
const prompts = makePrompts({
|
|
136
|
-
input: async (opts) => {
|
|
137
|
-
if (opts.message.startsWith('Host'))
|
|
138
|
-
return 'j-host';
|
|
139
|
-
if (opts.message.startsWith('API base path'))
|
|
140
|
-
return '/rest/api/2';
|
|
141
|
-
return '25';
|
|
142
|
-
},
|
|
143
|
-
password: async () => 'secret',
|
|
144
|
-
});
|
|
145
169
|
const registry = makeRegistry(keychain, home);
|
|
146
|
-
await runSetup(JIRA, {
|
|
170
|
+
await runSetup(JIRA, {
|
|
171
|
+
registry,
|
|
172
|
+
log: (m) => logs.push(m),
|
|
173
|
+
exit: () => undefined,
|
|
174
|
+
prompts: makePrompts(),
|
|
175
|
+
});
|
|
147
176
|
expect(logs.some((l) => l.includes('JIRA_API_TOKEN') && l.includes('Warning'))).toBe(true);
|
|
148
177
|
});
|
|
178
|
+
it('calls validateCredentials with the entered values before saving', async () => {
|
|
179
|
+
const validator = new StubCredentialValidator();
|
|
180
|
+
const registry = makeRegistry(keychain, home);
|
|
181
|
+
await runSetup(JIRA, {
|
|
182
|
+
registry,
|
|
183
|
+
log: (m) => logs.push(m),
|
|
184
|
+
exit: () => undefined,
|
|
185
|
+
prompts: makePrompts(),
|
|
186
|
+
validateCredentials: validator.asFn(),
|
|
187
|
+
});
|
|
188
|
+
expect(validator.calls).toEqual([
|
|
189
|
+
{ host: 'j-host', apiBasePath: '/rest/api/2', token: 'secret' },
|
|
190
|
+
]);
|
|
191
|
+
expect(keychain.writeCalls).toBe(1);
|
|
192
|
+
});
|
|
193
|
+
it('exits without writing when validation fails and user declines retry or save-anyway', async () => {
|
|
194
|
+
const validator = new StubCredentialValidator().reject('401 Unauthorized');
|
|
195
|
+
const exitFn = jest.fn();
|
|
196
|
+
const registry = makeRegistry(keychain, home);
|
|
197
|
+
await runSetup(JIRA, {
|
|
198
|
+
registry,
|
|
199
|
+
log: (m) => logs.push(m),
|
|
200
|
+
exit: exitFn,
|
|
201
|
+
prompts: makePrompts({}, { token: 'bad-token' }, scriptedConfirms({
|
|
202
|
+
'Try again': false,
|
|
203
|
+
'Save configuration anyway': false,
|
|
204
|
+
})),
|
|
205
|
+
validateCredentials: validator.asFn(),
|
|
206
|
+
});
|
|
207
|
+
expect(validator.calls).toHaveLength(1);
|
|
208
|
+
expect(exitFn).toHaveBeenCalledWith(1);
|
|
209
|
+
expect(keychain.writeCalls).toBe(0);
|
|
210
|
+
expect(home.writes).toHaveLength(0);
|
|
211
|
+
expect(logs.some((l) => l.includes('401 Unauthorized'))).toBe(true);
|
|
212
|
+
});
|
|
213
|
+
it('retries validation after a failure and writes once it succeeds', async () => {
|
|
214
|
+
const validator = new StubCredentialValidator().enqueue({ ok: false, message: '401 Unauthorized' }, { ok: true });
|
|
215
|
+
const registry = makeRegistry(keychain, home);
|
|
216
|
+
await runSetup(JIRA, {
|
|
217
|
+
registry,
|
|
218
|
+
log: (m) => logs.push(m),
|
|
219
|
+
exit: () => undefined,
|
|
220
|
+
prompts: makePrompts({}, {}, scriptedConfirms({ 'Try again': true })),
|
|
221
|
+
validateCredentials: validator.asFn(),
|
|
222
|
+
});
|
|
223
|
+
expect(validator.calls).toHaveLength(2);
|
|
224
|
+
expect(keychain.writeCalls).toBe(1);
|
|
225
|
+
expect(logs.some((l) => l.includes('401 Unauthorized'))).toBe(true);
|
|
226
|
+
expect(logs.some((l) => l.startsWith('Validation succeeded'))).toBe(true);
|
|
227
|
+
});
|
|
228
|
+
it('stops offering retry after the third failure and lets the user save anyway', async () => {
|
|
229
|
+
const validator = new StubCredentialValidator().reject('401 Unauthorized');
|
|
230
|
+
let retryPromptsShown = 0;
|
|
231
|
+
const confirms = (message) => {
|
|
232
|
+
if (message.startsWith('Try again')) {
|
|
233
|
+
retryPromptsShown++;
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
if (message.startsWith('Save configuration anyway'))
|
|
237
|
+
return true;
|
|
238
|
+
return false;
|
|
239
|
+
};
|
|
240
|
+
const registry = makeRegistry(keychain, home);
|
|
241
|
+
await runSetup(JIRA, {
|
|
242
|
+
registry,
|
|
243
|
+
log: (m) => logs.push(m),
|
|
244
|
+
exit: () => undefined,
|
|
245
|
+
prompts: makePrompts({}, {}, confirms),
|
|
246
|
+
validateCredentials: validator.asFn(),
|
|
247
|
+
});
|
|
248
|
+
expect(validator.calls).toHaveLength(3);
|
|
249
|
+
expect(retryPromptsShown).toBe(2);
|
|
250
|
+
expect(keychain.writeCalls).toBe(1);
|
|
251
|
+
});
|
|
149
252
|
it('exits 130 on SIGINT cancellation before any write', async () => {
|
|
150
253
|
const exitErr = Object.assign(new Error('closed'), {
|
|
151
254
|
name: 'ExitPromptError',
|
|
152
255
|
});
|
|
153
|
-
const prompts = makePrompts({
|
|
154
|
-
input: async () => {
|
|
155
|
-
throw exitErr;
|
|
156
|
-
},
|
|
157
|
-
});
|
|
158
256
|
const exitFn = jest.fn();
|
|
159
257
|
const registry = makeRegistry(keychain, home);
|
|
160
|
-
await runSetup(JIRA, {
|
|
258
|
+
await runSetup(JIRA, {
|
|
259
|
+
registry,
|
|
260
|
+
log: (m) => logs.push(m),
|
|
261
|
+
exit: exitFn,
|
|
262
|
+
prompts: makePrompts({
|
|
263
|
+
input: async () => {
|
|
264
|
+
throw exitErr;
|
|
265
|
+
},
|
|
266
|
+
}),
|
|
267
|
+
});
|
|
161
268
|
expect(exitFn).toHaveBeenCalledWith(130);
|
|
162
269
|
expect(keychain.writeCalls).toBe(0);
|
|
163
270
|
expect(home.writes).toHaveLength(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-cli.test.js","sourceRoot":"","sources":["../../src/__tests__/setup-cli.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"setup-cli.test.js","sourceRoot":"","sources":["../../src/__tests__/setup-cli.test.ts"],"names":[],"mappings":"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"}
|
package/build/config/source.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export interface ProductDefinition {
|
|
|
8
8
|
readonly id: string;
|
|
9
9
|
readonly envVars: Record<ConfigKey, string>;
|
|
10
10
|
readonly defaultApiBasePath?: string;
|
|
11
|
+
readonly apiBasePathStrippableSuffixes?: readonly string[];
|
|
11
12
|
}
|
|
12
13
|
export interface ReadableSource {
|
|
13
14
|
readonly id: SourceId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/config/source.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,iBAAiB,CAAC;AAE7E,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAEnF,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/config/source.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,iBAAiB,CAAC;AAE7E,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAEnF,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IACrE,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9C,QAAQ,IAAI,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,WAAW,IAAI,OAAO,CAAC;IACvB,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACvE,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;CACzD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,IAAI,cAAc,CAEjF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAM9E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/config/source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/config/source.ts"],"names":[],"mappings":"AA2BA,MAAM,UAAU,gBAAgB,CAAC,MAAsB;IACrD,OAAO,OAAQ,MAAyB,CAAC,KAAK,KAAK,UAAU,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAyB;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC"}
|
package/build/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
2
2
|
export * from './api-error-handler.js';
|
|
3
3
|
export * from './config/index.js';
|
|
4
4
|
export { runSetup } from './setup-cli.js';
|
|
5
|
+
export { describeValidationError } from './setup/describe-error.js';
|
|
5
6
|
export declare const formatToolResponse: (result: unknown) => {
|
|
6
7
|
content: {
|
|
7
8
|
type: "text";
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,eAAO,MAAM,kBAAkB,GAAI,QAAQ,OAAO;;;;;CAKhD,CAAC;AAGH,eAAO,MAAM,WAAW,GAAI,OAAO,KAAK,UAGvC,CAAC;AAGF,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,aAKA;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,SAAS,sBAkCpD"}
|
package/build/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
|
3
3
|
export * from './api-error-handler.js';
|
|
4
4
|
export * from './config/index.js';
|
|
5
5
|
export { runSetup } from './setup-cli.js';
|
|
6
|
+
export { describeValidationError } from './setup/describe-error.js';
|
|
6
7
|
// Helper function to format tool responses
|
|
7
8
|
export const formatToolResponse = (result) => ({
|
|
8
9
|
content: [{
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAe,EAAE,EAAE,CAAC,CAAC;IACtD,OAAO,EAAE,CAAC;YACR,IAAI,EAAE,MAAe;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;SAC7B,CAAC;CACH,CAAC,CAAC;AAEH,uBAAuB;AACvB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAY,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,sCAAsC;AACtC,MAAM,UAAU,eAAe,CAAC,OAG/B;IACC,OAAO,IAAI,SAAS,CAAC;QACnB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAiB;IACnD,0DAA0D;IAC1D,yBAAyB;IACzB,iDAAiD;IACjD,EAAE;IACF,wCAAwC;IACxC,0DAA0D;IAC1D,qCAAqC;IACrC,MAAM;IACN,EAAE;IACF,8CAA8C;IAC9C,kDAAkD;IAClD,MAAM;IACN,EAAE;IACF,mDAAmD;IACnD,sCAAsC;IACtC,2CAA2C;IAC3C,kDAAkD;IAClD,2CAA2C;IAC3C,4CAA4C;IAC5C,mBAAmB;IACnB,uBAAuB;IACvB,gBAAgB;IAChB,QAAQ;IACR,EAAE;IACF,uDAAuD;IACvD,qBAAqB;IACrB,QAAQ;IACR,MAAM;IAGN,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-error.d.ts","sourceRoot":"","sources":["../../src/setup/describe-error.ts"],"names":[],"mappings":"AA6BA,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAiB9D"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const NETWORK_CODE_HINTS = {
|
|
2
|
+
ENOTFOUND: 'could not resolve host',
|
|
3
|
+
EAI_AGAIN: 'DNS lookup temporarily failed',
|
|
4
|
+
ECONNREFUSED: 'connection refused',
|
|
5
|
+
ECONNRESET: 'connection reset by peer',
|
|
6
|
+
ETIMEDOUT: 'connection timed out',
|
|
7
|
+
ECONNABORTED: 'connection aborted',
|
|
8
|
+
EHOSTUNREACH: 'host is unreachable',
|
|
9
|
+
ENETUNREACH: 'network is unreachable',
|
|
10
|
+
EPROTO: 'TLS protocol error',
|
|
11
|
+
CERT_HAS_EXPIRED: 'server TLS certificate has expired',
|
|
12
|
+
DEPTH_ZERO_SELF_SIGNED_CERT: 'server uses a self-signed TLS certificate',
|
|
13
|
+
SELF_SIGNED_CERT_IN_CHAIN: 'server TLS certificate chain is self-signed',
|
|
14
|
+
UNABLE_TO_VERIFY_LEAF_SIGNATURE: 'server TLS certificate could not be verified',
|
|
15
|
+
ERR_TLS_CERT_ALTNAME_INVALID: 'server TLS certificate does not match the host name',
|
|
16
|
+
};
|
|
17
|
+
export function describeValidationError(error) {
|
|
18
|
+
if (isApiLikeError(error)) {
|
|
19
|
+
return formatApiError(error);
|
|
20
|
+
}
|
|
21
|
+
if (isAbortError(error)) {
|
|
22
|
+
return 'request was aborted (possibly timed out)';
|
|
23
|
+
}
|
|
24
|
+
const err = error;
|
|
25
|
+
const cause = err?.cause;
|
|
26
|
+
if (cause?.code) {
|
|
27
|
+
const hint = NETWORK_CODE_HINTS[cause.code] ?? 'network error';
|
|
28
|
+
const detail = cause.message ?? err?.message ?? 'unknown';
|
|
29
|
+
return `${hint} (${cause.code}: ${detail})`;
|
|
30
|
+
}
|
|
31
|
+
return err?.message ?? String(error);
|
|
32
|
+
}
|
|
33
|
+
function formatApiError(error) {
|
|
34
|
+
const status = `${error.status}${error.statusText ? ` ${error.statusText}` : ''}`.trim();
|
|
35
|
+
const url = error.url ? `${error.url} ` : '';
|
|
36
|
+
const hint = status.startsWith('401') || status.startsWith('403')
|
|
37
|
+
? ' Check the host, API base path, and API token.'
|
|
38
|
+
: '';
|
|
39
|
+
return `${url}returned ${status}.${hint}`.trim();
|
|
40
|
+
}
|
|
41
|
+
function isApiLikeError(error) {
|
|
42
|
+
return Boolean(error)
|
|
43
|
+
&& typeof error === 'object'
|
|
44
|
+
&& 'status' in error
|
|
45
|
+
&& typeof error.status === 'number';
|
|
46
|
+
}
|
|
47
|
+
function isAbortError(error) {
|
|
48
|
+
return Boolean(error && typeof error === 'object' && error.name === 'AbortError');
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=describe-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-error.js","sourceRoot":"","sources":["../../src/setup/describe-error.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAA2B;IACjD,SAAS,EAAE,wBAAwB;IACnC,SAAS,EAAE,+BAA+B;IAC1C,YAAY,EAAE,oBAAoB;IAClC,UAAU,EAAE,0BAA0B;IACtC,SAAS,EAAE,sBAAsB;IACjC,YAAY,EAAE,oBAAoB;IAClC,YAAY,EAAE,qBAAqB;IACnC,WAAW,EAAE,wBAAwB;IACrC,MAAM,EAAE,oBAAoB;IAC5B,gBAAgB,EAAE,oCAAoC;IACtD,2BAA2B,EAAE,2CAA2C;IACxE,yBAAyB,EAAE,6CAA6C;IACxE,+BAA+B,EAAE,8CAA8C;IAC/E,4BAA4B,EAAE,qDAAqD;CACpF,CAAC;AAcF,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,0CAA0C,CAAC;IACpD,CAAC;IAED,MAAM,GAAG,GAAG,KAAiE,CAAC;IAC9E,MAAM,KAAK,GAAG,GAAG,EAAE,KAAK,CAAC;IACzB,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC;QAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,SAAS,CAAC;QAC1D,OAAO,GAAG,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG,CAAC;IAC9C,CAAC;IAED,OAAO,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CAAC,KAAmB;IACzC,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IACzF,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;QAC/D,CAAC,CAAC,gDAAgD;QAClD,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,GAAG,GAAG,YAAY,MAAM,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,CAAC,KAAK,CAAC;WAChB,OAAO,KAAK,KAAK,QAAQ;WACzB,QAAQ,IAAK,KAAgB;WAC7B,OAAQ,KAAsB,CAAC,MAAM,KAAK,QAAQ,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAA2B,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;AAC3G,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type ValidationResult = true | string;
|
|
2
|
+
export declare class SetupValueValidator {
|
|
3
|
+
static host(raw: string): ValidationResult;
|
|
4
|
+
static apiBasePath(raw: string): ValidationResult;
|
|
5
|
+
static token(raw: string): ValidationResult;
|
|
6
|
+
static pageSize(raw: string): ValidationResult;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=value-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-validator.d.ts","sourceRoot":"","sources":["../../src/setup/value-validator.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,MAAM,CAAC;AAE7C,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB;IAsB1C,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB;IAmBjD,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB;IAQ3C,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB;CAM/C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export class SetupValueValidator {
|
|
2
|
+
static host(raw) {
|
|
3
|
+
const value = raw.trim();
|
|
4
|
+
if (value.length === 0) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
if (/\s/.test(value)) {
|
|
8
|
+
return 'must not contain whitespace';
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const url = new URL(/^https?:\/\//i.test(value) ? value : `https://${value}`);
|
|
12
|
+
if (!url.hostname) {
|
|
13
|
+
return 'must include a host name';
|
|
14
|
+
}
|
|
15
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
16
|
+
return 'must use http or https';
|
|
17
|
+
}
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return 'enter a host name or http(s) URL';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
static apiBasePath(raw) {
|
|
25
|
+
const value = raw.trim();
|
|
26
|
+
if (value.length === 0) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
if (/\s/.test(value)) {
|
|
30
|
+
return 'must not contain whitespace';
|
|
31
|
+
}
|
|
32
|
+
if (/^https?:\/\//i.test(value)) {
|
|
33
|
+
try {
|
|
34
|
+
new URL(value);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return 'enter a valid http(s) URL';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return value.startsWith('/') ? true : 'enter a path starting with / or a full http(s) URL';
|
|
42
|
+
}
|
|
43
|
+
static token(raw) {
|
|
44
|
+
const value = raw.trim();
|
|
45
|
+
if (value.length === 0) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return /\s/.test(value) ? 'must not contain whitespace' : true;
|
|
49
|
+
}
|
|
50
|
+
static pageSize(raw) {
|
|
51
|
+
const trimmed = raw.trim();
|
|
52
|
+
return /^\d+$/.test(trimmed) && Number.parseInt(trimmed, 10) > 0
|
|
53
|
+
? true
|
|
54
|
+
: 'enter a positive integer';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=value-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-validator.js","sourceRoot":"","sources":["../../src/setup/value-validator.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,mBAAmB;IAC9B,MAAM,CAAC,IAAI,CAAC,GAAW;QACrB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,6BAA6B,CAAC;QACvC,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;YAC9E,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,0BAA0B,CAAC;YACpC,CAAC;YACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1D,OAAO,wBAAwB,CAAC;YAClC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,kCAAkC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,GAAW;QAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,6BAA6B,CAAC;QACvC,CAAC;QACD,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;gBACf,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,2BAA2B,CAAC;YACrC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oDAAoD,CAAC;IAC7F,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAW;QACtB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAW;QACzB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC;YAC9D,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,0BAA0B,CAAC;IACjC,CAAC;CACF"}
|
package/build/setup-cli.d.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import { type ConfigRegistry } from './config/registry.js';
|
|
2
2
|
import type { ProductDefinition } from './config/source.js';
|
|
3
|
+
export type CredentialValidationContext = {
|
|
4
|
+
host: string;
|
|
5
|
+
apiBasePath: string;
|
|
6
|
+
token: string;
|
|
7
|
+
};
|
|
8
|
+
export type CredentialValidationResult = {
|
|
9
|
+
ok: true;
|
|
10
|
+
detail?: string;
|
|
11
|
+
} | {
|
|
12
|
+
ok: false;
|
|
13
|
+
message: string;
|
|
14
|
+
};
|
|
15
|
+
export type ValidateCredentials = (context: CredentialValidationContext) => Promise<CredentialValidationResult>;
|
|
3
16
|
export type SetupPrompts = {
|
|
4
17
|
input: (opts: {
|
|
5
18
|
message: string;
|
|
@@ -9,6 +22,7 @@ export type SetupPrompts = {
|
|
|
9
22
|
password: (opts: {
|
|
10
23
|
message: string;
|
|
11
24
|
mask?: string;
|
|
25
|
+
validate?: (raw: string) => true | string;
|
|
12
26
|
}) => Promise<string>;
|
|
13
27
|
confirm: (opts: {
|
|
14
28
|
message: string;
|
|
@@ -20,6 +34,7 @@ export type SetupDeps = {
|
|
|
20
34
|
log?: (message: string) => void;
|
|
21
35
|
exit?: (code: number) => void;
|
|
22
36
|
prompts?: SetupPrompts;
|
|
37
|
+
validateCredentials?: ValidateCredentials;
|
|
23
38
|
};
|
|
24
39
|
export declare function runSetup(product: ProductDefinition, deps?: SetupDeps): Promise<void>;
|
|
25
40
|
//# sourceMappingURL=setup-cli.d.ts.map
|
package/build/setup-cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-cli.d.ts","sourceRoot":"","sources":["../src/setup-cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup-cli.d.ts","sourceRoot":"","sources":["../src/setup-cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,oBAAoB,CAAC;AAyB5B,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAClC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,MAAM,mBAAmB,GAAG,CAChC,OAAO,EAAE,2BAA2B,KACjC,OAAO,CAAC,0BAA0B,CAAC,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnH,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnH,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C,CAAC;AAQF,wBAAsB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB9F"}
|