@positronic/cli 0.0.57 → 0.0.58
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 +22 -0
- package/dist/src/components/auth-format-jwk-key.js +457 -0
- package/dist/src/hooks/useApi.js +183 -49
- 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/package.json +4 -4
package/dist/src/cli.js
CHANGED
|
@@ -986,6 +986,15 @@ export function buildCli(options) {
|
|
|
986
986
|
}).command('list', 'List available SSH keys\n', function() {}, function() {
|
|
987
987
|
var element = authCommand.list();
|
|
988
988
|
render(element);
|
|
989
|
+
}).command('format-jwk-key', 'Convert an SSH public key to JWK format for ROOT_PUBLIC_KEY\n', function(yargsFormatJwkKey) {
|
|
990
|
+
return yargsFormatJwkKey.option('pubkey', {
|
|
991
|
+
describe: 'Path to SSH public key file',
|
|
992
|
+
type: 'string',
|
|
993
|
+
alias: 'p'
|
|
994
|
+
}).example('$0 auth format-jwk-key', 'Interactive public key selection').example('$0 auth format-jwk-key --pubkey ~/.ssh/id_ed25519.pub', 'Convert specific key');
|
|
995
|
+
}, function(argv) {
|
|
996
|
+
var element = authCommand.formatJwkKey(argv);
|
|
997
|
+
render(element);
|
|
989
998
|
}).command('$0', false, function() {}, function() {
|
|
990
999
|
// Default to status when just 'px auth' is run
|
|
991
1000
|
var element = authCommand.status();
|
|
@@ -35,6 +35,7 @@ import { AuthStatus } from '../components/auth-status.js';
|
|
|
35
35
|
import { AuthLogin } from '../components/auth-login.js';
|
|
36
36
|
import { AuthLogout } from '../components/auth-logout.js';
|
|
37
37
|
import { AuthList } from '../components/auth-list.js';
|
|
38
|
+
import { AuthFormatJwkKey } from '../components/auth-format-jwk-key.js';
|
|
38
39
|
import { ProjectConfigManager } from './project-config-manager.js';
|
|
39
40
|
export var AuthCommand = /*#__PURE__*/ function() {
|
|
40
41
|
"use strict";
|
|
@@ -92,6 +93,18 @@ export var AuthCommand = /*#__PURE__*/ function() {
|
|
|
92
93
|
configManager: this.configManager
|
|
93
94
|
});
|
|
94
95
|
}
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
/**
|
|
99
|
+
* Handles the 'px auth format-jwk-key' command.
|
|
100
|
+
* Convert an SSH public key to JWK format for ROOT_PUBLIC_KEY configuration.
|
|
101
|
+
*/ key: "formatJwkKey",
|
|
102
|
+
value: function formatJwkKey(param) {
|
|
103
|
+
var pubkey = param.pubkey;
|
|
104
|
+
return React.createElement(AuthFormatJwkKey, {
|
|
105
|
+
pubkeyPath: pubkey
|
|
106
|
+
});
|
|
107
|
+
}
|
|
95
108
|
}
|
|
96
109
|
]);
|
|
97
110
|
return AuthCommand;
|
|
@@ -307,6 +307,28 @@ export var apiClient = {
|
|
|
307
307
|
];
|
|
308
308
|
});
|
|
309
309
|
})();
|
|
310
|
+
},
|
|
311
|
+
/**
|
|
312
|
+
* Fetch without authentication - used for unauthenticated endpoints like /auth/setup
|
|
313
|
+
*/ fetchUnauthenticated: function(apiPath, options) {
|
|
314
|
+
return _async_to_generator(function() {
|
|
315
|
+
var baseUrl, port, fullUrl;
|
|
316
|
+
return _ts_generator(this, function(_state) {
|
|
317
|
+
if (apiBaseUrl) {
|
|
318
|
+
baseUrl = apiBaseUrl;
|
|
319
|
+
} else {
|
|
320
|
+
// Fallback to localhost (for backwards compatibility and testing)
|
|
321
|
+
port = process.env.POSITRONIC_PORT || '8787';
|
|
322
|
+
baseUrl = "http://localhost:".concat(port);
|
|
323
|
+
}
|
|
324
|
+
fullUrl = "".concat(baseUrl).concat(apiPath.startsWith('/') ? apiPath : '/' + apiPath);
|
|
325
|
+
// Don't sign the request - this is for unauthenticated endpoints
|
|
326
|
+
return [
|
|
327
|
+
2,
|
|
328
|
+
fetch(fullUrl, options)
|
|
329
|
+
];
|
|
330
|
+
});
|
|
331
|
+
})();
|
|
310
332
|
}
|
|
311
333
|
};
|
|
312
334
|
export function generateProject(projectName, projectDir) {
|
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
function _array_like_to_array(arr, len) {
|
|
2
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
+
return arr2;
|
|
5
|
+
}
|
|
6
|
+
function _array_with_holes(arr) {
|
|
7
|
+
if (Array.isArray(arr)) return arr;
|
|
8
|
+
}
|
|
9
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
10
|
+
try {
|
|
11
|
+
var info = gen[key](arg);
|
|
12
|
+
var value = info.value;
|
|
13
|
+
} catch (error) {
|
|
14
|
+
reject(error);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (info.done) {
|
|
18
|
+
resolve(value);
|
|
19
|
+
} else {
|
|
20
|
+
Promise.resolve(value).then(_next, _throw);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function _async_to_generator(fn) {
|
|
24
|
+
return function() {
|
|
25
|
+
var self = this, args = arguments;
|
|
26
|
+
return new Promise(function(resolve, reject) {
|
|
27
|
+
var gen = fn.apply(self, args);
|
|
28
|
+
function _next(value) {
|
|
29
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
30
|
+
}
|
|
31
|
+
function _throw(err) {
|
|
32
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
33
|
+
}
|
|
34
|
+
_next(undefined);
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function _iterable_to_array_limit(arr, i) {
|
|
39
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
40
|
+
if (_i == null) return;
|
|
41
|
+
var _arr = [];
|
|
42
|
+
var _n = true;
|
|
43
|
+
var _d = false;
|
|
44
|
+
var _s, _e;
|
|
45
|
+
try {
|
|
46
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
47
|
+
_arr.push(_s.value);
|
|
48
|
+
if (i && _arr.length === i) break;
|
|
49
|
+
}
|
|
50
|
+
} catch (err) {
|
|
51
|
+
_d = true;
|
|
52
|
+
_e = err;
|
|
53
|
+
} finally{
|
|
54
|
+
try {
|
|
55
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
56
|
+
} finally{
|
|
57
|
+
if (_d) throw _e;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return _arr;
|
|
61
|
+
}
|
|
62
|
+
function _non_iterable_rest() {
|
|
63
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
64
|
+
}
|
|
65
|
+
function _sliced_to_array(arr, i) {
|
|
66
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
67
|
+
}
|
|
68
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
69
|
+
if (!o) return;
|
|
70
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
71
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
72
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
73
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
74
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
75
|
+
}
|
|
76
|
+
function _ts_generator(thisArg, body) {
|
|
77
|
+
var f, y, t, _ = {
|
|
78
|
+
label: 0,
|
|
79
|
+
sent: function() {
|
|
80
|
+
if (t[0] & 1) throw t[1];
|
|
81
|
+
return t[1];
|
|
82
|
+
},
|
|
83
|
+
trys: [],
|
|
84
|
+
ops: []
|
|
85
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
86
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
87
|
+
return this;
|
|
88
|
+
}), g;
|
|
89
|
+
function verb(n) {
|
|
90
|
+
return function(v) {
|
|
91
|
+
return step([
|
|
92
|
+
n,
|
|
93
|
+
v
|
|
94
|
+
]);
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function step(op) {
|
|
98
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
99
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
100
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
101
|
+
if (y = 0, t) op = [
|
|
102
|
+
op[0] & 2,
|
|
103
|
+
t.value
|
|
104
|
+
];
|
|
105
|
+
switch(op[0]){
|
|
106
|
+
case 0:
|
|
107
|
+
case 1:
|
|
108
|
+
t = op;
|
|
109
|
+
break;
|
|
110
|
+
case 4:
|
|
111
|
+
_.label++;
|
|
112
|
+
return {
|
|
113
|
+
value: op[1],
|
|
114
|
+
done: false
|
|
115
|
+
};
|
|
116
|
+
case 5:
|
|
117
|
+
_.label++;
|
|
118
|
+
y = op[1];
|
|
119
|
+
op = [
|
|
120
|
+
0
|
|
121
|
+
];
|
|
122
|
+
continue;
|
|
123
|
+
case 7:
|
|
124
|
+
op = _.ops.pop();
|
|
125
|
+
_.trys.pop();
|
|
126
|
+
continue;
|
|
127
|
+
default:
|
|
128
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
129
|
+
_ = 0;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
133
|
+
_.label = op[1];
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
137
|
+
_.label = t[1];
|
|
138
|
+
t = op;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
if (t && _.label < t[2]) {
|
|
142
|
+
_.label = t[2];
|
|
143
|
+
_.ops.push(op);
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
if (t[2]) _.ops.pop();
|
|
147
|
+
_.trys.pop();
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
op = body.call(thisArg, _);
|
|
151
|
+
} catch (e) {
|
|
152
|
+
op = [
|
|
153
|
+
6,
|
|
154
|
+
e
|
|
155
|
+
];
|
|
156
|
+
y = 0;
|
|
157
|
+
} finally{
|
|
158
|
+
f = t = 0;
|
|
159
|
+
}
|
|
160
|
+
if (op[0] & 5) throw op[1];
|
|
161
|
+
return {
|
|
162
|
+
value: op[0] ? op[1] : void 0,
|
|
163
|
+
done: true
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
import React, { useState, useEffect } from 'react';
|
|
168
|
+
import { Box, Text, useApp } from 'ink';
|
|
169
|
+
import { existsSync, readdirSync } from 'fs';
|
|
170
|
+
import { homedir } from 'os';
|
|
171
|
+
import { join } from 'path';
|
|
172
|
+
import { convertSSHPubKeyToJWK, expandPath } from '../lib/ssh-key-utils.js';
|
|
173
|
+
import { SelectList } from './select-list.js';
|
|
174
|
+
/**
|
|
175
|
+
* Discover available SSH public keys in ~/.ssh
|
|
176
|
+
*/ function discoverSSHPubKeys() {
|
|
177
|
+
var sshDir = join(homedir(), '.ssh');
|
|
178
|
+
if (!existsSync(sshDir)) {
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
var pubKeys = [];
|
|
182
|
+
try {
|
|
183
|
+
var files = readdirSync(sshDir);
|
|
184
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
185
|
+
try {
|
|
186
|
+
for(var _iterator = files[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
187
|
+
var file = _step.value;
|
|
188
|
+
if (file.endsWith('.pub')) {
|
|
189
|
+
var fullPath = join(sshDir, file);
|
|
190
|
+
pubKeys.push({
|
|
191
|
+
path: fullPath,
|
|
192
|
+
displayPath: "~/.ssh/".concat(file)
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
} catch (err) {
|
|
197
|
+
_didIteratorError = true;
|
|
198
|
+
_iteratorError = err;
|
|
199
|
+
} finally{
|
|
200
|
+
try {
|
|
201
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
202
|
+
_iterator.return();
|
|
203
|
+
}
|
|
204
|
+
} finally{
|
|
205
|
+
if (_didIteratorError) {
|
|
206
|
+
throw _iteratorError;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
} catch (e) {
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
return pubKeys;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Copy text to clipboard using pbcopy (macOS) or xclip (Linux)
|
|
217
|
+
*/ function copyToClipboard(text) {
|
|
218
|
+
return _async_to_generator(function() {
|
|
219
|
+
var spawn;
|
|
220
|
+
return _ts_generator(this, function(_state) {
|
|
221
|
+
switch(_state.label){
|
|
222
|
+
case 0:
|
|
223
|
+
return [
|
|
224
|
+
4,
|
|
225
|
+
import('child_process')
|
|
226
|
+
];
|
|
227
|
+
case 1:
|
|
228
|
+
spawn = _state.sent().spawn;
|
|
229
|
+
return [
|
|
230
|
+
2,
|
|
231
|
+
new Promise(function(resolve) {
|
|
232
|
+
var _proc_stdin, _proc_stdin1;
|
|
233
|
+
// Try pbcopy first (macOS)
|
|
234
|
+
var proc = spawn('pbcopy', [], {
|
|
235
|
+
stdio: [
|
|
236
|
+
'pipe',
|
|
237
|
+
'ignore',
|
|
238
|
+
'ignore'
|
|
239
|
+
]
|
|
240
|
+
});
|
|
241
|
+
proc.on('error', function() {
|
|
242
|
+
var _proc_stdin, _proc_stdin1;
|
|
243
|
+
// Try xclip (Linux)
|
|
244
|
+
proc = spawn('xclip', [
|
|
245
|
+
'-selection',
|
|
246
|
+
'clipboard'
|
|
247
|
+
], {
|
|
248
|
+
stdio: [
|
|
249
|
+
'pipe',
|
|
250
|
+
'ignore',
|
|
251
|
+
'ignore'
|
|
252
|
+
]
|
|
253
|
+
});
|
|
254
|
+
proc.on('error', function() {
|
|
255
|
+
resolve(false);
|
|
256
|
+
});
|
|
257
|
+
proc.on('close', function(code) {
|
|
258
|
+
resolve(code === 0);
|
|
259
|
+
});
|
|
260
|
+
(_proc_stdin = proc.stdin) === null || _proc_stdin === void 0 ? void 0 : _proc_stdin.write(text);
|
|
261
|
+
(_proc_stdin1 = proc.stdin) === null || _proc_stdin1 === void 0 ? void 0 : _proc_stdin1.end();
|
|
262
|
+
});
|
|
263
|
+
proc.on('close', function(code) {
|
|
264
|
+
resolve(code === 0);
|
|
265
|
+
});
|
|
266
|
+
(_proc_stdin = proc.stdin) === null || _proc_stdin === void 0 ? void 0 : _proc_stdin.write(text);
|
|
267
|
+
(_proc_stdin1 = proc.stdin) === null || _proc_stdin1 === void 0 ? void 0 : _proc_stdin1.end();
|
|
268
|
+
})
|
|
269
|
+
];
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
})();
|
|
273
|
+
}
|
|
274
|
+
export var AuthFormatJwkKey = function(param) {
|
|
275
|
+
var pubkeyPath = param.pubkeyPath;
|
|
276
|
+
var exit = useApp().exit;
|
|
277
|
+
var _useState = _sliced_to_array(useState(pubkeyPath ? 'success' : 'selecting'), 2), state = _useState[0], setState = _useState[1];
|
|
278
|
+
var _useState1 = _sliced_to_array(useState(null), 2), error = _useState1[0], setError = _useState1[1];
|
|
279
|
+
var _useState2 = _sliced_to_array(useState(null), 2), jwkOutput = _useState2[0], setJwkOutput = _useState2[1];
|
|
280
|
+
var _useState3 = _sliced_to_array(useState(null), 2), fingerprint = _useState3[0], setFingerprint = _useState3[1];
|
|
281
|
+
var _useState4 = _sliced_to_array(useState(false), 2), copiedToClipboard = _useState4[0], setCopiedToClipboard = _useState4[1];
|
|
282
|
+
var _useState5 = _sliced_to_array(useState(pubkeyPath || null), 2), selectedPath = _useState5[0], setSelectedPath = _useState5[1];
|
|
283
|
+
// Handle direct path provided via --pubkey
|
|
284
|
+
useEffect(function() {
|
|
285
|
+
if (pubkeyPath && state === 'success' && !jwkOutput) {
|
|
286
|
+
processKey(pubkeyPath);
|
|
287
|
+
}
|
|
288
|
+
}, [
|
|
289
|
+
pubkeyPath,
|
|
290
|
+
state,
|
|
291
|
+
jwkOutput
|
|
292
|
+
]);
|
|
293
|
+
var processKey = function(keyPath) {
|
|
294
|
+
return _async_to_generator(function() {
|
|
295
|
+
var expandedPath, keyInfo, jwkString, copied, err;
|
|
296
|
+
return _ts_generator(this, function(_state) {
|
|
297
|
+
switch(_state.label){
|
|
298
|
+
case 0:
|
|
299
|
+
_state.trys.push([
|
|
300
|
+
0,
|
|
301
|
+
2,
|
|
302
|
+
,
|
|
303
|
+
3
|
|
304
|
+
]);
|
|
305
|
+
expandedPath = expandPath(keyPath);
|
|
306
|
+
if (!existsSync(expandedPath)) {
|
|
307
|
+
setError("Public key file not found: ".concat(keyPath));
|
|
308
|
+
setState('error');
|
|
309
|
+
return [
|
|
310
|
+
2
|
|
311
|
+
];
|
|
312
|
+
}
|
|
313
|
+
keyInfo = convertSSHPubKeyToJWK(expandedPath);
|
|
314
|
+
jwkString = JSON.stringify(keyInfo.jwk, null, 2);
|
|
315
|
+
setJwkOutput(jwkString);
|
|
316
|
+
setFingerprint(keyInfo.fingerprint);
|
|
317
|
+
setSelectedPath(keyPath);
|
|
318
|
+
return [
|
|
319
|
+
4,
|
|
320
|
+
copyToClipboard(jwkString)
|
|
321
|
+
];
|
|
322
|
+
case 1:
|
|
323
|
+
copied = _state.sent();
|
|
324
|
+
setCopiedToClipboard(copied);
|
|
325
|
+
setState('success');
|
|
326
|
+
return [
|
|
327
|
+
3,
|
|
328
|
+
3
|
|
329
|
+
];
|
|
330
|
+
case 2:
|
|
331
|
+
err = _state.sent();
|
|
332
|
+
setError(err.message || 'Failed to convert key');
|
|
333
|
+
setState('error');
|
|
334
|
+
return [
|
|
335
|
+
3,
|
|
336
|
+
3
|
|
337
|
+
];
|
|
338
|
+
case 3:
|
|
339
|
+
return [
|
|
340
|
+
2
|
|
341
|
+
];
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
})();
|
|
345
|
+
};
|
|
346
|
+
// Check for available keys when in selecting state
|
|
347
|
+
var pubKeys = discoverSSHPubKeys();
|
|
348
|
+
if (state === 'selecting' && pubKeys.length === 0) {
|
|
349
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
350
|
+
flexDirection: "column",
|
|
351
|
+
paddingTop: 1,
|
|
352
|
+
paddingBottom: 1
|
|
353
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
354
|
+
color: "yellow"
|
|
355
|
+
}, "No SSH public keys found in ~/.ssh/"), /*#__PURE__*/ React.createElement(Box, {
|
|
356
|
+
marginTop: 1,
|
|
357
|
+
flexDirection: "column"
|
|
358
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
359
|
+
dimColor: true
|
|
360
|
+
}, "Generate a new SSH key with:"), /*#__PURE__*/ React.createElement(Box, {
|
|
361
|
+
marginLeft: 2,
|
|
362
|
+
marginTop: 1
|
|
363
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
364
|
+
color: "cyan"
|
|
365
|
+
}, 'ssh-keygen -t ed25519 -C "your-email@example.com"'))), /*#__PURE__*/ React.createElement(Box, {
|
|
366
|
+
marginTop: 1
|
|
367
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
368
|
+
dimColor: true
|
|
369
|
+
}, "Or specify a public key path with: px auth format-jwk-key --pubkey /path/to/key.pub")));
|
|
370
|
+
}
|
|
371
|
+
if (state === 'selecting') {
|
|
372
|
+
var items = pubKeys.map(function(key) {
|
|
373
|
+
return {
|
|
374
|
+
id: key.path,
|
|
375
|
+
label: key.displayPath,
|
|
376
|
+
description: ''
|
|
377
|
+
};
|
|
378
|
+
});
|
|
379
|
+
var handleSelect = function(item) {
|
|
380
|
+
return _async_to_generator(function() {
|
|
381
|
+
return _ts_generator(this, function(_state) {
|
|
382
|
+
switch(_state.label){
|
|
383
|
+
case 0:
|
|
384
|
+
return [
|
|
385
|
+
4,
|
|
386
|
+
processKey(item.id)
|
|
387
|
+
];
|
|
388
|
+
case 1:
|
|
389
|
+
_state.sent();
|
|
390
|
+
return [
|
|
391
|
+
2
|
|
392
|
+
];
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
})();
|
|
396
|
+
};
|
|
397
|
+
var handleCancel = function() {
|
|
398
|
+
exit();
|
|
399
|
+
};
|
|
400
|
+
return /*#__PURE__*/ React.createElement(SelectList, {
|
|
401
|
+
items: items,
|
|
402
|
+
header: "Select an SSH public key to convert to JWK format",
|
|
403
|
+
onSelect: handleSelect,
|
|
404
|
+
onCancel: handleCancel,
|
|
405
|
+
footer: "Use arrow keys to navigate, Enter to select, q to cancel"
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
if (state === 'error') {
|
|
409
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
410
|
+
flexDirection: "column",
|
|
411
|
+
paddingTop: 1,
|
|
412
|
+
paddingBottom: 1
|
|
413
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
414
|
+
color: "red"
|
|
415
|
+
}, "Error: ", error));
|
|
416
|
+
}
|
|
417
|
+
if (state === 'success' && jwkOutput) {
|
|
418
|
+
var displayPath = (selectedPath === null || selectedPath === void 0 ? void 0 : selectedPath.startsWith(homedir())) ? selectedPath.replace(homedir(), '~') : selectedPath;
|
|
419
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
420
|
+
flexDirection: "column",
|
|
421
|
+
paddingTop: 1,
|
|
422
|
+
paddingBottom: 1
|
|
423
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
424
|
+
bold: true,
|
|
425
|
+
color: "green"
|
|
426
|
+
}, "JWK Public Key"), /*#__PURE__*/ React.createElement(Box, {
|
|
427
|
+
marginTop: 1
|
|
428
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
429
|
+
dimColor: true
|
|
430
|
+
}, "Source: ", displayPath)), fingerprint && /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, {
|
|
431
|
+
dimColor: true
|
|
432
|
+
}, "Fingerprint: ", fingerprint)), /*#__PURE__*/ React.createElement(Box, {
|
|
433
|
+
marginTop: 1,
|
|
434
|
+
flexDirection: "column"
|
|
435
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
436
|
+
color: "cyan"
|
|
437
|
+
}, jwkOutput)), /*#__PURE__*/ React.createElement(Box, {
|
|
438
|
+
marginTop: 1
|
|
439
|
+
}, copiedToClipboard ? /*#__PURE__*/ React.createElement(Text, {
|
|
440
|
+
color: "green"
|
|
441
|
+
}, "Copied to clipboard.") : /*#__PURE__*/ React.createElement(Text, {
|
|
442
|
+
color: "yellow"
|
|
443
|
+
}, "Could not copy to clipboard - copy the value above manually.")), /*#__PURE__*/ React.createElement(Box, {
|
|
444
|
+
marginTop: 1,
|
|
445
|
+
flexDirection: "column"
|
|
446
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
447
|
+
bold: true
|
|
448
|
+
}, "Next steps:"), /*#__PURE__*/ React.createElement(Box, {
|
|
449
|
+
marginLeft: 2,
|
|
450
|
+
marginTop: 1,
|
|
451
|
+
flexDirection: "column"
|
|
452
|
+
}, /*#__PURE__*/ React.createElement(Text, null, "1. Go to Cloudflare dashboard"), /*#__PURE__*/ React.createElement(Text, null, "2. Navigate to Workers & Pages ", '>', " Your project ", '>', " Settings ", '>', " Variables and Secrets"), /*#__PURE__*/ React.createElement(Text, null, "3. Add a new secret named ", /*#__PURE__*/ React.createElement(Text, {
|
|
453
|
+
color: "cyan"
|
|
454
|
+
}, "ROOT_PUBLIC_KEY")), /*#__PURE__*/ React.createElement(Text, null, "4. Paste the JWK value above"))));
|
|
455
|
+
}
|
|
456
|
+
return null;
|
|
457
|
+
};
|
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
|
];
|
package/dist/types/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAK5D,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,KAAK,GAAG,CAAC;CAC9C;AAoBD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAK5D,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,KAAK,GAAG,CAAC;CAC9C;AAoBD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,4BAu5C3C"}
|
|
@@ -8,6 +8,9 @@ interface LoginArgs {
|
|
|
8
8
|
interface LogoutArgs {
|
|
9
9
|
project?: boolean;
|
|
10
10
|
}
|
|
11
|
+
interface FormatJwkKeyArgs {
|
|
12
|
+
pubkey?: string;
|
|
13
|
+
}
|
|
11
14
|
export declare class AuthCommand {
|
|
12
15
|
private configManager;
|
|
13
16
|
constructor(configManager?: ProjectConfigManager);
|
|
@@ -31,6 +34,11 @@ export declare class AuthCommand {
|
|
|
31
34
|
* List available SSH keys.
|
|
32
35
|
*/
|
|
33
36
|
list(): React.ReactElement;
|
|
37
|
+
/**
|
|
38
|
+
* Handles the 'px auth format-jwk-key' command.
|
|
39
|
+
* Convert an SSH public key to JWK format for ROOT_PUBLIC_KEY configuration.
|
|
40
|
+
*/
|
|
41
|
+
formatJwkKey({ pubkey }: ArgumentsCamelCase<FormatJwkKeyArgs>): React.ReactElement;
|
|
34
42
|
}
|
|
35
43
|
export {};
|
|
36
44
|
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,UAAU,SAAS;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,aAAa,CAAuB;gBAEhC,aAAa,CAAC,EAAE,oBAAoB;IAIhD;;;OAGG;IACH,MAAM,IAAI,KAAK,CAAC,YAAY;IAM5B;;;OAGG;IACH,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,kBAAkB,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,YAAY;IAQ3E;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,kBAAkB,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,YAAY;IAOvE;;;OAGG;IACH,IAAI,IAAI,KAAK,CAAC,YAAY;IAM1B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,YAAY;CAKnF"}
|
|
@@ -24,6 +24,10 @@ export declare function isApiLocalDevMode(): boolean;
|
|
|
24
24
|
export declare function getApiBaseUrl(): string;
|
|
25
25
|
export declare const apiClient: {
|
|
26
26
|
fetch: (apiPath: string, options?: RequestInit) => Promise<Response>;
|
|
27
|
+
/**
|
|
28
|
+
* Fetch without authentication - used for unauthenticated endpoints like /auth/setup
|
|
29
|
+
*/
|
|
30
|
+
fetchUnauthenticated: (apiPath: string, options?: RequestInit) => Promise<Response>;
|
|
27
31
|
};
|
|
28
32
|
export declare function generateProject(projectName: string, projectDir: string): Promise<void>;
|
|
29
33
|
export declare function scanLocalResources(resourcesDir: string): ResourceEntry[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAUtD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;AAGhE,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC;AAMzC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,GAAE,OAAc,GAAG,IAAI,CAGtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AAGD,eAAO,MAAM,SAAS;qBACG,MAAM,YAAY,WAAW,KAAG,OAAO,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAUtD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;AAGhE,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC;AAMzC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,GAAE,OAAc,GAAG,IAAI,CAGtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AAGD,eAAO,MAAM,SAAS;qBACG,MAAM,YAAY,WAAW,KAAG,OAAO,CAAC,QAAQ,CAAC;IAiDxE;;OAEG;oCACmC,MAAM,YAAY,WAAW,KAAG,OAAO,CAAC,QAAQ,CAAC;CAkBxF,CAAC;AAEF,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAsF5E;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,EAAE,CAsCxE;AAeD,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;IAC9C,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5B,KAAK,IAAI,CAAC;AAEX;;GAEG;AACH,wBAAsB,aAAa,CACjC,eAAe,EAAE,MAAM,EACvB,MAAM,GAAE,SAAqB,EAC7B,UAAU,CAAC,EAAE,oBAAoB,GAChC,OAAO,CAAC,UAAU,CAAC,CA+KrB;AAqKD;;GAEG;AACH,wBAAsB,aAAa,CACjC,eAAe,EAAE,MAAM,EACvB,MAAM,GAAE,SAAqB,mBAoB9B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAwCnE;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAO3E;AAsCD;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,SAAO,GACf,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,SAAqB,EAC7B,UAAU,CAAC,EAAE,gBAAgB,EAC7B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA2If"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-format-jwk-key.d.ts","sourceRoot":"","sources":["../../../src/components/auth-format-jwk-key.tsx"],"names":[],"mappings":"AAQA,UAAU,qBAAqB;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAoED,eAAO,MAAM,gBAAgB,GAAI,gBAAgB,qBAAqB,mDAgJrE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useApi.d.ts","sourceRoot":"","sources":["../../../src/hooks/useApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useApi.d.ts","sourceRoot":"","sources":["../../../src/hooks/useApi.ts"],"names":[],"mappings":"AA2EA,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;;;;eAIjD,MAAM;iBACJ,MAAM;kBACL,MAAM;;EAgDnB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,GAAG;;;;eAIzD,MAAM;iBACJ,MAAM;kBACL,MAAM;;qBAIF,GAAG,YAAY,GAAG;EA0DnC;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM;;;eAGtC,MAAM;iBACJ,MAAM;kBACL,MAAM;;wBAIC,MAAM,YAAY,GAAG;EAsDzC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@positronic/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.58",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"clean": "rm -rf tsconfig.tsbuildinfo dist node_modules"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@positronic/core": "^0.0.
|
|
27
|
-
"@positronic/spec": "^0.0.
|
|
28
|
-
"@positronic/template-new-project": "^0.0.
|
|
26
|
+
"@positronic/core": "^0.0.58",
|
|
27
|
+
"@positronic/spec": "^0.0.58",
|
|
28
|
+
"@positronic/template-new-project": "^0.0.58",
|
|
29
29
|
"caz": "^2.0.0",
|
|
30
30
|
"chokidar": "^3.6.0",
|
|
31
31
|
"dotenv": "^16.4.7",
|