replicas-cli 0.2.2 → 0.2.4
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/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +79 -25
- package/dist/commands/login.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +35 -6
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +1 -0
- package/dist/lib/auth.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAgBA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAgBA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA6MlD"}
|
package/dist/commands/login.js
CHANGED
|
@@ -20,9 +20,64 @@ async function loginCommand() {
|
|
|
20
20
|
const state = generateState();
|
|
21
21
|
return new Promise((resolve, reject) => {
|
|
22
22
|
let authTimeout;
|
|
23
|
+
let hasHandledCallback = false;
|
|
24
|
+
let lastRedirectUrl = null;
|
|
25
|
+
let lastMessage = null;
|
|
26
|
+
const pendingResponses = new Set();
|
|
27
|
+
function respondWithRedirect(res) {
|
|
28
|
+
if (lastRedirectUrl) {
|
|
29
|
+
res.writeHead(302, {
|
|
30
|
+
'Location': lastRedirectUrl,
|
|
31
|
+
'Connection': 'close',
|
|
32
|
+
});
|
|
33
|
+
res.end();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
res.writeHead(200, {
|
|
37
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
38
|
+
'Connection': 'close',
|
|
39
|
+
});
|
|
40
|
+
res.end(`
|
|
41
|
+
<!DOCTYPE html>
|
|
42
|
+
<html lang="en">
|
|
43
|
+
<head>
|
|
44
|
+
<meta charset="utf-8" />
|
|
45
|
+
<title>Replicas CLI Login</title>
|
|
46
|
+
<style>
|
|
47
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background:#09090b; color:#f4f4f5; display:flex; align-items:center; justify-content:center; height:100vh; margin:0; }
|
|
48
|
+
.card { border:1px solid #27272a; padding:32px; border-radius:12px; background:#0f0f12; max-width:420px; text-align:center; }
|
|
49
|
+
.title { font-size:20px; margin-bottom:12px; letter-spacing:0.08em; text-transform:uppercase; color:#a855f7; }
|
|
50
|
+
.message { font-family: 'Menlo', 'Source Code Pro', monospace; font-size:14px; line-height:1.6; color:#d4d4d8; white-space:pre-line; }
|
|
51
|
+
</style>
|
|
52
|
+
</head>
|
|
53
|
+
<body>
|
|
54
|
+
<div class="card">
|
|
55
|
+
<div class="title">Replicas CLI</div>
|
|
56
|
+
<div class="message">${lastMessage || 'Authentication already processed. You can close this tab.'}</div>
|
|
57
|
+
</div>
|
|
58
|
+
</body>
|
|
59
|
+
</html>
|
|
60
|
+
`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function flushPendingResponses() {
|
|
64
|
+
for (const response of pendingResponses) {
|
|
65
|
+
respondWithRedirect(response);
|
|
66
|
+
}
|
|
67
|
+
pendingResponses.clear();
|
|
68
|
+
}
|
|
23
69
|
const server = http_1.default.createServer(async (req, res) => {
|
|
24
70
|
const url = new url_1.URL(req.url || '', `http://${req.headers.host}`);
|
|
25
71
|
if (url.pathname === '/callback') {
|
|
72
|
+
if (hasHandledCallback) {
|
|
73
|
+
if (!lastRedirectUrl) {
|
|
74
|
+
pendingResponses.add(res);
|
|
75
|
+
res.on('close', () => pendingResponses.delete(res));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
respondWithRedirect(res);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
26
81
|
const returnedState = url.searchParams.get('state');
|
|
27
82
|
const accessToken = url.searchParams.get('access_token');
|
|
28
83
|
const refreshToken = url.searchParams.get('refresh_token');
|
|
@@ -30,11 +85,10 @@ async function loginCommand() {
|
|
|
30
85
|
const error = url.searchParams.get('error');
|
|
31
86
|
if (error) {
|
|
32
87
|
const errorUrl = `${WEB_APP_URL}/cli-login/error?message=${encodeURIComponent(error)}`;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
res.end();
|
|
88
|
+
lastRedirectUrl = errorUrl;
|
|
89
|
+
lastMessage = `Authentication failed: ${error}`;
|
|
90
|
+
respondWithRedirect(res);
|
|
91
|
+
flushPendingResponses();
|
|
38
92
|
clearTimeout(authTimeout);
|
|
39
93
|
setImmediate(() => {
|
|
40
94
|
server.closeAllConnections?.();
|
|
@@ -45,11 +99,10 @@ async function loginCommand() {
|
|
|
45
99
|
}
|
|
46
100
|
if (returnedState !== state) {
|
|
47
101
|
const errorUrl = `${WEB_APP_URL}/cli-login/error?message=${encodeURIComponent('Invalid state parameter. This might be a CSRF attack.')}`;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
res.end();
|
|
102
|
+
lastRedirectUrl = errorUrl;
|
|
103
|
+
lastMessage = 'Invalid state parameter. This might be a CSRF attack.';
|
|
104
|
+
respondWithRedirect(res);
|
|
105
|
+
flushPendingResponses();
|
|
53
106
|
clearTimeout(authTimeout);
|
|
54
107
|
setImmediate(() => {
|
|
55
108
|
server.closeAllConnections?.();
|
|
@@ -60,11 +113,10 @@ async function loginCommand() {
|
|
|
60
113
|
}
|
|
61
114
|
if (!accessToken || !refreshToken || !expiresAt) {
|
|
62
115
|
const errorUrl = `${WEB_APP_URL}/cli-login/error?message=${encodeURIComponent('Missing required authentication tokens.')}`;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
res.end();
|
|
116
|
+
lastRedirectUrl = errorUrl;
|
|
117
|
+
lastMessage = 'Missing required authentication tokens.';
|
|
118
|
+
respondWithRedirect(res);
|
|
119
|
+
flushPendingResponses();
|
|
68
120
|
clearTimeout(authTimeout);
|
|
69
121
|
setImmediate(() => {
|
|
70
122
|
server.closeAllConnections?.();
|
|
@@ -73,10 +125,14 @@ async function loginCommand() {
|
|
|
73
125
|
});
|
|
74
126
|
return;
|
|
75
127
|
}
|
|
128
|
+
hasHandledCallback = true;
|
|
129
|
+
const existingConfig = (0, config_1.readConfig)();
|
|
76
130
|
const config = {
|
|
77
131
|
access_token: accessToken,
|
|
78
132
|
refresh_token: refreshToken,
|
|
79
133
|
expires_at: parseInt(expiresAt, 10),
|
|
134
|
+
organization_id: existingConfig?.organization_id,
|
|
135
|
+
ide_command: existingConfig?.ide_command,
|
|
80
136
|
};
|
|
81
137
|
try {
|
|
82
138
|
(0, config_1.writeConfig)(config);
|
|
@@ -90,11 +146,10 @@ async function loginCommand() {
|
|
|
90
146
|
console.log(chalk_1.default.gray(' You can set your organization later with: replicas org switch'));
|
|
91
147
|
}
|
|
92
148
|
const successUrl = `${WEB_APP_URL}/cli-login/success?email=${encodeURIComponent(user.email)}`;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
res.end();
|
|
149
|
+
lastRedirectUrl = successUrl;
|
|
150
|
+
lastMessage = `Successfully logged in as ${user.email}. You can close this tab.`;
|
|
151
|
+
respondWithRedirect(res);
|
|
152
|
+
flushPendingResponses();
|
|
98
153
|
console.log(chalk_1.default.green('\n✓ Successfully logged in!'));
|
|
99
154
|
console.log(chalk_1.default.gray(` Email: ${user.email}\n`));
|
|
100
155
|
clearTimeout(authTimeout);
|
|
@@ -106,11 +161,10 @@ async function loginCommand() {
|
|
|
106
161
|
}
|
|
107
162
|
catch (error) {
|
|
108
163
|
const errorUrl = `${WEB_APP_URL}/cli-login/error?message=${encodeURIComponent('Failed to verify authentication.')}`;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
res.end();
|
|
164
|
+
lastRedirectUrl = errorUrl;
|
|
165
|
+
lastMessage = 'Failed to verify authentication.';
|
|
166
|
+
respondWithRedirect(res);
|
|
167
|
+
flushPendingResponses();
|
|
114
168
|
clearTimeout(authTimeout);
|
|
115
169
|
setImmediate(() => {
|
|
116
170
|
server.closeAllConnections?.();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;AAgBA,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;AAgBA,oCA6MC;AA7ND,gDAAwB;AACxB,6BAA0B;AAC1B,gDAAwB;AACxB,kDAA0B;AAC1B,0CAAwD;AACxD,sCAA6C;AAC7C,sDAAyD;AAGzD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,sBAAsB,CAAC;AAE3E,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAEM,KAAK,UAAU,YAAY;IAChC,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAE9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,WAA2B,CAAC;QAChC,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,eAAe,GAAkB,IAAI,CAAC;QAC1C,IAAI,WAAW,GAAkB,IAAI,CAAC;QACtC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuB,CAAC;QAExD,SAAS,mBAAmB,CAAC,GAAwB;YACnD,IAAI,eAAe,EAAE,CAAC;gBACpB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;oBACjB,UAAU,EAAE,eAAe;oBAC3B,YAAY,EAAE,OAAO;iBACtB,CAAC,CAAC;gBACH,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;oBACjB,cAAc,EAAE,0BAA0B;oBAC1C,YAAY,EAAE,OAAO;iBACtB,CAAC,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;uCAgBuB,WAAW,IAAI,2DAA2D;;;;SAIxG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,SAAS,qBAAqB;YAC5B,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;gBACxC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;YACD,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,MAAM,GAAG,cAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAClD,MAAM,GAAG,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAEjE,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACjC,IAAI,kBAAkB,EAAE,CAAC;oBACvB,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBAC1B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;wBACpD,OAAO;oBACT,CAAC;oBAED,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBACzB,OAAO;gBACT,CAAC;gBAED,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACpD,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACzD,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC3D,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBACrD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAE5C,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,QAAQ,GAAG,GAAG,WAAW,4BAA4B,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvF,eAAe,GAAG,QAAQ,CAAC;oBAC3B,WAAW,GAAG,0BAA0B,KAAK,EAAE,CAAC;oBAChD,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBACzB,qBAAqB,EAAE,CAAC;oBAExB,YAAY,CAAC,WAAW,CAAC,CAAC;oBAC1B,YAAY,CAAC,GAAG,EAAE;wBAChB,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;wBAC/B,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC,CAAC;oBACvD,CAAC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG,GAAG,WAAW,4BAA4B,kBAAkB,CAAC,uDAAuD,CAAC,EAAE,CAAC;oBACzI,eAAe,GAAG,QAAQ,CAAC;oBAC3B,WAAW,GAAG,uDAAuD,CAAC;oBACtE,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBACzB,qBAAqB,EAAE,CAAC;oBAExB,YAAY,CAAC,WAAW,CAAC,CAAC;oBAC1B,YAAY,CAAC,GAAG,EAAE;wBAChB,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;wBAC/B,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;oBAC/C,CAAC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChD,MAAM,QAAQ,GAAG,GAAG,WAAW,4BAA4B,kBAAkB,CAAC,yCAAyC,CAAC,EAAE,CAAC;oBAC3H,eAAe,GAAG,QAAQ,CAAC;oBAC3B,WAAW,GAAG,yCAAyC,CAAC;oBACxD,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBACzB,qBAAqB,EAAE,CAAC;oBAExB,YAAY,CAAC,WAAW,CAAC,CAAC;oBAC1B,YAAY,CAAC,GAAG,EAAE;wBAChB,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;wBAC/B,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;oBACrD,CAAC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,MAAM,cAAc,GAAG,IAAA,mBAAU,GAAE,CAAC;gBACpC,MAAM,MAAM,GAAW;oBACrB,YAAY,EAAE,WAAW;oBACzB,aAAa,EAAE,YAAY;oBAC3B,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;oBACnC,eAAe,EAAE,cAAc,EAAE,eAAe;oBAChD,WAAW,EAAE,cAAc,EAAE,WAAW;iBACzC,CAAC;gBAEF,IAAI,CAAC;oBACH,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;oBAEpB,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAc,GAAE,CAAC;oBAEpC,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,MAAM,IAAA,iCAAkB,GAAE,CAAC;wBACzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC,CAAC;oBACtD,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;wBACtE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC,CAAC;oBAC7F,CAAC;oBAED,MAAM,UAAU,GAAG,GAAG,WAAW,4BAA4B,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9F,eAAe,GAAG,UAAU,CAAC;oBAC7B,WAAW,GAAG,6BAA6B,IAAI,CAAC,KAAK,2BAA2B,CAAC;oBACjF,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBACzB,qBAAqB,EAAE,CAAC;oBAExB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;oBACxD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;oBAEpD,YAAY,CAAC,WAAW,CAAC,CAAC;oBAC1B,YAAY,CAAC,GAAG,EAAE;wBAChB,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;wBAC/B,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,OAAO,EAAE,CAAC;oBACZ,CAAC,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,QAAQ,GAAG,GAAG,WAAW,4BAA4B,kBAAkB,CAAC,kCAAkC,CAAC,EAAE,CAAC;oBACpH,eAAe,GAAG,QAAQ,CAAC;oBAC3B,WAAW,GAAG,kCAAkC,CAAC;oBACjD,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBACzB,qBAAqB,EAAE,CAAC;oBAExB,YAAY,CAAC,WAAW,CAAC,CAAC;oBAC1B,YAAY,CAAC,GAAG,EAAE;wBAChB,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;wBAC/B,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,KAAK,CAAC,CAAC;oBAChB,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAC1B,MAAM,QAAQ,GAAG,GAAG,WAAW,mBAAmB,IAAI,UAAU,KAAK,EAAE,CAAC;YAExE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sDAAsD,QAAQ,IAAI,CAAC,CAAC,CAAC;YAE5F,IAAA,cAAI,EAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC7B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;gBACnE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,QAAQ,IAAI,CAAC,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACjE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,7 @@ const program = new commander_1.Command();
|
|
|
18
18
|
program
|
|
19
19
|
.name('replicas')
|
|
20
20
|
.description('CLI for managing Replicas workspaces')
|
|
21
|
-
.version('0.
|
|
21
|
+
.version('0.2.3');
|
|
22
22
|
program
|
|
23
23
|
.command('login')
|
|
24
24
|
.description('Authenticate with your Replicas account')
|
package/dist/lib/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAKA,UAAU,YAAa,SAAQ,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;IACtD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAClD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAKA,UAAU,YAAa,SAAQ,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;IACtD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAClD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,CAAC,CAAC,CA4BZ;AAwCD,wBAAsB,qBAAqB,CAAC,CAAC,GAAG,OAAO,EACrD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,CAAC,CAAC,CAgCZ"}
|
package/dist/lib/api.js
CHANGED
|
@@ -15,17 +15,44 @@ async function authenticatedFetch(url, options) {
|
|
|
15
15
|
'Content-Type': 'application/json',
|
|
16
16
|
...(options?.headers || {}),
|
|
17
17
|
};
|
|
18
|
-
const
|
|
18
|
+
const absoluteUrl = url.startsWith('http') ? url : `${WEB_APP_URL}${url}`;
|
|
19
|
+
const requestInit = {
|
|
19
20
|
...options,
|
|
20
21
|
headers,
|
|
21
|
-
body: options?.body ? JSON.stringify(options.body) : undefined,
|
|
22
|
-
}
|
|
22
|
+
body: options?.body !== undefined ? JSON.stringify(options.body) : undefined,
|
|
23
|
+
};
|
|
24
|
+
const response = await fetchWithRedirects(absoluteUrl, requestInit);
|
|
23
25
|
if (!response.ok) {
|
|
24
26
|
const error = await response.json().catch(() => ({ error: 'Request failed' }));
|
|
25
27
|
throw new Error(error.error || `Request failed with status ${response.status}`);
|
|
26
28
|
}
|
|
27
29
|
return response.json();
|
|
28
30
|
}
|
|
31
|
+
const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
|
|
32
|
+
const MAX_REDIRECTS = 5;
|
|
33
|
+
async function fetchWithRedirects(url, init, attempt = 0) {
|
|
34
|
+
const response = await fetch(url, { ...init, redirect: 'manual' });
|
|
35
|
+
if (REDIRECT_STATUSES.has(response.status)) {
|
|
36
|
+
if (attempt >= MAX_REDIRECTS) {
|
|
37
|
+
throw new Error('Too many redirects while contacting the Replicas API');
|
|
38
|
+
}
|
|
39
|
+
const location = response.headers.get('location');
|
|
40
|
+
if (!location) {
|
|
41
|
+
throw new Error(`Redirect status ${response.status} missing Location header`);
|
|
42
|
+
}
|
|
43
|
+
const nextUrl = new URL(location, url).toString();
|
|
44
|
+
const shouldForceGet = response.status === 303 &&
|
|
45
|
+
init.method !== undefined &&
|
|
46
|
+
init.method.toUpperCase() !== 'GET';
|
|
47
|
+
const nextInit = {
|
|
48
|
+
...init,
|
|
49
|
+
method: shouldForceGet ? 'GET' : init.method,
|
|
50
|
+
body: shouldForceGet ? undefined : init.body,
|
|
51
|
+
};
|
|
52
|
+
return fetchWithRedirects(nextUrl, nextInit, attempt + 1);
|
|
53
|
+
}
|
|
54
|
+
return response;
|
|
55
|
+
}
|
|
29
56
|
async function orgAuthenticatedFetch(url, options) {
|
|
30
57
|
const token = await (0, auth_1.getValidToken)();
|
|
31
58
|
const organizationId = (0, config_1.getOrganizationId)();
|
|
@@ -38,11 +65,13 @@ async function orgAuthenticatedFetch(url, options) {
|
|
|
38
65
|
'Content-Type': 'application/json',
|
|
39
66
|
...(options?.headers || {}),
|
|
40
67
|
};
|
|
41
|
-
const
|
|
68
|
+
const absoluteUrl = url.startsWith('http') ? url : `${WEB_APP_URL}${url}`;
|
|
69
|
+
const requestInit = {
|
|
42
70
|
...options,
|
|
43
71
|
headers,
|
|
44
|
-
body: options?.body ? JSON.stringify(options.body) : undefined,
|
|
45
|
-
}
|
|
72
|
+
body: options?.body !== undefined ? JSON.stringify(options.body) : undefined,
|
|
73
|
+
};
|
|
74
|
+
const response = await fetchWithRedirects(absoluteUrl, requestInit);
|
|
46
75
|
if (!response.ok) {
|
|
47
76
|
const error = await response.json().catch(() => ({ error: 'Request failed' }));
|
|
48
77
|
throw new Error(error.error || `Request failed with status ${response.status}`);
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":";;AASA,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAgChC,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBrD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAYpD"}
|
package/dist/lib/auth.js
CHANGED
|
@@ -22,6 +22,7 @@ async function refreshToken() {
|
|
|
22
22
|
if (!data.session)
|
|
23
23
|
throw new Error('Failed to refresh session');
|
|
24
24
|
(0, config_1.writeConfig)({
|
|
25
|
+
...config,
|
|
25
26
|
access_token: data.session.access_token,
|
|
26
27
|
refresh_token: data.session.refresh_token,
|
|
27
28
|
expires_at: data.session.expires_at || 0,
|
package/dist/lib/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":";;AAkCA,sCAgBC;AAED,wCAYC;AAhED,yCAAsC;AACtC,qCAAmD;AAGnD,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,OAAO,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,mBAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;YACzD,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC,CAAC;QAEH,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAEhE,IAAA,oBAAW,EAAC;YACV,GAAG,MAAM;YACT,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;YACvC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;YACzC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,SAAS,CAAC,YAAY,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC;AAEM,KAAK,UAAU,cAAc;IAClC,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IAEpC,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,mBAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAErE,IAAI,KAAK;QAAE,MAAM,KAAK,CAAC;IACvB,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAE7C,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;KAC/B,CAAC;AACJ,CAAC"}
|