@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
package/README.md ADDED
@@ -0,0 +1,166 @@
1
+ # @oaysus/cli
2
+
3
+ Official CLI for building and uploading frontend components to Oaysus.
4
+
5
+ ## Installation
6
+
7
+ ### npm (recommended)
8
+
9
+ ```bash
10
+ npm install -g @oaysus/cli
11
+ ```
12
+
13
+ ### Homebrew (macOS/Linux)
14
+
15
+ ```bash
16
+ brew tap oaysus/tap
17
+ brew install oaysus
18
+ ```
19
+
20
+ ### Verify installation
21
+
22
+ ```bash
23
+ oaysus --version
24
+ ```
25
+
26
+ ## Quick Start
27
+
28
+ ```bash
29
+ # Authenticate with Oaysus
30
+ oaysus login
31
+
32
+ # Create a new theme pack project
33
+ oaysus init my-theme
34
+
35
+ # Navigate to project
36
+ cd my-theme
37
+
38
+ # Add a component
39
+ oaysus create
40
+
41
+ # Build and upload
42
+ oaysus push
43
+ ```
44
+
45
+ ## Commands
46
+
47
+ | Command | Description |
48
+ |---------|-------------|
49
+ | `oaysus init [name]` | Create a new theme pack project |
50
+ | `oaysus create` | Add a component to your project |
51
+ | `oaysus validate` | Validate package structure |
52
+ | `oaysus build` | Build components locally (no upload) |
53
+ | `oaysus push` | Build and upload to Oaysus |
54
+ | `oaysus login` | Authenticate with Oaysus |
55
+ | `oaysus logout` | Clear authentication |
56
+ | `oaysus whoami` | Display current user |
57
+
58
+ ## Framework Support
59
+
60
+ The CLI supports multiple frontend frameworks:
61
+
62
+ - **React** - Full support with JSX/TSX components
63
+ - **Vue** - Single File Components (.vue)
64
+ - **Svelte** - Svelte components (.svelte)
65
+
66
+ Framework is automatically detected from your `package.json` dependencies.
67
+
68
+ ## Project Structure
69
+
70
+ ### Single Component
71
+
72
+ ```
73
+ my-component/
74
+ ├── package.json
75
+ ├── index.tsx # Main component file
76
+ └── schema.json # Component props schema
77
+ ```
78
+
79
+ ### Theme Pack (Multiple Components)
80
+
81
+ ```
82
+ my-theme/
83
+ ├── package.json
84
+ └── components/
85
+ ├── Button/
86
+ │ ├── index.tsx
87
+ │ └── schema.json
88
+ ├── Card/
89
+ │ ├── index.tsx
90
+ │ └── schema.json
91
+ └── Header/
92
+ ├── index.tsx
93
+ └── schema.json
94
+ ```
95
+
96
+ ## Configuration
97
+
98
+ ### package.json
99
+
100
+ ```json
101
+ {
102
+ "name": "my-theme",
103
+ "version": "1.0.0",
104
+ "dependencies": {
105
+ "react": "^18.0.0"
106
+ },
107
+ "oaysus": {
108
+ "theme": {
109
+ "name": "my-theme",
110
+ "displayName": "My Theme",
111
+ "category": "ui",
112
+ "tags": ["react", "components"]
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ ### schema.json
119
+
120
+ ```json
121
+ {
122
+ "type": "component",
123
+ "displayName": "My Component",
124
+ "description": "A reusable UI component",
125
+ "props": {
126
+ "title": {
127
+ "type": "string",
128
+ "default": "Hello",
129
+ "description": "The title text"
130
+ },
131
+ "variant": {
132
+ "type": "string",
133
+ "default": "primary",
134
+ "description": "Button variant"
135
+ }
136
+ }
137
+ }
138
+ ```
139
+
140
+ ## Requirements
141
+
142
+ - Node.js 20 or higher
143
+ - Oaysus account
144
+
145
+ ## Authentication
146
+
147
+ The CLI uses device authorization flow for secure authentication:
148
+
149
+ 1. Run `oaysus login`
150
+ 2. A browser window opens for authentication
151
+ 3. Log in with your Oaysus account
152
+ 4. The CLI automatically receives your credentials
153
+
154
+ Credentials are stored securely in `~/.oaysus/credentials.json` with restricted file permissions.
155
+
156
+ ## Documentation
157
+
158
+ For full documentation, visit [docs.oaysus.com](https://docs.oaysus.com)
159
+
160
+ ## Contributing
161
+
162
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
163
+
164
+ ## License
165
+
166
+ MIT
package/bin/oaysus.js ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+
3
+ // CommonJS wrapper to avoid ESM loading issues
4
+ (async () => {
5
+ await import('../dist/index.js');
6
+ })();
package/dist/cli.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Entry Point
4
+ * Parses command-line arguments and renders appropriate Ink screens
5
+ */
6
+ /**
7
+ * Main CLI Router
8
+ * Routes commands to appropriate Ink screens
9
+ */
10
+ export declare function runCli(): Promise<void>;
11
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAkCA;;;GAGG;AAEH;;;GAGG;AACH,wBAAsB,MAAM,kBAmJ3B"}
package/dist/cli.js ADDED
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env node
2
+ import React from 'react';
3
+ import { render } from 'ink';
4
+ import { readFile } from 'fs/promises';
5
+ import { fileURLToPath } from 'url';
6
+ import path from 'path';
7
+ import { LoginScreen } from './screens/LoginScreen.js';
8
+ import { WhoamiScreen } from './screens/WhoamiScreen.js';
9
+ import { LogoutScreen } from './screens/LogoutScreen.js';
10
+ import { ValidateScreen } from './screens/ValidateScreen.js';
11
+ import { InitScreen } from './screens/InitScreen.js';
12
+ import { CreateScreen } from './screens/CreateScreen.js';
13
+ import { PushScreen } from './screens/PushScreen.js';
14
+ import { BuildScreen } from './screens/BuildScreen.js';
15
+ import { App } from './components/App.js';
16
+ import { saveCommandToHistory } from './lib/shared/command-history.js';
17
+ import { push } from './lib/push.js';
18
+ import { checkAuthForCommand } from './lib/shared/auth-middleware.js';
19
+ // Get package version function
20
+ const __filename = fileURLToPath(import.meta.url);
21
+ const __dirname = path.dirname(__filename);
22
+ async function getVersion() {
23
+ try {
24
+ const pkgData = await readFile(path.join(__dirname, '../package.json'), 'utf-8');
25
+ const pkg = JSON.parse(pkgData);
26
+ return pkg.version;
27
+ }
28
+ catch {
29
+ return '0.1.0';
30
+ }
31
+ }
32
+ /**
33
+ * CLI Entry Point
34
+ * Parses command-line arguments and renders appropriate Ink screens
35
+ */
36
+ /**
37
+ * Main CLI Router
38
+ * Routes commands to appropriate Ink screens
39
+ */
40
+ export async function runCli() {
41
+ const args = process.argv.slice(2);
42
+ const command = args[0];
43
+ // Handle exit callback
44
+ const handleExit = () => {
45
+ process.exit(0);
46
+ };
47
+ // Handle version flag
48
+ if (args.includes('--version') || args.includes('-v')) {
49
+ const version = await getVersion();
50
+ console.log(`oaysus-cli v${version}`);
51
+ process.exit(0);
52
+ }
53
+ // Show welcome screen when no command provided
54
+ if (!command) {
55
+ render(React.createElement(App, { onExit: handleExit }));
56
+ return;
57
+ }
58
+ // Handle help flag
59
+ if (args.includes('--help') || args.includes('-h')) {
60
+ console.log(`
61
+ Oaysus CLI - Professional developer tool for component uploads
62
+
63
+ Usage
64
+ $ oaysus <command> [options]
65
+
66
+ Commands
67
+ init [name] Create a new component project (theme pack structure)
68
+ create Add a component to your project
69
+ validate Validate component package and create ZIP
70
+ build Build components locally (no upload to R2)
71
+ push Build and upload component package to Oaysus
72
+ login Authenticate with your Oaysus account
73
+ logout Clear authentication tokens and log out
74
+ whoami Display current authenticated user information
75
+
76
+ Options
77
+ --help, -h Show this help message
78
+ --version, -v Show version number
79
+ --dry-run Validate without creating ZIP (validate command only)
80
+
81
+ Examples
82
+ $ oaysus init my-project # Create new project with components/ structure
83
+ $ oaysus create component Pricing # Add a new component
84
+ $ oaysus validate # Validate and create ZIP (no upload)
85
+ $ oaysus build # Build components to .oaysus-build/ (no upload)
86
+ $ oaysus push # Build and upload to Oaysus
87
+ $ oaysus login # Authenticate with Oaysus
88
+ $ oaysus whoami # Show current user
89
+ $ oaysus logout # Sign out
90
+
91
+ Project Structure
92
+ All projects use a consistent theme pack structure:
93
+ my-project/
94
+ ├── components/ # Your components live here
95
+ │ └── Hero/ # One Hero component created by default
96
+ ├── shared/ # Shared utilities and types
97
+ ├── package.json
98
+ └── README.md
99
+
100
+ Use "oaysus create component" to add more components to your project.
101
+ `);
102
+ process.exit(0);
103
+ }
104
+ // Track command in history
105
+ const commandString = `oaysus ${args.join(' ')}`;
106
+ saveCommandToHistory(commandString).catch(() => {
107
+ // Silently ignore history save errors
108
+ });
109
+ // Check authentication for commands that require it
110
+ const authResult = await checkAuthForCommand(command);
111
+ if (!authResult.valid) {
112
+ console.error(`\n✗ ${authResult.error}`);
113
+ if (authResult.suggestion) {
114
+ console.log(`💡 ${authResult.suggestion}`);
115
+ }
116
+ process.exit(1);
117
+ }
118
+ switch (command) {
119
+ case 'init':
120
+ render(React.createElement(InitScreen, {
121
+ projectName: args[1],
122
+ onExit: handleExit
123
+ }));
124
+ break;
125
+ case 'create':
126
+ render(React.createElement(CreateScreen, {
127
+ componentName: args[1],
128
+ projectPath: args[2] || '.',
129
+ onExit: handleExit
130
+ }));
131
+ break;
132
+ case 'login':
133
+ render(React.createElement(LoginScreen, { onExit: handleExit }));
134
+ break;
135
+ case 'whoami':
136
+ render(React.createElement(WhoamiScreen, { onExit: handleExit }));
137
+ break;
138
+ case 'logout':
139
+ render(React.createElement(LogoutScreen, { onExit: handleExit }));
140
+ break;
141
+ case 'validate':
142
+ render(React.createElement(ValidateScreen, {
143
+ projectPath: args[1] || '.',
144
+ dryRun: args.includes('--dry-run'),
145
+ onExit: handleExit
146
+ }));
147
+ break;
148
+ case 'build':
149
+ render(React.createElement(BuildScreen, {
150
+ projectPath: args[1] || '.',
151
+ onExit: handleExit
152
+ }));
153
+ break;
154
+ case 'push':
155
+ // Use non-interactive mode if no TTY (e.g., running from script/IDE)
156
+ if (!process.stdin.isTTY) {
157
+ push({ projectPath: args[1] || '.' }).then(result => {
158
+ process.exit(result.success ? 0 : 1);
159
+ });
160
+ }
161
+ else {
162
+ render(React.createElement(PushScreen, {
163
+ projectPath: args[1] || '.',
164
+ onExit: handleExit
165
+ }));
166
+ }
167
+ break;
168
+ default:
169
+ console.error(`Unknown command: ${command}`);
170
+ console.log('Run "oaysus --help" for usage information');
171
+ process.exit(1);
172
+ }
173
+ }
174
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function loginCommand(): Promise<void>;
2
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAOA,wBAAsB,YAAY,kBA+EjC"}
@@ -0,0 +1,75 @@
1
+ import ora from 'ora';
2
+ import chalk from 'chalk';
3
+ import inquirer from 'inquirer';
4
+ import { requestMagicLink, initializeDevice, pollForAuth, saveCredentials } from '../lib/shared/auth';
5
+ export async function loginCommand() {
6
+ try {
7
+ // Step 1: Prompt for email
8
+ const { email } = await inquirer.prompt([
9
+ {
10
+ type: 'input',
11
+ name: 'email',
12
+ message: 'Email:',
13
+ validate: (input) => {
14
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
15
+ if (!emailRegex.test(input)) {
16
+ return 'Please enter a valid email address';
17
+ }
18
+ return true;
19
+ }
20
+ }
21
+ ]);
22
+ // Step 2: Request magic link
23
+ const spinner = ora('Sending magic link...').start();
24
+ await requestMagicLink(email, '/device');
25
+ spinner.succeed('Magic link sent to your email');
26
+ // Step 3: Initialize device authorization (for later polling)
27
+ const deviceSpinner = ora('Initializing device authorization...').start();
28
+ const deviceResponse = await initializeDevice();
29
+ deviceSpinner.succeed('Device code generated');
30
+ // Display instructions
31
+ console.log('');
32
+ console.log(chalk.bold.cyan('═══════════════════════════════════════'));
33
+ console.log(chalk.bold.white(' 📧 Check your email and click the link'));
34
+ console.log('');
35
+ console.log(chalk.gray(' Then enter code:'), chalk.bold.yellow(deviceResponse.userCode));
36
+ console.log(chalk.bold.cyan('═══════════════════════════════════════'));
37
+ console.log('');
38
+ // Step 4: Poll for device authorization
39
+ const pollSpinner = ora('Waiting for you to click the magic link and approve the device...').start();
40
+ const result = await pollForAuth(deviceResponse.deviceCode, {
41
+ interval: 2000, // Poll every 2 seconds
42
+ timeout: 600000 // 10 minute timeout
43
+ });
44
+ // Handle two-phase auth (this old command doesn't support it properly)
45
+ if ('needsWebsiteSelection' in result) {
46
+ pollSpinner.fail('This command does not support website selection yet. Please use /login in the main menu.');
47
+ process.exit(1);
48
+ }
49
+ const credentials = result;
50
+ pollSpinner.succeed('Authorization complete!');
51
+ // Save credentials
52
+ await saveCredentials(credentials);
53
+ // Display success
54
+ console.log('');
55
+ console.log(chalk.green.bold('✓ Authenticated successfully!'));
56
+ console.log('');
57
+ console.log(chalk.gray('Email: '), chalk.white(credentials.email));
58
+ console.log(chalk.gray('Website: '), chalk.white(credentials.websiteId));
59
+ console.log(chalk.gray('User ID: '), chalk.white(credentials.userId));
60
+ console.log('');
61
+ }
62
+ catch (error) {
63
+ console.error('');
64
+ console.error(chalk.red('✗ Authentication failed'));
65
+ console.error('');
66
+ if (error instanceof Error) {
67
+ console.error(chalk.red(error.message));
68
+ }
69
+ else {
70
+ console.error(chalk.red('An unknown error occurred'));
71
+ }
72
+ process.exit(1);
73
+ }
74
+ }
75
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function logoutCommand(): Promise<void>;
2
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,kBAsBlC"}
@@ -0,0 +1,23 @@
1
+ import chalk from 'chalk';
2
+ import { clearCredentials, loadCredentials } from '../lib/shared/auth';
3
+ export async function logoutCommand() {
4
+ try {
5
+ const credentials = await loadCredentials();
6
+ if (!credentials) {
7
+ console.log(chalk.yellow('⚠ Not currently logged in'));
8
+ return;
9
+ }
10
+ // Clear credentials file
11
+ await clearCredentials();
12
+ console.log(chalk.green('✓ Logged out successfully'));
13
+ console.log(chalk.gray(` Cleared credentials for ${credentials.email}`));
14
+ }
15
+ catch (error) {
16
+ console.error(chalk.red('Failed to logout'));
17
+ if (error instanceof Error) {
18
+ console.error(chalk.red(error.message));
19
+ }
20
+ process.exit(1);
21
+ }
22
+ }
23
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;QAE5C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,MAAM,gBAAgB,EAAE,CAAC;QAEzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAE5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC7C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function whoamiCommand(): Promise<void>;
2
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,kBA8ClC"}
@@ -0,0 +1,44 @@
1
+ import chalk from 'chalk';
2
+ import { loadCredentials } from '../lib/shared/auth';
3
+ export async function whoamiCommand() {
4
+ try {
5
+ const credentials = await loadCredentials();
6
+ if (!credentials) {
7
+ console.log(chalk.red('✗ Not authenticated'));
8
+ console.log(chalk.gray(' Run: oaysus login'));
9
+ process.exit(1);
10
+ }
11
+ // Check if token expired
12
+ const expiresAt = new Date(credentials.expiresAt);
13
+ const now = new Date();
14
+ const isExpired = expiresAt <= now;
15
+ if (isExpired) {
16
+ console.log(chalk.yellow('⚠ Token expired'));
17
+ console.log(chalk.gray(' Run: oaysus login'));
18
+ process.exit(1);
19
+ }
20
+ // Display user info
21
+ console.log('');
22
+ console.log(chalk.bold.white('Current User:'));
23
+ console.log('');
24
+ console.log(chalk.gray('Email: '), chalk.white(credentials.email));
25
+ console.log(chalk.gray('User ID: '), chalk.white(credentials.userId));
26
+ console.log(chalk.gray('Website ID: '), chalk.white(credentials.websiteId));
27
+ console.log(chalk.gray('Platforms: '), chalk.white(credentials.platforms.join(', ')));
28
+ console.log('');
29
+ // Display expiry info
30
+ const timeUntilExpiry = expiresAt.getTime() - now.getTime();
31
+ const daysUntilExpiry = Math.floor(timeUntilExpiry / (1000 * 60 * 60 * 24));
32
+ const hoursUntilExpiry = Math.floor((timeUntilExpiry % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
33
+ console.log(chalk.gray('Token expires in:'), chalk.white(`${daysUntilExpiry}d ${hoursUntilExpiry}h`));
34
+ console.log('');
35
+ }
36
+ catch (error) {
37
+ console.error(chalk.red('Failed to get user info'));
38
+ if (error instanceof Error) {
39
+ console.error(chalk.red(error.message));
40
+ }
41
+ process.exit(1);
42
+ }
43
+ }
44
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import React from 'react';
2
+ type Screen = {
3
+ type: 'welcome';
4
+ } | {
5
+ type: 'init';
6
+ projectName?: string;
7
+ } | {
8
+ type: 'create';
9
+ componentName?: string;
10
+ projectPath?: string;
11
+ } | {
12
+ type: 'login';
13
+ } | {
14
+ type: 'status';
15
+ } | {
16
+ type: 'logout';
17
+ } | {
18
+ type: 'validate';
19
+ projectPath?: string;
20
+ dryRun?: boolean;
21
+ } | {
22
+ type: 'push';
23
+ projectPath?: string;
24
+ };
25
+ export interface HistoryEntry {
26
+ type: 'prompt' | 'response' | 'info' | 'success' | 'error' | 'progress' | 'spinner';
27
+ content: string;
28
+ timestamp?: number;
29
+ color?: 'green' | 'cyan' | 'yellow' | 'red' | 'dim';
30
+ spinnerId?: string;
31
+ }
32
+ interface AppProps {
33
+ initialScreen?: Screen;
34
+ onExit: () => void;
35
+ }
36
+ /**
37
+ * App Component
38
+ * Main router for the CLI application
39
+ * Manages navigation between different screens and persistent history
40
+ */
41
+ export declare const App: React.FC<AppProps>;
42
+ export default App;
43
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAUxC,KAAK,MAAM,GACP;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,QAAQ;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CA4HlC,CAAC;AAEF,eAAe,GAAG,CAAC"}