@oaysus/cli 0.1.0

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.
Files changed (243) hide show
  1. package/README.md +166 -0
  2. package/bin/oaysus.js +6 -0
  3. package/dist/cli.d.ts +11 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +174 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/login.d.ts +2 -0
  8. package/dist/commands/login.d.ts.map +1 -0
  9. package/dist/commands/login.js +75 -0
  10. package/dist/commands/login.js.map +1 -0
  11. package/dist/commands/logout.d.ts +2 -0
  12. package/dist/commands/logout.d.ts.map +1 -0
  13. package/dist/commands/logout.js +23 -0
  14. package/dist/commands/logout.js.map +1 -0
  15. package/dist/commands/whoami.d.ts +2 -0
  16. package/dist/commands/whoami.d.ts.map +1 -0
  17. package/dist/commands/whoami.js +44 -0
  18. package/dist/commands/whoami.js.map +1 -0
  19. package/dist/components/App.d.ts +43 -0
  20. package/dist/components/App.d.ts.map +1 -0
  21. package/dist/components/App.js +63 -0
  22. package/dist/components/App.js.map +1 -0
  23. package/dist/components/BuildProgress.d.ts +16 -0
  24. package/dist/components/BuildProgress.d.ts.map +1 -0
  25. package/dist/components/BuildProgress.js +42 -0
  26. package/dist/components/BuildProgress.js.map +1 -0
  27. package/dist/components/ErrorMessage.d.ts +13 -0
  28. package/dist/components/ErrorMessage.d.ts.map +1 -0
  29. package/dist/components/ErrorMessage.js +29 -0
  30. package/dist/components/ErrorMessage.js.map +1 -0
  31. package/dist/components/FileList.d.ts +13 -0
  32. package/dist/components/FileList.d.ts.map +1 -0
  33. package/dist/components/FileList.js +25 -0
  34. package/dist/components/FileList.js.map +1 -0
  35. package/dist/components/Header.d.ts +12 -0
  36. package/dist/components/Header.d.ts.map +1 -0
  37. package/dist/components/Header.js +18 -0
  38. package/dist/components/Header.js.map +1 -0
  39. package/dist/components/LastCommand.d.ts +9 -0
  40. package/dist/components/LastCommand.d.ts.map +1 -0
  41. package/dist/components/LastCommand.js +39 -0
  42. package/dist/components/LastCommand.js.map +1 -0
  43. package/dist/components/Logo.d.ts +14 -0
  44. package/dist/components/Logo.d.ts.map +1 -0
  45. package/dist/components/Logo.js +44 -0
  46. package/dist/components/Logo.js.map +1 -0
  47. package/dist/components/ProgressBar.d.ts +13 -0
  48. package/dist/components/ProgressBar.d.ts.map +1 -0
  49. package/dist/components/ProgressBar.js +20 -0
  50. package/dist/components/ProgressBar.js.map +1 -0
  51. package/dist/components/SlashCommands.d.ts +17 -0
  52. package/dist/components/SlashCommands.d.ts.map +1 -0
  53. package/dist/components/SlashCommands.js +59 -0
  54. package/dist/components/SlashCommands.js.map +1 -0
  55. package/dist/components/Spinner.d.ts +13 -0
  56. package/dist/components/Spinner.d.ts.map +1 -0
  57. package/dist/components/Spinner.js +16 -0
  58. package/dist/components/Spinner.js.map +1 -0
  59. package/dist/components/StatusCard.d.ts +14 -0
  60. package/dist/components/StatusCard.d.ts.map +1 -0
  61. package/dist/components/StatusCard.js +40 -0
  62. package/dist/components/StatusCard.js.map +1 -0
  63. package/dist/components/SuccessMessage.d.ts +12 -0
  64. package/dist/components/SuccessMessage.d.ts.map +1 -0
  65. package/dist/components/SuccessMessage.js +18 -0
  66. package/dist/components/SuccessMessage.js.map +1 -0
  67. package/dist/components/UploadProgress.d.ts +13 -0
  68. package/dist/components/UploadProgress.d.ts.map +1 -0
  69. package/dist/components/UploadProgress.js +40 -0
  70. package/dist/components/UploadProgress.js.map +1 -0
  71. package/dist/components/ValidationProgress.d.ts +12 -0
  72. package/dist/components/ValidationProgress.d.ts.map +1 -0
  73. package/dist/components/ValidationProgress.js +44 -0
  74. package/dist/components/ValidationProgress.js.map +1 -0
  75. package/dist/index.d.ts +7 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +21 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/lib/core/framework-registry.d.ts +27 -0
  80. package/dist/lib/core/framework-registry.d.ts.map +1 -0
  81. package/dist/lib/core/framework-registry.js +67 -0
  82. package/dist/lib/core/framework-registry.js.map +1 -0
  83. package/dist/lib/core/types.d.ts +124 -0
  84. package/dist/lib/core/types.d.ts.map +1 -0
  85. package/dist/lib/core/types.js +6 -0
  86. package/dist/lib/core/types.js.map +1 -0
  87. package/dist/lib/project-generator.d.ts +15 -0
  88. package/dist/lib/project-generator.d.ts.map +1 -0
  89. package/dist/lib/project-generator.js +286 -0
  90. package/dist/lib/project-generator.js.map +1 -0
  91. package/dist/lib/push.d.ts +20 -0
  92. package/dist/lib/push.d.ts.map +1 -0
  93. package/dist/lib/push.js +222 -0
  94. package/dist/lib/push.js.map +1 -0
  95. package/dist/lib/react/builder.d.ts +45 -0
  96. package/dist/lib/react/builder.d.ts.map +1 -0
  97. package/dist/lib/react/builder.js +381 -0
  98. package/dist/lib/react/builder.js.map +1 -0
  99. package/dist/lib/react/bundler.d.ts +104 -0
  100. package/dist/lib/react/bundler.d.ts.map +1 -0
  101. package/dist/lib/react/bundler.js +654 -0
  102. package/dist/lib/react/bundler.js.map +1 -0
  103. package/dist/lib/react/config.d.ts +34 -0
  104. package/dist/lib/react/config.d.ts.map +1 -0
  105. package/dist/lib/react/config.js +64 -0
  106. package/dist/lib/react/config.js.map +1 -0
  107. package/dist/lib/react/import-map.d.ts +54 -0
  108. package/dist/lib/react/import-map.d.ts.map +1 -0
  109. package/dist/lib/react/import-map.js +187 -0
  110. package/dist/lib/react/import-map.js.map +1 -0
  111. package/dist/lib/shared/auth-middleware.d.ts +29 -0
  112. package/dist/lib/shared/auth-middleware.d.ts.map +1 -0
  113. package/dist/lib/shared/auth-middleware.js +48 -0
  114. package/dist/lib/shared/auth-middleware.js.map +1 -0
  115. package/dist/lib/shared/auth.d.ts +50 -0
  116. package/dist/lib/shared/auth.d.ts.map +1 -0
  117. package/dist/lib/shared/auth.js +243 -0
  118. package/dist/lib/shared/auth.js.map +1 -0
  119. package/dist/lib/shared/cdn-downloader.d.ts +30 -0
  120. package/dist/lib/shared/cdn-downloader.d.ts.map +1 -0
  121. package/dist/lib/shared/cdn-downloader.js +126 -0
  122. package/dist/lib/shared/cdn-downloader.js.map +1 -0
  123. package/dist/lib/shared/command-history.d.ts +29 -0
  124. package/dist/lib/shared/command-history.d.ts.map +1 -0
  125. package/dist/lib/shared/command-history.js +73 -0
  126. package/dist/lib/shared/command-history.js.map +1 -0
  127. package/dist/lib/shared/commands.d.ts +24 -0
  128. package/dist/lib/shared/commands.d.ts.map +1 -0
  129. package/dist/lib/shared/commands.js +63 -0
  130. package/dist/lib/shared/commands.js.map +1 -0
  131. package/dist/lib/shared/config.d.ts +40 -0
  132. package/dist/lib/shared/config.d.ts.map +1 -0
  133. package/dist/lib/shared/config.js +69 -0
  134. package/dist/lib/shared/config.js.map +1 -0
  135. package/dist/lib/shared/file-utils.d.ts +45 -0
  136. package/dist/lib/shared/file-utils.d.ts.map +1 -0
  137. package/dist/lib/shared/file-utils.js +88 -0
  138. package/dist/lib/shared/file-utils.js.map +1 -0
  139. package/dist/lib/shared/import-analyzer.d.ts +49 -0
  140. package/dist/lib/shared/import-analyzer.d.ts.map +1 -0
  141. package/dist/lib/shared/import-analyzer.js +268 -0
  142. package/dist/lib/shared/import-analyzer.js.map +1 -0
  143. package/dist/lib/shared/path-builder.d.ts +55 -0
  144. package/dist/lib/shared/path-builder.d.ts.map +1 -0
  145. package/dist/lib/shared/path-builder.js +66 -0
  146. package/dist/lib/shared/path-builder.js.map +1 -0
  147. package/dist/lib/shared/uploader.d.ts +79 -0
  148. package/dist/lib/shared/uploader.d.ts.map +1 -0
  149. package/dist/lib/shared/uploader.js +340 -0
  150. package/dist/lib/shared/uploader.js.map +1 -0
  151. package/dist/lib/shared/zip-creator.d.ts +18 -0
  152. package/dist/lib/shared/zip-creator.d.ts.map +1 -0
  153. package/dist/lib/shared/zip-creator.js +131 -0
  154. package/dist/lib/shared/zip-creator.js.map +1 -0
  155. package/dist/lib/svelte/builder.d.ts +37 -0
  156. package/dist/lib/svelte/builder.d.ts.map +1 -0
  157. package/dist/lib/svelte/builder.js +364 -0
  158. package/dist/lib/svelte/builder.js.map +1 -0
  159. package/dist/lib/svelte/bundler.d.ts +92 -0
  160. package/dist/lib/svelte/bundler.d.ts.map +1 -0
  161. package/dist/lib/svelte/bundler.js +499 -0
  162. package/dist/lib/svelte/bundler.js.map +1 -0
  163. package/dist/lib/svelte/config.d.ts +22 -0
  164. package/dist/lib/svelte/config.d.ts.map +1 -0
  165. package/dist/lib/svelte/config.js +65 -0
  166. package/dist/lib/svelte/config.js.map +1 -0
  167. package/dist/lib/svelte/import-map.d.ts +42 -0
  168. package/dist/lib/svelte/import-map.d.ts.map +1 -0
  169. package/dist/lib/svelte/import-map.js +197 -0
  170. package/dist/lib/svelte/import-map.js.map +1 -0
  171. package/dist/lib/template-manager.d.ts +33 -0
  172. package/dist/lib/template-manager.d.ts.map +1 -0
  173. package/dist/lib/template-manager.js +69 -0
  174. package/dist/lib/template-manager.js.map +1 -0
  175. package/dist/lib/validator.d.ts +10 -0
  176. package/dist/lib/validator.d.ts.map +1 -0
  177. package/dist/lib/validator.js +343 -0
  178. package/dist/lib/validator.js.map +1 -0
  179. package/dist/lib/vue/builder.d.ts +37 -0
  180. package/dist/lib/vue/builder.d.ts.map +1 -0
  181. package/dist/lib/vue/builder.js +366 -0
  182. package/dist/lib/vue/builder.js.map +1 -0
  183. package/dist/lib/vue/bundler.d.ts +78 -0
  184. package/dist/lib/vue/bundler.d.ts.map +1 -0
  185. package/dist/lib/vue/bundler.js +208 -0
  186. package/dist/lib/vue/bundler.js.map +1 -0
  187. package/dist/lib/vue/config.d.ts +18 -0
  188. package/dist/lib/vue/config.d.ts.map +1 -0
  189. package/dist/lib/vue/config.js +42 -0
  190. package/dist/lib/vue/config.js.map +1 -0
  191. package/dist/lib/vue/import-map.d.ts +42 -0
  192. package/dist/lib/vue/import-map.d.ts.map +1 -0
  193. package/dist/lib/vue/import-map.js +156 -0
  194. package/dist/lib/vue/import-map.js.map +1 -0
  195. package/dist/screens/BuildScreen.d.ts +8 -0
  196. package/dist/screens/BuildScreen.d.ts.map +1 -0
  197. package/dist/screens/BuildScreen.js +158 -0
  198. package/dist/screens/BuildScreen.js.map +1 -0
  199. package/dist/screens/CreateScreen.d.ts +12 -0
  200. package/dist/screens/CreateScreen.d.ts.map +1 -0
  201. package/dist/screens/CreateScreen.js +305 -0
  202. package/dist/screens/CreateScreen.js.map +1 -0
  203. package/dist/screens/InitScreen.d.ts +11 -0
  204. package/dist/screens/InitScreen.d.ts.map +1 -0
  205. package/dist/screens/InitScreen.js +339 -0
  206. package/dist/screens/InitScreen.js.map +1 -0
  207. package/dist/screens/LoginScreen.d.ts +15 -0
  208. package/dist/screens/LoginScreen.d.ts.map +1 -0
  209. package/dist/screens/LoginScreen.js +427 -0
  210. package/dist/screens/LoginScreen.js.map +1 -0
  211. package/dist/screens/LogoutScreen.d.ts +15 -0
  212. package/dist/screens/LogoutScreen.d.ts.map +1 -0
  213. package/dist/screens/LogoutScreen.js +187 -0
  214. package/dist/screens/LogoutScreen.js.map +1 -0
  215. package/dist/screens/PushScreen.d.ts +12 -0
  216. package/dist/screens/PushScreen.d.ts.map +1 -0
  217. package/dist/screens/PushScreen.js +546 -0
  218. package/dist/screens/PushScreen.js.map +1 -0
  219. package/dist/screens/ValidateScreen.d.ts +12 -0
  220. package/dist/screens/ValidateScreen.d.ts.map +1 -0
  221. package/dist/screens/ValidateScreen.js +193 -0
  222. package/dist/screens/ValidateScreen.js.map +1 -0
  223. package/dist/screens/WelcomeScreen.d.ts +39 -0
  224. package/dist/screens/WelcomeScreen.d.ts.map +1 -0
  225. package/dist/screens/WelcomeScreen.js +297 -0
  226. package/dist/screens/WelcomeScreen.js.map +1 -0
  227. package/dist/screens/WhoamiScreen.d.ts +14 -0
  228. package/dist/screens/WhoamiScreen.d.ts.map +1 -0
  229. package/dist/screens/WhoamiScreen.js +180 -0
  230. package/dist/screens/WhoamiScreen.js.map +1 -0
  231. package/dist/types/index.d.ts +40 -0
  232. package/dist/types/index.d.ts.map +1 -0
  233. package/dist/types/index.js +2 -0
  234. package/dist/types/index.js.map +1 -0
  235. package/dist/types/templates.d.ts +55 -0
  236. package/dist/types/templates.d.ts.map +1 -0
  237. package/dist/types/templates.js +6 -0
  238. package/dist/types/templates.js.map +1 -0
  239. package/dist/types/validation.d.ts +108 -0
  240. package/dist/types/validation.d.ts.map +1 -0
  241. package/dist/types/validation.js +6 -0
  242. package/dist/types/validation.js.map +1 -0
  243. package/package.json +94 -0
