@somewhere-tech/cli 0.1.1 → 0.1.3

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/lib/auth.js CHANGED
@@ -1,13 +1,16 @@
1
1
  import http from 'node:http';
2
2
  import open from 'open';
3
- const AUTH_URL = 'https://somewhere.tech/auth/cli';
3
+ import chalk from 'chalk';
4
+ const AUTH_URL = 'https://api.somewhere.tech/v1/auth/cli';
4
5
  /**
5
6
  * Browser-based OAuth login flow:
6
7
  * 1. Start local HTTP server on a random port
7
- * 2. Open browser to /auth/cli?redirect=http://localhost:PORT/callback
8
+ * 2. Open browser to api.somewhere.tech/v1/auth/cli?redirect=http://localhost:PORT/callback
8
9
  * 3. User authenticates via Google OAuth
9
10
  * 4. Platform redirects to localhost with ?token=smt_...&email=...&username=...
10
11
  * 5. Return the received credentials
12
+ *
13
+ * If the browser doesn't open, prints the URL so the user can copy-paste it.
11
14
  */
12
15
  export async function browserLogin() {
13
16
  return new Promise((resolve, reject) => {
@@ -25,17 +28,96 @@ export async function browserLogin() {
25
28
  return;
26
29
  }
27
30
  res.writeHead(200, { 'Content-Type': 'text/html' });
28
- res.end(`
29
- <html>
30
- <body style="font-family:system-ui;display:flex;align-items:center;justify-content:center;height:100vh;margin:0;background:#0d0e14;color:#e5e7eb">
31
- <div style="text-align:center">
32
- <div style="font-size:48px;margin-bottom:16px">✓</div>
33
- <h1 style="font-size:24px;margin:0 0 8px;color:#2dd4bf">Logged in</h1>
34
- <p style="color:#9ca3af">You can close this tab and return to the terminal.</p>
35
- </div>
36
- </body>
37
- </html>
38
- `);
31
+ res.end(`<!DOCTYPE html>
32
+ <html lang="en">
33
+ <head>
34
+ <meta charset="utf-8">
35
+ <meta name="viewport" content="width=device-width, initial-scale=1">
36
+ <title>somewhere.tech Logged in</title>
37
+ <link rel="preconnect" href="https://fonts.googleapis.com">
38
+ <link href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&display=swap" rel="stylesheet">
39
+ <style>
40
+ * { margin: 0; padding: 0; box-sizing: border-box; }
41
+ body {
42
+ font-family: system-ui, -apple-system, sans-serif;
43
+ background: #0d0e14;
44
+ color: #e5e7eb;
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ height: 100vh;
49
+ overflow: hidden;
50
+ }
51
+ .glow {
52
+ position: fixed;
53
+ top: 30%;
54
+ left: 50%;
55
+ transform: translate(-50%, -50%);
56
+ width: 500px;
57
+ height: 500px;
58
+ background: radial-gradient(circle, rgba(45,212,191,0.08) 0%, transparent 70%);
59
+ pointer-events: none;
60
+ }
61
+ .card {
62
+ position: relative;
63
+ z-index: 1;
64
+ text-align: center;
65
+ padding: 48px;
66
+ }
67
+ .brand {
68
+ font-family: 'Instrument Serif', serif;
69
+ font-style: italic;
70
+ font-size: 28px;
71
+ color: #2dd4bf;
72
+ margin-bottom: 32px;
73
+ }
74
+ .check {
75
+ width: 64px;
76
+ height: 64px;
77
+ border-radius: 50%;
78
+ background: rgba(45,212,191,0.1);
79
+ border: 2px solid #2dd4bf;
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ margin: 0 auto 24px;
84
+ font-size: 28px;
85
+ color: #2dd4bf;
86
+ }
87
+ h1 {
88
+ font-size: 22px;
89
+ font-weight: 500;
90
+ margin-bottom: 8px;
91
+ }
92
+ .sub {
93
+ color: #6b7280;
94
+ font-size: 14px;
95
+ line-height: 1.6;
96
+ }
97
+ .email {
98
+ color: #9ca3af;
99
+ font-family: ui-monospace, monospace;
100
+ font-size: 13px;
101
+ margin-top: 24px;
102
+ padding: 8px 16px;
103
+ background: rgba(255,255,255,0.04);
104
+ border-radius: 6px;
105
+ display: inline-block;
106
+ }
107
+ </style>
108
+ </head>
109
+ <body>
110
+ <div class="glow"></div>
111
+ <div class="card">
112
+ <div class="brand">somewhere.tech</div>
113
+ <div class="check">✓</div>
114
+ <h1>You're logged in</h1>
115
+ <p class="sub">Return to your terminal. This tab can be closed.</p>
116
+ <div class="email">${email}</div>
117
+ </div>
118
+ <script>setTimeout(() => window.close(), 3000);</script>
119
+ </body>
120
+ </html>`);
39
121
  resolve({
40
122
  token,
41
123
  user: { email, username },
@@ -55,7 +137,13 @@ export async function browserLogin() {
55
137
  const port = addr.port;
56
138
  const redirect = `http://localhost:${port}/callback`;
57
139
  const loginUrl = `${AUTH_URL}?redirect=${encodeURIComponent(redirect)}`;
58
- open(loginUrl);
140
+ console.log('');
141
+ console.log(` If the browser doesn't open, visit this URL:`);
142
+ console.log(` ${chalk.cyan(loginUrl)}`);
143
+ console.log('');
144
+ open(loginUrl).catch(() => {
145
+ // Browser didn't open — the URL is already printed above
146
+ });
59
147
  });
60
148
  server.on('error', reject);
61
149
  // Timeout after 5 minutes
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,QAAQ,GAAG,iCAAiC,CAAC;AAQnD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YAExD,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClD,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBAExD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC;oBACjG,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;oBAC1C,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO;gBACT,CAAC;gBAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;SAUP,CAAC,CAAC;gBAEH,OAAO,CAAC;oBACN,KAAK;oBACL,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;iBAC1B,CAAC,CAAC;gBAEH,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,QAAQ,GAAG,oBAAoB,IAAI,WAAW,CAAC;YACrD,MAAM,QAAQ,GAAG,GAAG,QAAQ,aAAa,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE3B,0BAA0B;QAC1B,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACnD,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@somewhere-tech/cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "CLI for somewhere.tech — auth, projects, deploy, logs, env.",
5
5
  "keywords": [
6
6
  "somewhere",