@optiqcode/cli 0.1.4 → 0.1.5
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/auth.js +64 -60
- package/dist/auth.js.map +1 -1
- package/package.json +1 -1
package/dist/auth.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
|
-
import {
|
|
4
|
+
import { execSync } from "node:child_process";
|
|
5
5
|
import { banner, step, info, success, warn, error, spinner, divider } from "./ui.js";
|
|
6
6
|
const CONFIG_DIR = join(homedir(), ".optiq");
|
|
7
7
|
const TOKEN_FILE = join(CONFIG_DIR, "auth.json");
|
|
8
|
+
const BASE_URL = process.env.OPTIQ_API_URL || "https://api.optiqcode.com";
|
|
8
9
|
export function getTokens() {
|
|
9
10
|
if (!existsSync(TOKEN_FILE))
|
|
10
11
|
return null;
|
|
@@ -29,16 +30,23 @@ export function getAccessToken() {
|
|
|
29
30
|
export function isLoggedIn() {
|
|
30
31
|
return getTokens() !== null;
|
|
31
32
|
}
|
|
32
|
-
function
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
function openBrowser(url) {
|
|
34
|
+
try {
|
|
35
|
+
const platform = process.platform;
|
|
36
|
+
if (platform === "darwin")
|
|
37
|
+
execSync(`open "${url}"`);
|
|
38
|
+
else if (platform === "win32")
|
|
39
|
+
execSync(`start "" "${url}"`);
|
|
40
|
+
else
|
|
41
|
+
execSync(`xdg-open "${url}"`);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Silently fail — user can open manually
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function sleep(ms) {
|
|
48
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
40
49
|
}
|
|
41
|
-
const BASE_URL = process.env.OPTIQ_API_URL || "https://optiqcode.com";
|
|
42
50
|
export async function login() {
|
|
43
51
|
banner();
|
|
44
52
|
const existing = getTokens();
|
|
@@ -48,64 +56,60 @@ export async function login() {
|
|
|
48
56
|
return;
|
|
49
57
|
}
|
|
50
58
|
step("Sign in");
|
|
51
|
-
const email = await prompt("Enter your email: ");
|
|
52
|
-
if (!email)
|
|
53
|
-
throw new Error("Email is required");
|
|
54
59
|
divider();
|
|
55
|
-
const s1 = spinner("
|
|
56
|
-
const
|
|
60
|
+
const s1 = spinner("Requesting device code...");
|
|
61
|
+
const codeRes = await fetch(`${BASE_URL}/api/v1/auth/device/code`, {
|
|
57
62
|
method: "POST",
|
|
58
63
|
headers: { "Content-Type": "application/json" },
|
|
59
|
-
body: JSON.stringify({ email }),
|
|
60
64
|
});
|
|
61
|
-
if (!
|
|
65
|
+
if (!codeRes.ok) {
|
|
62
66
|
s1.stop();
|
|
63
|
-
|
|
64
|
-
throw new Error(`Failed to send code: ${text}`);
|
|
65
|
-
}
|
|
66
|
-
s1.stop(`Verification code sent to ${email}`);
|
|
67
|
-
step("Verify");
|
|
68
|
-
info("Check your inbox for a 6-digit code.");
|
|
69
|
-
const code = await prompt("Enter code: ");
|
|
70
|
-
if (!code)
|
|
71
|
-
throw new Error("Code is required");
|
|
72
|
-
const s2 = spinner("Verifying...");
|
|
73
|
-
const verifyRes = await fetch(`${BASE_URL}/api/v1/auth/verify-code`, {
|
|
74
|
-
method: "POST",
|
|
75
|
-
headers: { "Content-Type": "application/json" },
|
|
76
|
-
body: JSON.stringify({ email, code }),
|
|
77
|
-
});
|
|
78
|
-
if (!verifyRes.ok) {
|
|
79
|
-
s2.stop();
|
|
80
|
-
const text = await verifyRes.text().catch(() => "");
|
|
81
|
-
throw new Error(`Verification failed: ${text}`);
|
|
67
|
+
throw new Error("Failed to start login flow.");
|
|
82
68
|
}
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
69
|
+
const { device_code, user_code, verification_url } = await codeRes.json();
|
|
70
|
+
s1.stop("Device code generated");
|
|
71
|
+
const fullUrl = `${verification_url}?code=${user_code}`;
|
|
72
|
+
info(`\n Your code: ${user_code}\n`);
|
|
73
|
+
info(` Opening browser to: ${fullUrl}`);
|
|
74
|
+
info(" If it doesn't open, copy the URL above.\n");
|
|
75
|
+
openBrowser(fullUrl);
|
|
76
|
+
divider();
|
|
77
|
+
const s2 = spinner("Waiting for browser authorization...");
|
|
78
|
+
const deadline = Date.now() + 300_000; // 5 min
|
|
79
|
+
while (Date.now() < deadline) {
|
|
80
|
+
await sleep(2000);
|
|
81
|
+
try {
|
|
82
|
+
const pollRes = await fetch(`${BASE_URL}/api/v1/auth/device/token`, {
|
|
83
|
+
method: "POST",
|
|
84
|
+
headers: { "Content-Type": "application/json" },
|
|
85
|
+
body: JSON.stringify({ device_code }),
|
|
86
|
+
});
|
|
87
|
+
if (!pollRes.ok) {
|
|
88
|
+
s2.stop();
|
|
89
|
+
throw new Error("Authorization failed or expired.");
|
|
90
|
+
}
|
|
91
|
+
const data = await pollRes.json();
|
|
92
|
+
if (data.status === "approved") {
|
|
93
|
+
s2.stop("Authorized");
|
|
94
|
+
saveTokens({
|
|
95
|
+
access_token: data.access_token,
|
|
96
|
+
refresh_token: data.refresh_token,
|
|
97
|
+
email: data.email,
|
|
98
|
+
});
|
|
99
|
+
divider();
|
|
100
|
+
success(`Welcome back, ${data.email}`);
|
|
101
|
+
info("You're all set. Run `optiq --help` to get started.\n");
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// status === "pending" — keep polling
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Network error — keep trying
|
|
98
108
|
}
|
|
99
|
-
const mfaData = await mfaRes.json();
|
|
100
|
-
saveTokens({ access_token: mfaData.access_token, refresh_token: mfaData.refresh_token, email });
|
|
101
|
-
s3.stop("MFA verified");
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
saveTokens({ access_token: data.access_token, refresh_token: data.refresh_token, email });
|
|
105
109
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
110
|
+
s2.stop();
|
|
111
|
+
error("Login timed out. Please try again.");
|
|
112
|
+
process.exit(1);
|
|
109
113
|
}
|
|
110
114
|
export async function refreshAccessToken() {
|
|
111
115
|
const tokens = getTokens();
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAErF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,2BAA2B,CAAC;AAQ1E,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,UAAU,CAAC,UAAU,CAAC;QAAE,UAAU,CAAC,UAAU,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,SAAS,EAAE,EAAE,YAAY,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,SAAS,EAAE,KAAK,IAAI,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,QAAQ,KAAK,QAAQ;YAAE,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;aAChD,IAAI,QAAQ,KAAK,OAAO;YAAE,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;;YACxD,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,EAAE,CAAC;IAET,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC7B,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,wBAAwB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,8CAA8C,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,CAAC;IAChB,OAAO,EAAE,CAAC;IAEV,MAAM,EAAE,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,0BAA0B,EAAE;QACjE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,EAAE,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IAC1E,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAEjC,MAAM,OAAO,GAAG,GAAG,gBAAgB,SAAS,SAAS,EAAE,CAAC;IACxD,IAAI,CAAC,kBAAkB,SAAS,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACpD,WAAW,CAAC,OAAO,CAAC,CAAC;IAErB,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAC;IAE3D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ;IAC/C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,2BAA2B,EAAE;gBAClE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;aACtC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBAChB,EAAE,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC/B,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACtB,UAAU,CAAC;oBACT,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC,CAAC;gBACH,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,iBAAiB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBACvC,IAAI,CAAC,sDAAsD,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;YACD,sCAAsC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAED,EAAE,CAAC,IAAI,EAAE,CAAC;IACV,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,aAAa;QAAE,OAAO,IAAI,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,sBAAsB,EAAE;YACzD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;SAC9D,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,WAAW,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,QAAQ,qBAAqB,EAAE;gBAC5C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,YAAY,EAAE;iBAC/C;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;IACH,CAAC;IACD,WAAW,EAAE,CAAC;IACd,CAAC,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|