@@ -0,0 +1,427 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Box, Text, useInput } from 'ink';
3
+ import TextInput from 'ink-text-input';
4
+ import SelectInput from 'ink-select-input';
5
+ import { readFile } from 'fs/promises';
6
+ import { fileURLToPath } from 'url';
7
+ import path from 'path';
8
+ import { Logo } from '../components/Logo.js';
9
+ import { Spinner } from '../components/Spinner.js';
10
+ import { requestMagicLink, initializeDevice, pollForAuth, selectWebsite, saveCredentials, loadCredentials, } from '../lib/shared/auth.js';
11
+ /**
12
+ * LoginScreen Component
13
+ * Handles authentication flow with init-style UI
14
+ */
15
+ export const LoginScreen = ({ onExit, sessionHistory = [], addToHistory, removeFromHistory }) => {
16
+ const [state, setState] = useState('email-input');
17
+ const [email, setEmail] = useState('');
18
+ const [emailError, setEmailError] = useState('');
19
+ const [deviceCode, setDeviceCode] = useState('');
20
+ const [userCode, setUserCode] = useState('');
21
+ const [websites, setWebsites] = useState([]);
22
+ const [countdown, setCountdown] = useState(600); // 10 minutes in seconds
23
+ const [credentials, setCredentials] = useState(null);
24
+ const [error, setError] = useState('');
25
+ const [appData, setAppData] = useState({
26
+ version: '0.1.0',
27
+ userEmail: null,
28
+ isLoaded: false
29
+ });
30
+ const [directory] = useState(process.cwd());
31
+ // Destructure for easier access
32
+ const { version, userEmail, isLoaded } = appData;
33
+ // Load version and credentials on mount
34
+ useEffect(() => {
35
+ const loadAllData = async () => {
36
+ // Load all data in parallel
37
+ const [versionData, credsData] = await Promise.all([
38
+ // Load version
39
+ (async () => {
40
+ try {
41
+ const __filename = fileURLToPath(import.meta.url);
42
+ const __dirname = path.dirname(__filename);
43
+ const pkgPath = path.join(__dirname, '../../package.json');
44
+ const pkgData = await readFile(pkgPath, 'utf-8');
45
+ const pkg = JSON.parse(pkgData);
46
+ return pkg.version;
47
+ }
48
+ catch {
49
+ return '0.1.0';
50
+ }
51
+ })(),
52
+ // Load credentials
53
+ loadCredentials()
54
+ ]);
55
+ // Single state update to prevent multiple renders
56
+ setAppData({
57
+ version: versionData,
58
+ userEmail: credsData?.email || null,
59
+ isLoaded: true
60
+ });
61
+ };
62
+ loadAllData();
63
+ }, []);
64
+ // Auto-exit after success (immediate)
65
+ useEffect(() => {
66
+ if (state === 'success') {
67
+ if (onExit)
68
+ onExit();
69
+ }
70
+ }, [state, onExit]);
71
+ // Email validation
72
+ const validateEmail = (input) => {
73
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
74
+ return emailRegex.test(input);
75
+ };
76
+ // Handle email submission
77
+ const handleEmailSubmit = async (value) => {
78
+ const emailInput = value.trim();
79
+ if (!emailInput) {
80
+ setEmailError('Email is required');
81
+ return;
82
+ }
83
+ if (!validateEmail(emailInput)) {
84
+ setEmailError('Please enter a valid email address');
85
+ return;
86
+ }
87
+ setEmail(emailInput);
88
+ setEmailError('');
89
+ if (addToHistory) {
90
+ // Add command with spacing if needed
91
+ addToHistory({
92
+ type: 'info',
93
+ content: '❯ /login',
94
+ color: 'cyan',
95
+ spinnerId: sessionHistory.length > 0 ? 'command-separator' : undefined
96
+ });
97
+ }
98
+ setState('sending-link');
99
+ // Add spinner to history with email context
100
+ if (addToHistory) {
101
+ addToHistory({
102
+ type: 'spinner',
103
+ content: `Sending magic link to ${emailInput}...`,
104
+ color: 'cyan',
105
+ spinnerId: 'sending-link'
106
+ });
107
+ }
108
+ try {
109
+ // Initialize device authorization first
110
+ const deviceResponse = await initializeDevice();
111
+ setDeviceCode(deviceResponse.deviceCode);
112
+ setUserCode(deviceResponse.userCode); // Keep for reference but won't display to user
113
+ // Send magic link with device code embedded in URL
114
+ await requestMagicLink(emailInput, deviceResponse.deviceCode);
115
+ // Remove spinner and add success message
116
+ if (removeFromHistory) {
117
+ removeFromHistory('sending-link');
118
+ }
119
+ if (addToHistory) {
120
+ addToHistory([
121
+ {
122
+ type: 'success',
123
+ content: `✓ Magic link sent to ${emailInput}`
124
+ },
125
+ {
126
+ type: 'progress',
127
+ content: 'Waiting for email verification...',
128
+ color: 'cyan',
129
+ spinnerId: 'waiting-auth'
130
+ }
131
+ ]);
132
+ }
133
+ setState('waiting-for-approval');
134
+ // Start polling - may return credentials or website selection request
135
+ const result = await pollForAuth(deviceResponse.deviceCode, {
136
+ interval: 2000,
137
+ timeout: 600000,
138
+ });
139
+ // Check if result is DeviceStatusResponse with website selection needed
140
+ if ('needsWebsiteSelection' in result && result.needsWebsiteSelection) {
141
+ // Device approved - check if user has websites
142
+ if (!result.websites || result.websites.length === 0) {
143
+ // No websites found
144
+ setError('No websites found for this account. Please create a website first.');
145
+ if (addToHistory) {
146
+ addToHistory({
147
+ type: 'error',
148
+ content: '✗ No websites found for this account'
149
+ });
150
+ }
151
+ setTimeout(() => {
152
+ if (onExit)
153
+ onExit();
154
+ }, 3000);
155
+ setState('error');
156
+ return;
157
+ }
158
+ // Has websites - proceed to selection
159
+ setWebsites(result.websites);
160
+ setState('website-selection');
161
+ // Remove waiting spinner
162
+ if (removeFromHistory) {
163
+ removeFromHistory('waiting-auth');
164
+ }
165
+ }
166
+ else {
167
+ // Got credentials directly (shouldn't happen in new flow, but handle it)
168
+ if (removeFromHistory) {
169
+ removeFromHistory('waiting-auth');
170
+ }
171
+ const creds = result;
172
+ await saveCredentials(creds);
173
+ setCredentials(creds);
174
+ setState('success');
175
+ }
176
+ }
177
+ catch (err) {
178
+ const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred';
179
+ setError(errorMessage);
180
+ // Remove any active spinners
181
+ if (removeFromHistory) {
182
+ removeFromHistory('sending-link');
183
+ removeFromHistory('waiting-auth');
184
+ }
185
+ // Add error to session history
186
+ if (addToHistory) {
187
+ addToHistory({
188
+ type: 'error',
189
+ content: `✗ Authentication failed: ${errorMessage}`
190
+ });
191
+ }
192
+ // Auto-return to menu after brief delay
193
+ setTimeout(() => {
194
+ if (onExit)
195
+ onExit();
196
+ }, 2000);
197
+ setState('error');
198
+ }
199
+ };
200
+ // Handle website selection
201
+ const handleWebsiteSelect = async (item) => {
202
+ // Safety check - if no item selected, ignore
203
+ if (!item || !item.value) {
204
+ return;
205
+ }
206
+ setState('selecting-website');
207
+ // Add spinner for completing authentication with website context
208
+ if (addToHistory) {
209
+ addToHistory({
210
+ type: 'spinner',
211
+ content: `Completing authentication for ${item.label}...`,
212
+ color: 'cyan',
213
+ spinnerId: 'completing-auth'
214
+ });
215
+ }
216
+ try {
217
+ // Submit website selection
218
+ await selectWebsite(deviceCode, item.value);
219
+ setState('waiting-for-jwt');
220
+ // Continue polling for JWT
221
+ const result = await pollForAuth(deviceCode, {
222
+ interval: 2000,
223
+ timeout: 600000,
224
+ });
225
+ // Remove spinner
226
+ if (removeFromHistory) {
227
+ removeFromHistory('completing-auth');
228
+ }
229
+ // Should now get credentials with JWT
230
+ if ('jwt' in result && result.jwt) {
231
+ const creds = result;
232
+ await saveCredentials(creds);
233
+ setCredentials(creds);
234
+ // Add success messages to history
235
+ if (addToHistory) {
236
+ addToHistory([
237
+ {
238
+ type: 'success',
239
+ content: `✓ Website selected - ${creds.websiteName || item.label}`
240
+ },
241
+ {
242
+ type: 'success',
243
+ content: `✓ Authenticated as ${creds.email}`
244
+ }
245
+ ]);
246
+ }
247
+ setState('success');
248
+ }
249
+ else {
250
+ throw new Error('Failed to receive authentication token');
251
+ }
252
+ }
253
+ catch (err) {
254
+ const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred';
255
+ setError(errorMessage);
256
+ // Remove spinner
257
+ if (removeFromHistory) {
258
+ removeFromHistory('completing-auth');
259
+ }
260
+ if (addToHistory) {
261
+ addToHistory({
262
+ type: 'error',
263
+ content: `✗ Authentication failed: ${errorMessage}`
264
+ });
265
+ }
266
+ setTimeout(() => {
267
+ if (onExit)
268
+ onExit();
269
+ }, 2000);
270
+ setState('error');
271
+ }
272
+ };
273
+ // Handle cancellation
274
+ const handleCancel = () => {
275
+ if (addToHistory) {
276
+ addToHistory({
277
+ type: 'info',
278
+ content: 'Login cancelled, returned to menu'
279
+ });
280
+ }
281
+ if (onExit)
282
+ onExit();
283
+ };
284
+ // Handle countdown timer
285
+ useEffect(() => {
286
+ if (state !== 'waiting-for-approval')
287
+ return;
288
+ const timer = setInterval(() => {
289
+ setCountdown((prev) => {
290
+ if (prev <= 1) {
291
+ clearInterval(timer);
292
+ const timeoutError = 'Authentication timeout - please try again';
293
+ setError(timeoutError);
294
+ // Remove waiting spinner and add timeout error to session history
295
+ if (removeFromHistory) {
296
+ removeFromHistory('waiting-auth');
297
+ }
298
+ if (addToHistory) {
299
+ addToHistory({
300
+ type: 'error',
301
+ content: `✗ Authentication timeout - please try again`
302
+ });
303
+ }
304
+ // Auto-return to menu after brief delay
305
+ setTimeout(() => {
306
+ if (onExit)
307
+ onExit();
308
+ }, 2000);
309
+ setState('error');
310
+ return 0;
311
+ }
312
+ return prev - 1;
313
+ });
314
+ }, 1000);
315
+ return () => clearInterval(timer);
316
+ }, [state, addToHistory, onExit, removeFromHistory]);
317
+ // Format countdown as MM:SS
318
+ const formatCountdown = (seconds) => {
319
+ const mins = Math.floor(seconds / 60);
320
+ const secs = seconds % 60;
321
+ return `${mins}:${secs.toString().padStart(2, '0')}`;
322
+ };
323
+ // Handle keyboard input
324
+ useInput((input, key) => {
325
+ if (key.escape && state === 'email-input') {
326
+ handleCancel();
327
+ }
328
+ });
329
+ // Don't render until data is loaded to prevent double rendering
330
+ if (!isLoaded) {
331
+ return null;
332
+ }
333
+ return (React.createElement(Box, { flexDirection: "column" },
334
+ React.createElement(Logo, { version: version, directory: directory, userEmail: userEmail }),
335
+ sessionHistory.length > 0 && (React.createElement(Box, { flexDirection: "column", marginTop: 1 }, sessionHistory.map((entry, index) => {
336
+ const isLastEntry = index === sessionHistory.length - 1;
337
+ const uniqueKey = `history-${index}-${entry.type}-${entry.spinnerId || ''}`;
338
+ if (entry.type === 'prompt') {
339
+ return (React.createElement(Box, { key: uniqueKey },
340
+ React.createElement(Text, null, entry.content)));
341
+ }
342
+ else if (entry.type === 'response') {
343
+ return (React.createElement(Box, { key: uniqueKey, marginBottom: isLastEntry ? 0 : 1 },
344
+ React.createElement(Text, { dimColor: true }, "\u276F "),
345
+ React.createElement(Text, null, entry.content)));
346
+ }
347
+ else if (entry.type === 'success') {
348
+ // Split checkmark from text: "✓ Message" -> "✓ " + "Message"
349
+ const hasCheckmark = entry.content.startsWith('✓ ');
350
+ if (hasCheckmark) {
351
+ const text = entry.content.substring(2); // Remove "✓ "
352
+ return (React.createElement(Box, { key: uniqueKey },
353
+ React.createElement(Text, { color: "green" }, "\u2713 "),
354
+ React.createElement(Text, null, text)));
355
+ }
356
+ return (React.createElement(Box, { key: uniqueKey },
357
+ React.createElement(Text, { color: "green" }, entry.content)));
358
+ }
359
+ else if (entry.type === 'spinner') {
360
+ return (React.createElement(Box, { key: uniqueKey },
361
+ React.createElement(Spinner, { type: "dots", color: "cyan", message: entry.content })));
362
+ }
363
+ else if (entry.type === 'progress') {
364
+ // Special handling for waiting-auth spinner to show live countdown
365
+ if (entry.spinnerId === 'waiting-auth' && state === 'waiting-for-approval') {
366
+ return (React.createElement(Box, { key: uniqueKey },
367
+ React.createElement(Spinner, { type: "dots", color: "cyan", message: `${entry.content} Expires in: ${formatCountdown(countdown)}` })));
368
+ }
369
+ return (React.createElement(Box, { key: uniqueKey },
370
+ React.createElement(Text, { color: "cyan" }, entry.content)));
371
+ }
372
+ else if (entry.type === 'error') {
373
+ return (React.createElement(Box, { key: uniqueKey },
374
+ React.createElement(Text, { color: "red" }, entry.content)));
375
+ }
376
+ else {
377
+ // Default info type
378
+ const needsTopMargin = entry.spinnerId === 'command-separator';
379
+ if (entry.color === 'dim') {
380
+ return (React.createElement(Box, { key: uniqueKey, marginBottom: isLastEntry ? 0 : 1, marginTop: needsTopMargin ? 1 : 0 },
381
+ React.createElement(Text, { dimColor: true }, entry.content)));
382
+ }
383
+ return (React.createElement(Box, { key: uniqueKey, marginBottom: isLastEntry ? 0 : 1, marginTop: needsTopMargin ? 1 : 0 },
384
+ React.createElement(Text, { color: entry.color }, entry.content)));
385
+ }
386
+ }))),
387
+ React.createElement(Box, { flexDirection: "column" },
388
+ React.createElement(Text, { dimColor: true }, '─'.repeat(process.stdout.columns || 80)),
389
+ React.createElement(Box, null,
390
+ React.createElement(Text, { dimColor: true }, "\u276F "),
391
+ React.createElement(Text, { dimColor: true }, "/login")),
392
+ React.createElement(Text, { dimColor: true }, '─'.repeat(process.stdout.columns || 80))),
393
+ React.createElement(Box, { flexDirection: "column", marginTop: 1, paddingX: 2 },
394
+ state === 'email-input' && (React.createElement(Box, { flexDirection: "column" },
395
+ React.createElement(Box, null,
396
+ React.createElement(Text, null, "Enter your email address "),
397
+ React.createElement(Text, { dimColor: true }, "(We'll send you a magic link)")),
398
+ React.createElement(Box, { marginTop: 1 },
399
+ React.createElement(Text, { color: "cyan" }, "> "),
400
+ React.createElement(Text, { color: "cyan" },
401
+ React.createElement(TextInput, { value: email, onChange: setEmail, onSubmit: handleEmailSubmit, placeholder: "you@example.com" }))),
402
+ emailError && (React.createElement(Box, { marginTop: 1 },
403
+ React.createElement(Text, { color: "red" },
404
+ "\u2717 ",
405
+ emailError))),
406
+ React.createElement(Box, { marginTop: 1 },
407
+ React.createElement(Text, { dimColor: true }, "Press Enter to continue, Esc to cancel")))),
408
+ state === 'website-selection' && websites.length > 0 && (React.createElement(Box, { flexDirection: "column" },
409
+ React.createElement(Box, { marginBottom: 1 },
410
+ React.createElement(Text, null, "Select a website to continue")),
411
+ React.createElement(Box, null,
412
+ React.createElement(SelectInput, { items: websites.map(w => ({
413
+ label: w.name,
414
+ value: w.id
415
+ })), onSelect: handleWebsiteSelect })),
416
+ React.createElement(Box, { marginTop: 1 },
417
+ React.createElement(Text, { dimColor: true }, "Use arrow keys to navigate, Enter to select")))),
418
+ state === 'error' && (React.createElement(Box, { flexDirection: "column" },
419
+ React.createElement(Box, { marginBottom: 1 },
420
+ React.createElement(Text, { color: "red" }, "\u2717 Authentication failed")),
421
+ React.createElement(Box, { marginBottom: 1 },
422
+ React.createElement(Text, { dimColor: true }, error)),
423
+ React.createElement(Box, { marginTop: 1 },
424
+ React.createElement(Text, { dimColor: true }, "Returning to menu...")))))));
425
+ };
426
+ export default LoginScreen;
427
+ //# sourceMappingURL=LoginScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoginScreen.js","sourceRoot":"","sources":["../../src/screens/LoginScreen.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import type { HistoryEntry } from '../components/App.js';
3
+ interface LogoutScreenProps {
4
+ onExit?: () => void;
5
+ sessionHistory?: HistoryEntry[];
6
+ addToHistory?: (entry: HistoryEntry | HistoryEntry[]) => void;
7
+ removeFromHistory?: (spinnerId: string) => void;
8
+ }
9
+ /**
10
+ * LogoutScreen Component
11
+ * Handles user logout with visual feedback and history integration
12
+ */
13
+ export declare const LogoutScreen: React.FC<LogoutScreenProps>;
14
+ export default LogoutScreen;
15
+ //# sourceMappingURL=LogoutScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogoutScreen.d.ts","sourceRoot":"","sources":["../../src/screens/LogoutScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAU3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,EAAE,KAAK,IAAI,CAAC;IAC9D,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAyOpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,187 @@
1
+ import React, { useState, useEffect, useRef } from 'react';
2
+ import { Box, Text } from 'ink';
3
+ import path from 'path';
4
+ import { readFile } from 'fs/promises';
5
+ import { fileURLToPath } from 'url';
6
+ import { Logo } from '../components/Logo.js';
7
+ import { SuccessMessage } from '../components/SuccessMessage.js';
8
+ import { ErrorMessage } from '../components/ErrorMessage.js';
9
+ import { Spinner } from '../components/Spinner.js';
10
+ import { clearCredentials, loadCredentials } from '../lib/shared/auth.js';
11
+ /**
12
+ * LogoutScreen Component
13
+ * Handles user logout with visual feedback and history integration
14
+ */
15
+ export const LogoutScreen = ({ onExit, sessionHistory = [], addToHistory, removeFromHistory }) => {
16
+ const [email, setEmail] = useState('');
17
+ const [websiteName, setWebsiteName] = useState('');
18
+ const [success, setSuccess] = useState(false);
19
+ const [error, setError] = useState('');
20
+ const [loading, setLoading] = useState(true);
21
+ const [appData, setAppData] = useState({
22
+ version: '0.1.0',
23
+ userEmail: null,
24
+ isLoaded: false
25
+ });
26
+ const [directory] = useState(process.cwd());
27
+ // Standalone mode: maintain local history when external callbacks aren't available
28
+ const isStandalone = !addToHistory;
29
+ const [localHistory, setLocalHistory] = useState([]);
30
+ // Unified history management
31
+ const addEntry = (entry) => {
32
+ if (addToHistory) {
33
+ addToHistory(entry);
34
+ }
35
+ else {
36
+ if (Array.isArray(entry)) {
37
+ setLocalHistory(prev => [...prev, ...entry]);
38
+ }
39
+ else {
40
+ setLocalHistory(prev => [...prev, entry]);
41
+ }
42
+ }
43
+ };
44
+ const removeEntry = (spinnerId) => {
45
+ if (removeFromHistory) {
46
+ removeFromHistory(spinnerId);
47
+ }
48
+ else {
49
+ setLocalHistory(prev => prev.filter(entry => entry.spinnerId !== spinnerId));
50
+ }
51
+ };
52
+ // Use appropriate history for rendering
53
+ const displayHistory = isStandalone ? localHistory : sessionHistory;
54
+ // Track if logout has already been initiated
55
+ const hasLoggedOut = useRef(false);
56
+ // Destructure for easier access
57
+ const { version, userEmail, isLoaded } = appData;
58
+ // Load version and credentials on mount
59
+ useEffect(() => {
60
+ const loadAllData = async () => {
61
+ const [versionData, credsData] = await Promise.all([
62
+ (async () => {
63
+ try {
64
+ const __filename = fileURLToPath(import.meta.url);
65
+ const __dirname = path.dirname(__filename);
66
+ const pkgPath = path.join(__dirname, '../../package.json');
67
+ const pkgData = await readFile(pkgPath, 'utf-8');
68
+ const pkg = JSON.parse(pkgData);
69
+ return pkg.version;
70
+ }
71
+ catch {
72
+ return '0.1.0';
73
+ }
74
+ })(),
75
+ loadCredentials()
76
+ ]);
77
+ setAppData({
78
+ version: versionData,
79
+ userEmail: credsData?.email || null,
80
+ isLoaded: true
81
+ });
82
+ };
83
+ loadAllData();
84
+ }, []);
85
+ // Handle logout flow
86
+ useEffect(() => {
87
+ if (!isLoaded)
88
+ return;
89
+ if (hasLoggedOut.current)
90
+ return;
91
+ hasLoggedOut.current = true;
92
+ const handleLogout = async () => {
93
+ try {
94
+ const credentials = await loadCredentials();
95
+ // Log the command
96
+ addEntry({
97
+ type: 'info',
98
+ content: '> /logout',
99
+ color: 'cyan'
100
+ });
101
+ if (!credentials) {
102
+ setError('Not currently logged in');
103
+ addEntry({
104
+ type: 'error',
105
+ content: '✗ Not currently logged in',
106
+ color: 'red'
107
+ });
108
+ setLoading(false);
109
+ onExit?.();
110
+ return;
111
+ }
112
+ setEmail(credentials.email);
113
+ setWebsiteName(credentials.websiteName || '');
114
+ // Clear credentials
115
+ await clearCredentials();
116
+ // Show success
117
+ addEntry({
118
+ type: 'success',
119
+ content: `✓ Logged out from ${credentials.email}`,
120
+ color: 'green'
121
+ });
122
+ setSuccess(true);
123
+ setLoading(false);
124
+ onExit?.();
125
+ }
126
+ catch (err) {
127
+ const errorMessage = err instanceof Error ? err.message : 'Logout failed';
128
+ setError(errorMessage);
129
+ addEntry({
130
+ type: 'error',
131
+ content: `✗ ${errorMessage}`,
132
+ color: 'red'
133
+ });
134
+ setLoading(false);
135
+ onExit?.();
136
+ }
137
+ };
138
+ handleLogout();
139
+ // eslint-disable-next-line react-hooks/exhaustive-deps
140
+ }, [isLoaded]);
141
+ // Don't render until data is loaded
142
+ if (!isLoaded) {
143
+ return null;
144
+ }
145
+ return (React.createElement(Box, { flexDirection: "column" },
146
+ React.createElement(Logo, { version: version, directory: directory, userEmail: userEmail }),
147
+ displayHistory.length > 0 && (React.createElement(Box, { flexDirection: "column", marginTop: 1 }, displayHistory.map((entry, index) => {
148
+ const uniqueKey = `history-${index}-${entry.type}-${entry.spinnerId || ''}`;
149
+ if (entry.type === 'spinner') {
150
+ return (React.createElement(Box, { key: uniqueKey },
151
+ React.createElement(Spinner, { type: "dots", color: "cyan", message: entry.content })));
152
+ }
153
+ else if (entry.type === 'success') {
154
+ const hasCheckmark = entry.content.startsWith('✓ ');
155
+ if (hasCheckmark) {
156
+ const text = entry.content.substring(2);
157
+ return (React.createElement(Box, { key: uniqueKey },
158
+ React.createElement(Text, { color: "green" }, "\u2713 "),
159
+ React.createElement(Text, null, text)));
160
+ }
161
+ return (React.createElement(Box, { key: uniqueKey },
162
+ React.createElement(Text, { color: "green" }, entry.content)));
163
+ }
164
+ else if (entry.type === 'error') {
165
+ return (React.createElement(Box, { key: uniqueKey },
166
+ React.createElement(Text, { color: "red" }, entry.content)));
167
+ }
168
+ else {
169
+ // Info type
170
+ const textColor = entry.color === 'dim' ? undefined : entry.color;
171
+ const isDim = entry.color === 'dim';
172
+ return (React.createElement(Box, { key: uniqueKey },
173
+ React.createElement(Text, { color: textColor, dimColor: isDim }, entry.content)));
174
+ }
175
+ }))),
176
+ isStandalone && displayHistory.length === 0 && (React.createElement(Box, { flexDirection: "column", marginTop: 1, paddingX: 2 },
177
+ loading && (React.createElement(Spinner, { message: "Processing logout..." })),
178
+ success && (React.createElement(SuccessMessage, { message: "Logged out successfully", details: [
179
+ `Cleared credentials for ${email}`,
180
+ ...(websiteName ? [`Session cleared for ${websiteName}`] : [])
181
+ ] })),
182
+ error && !loading && (React.createElement(ErrorMessage, { message: error, suggestion: error.includes('Not currently logged in')
183
+ ? 'No active session to clear'
184
+ : 'Please try again' }))))));
185
+ };
186
+ export default LogoutScreen;
187
+ //# sourceMappingURL=LogoutScreen.js.map