@positronic/cli 0.0.57 → 0.0.59
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/dist/src/cli.js +9 -0
- package/dist/src/commands/auth.js +13 -0
- package/dist/src/commands/helpers.js +60 -27
- package/dist/src/components/auth-format-jwk-key.js +457 -0
- package/dist/src/components/auth-login.js +3 -3
- package/dist/src/components/auth-logout.js +3 -3
- package/dist/src/hooks/useApi.js +183 -49
- package/dist/src/lib/jwt-auth.js +364 -0
- package/dist/src/lib/ssh-key-utils.js +0 -9
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/commands/auth.d.ts +8 -0
- package/dist/types/commands/auth.d.ts.map +1 -1
- package/dist/types/commands/helpers.d.ts +4 -0
- package/dist/types/commands/helpers.d.ts.map +1 -1
- package/dist/types/components/auth-format-jwk-key.d.ts +6 -0
- package/dist/types/components/auth-format-jwk-key.d.ts.map +1 -0
- package/dist/types/hooks/useApi.d.ts.map +1 -1
- package/dist/types/lib/jwt-auth.d.ts +51 -0
- package/dist/types/lib/jwt-auth.d.ts.map +1 -0
- package/dist/types/lib/ssh-key-utils.d.ts +0 -4
- package/dist/types/lib/ssh-key-utils.d.ts.map +1 -1
- package/package.json +5 -4
- package/dist/src/lib/request-signer.js +0 -208
- package/dist/types/lib/request-signer.d.ts +0 -51
- package/dist/types/lib/request-signer.d.ts.map +0 -1
package/dist/src/hooks/useApi.js
CHANGED
|
@@ -218,6 +218,16 @@ function _ts_generator(thisArg, body) {
|
|
|
218
218
|
}
|
|
219
219
|
import { useState, useEffect, useCallback } from 'react';
|
|
220
220
|
import { apiClient, isApiLocalDevMode } from '../commands/helpers.js';
|
|
221
|
+
var ROOT_KEY_NOT_CONFIGURED_ERROR = {
|
|
222
|
+
title: 'Root Key Not Configured',
|
|
223
|
+
message: 'The server does not have a root authentication key configured.',
|
|
224
|
+
details: "Run 'px auth format-jwk-key' to generate the key, then add ROOT_PUBLIC_KEY as a secret in your server configuration."
|
|
225
|
+
};
|
|
226
|
+
var AUTH_REQUIRED_ERROR = {
|
|
227
|
+
title: 'Authentication Required',
|
|
228
|
+
message: 'Your request could not be authenticated.',
|
|
229
|
+
details: "Run 'px auth login' to configure your SSH key, or check that your key is registered on the server."
|
|
230
|
+
};
|
|
221
231
|
function getConnectionErrorMessage() {
|
|
222
232
|
if (isApiLocalDevMode()) {
|
|
223
233
|
return {
|
|
@@ -233,6 +243,125 @@ function getConnectionErrorMessage() {
|
|
|
233
243
|
};
|
|
234
244
|
}
|
|
235
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Fetch auth setup instructions from the server
|
|
248
|
+
*/ function fetchAuthSetupInstructions() {
|
|
249
|
+
return _async_to_generator(function() {
|
|
250
|
+
var response;
|
|
251
|
+
return _ts_generator(this, function(_state) {
|
|
252
|
+
switch(_state.label){
|
|
253
|
+
case 0:
|
|
254
|
+
return [
|
|
255
|
+
4,
|
|
256
|
+
apiClient.fetchUnauthenticated('/auth/setup')
|
|
257
|
+
];
|
|
258
|
+
case 1:
|
|
259
|
+
response = _state.sent();
|
|
260
|
+
if (!response.ok) return [
|
|
261
|
+
3,
|
|
262
|
+
3
|
|
263
|
+
];
|
|
264
|
+
return [
|
|
265
|
+
4,
|
|
266
|
+
response.json()
|
|
267
|
+
];
|
|
268
|
+
case 2:
|
|
269
|
+
return [
|
|
270
|
+
2,
|
|
271
|
+
_state.sent()
|
|
272
|
+
];
|
|
273
|
+
case 3:
|
|
274
|
+
return [
|
|
275
|
+
2,
|
|
276
|
+
null
|
|
277
|
+
];
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
})();
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Check if the error response indicates ROOT_KEY_NOT_CONFIGURED
|
|
284
|
+
*/ function isRootKeyNotConfiguredError(response) {
|
|
285
|
+
return _async_to_generator(function() {
|
|
286
|
+
var clonedResponse, data, e;
|
|
287
|
+
return _ts_generator(this, function(_state) {
|
|
288
|
+
switch(_state.label){
|
|
289
|
+
case 0:
|
|
290
|
+
_state.trys.push([
|
|
291
|
+
0,
|
|
292
|
+
2,
|
|
293
|
+
,
|
|
294
|
+
3
|
|
295
|
+
]);
|
|
296
|
+
clonedResponse = response.clone();
|
|
297
|
+
return [
|
|
298
|
+
4,
|
|
299
|
+
clonedResponse.json()
|
|
300
|
+
];
|
|
301
|
+
case 1:
|
|
302
|
+
data = _state.sent();
|
|
303
|
+
return [
|
|
304
|
+
2,
|
|
305
|
+
data.error === 'ROOT_KEY_NOT_CONFIGURED'
|
|
306
|
+
];
|
|
307
|
+
case 2:
|
|
308
|
+
e = _state.sent();
|
|
309
|
+
return [
|
|
310
|
+
2,
|
|
311
|
+
false
|
|
312
|
+
];
|
|
313
|
+
case 3:
|
|
314
|
+
return [
|
|
315
|
+
2
|
|
316
|
+
];
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
})();
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Build the appropriate auth error based on the response
|
|
323
|
+
*/ function buildAuthError(response) {
|
|
324
|
+
return _async_to_generator(function() {
|
|
325
|
+
var setupInfo;
|
|
326
|
+
return _ts_generator(this, function(_state) {
|
|
327
|
+
switch(_state.label){
|
|
328
|
+
case 0:
|
|
329
|
+
return [
|
|
330
|
+
4,
|
|
331
|
+
isRootKeyNotConfiguredError(response)
|
|
332
|
+
];
|
|
333
|
+
case 1:
|
|
334
|
+
if (!_state.sent()) return [
|
|
335
|
+
3,
|
|
336
|
+
3
|
|
337
|
+
];
|
|
338
|
+
return [
|
|
339
|
+
4,
|
|
340
|
+
fetchAuthSetupInstructions()
|
|
341
|
+
];
|
|
342
|
+
case 2:
|
|
343
|
+
setupInfo = _state.sent();
|
|
344
|
+
if (setupInfo) {
|
|
345
|
+
return [
|
|
346
|
+
2,
|
|
347
|
+
_object_spread_props(_object_spread({}, ROOT_KEY_NOT_CONFIGURED_ERROR), {
|
|
348
|
+
details: setupInfo.instructions
|
|
349
|
+
})
|
|
350
|
+
];
|
|
351
|
+
}
|
|
352
|
+
return [
|
|
353
|
+
2,
|
|
354
|
+
ROOT_KEY_NOT_CONFIGURED_ERROR
|
|
355
|
+
];
|
|
356
|
+
case 3:
|
|
357
|
+
return [
|
|
358
|
+
2,
|
|
359
|
+
AUTH_REQUIRED_ERROR
|
|
360
|
+
];
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
})();
|
|
364
|
+
}
|
|
236
365
|
export function useApiGet(endpoint, options) {
|
|
237
366
|
var _useState = _sliced_to_array(useState(null), 2), data = _useState[0], setData = _useState[1];
|
|
238
367
|
var _useState1 = _sliced_to_array(useState(true), 2), loading = _useState1[0], setLoading = _useState1[1];
|
|
@@ -246,9 +375,9 @@ export function useApiGet(endpoint, options) {
|
|
|
246
375
|
case 0:
|
|
247
376
|
_state.trys.push([
|
|
248
377
|
0,
|
|
249
|
-
7,
|
|
250
378
|
8,
|
|
251
|
-
9
|
|
379
|
+
9,
|
|
380
|
+
10
|
|
252
381
|
]);
|
|
253
382
|
setLoading(true);
|
|
254
383
|
setError(null);
|
|
@@ -273,41 +402,44 @@ export function useApiGet(endpoint, options) {
|
|
|
273
402
|
setData(result);
|
|
274
403
|
return [
|
|
275
404
|
3,
|
|
276
|
-
|
|
405
|
+
7
|
|
277
406
|
];
|
|
278
407
|
case 3:
|
|
279
408
|
if (!(response.status === 401)) return [
|
|
280
409
|
3,
|
|
281
|
-
|
|
410
|
+
5
|
|
282
411
|
];
|
|
283
|
-
setError({
|
|
284
|
-
title: 'Authentication Required',
|
|
285
|
-
message: 'Your request could not be authenticated.',
|
|
286
|
-
details: "Run 'px auth login' to configure your SSH key, or check that your key is registered on the server."
|
|
287
|
-
});
|
|
288
412
|
return [
|
|
289
|
-
|
|
290
|
-
|
|
413
|
+
4,
|
|
414
|
+
buildAuthError(response)
|
|
291
415
|
];
|
|
292
416
|
case 4:
|
|
417
|
+
setError.apply(void 0, [
|
|
418
|
+
_state.sent()
|
|
419
|
+
]);
|
|
420
|
+
return [
|
|
421
|
+
3,
|
|
422
|
+
7
|
|
423
|
+
];
|
|
424
|
+
case 5:
|
|
293
425
|
return [
|
|
294
426
|
4,
|
|
295
427
|
response.text()
|
|
296
428
|
];
|
|
297
|
-
case
|
|
429
|
+
case 6:
|
|
298
430
|
errorText = _state.sent();
|
|
299
431
|
setError({
|
|
300
432
|
title: 'Server Error',
|
|
301
433
|
message: "Error fetching ".concat(endpoint, ": ").concat(response.status, " ").concat(response.statusText),
|
|
302
434
|
details: "Server response: ".concat(errorText)
|
|
303
435
|
});
|
|
304
|
-
_state.label =
|
|
305
|
-
case
|
|
436
|
+
_state.label = 7;
|
|
437
|
+
case 7:
|
|
306
438
|
return [
|
|
307
439
|
3,
|
|
308
|
-
|
|
440
|
+
10
|
|
309
441
|
];
|
|
310
|
-
case
|
|
442
|
+
case 8:
|
|
311
443
|
err = _state.sent();
|
|
312
444
|
baseError = getConnectionErrorMessage();
|
|
313
445
|
errorDetails = err.message;
|
|
@@ -319,14 +451,14 @@ export function useApiGet(endpoint, options) {
|
|
|
319
451
|
}));
|
|
320
452
|
return [
|
|
321
453
|
3,
|
|
322
|
-
|
|
454
|
+
10
|
|
323
455
|
];
|
|
324
|
-
case
|
|
456
|
+
case 9:
|
|
325
457
|
setLoading(false);
|
|
326
458
|
return [
|
|
327
459
|
7
|
|
328
460
|
];
|
|
329
|
-
case
|
|
461
|
+
case 10:
|
|
330
462
|
return [
|
|
331
463
|
2
|
|
332
464
|
];
|
|
@@ -356,9 +488,9 @@ export function useApiPost(endpoint, defaultOptions) {
|
|
|
356
488
|
case 0:
|
|
357
489
|
_state.trys.push([
|
|
358
490
|
0,
|
|
359
|
-
7,
|
|
360
491
|
8,
|
|
361
|
-
9
|
|
492
|
+
9,
|
|
493
|
+
10
|
|
362
494
|
]);
|
|
363
495
|
setLoading(true);
|
|
364
496
|
setError(null);
|
|
@@ -390,21 +522,22 @@ export function useApiPost(endpoint, defaultOptions) {
|
|
|
390
522
|
case 3:
|
|
391
523
|
if (!(response.status === 401)) return [
|
|
392
524
|
3,
|
|
393
|
-
|
|
525
|
+
5
|
|
394
526
|
];
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
527
|
+
return [
|
|
528
|
+
4,
|
|
529
|
+
buildAuthError(response)
|
|
530
|
+
];
|
|
531
|
+
case 4:
|
|
532
|
+
errorObj = _state.sent();
|
|
400
533
|
setError(errorObj);
|
|
401
534
|
throw errorObj;
|
|
402
|
-
case
|
|
535
|
+
case 5:
|
|
403
536
|
return [
|
|
404
537
|
4,
|
|
405
538
|
response.text()
|
|
406
539
|
];
|
|
407
|
-
case
|
|
540
|
+
case 6:
|
|
408
541
|
errorText = _state.sent();
|
|
409
542
|
errorObj1 = {
|
|
410
543
|
title: 'Server Error',
|
|
@@ -413,12 +546,12 @@ export function useApiPost(endpoint, defaultOptions) {
|
|
|
413
546
|
};
|
|
414
547
|
setError(errorObj1);
|
|
415
548
|
throw errorObj1;
|
|
416
|
-
case
|
|
549
|
+
case 7:
|
|
417
550
|
return [
|
|
418
551
|
3,
|
|
419
|
-
|
|
552
|
+
10
|
|
420
553
|
];
|
|
421
|
-
case
|
|
554
|
+
case 8:
|
|
422
555
|
err = _state.sent();
|
|
423
556
|
// If it's already our error object, don't wrap it again
|
|
424
557
|
if (err.title && err.message) {
|
|
@@ -435,12 +568,12 @@ export function useApiPost(endpoint, defaultOptions) {
|
|
|
435
568
|
});
|
|
436
569
|
setError(errorObj2);
|
|
437
570
|
throw errorObj2;
|
|
438
|
-
case
|
|
571
|
+
case 9:
|
|
439
572
|
setLoading(false);
|
|
440
573
|
return [
|
|
441
574
|
7
|
|
442
575
|
];
|
|
443
|
-
case
|
|
576
|
+
case 10:
|
|
444
577
|
return [
|
|
445
578
|
2
|
|
446
579
|
];
|
|
@@ -469,9 +602,9 @@ export function useApiDelete(resourceType) {
|
|
|
469
602
|
case 0:
|
|
470
603
|
_state.trys.push([
|
|
471
604
|
0,
|
|
472
|
-
6,
|
|
473
605
|
7,
|
|
474
|
-
8
|
|
606
|
+
8,
|
|
607
|
+
9
|
|
475
608
|
]);
|
|
476
609
|
setLoading(true);
|
|
477
610
|
setError(null);
|
|
@@ -494,21 +627,22 @@ export function useApiDelete(resourceType) {
|
|
|
494
627
|
case 2:
|
|
495
628
|
if (!(response.status === 401)) return [
|
|
496
629
|
3,
|
|
497
|
-
|
|
630
|
+
4
|
|
498
631
|
];
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
632
|
+
return [
|
|
633
|
+
4,
|
|
634
|
+
buildAuthError(response)
|
|
635
|
+
];
|
|
636
|
+
case 3:
|
|
637
|
+
errorObj = _state.sent();
|
|
504
638
|
setError(errorObj);
|
|
505
639
|
throw errorObj;
|
|
506
|
-
case
|
|
640
|
+
case 4:
|
|
507
641
|
return [
|
|
508
642
|
4,
|
|
509
643
|
response.text()
|
|
510
644
|
];
|
|
511
|
-
case
|
|
645
|
+
case 5:
|
|
512
646
|
errorText = _state.sent();
|
|
513
647
|
errorObj1 = {
|
|
514
648
|
title: 'Server Error',
|
|
@@ -517,12 +651,12 @@ export function useApiDelete(resourceType) {
|
|
|
517
651
|
};
|
|
518
652
|
setError(errorObj1);
|
|
519
653
|
throw errorObj1;
|
|
520
|
-
case
|
|
654
|
+
case 6:
|
|
521
655
|
return [
|
|
522
656
|
3,
|
|
523
|
-
|
|
657
|
+
9
|
|
524
658
|
];
|
|
525
|
-
case
|
|
659
|
+
case 7:
|
|
526
660
|
err = _state.sent();
|
|
527
661
|
// If it's already our error object, don't wrap it again
|
|
528
662
|
if (err.title && err.message) {
|
|
@@ -539,12 +673,12 @@ export function useApiDelete(resourceType) {
|
|
|
539
673
|
});
|
|
540
674
|
setError(errorObj2);
|
|
541
675
|
throw errorObj2;
|
|
542
|
-
case
|
|
676
|
+
case 8:
|
|
543
677
|
setLoading(false);
|
|
544
678
|
return [
|
|
545
679
|
7
|
|
546
680
|
];
|
|
547
|
-
case
|
|
681
|
+
case 9:
|
|
548
682
|
return [
|
|
549
683
|
2
|
|
550
684
|
];
|