confluence-cli 2.0.0 → 2.0.2
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/lib/config.js +11 -7
- package/lib/confluence-client.js +15 -6
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/lib/config.js
CHANGED
|
@@ -257,7 +257,7 @@ function saveConfigFile(data) {
|
|
|
257
257
|
const validateCliOptions = (options) => {
|
|
258
258
|
const errors = [];
|
|
259
259
|
|
|
260
|
-
if (options.domain && !options.domain.trim()) {
|
|
260
|
+
if (options.domain && (typeof options.domain !== 'string' || !options.domain.trim())) {
|
|
261
261
|
errors.push('--domain cannot be empty');
|
|
262
262
|
}
|
|
263
263
|
|
|
@@ -265,12 +265,12 @@ const validateCliOptions = (options) => {
|
|
|
265
265
|
errors.push('--token cannot be empty');
|
|
266
266
|
}
|
|
267
267
|
|
|
268
|
-
if (options.email && !options.email.trim()) {
|
|
268
|
+
if (options.email && (typeof options.email !== 'string' || !options.email.trim())) {
|
|
269
269
|
errors.push('--email cannot be empty');
|
|
270
270
|
}
|
|
271
271
|
|
|
272
272
|
if (options.apiPath) {
|
|
273
|
-
if (!options.apiPath.startsWith('/')) {
|
|
273
|
+
if (typeof options.apiPath !== 'string' || !options.apiPath.startsWith('/')) {
|
|
274
274
|
errors.push('--api-path must start with "/"');
|
|
275
275
|
} else {
|
|
276
276
|
// Validate API path format
|
|
@@ -282,16 +282,18 @@ const validateCliOptions = (options) => {
|
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
284
|
|
|
285
|
-
if (options.protocol && !['http', 'https'].includes(options.protocol.toLowerCase())) {
|
|
285
|
+
if (options.protocol && (typeof options.protocol !== 'string' || !['http', 'https'].includes(options.protocol.toLowerCase()))) {
|
|
286
286
|
errors.push('--protocol must be "http" or "https"');
|
|
287
287
|
}
|
|
288
288
|
|
|
289
|
-
if (options.authType && !AUTH_TYPES.includes(options.authType.toLowerCase())) {
|
|
289
|
+
if (options.authType && (typeof options.authType !== 'string' || !AUTH_TYPES.includes(options.authType.toLowerCase()))) {
|
|
290
290
|
errors.push('--auth-type must be "basic", "bearer", "mtls", or "cookie"');
|
|
291
291
|
}
|
|
292
292
|
|
|
293
293
|
// Check if basic auth is provided with email
|
|
294
|
-
const normAuthType = options.authType
|
|
294
|
+
const normAuthType = (typeof options.authType === 'string' && options.authType)
|
|
295
|
+
? normalizeAuthType(options.authType, Boolean(options.email))
|
|
296
|
+
: null;
|
|
295
297
|
if (normAuthType === 'basic' && !options.email) {
|
|
296
298
|
errors.push('--email is required when using basic authentication (use your username for on-premise)');
|
|
297
299
|
}
|
|
@@ -512,7 +514,9 @@ async function initConfig(cliOptions = {}) {
|
|
|
512
514
|
protocol: cliOptions.protocol,
|
|
513
515
|
domain: cliOptions.domain,
|
|
514
516
|
apiPath: cliOptions.apiPath,
|
|
515
|
-
authType: cliOptions.authType
|
|
517
|
+
authType: (typeof cliOptions.authType === 'string' && cliOptions.authType)
|
|
518
|
+
? cliOptions.authType.trim().toLowerCase()
|
|
519
|
+
: cliOptions.authType,
|
|
516
520
|
email: cliOptions.email,
|
|
517
521
|
token: cliOptions.token,
|
|
518
522
|
cookie: cliOptions.cookie,
|
package/lib/confluence-client.js
CHANGED
|
@@ -496,14 +496,23 @@ class ConfluenceClient {
|
|
|
496
496
|
return { html, userMap: new Map() };
|
|
497
497
|
}
|
|
498
498
|
|
|
499
|
-
// Fetch user info for all keys in parallel
|
|
500
|
-
|
|
501
|
-
const
|
|
499
|
+
// Fetch user info for all keys in parallel; isolate per-key failures so a
|
|
500
|
+
// single rejection doesn't drop display names for the rest of the page.
|
|
501
|
+
const keysArray = Array.from(userKeys);
|
|
502
|
+
const results = await Promise.allSettled(
|
|
503
|
+
keysArray.map(key => this.getUserByKey(key))
|
|
504
|
+
);
|
|
502
505
|
|
|
503
|
-
// Build userkey -> displayName map
|
|
506
|
+
// Build userkey -> displayName map. On rejection, fall back to the raw
|
|
507
|
+
// userkey (mirrors getUserByKey's own caught-error fallback).
|
|
504
508
|
const userMap = new Map();
|
|
505
|
-
|
|
506
|
-
|
|
509
|
+
results.forEach((result, i) => {
|
|
510
|
+
const key = keysArray[i];
|
|
511
|
+
if (result.status === 'fulfilled') {
|
|
512
|
+
userMap.set(result.value.key, result.value.displayName);
|
|
513
|
+
} else {
|
|
514
|
+
userMap.set(key, key);
|
|
515
|
+
}
|
|
507
516
|
});
|
|
508
517
|
|
|
509
518
|
// Replace userkey references with display names in HTML
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "confluence-cli",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "confluence-cli",
|
|
9
|
-
"version": "2.0.
|
|
9
|
+
"version": "2.0.2",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"axios": "^1.15.0",
|