@basictech/cli 0.0.22 → 0.0.25

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 (112) hide show
  1. package/dist/commands/account.d.ts +2 -0
  2. package/dist/commands/account.d.ts.map +1 -0
  3. package/dist/commands/account.js +18 -0
  4. package/dist/commands/account.js.map +1 -0
  5. package/dist/commands/debug.d.ts +2 -0
  6. package/dist/commands/debug.d.ts.map +1 -0
  7. package/dist/commands/debug.js +6 -0
  8. package/dist/commands/debug.js.map +1 -0
  9. package/dist/commands/init.d.ts +10 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +111 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/login.d.ts +2 -0
  14. package/dist/commands/login.d.ts.map +1 -0
  15. package/dist/commands/login.js +20 -0
  16. package/dist/commands/login.js.map +1 -0
  17. package/dist/commands/logout.d.ts +2 -0
  18. package/dist/commands/logout.d.ts.map +1 -0
  19. package/dist/commands/logout.js +7 -0
  20. package/dist/commands/logout.js.map +1 -0
  21. package/dist/commands/projects.d.ts +2 -0
  22. package/dist/commands/projects.d.ts.map +1 -0
  23. package/dist/commands/projects.js +90 -0
  24. package/dist/commands/projects.js.map +1 -0
  25. package/dist/commands/pull.d.ts +2 -0
  26. package/dist/commands/pull.d.ts.map +1 -0
  27. package/dist/commands/pull.js +366 -0
  28. package/dist/commands/pull.js.map +1 -0
  29. package/dist/commands/push.d.ts +2 -0
  30. package/dist/commands/push.d.ts.map +1 -0
  31. package/dist/commands/push.js +403 -0
  32. package/dist/commands/push.js.map +1 -0
  33. package/dist/commands/status.d.ts +2 -0
  34. package/dist/commands/status.d.ts.map +1 -0
  35. package/dist/commands/status.js +385 -0
  36. package/dist/commands/status.js.map +1 -0
  37. package/dist/commands/teams.d.ts +2 -0
  38. package/dist/commands/teams.d.ts.map +1 -0
  39. package/dist/commands/teams.js +164 -0
  40. package/dist/commands/teams.js.map +1 -0
  41. package/dist/commands/update.d.ts +2 -0
  42. package/dist/commands/update.d.ts.map +1 -0
  43. package/dist/commands/update.js +76 -0
  44. package/dist/commands/update.js.map +1 -0
  45. package/dist/commands/version.d.ts +2 -0
  46. package/dist/commands/version.d.ts.map +1 -0
  47. package/dist/commands/version.js +21 -0
  48. package/dist/commands/version.js.map +1 -0
  49. package/dist/components/Form.d.ts +15 -0
  50. package/dist/components/Form.d.ts.map +1 -0
  51. package/dist/components/Form.js +69 -0
  52. package/dist/components/Form.js.map +1 -0
  53. package/dist/components/InitForm.d.ts +17 -0
  54. package/dist/components/InitForm.d.ts.map +1 -0
  55. package/dist/components/InitForm.js +358 -0
  56. package/dist/components/InitForm.js.map +1 -0
  57. package/dist/components/Spinner.d.ts +7 -0
  58. package/dist/components/Spinner.d.ts.map +1 -0
  59. package/dist/components/Spinner.js +15 -0
  60. package/dist/components/Spinner.js.map +1 -0
  61. package/dist/components/Table.d.ts +24 -0
  62. package/dist/components/Table.d.ts.map +1 -0
  63. package/dist/components/Table.js +69 -0
  64. package/dist/components/Table.js.map +1 -0
  65. package/dist/components/TeamForm.d.ts +10 -0
  66. package/dist/components/TeamForm.d.ts.map +1 -0
  67. package/dist/components/TeamForm.js +193 -0
  68. package/dist/components/TeamForm.js.map +1 -0
  69. package/dist/index.d.ts +3 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +243 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/lib/api.d.ts +23 -0
  74. package/dist/lib/api.d.ts.map +1 -0
  75. package/dist/lib/api.js +133 -0
  76. package/dist/lib/api.js.map +1 -0
  77. package/dist/lib/auth.d.ts +17 -0
  78. package/dist/lib/auth.d.ts.map +1 -0
  79. package/dist/lib/auth.js +288 -0
  80. package/dist/lib/auth.js.map +1 -0
  81. package/dist/lib/config-templates.d.ts +9 -0
  82. package/dist/lib/config-templates.d.ts.map +1 -0
  83. package/dist/lib/config-templates.js +117 -0
  84. package/dist/lib/config-templates.js.map +1 -0
  85. package/dist/lib/constants.d.ts +18 -0
  86. package/dist/lib/constants.d.ts.map +1 -0
  87. package/dist/lib/constants.js +32 -0
  88. package/dist/lib/constants.js.map +1 -0
  89. package/dist/lib/errors.d.ts +21 -0
  90. package/dist/lib/errors.d.ts.map +1 -0
  91. package/dist/lib/errors.js +75 -0
  92. package/dist/lib/errors.js.map +1 -0
  93. package/dist/lib/platform.d.ts +11 -0
  94. package/dist/lib/platform.d.ts.map +1 -0
  95. package/dist/lib/platform.js +133 -0
  96. package/dist/lib/platform.js.map +1 -0
  97. package/dist/lib/schema.d.ts +24 -0
  98. package/dist/lib/schema.d.ts.map +1 -0
  99. package/dist/lib/schema.js +162 -0
  100. package/dist/lib/schema.js.map +1 -0
  101. package/dist/lib/types.d.ts +111 -0
  102. package/dist/lib/types.d.ts.map +1 -0
  103. package/dist/lib/types.js +2 -0
  104. package/dist/lib/types.js.map +1 -0
  105. package/dist/lib/version.d.ts +2 -0
  106. package/dist/lib/version.d.ts.map +1 -0
  107. package/dist/lib/version.js +22 -0
  108. package/dist/lib/version.js.map +1 -0
  109. package/package.json +64 -12
  110. package/readme.md +92 -35
  111. package/bin/readme.md +0 -61
  112. package/index.js +0 -108
@@ -0,0 +1,133 @@
1
+ import { CONSTANTS } from './constants.js';
2
+ import { AuthService } from './auth.js';
3
+ import { ApiError, handleError } from './errors.js';
4
+ export class ApiClient {
5
+ static instance;
6
+ authService;
7
+ constructor() {
8
+ this.authService = AuthService.getInstance();
9
+ }
10
+ static getInstance() {
11
+ if (!ApiClient.instance) {
12
+ ApiClient.instance = new ApiClient();
13
+ }
14
+ return ApiClient.instance;
15
+ }
16
+ async request(endpoint, options = {}) {
17
+ try {
18
+ const token = await this.authService.getToken();
19
+ const response = await fetch(`${CONSTANTS.API_BASE}${endpoint}`, {
20
+ ...options,
21
+ headers: {
22
+ 'Content-Type': 'application/json',
23
+ ...(token && { Authorization: `Bearer ${token.access_token}` }),
24
+ ...options.headers,
25
+ },
26
+ });
27
+ if (!response.ok) {
28
+ const errorText = await response.text();
29
+ throw new ApiError(`API Error: ${response.status} - ${errorText}`, response.status);
30
+ }
31
+ return response.json();
32
+ }
33
+ catch (error) {
34
+ throw handleError(error);
35
+ }
36
+ }
37
+ async getProjects() {
38
+ const response = await this.request('/project');
39
+ return response.data;
40
+ }
41
+ async createProject(data) {
42
+ const response = await this.request('/project', {
43
+ method: 'POST',
44
+ body: JSON.stringify(data),
45
+ });
46
+ return response.data;
47
+ }
48
+ async createProjectWithTeam(name, slug, teamId) {
49
+ const response = await this.request('/project', {
50
+ method: 'POST',
51
+ body: JSON.stringify({
52
+ name,
53
+ slug,
54
+ team_id: teamId
55
+ }),
56
+ });
57
+ return response.data;
58
+ }
59
+ async getProject(projectId) {
60
+ const response = await this.request(`/project/${projectId}`);
61
+ return response.data;
62
+ }
63
+ async getTeams() {
64
+ const response = await this.request('/team');
65
+ return response.data;
66
+ }
67
+ async createTeam(name, slug) {
68
+ const response = await this.request('/team', {
69
+ method: 'POST',
70
+ body: JSON.stringify({ name, slug }),
71
+ });
72
+ return response.data;
73
+ }
74
+ async checkTeamSlugAvailability(slug) {
75
+ try {
76
+ const response = await this.request(`/team/slug?slug=${encodeURIComponent(slug)}`);
77
+ return response.available;
78
+ }
79
+ catch (error) {
80
+ // If there's an error checking availability, assume it's not available
81
+ return false;
82
+ }
83
+ }
84
+ async getProjectSchema(projectId) {
85
+ try {
86
+ const response = await this.request(`/project/${projectId}/schema`);
87
+ if (response.data.length === 0) {
88
+ return null;
89
+ }
90
+ return response.data[0].schema;
91
+ }
92
+ catch (error) {
93
+ if (error instanceof ApiError && error.statusCode === 404) {
94
+ return null;
95
+ }
96
+ throw error;
97
+ }
98
+ }
99
+ async pushProjectSchema(projectId, schema) {
100
+ await this.request(`/project/${projectId}/schema`, {
101
+ method: 'POST',
102
+ body: JSON.stringify({ schema }),
103
+ });
104
+ }
105
+ async validateSchema(schema) {
106
+ const response = await this.request('/utils/schema/verifyUpdateSchema', {
107
+ method: 'POST',
108
+ body: JSON.stringify({ schema }),
109
+ });
110
+ return response;
111
+ }
112
+ async compareSchema(schema) {
113
+ const response = await this.request('/utils/schema/compareSchema', {
114
+ method: 'POST',
115
+ body: JSON.stringify({ schema }),
116
+ });
117
+ return response;
118
+ }
119
+ async checkLatestRelease() {
120
+ try {
121
+ const response = await fetch(`https://api.github.com/repos/${CONSTANTS.GITHUB_REPO}/releases/latest`);
122
+ if (!response.ok) {
123
+ throw new Error('Failed to check for updates');
124
+ }
125
+ const release = await response.json();
126
+ return release.tag_name.replace(/^v/, '');
127
+ }
128
+ catch (error) {
129
+ throw handleError(error);
130
+ }
131
+ }
132
+ }
133
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Token, UserInfo } from './types';
2
+ export declare class AuthService {
3
+ private static instance;
4
+ static getInstance(): AuthService;
5
+ login(): Promise<void>;
6
+ logout(): Promise<void>;
7
+ getToken(): Promise<Token | null>;
8
+ getUserInfo(): Promise<UserInfo>;
9
+ private startOAuthFlow;
10
+ private exchangeCodeForToken;
11
+ private refreshToken;
12
+ private saveToken;
13
+ private deleteToken;
14
+ private generateState;
15
+ private getSuccessHtml;
16
+ }
17
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/C,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IAErC,MAAM,CAAC,WAAW,IAAI,WAAW;IAO3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQvB,QAAQ,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAsBjC,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;YAmBxB,cAAc;YA2Dd,oBAAoB;YAiCpB,YAAY;YAkCZ,SAAS;YAWT,WAAW;IAWzB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,cAAc;CA6FvB"}
@@ -0,0 +1,288 @@
1
+ import { createServer } from 'http';
2
+ import { promises as fs } from 'fs';
3
+ import { CONSTANTS } from './constants.js';
4
+ import { getConfigPath, getConfigDir, openBrowser } from './platform.js';
5
+ import { AuthError, handleError } from './errors.js';
6
+ export class AuthService {
7
+ static instance;
8
+ static getInstance() {
9
+ if (!AuthService.instance) {
10
+ AuthService.instance = new AuthService();
11
+ }
12
+ return AuthService.instance;
13
+ }
14
+ async login() {
15
+ try {
16
+ const token = await this.startOAuthFlow();
17
+ await this.saveToken(token);
18
+ }
19
+ catch (error) {
20
+ throw handleError(error);
21
+ }
22
+ }
23
+ async logout() {
24
+ try {
25
+ await this.deleteToken();
26
+ }
27
+ catch (error) {
28
+ throw handleError(error);
29
+ }
30
+ }
31
+ async getToken() {
32
+ try {
33
+ const tokenPath = getConfigPath();
34
+ const tokenData = await fs.readFile(tokenPath, 'utf8');
35
+ const token = JSON.parse(tokenData);
36
+ // Check if token is expired
37
+ if (token.expires_at && Date.now() > token.expires_at) {
38
+ const refreshedToken = await this.refreshToken(token);
39
+ await this.saveToken(refreshedToken);
40
+ return refreshedToken;
41
+ }
42
+ return token;
43
+ }
44
+ catch (error) {
45
+ if (error.code === 'ENOENT') {
46
+ return null; // Token file doesn't exist
47
+ }
48
+ throw handleError(error);
49
+ }
50
+ }
51
+ async getUserInfo() {
52
+ const token = await this.getToken();
53
+ if (!token) {
54
+ throw new AuthError('Not logged in');
55
+ }
56
+ const response = await fetch(`${CONSTANTS.API_BASE}/auth/userInfo`, {
57
+ headers: {
58
+ Authorization: `Bearer ${token.access_token}`,
59
+ },
60
+ });
61
+ if (!response.ok) {
62
+ throw new AuthError('Failed to fetch user info');
63
+ }
64
+ return await response.json();
65
+ }
66
+ async startOAuthFlow() {
67
+ return new Promise((resolve, reject) => {
68
+ const server = createServer((req, res) => {
69
+ if (req.url?.startsWith('/callback')) {
70
+ const url = new URL(req.url, CONSTANTS.OAUTH_REDIRECT);
71
+ const code = url.searchParams.get('code');
72
+ const state = url.searchParams.get('state');
73
+ if (!code) {
74
+ res.writeHead(400);
75
+ res.end('Authorization code not found');
76
+ server.close();
77
+ reject(new AuthError('Authorization code not found'));
78
+ return;
79
+ }
80
+ this.exchangeCodeForToken(code)
81
+ .then(token => {
82
+ res.writeHead(200, { 'Content-Type': 'text/html' });
83
+ res.end(this.getSuccessHtml());
84
+ server.close();
85
+ resolve(token);
86
+ })
87
+ .catch(error => {
88
+ res.writeHead(500);
89
+ res.end('Authentication failed');
90
+ server.close();
91
+ reject(error);
92
+ });
93
+ }
94
+ else {
95
+ res.writeHead(404);
96
+ res.end('Not found');
97
+ }
98
+ });
99
+ server.listen(8080, async () => {
100
+ const state = this.generateState();
101
+ const authUrl = `${CONSTANTS.API_BASE}/auth/authorize?` +
102
+ `client_id=${CONSTANTS.OAUTH_CLIENT_ID}&` +
103
+ `redirect_uri=${encodeURIComponent(CONSTANTS.OAUTH_REDIRECT)}&` +
104
+ `response_type=code&` +
105
+ `scope=${encodeURIComponent(CONSTANTS.OAUTH_SCOPES)}&` +
106
+ `state=${state}`;
107
+ try {
108
+ await openBrowser(authUrl);
109
+ }
110
+ catch (error) {
111
+ console.log(`Please visit this URL to log in: ${authUrl}`);
112
+ }
113
+ });
114
+ // Timeout after 5 minutes
115
+ setTimeout(() => {
116
+ server.close();
117
+ reject(new AuthError('Authentication timeout'));
118
+ }, 5 * 60 * 1000);
119
+ });
120
+ }
121
+ async exchangeCodeForToken(code) {
122
+ const response = await fetch(`${CONSTANTS.API_BASE}/auth/token`, {
123
+ method: 'POST',
124
+ headers: {
125
+ 'Content-Type': 'application/x-www-form-urlencoded',
126
+ },
127
+ body: new URLSearchParams({
128
+ grant_type: 'authorization_code',
129
+ client_id: CONSTANTS.OAUTH_CLIENT_ID,
130
+ code,
131
+ redirect_uri: CONSTANTS.OAUTH_REDIRECT,
132
+ }),
133
+ });
134
+ if (!response.ok) {
135
+ throw new AuthError('Failed to exchange code for token');
136
+ }
137
+ const data = await response.json();
138
+ return {
139
+ access_token: data.access_token,
140
+ refresh_token: data.refresh_token,
141
+ expires_at: Date.now() + (data.expires_in * 1000),
142
+ token_type: data.token_type || 'Bearer',
143
+ };
144
+ }
145
+ async refreshToken(token) {
146
+ const response = await fetch(`${CONSTANTS.API_BASE}/auth/token`, {
147
+ method: 'POST',
148
+ headers: {
149
+ 'Content-Type': 'application/x-www-form-urlencoded',
150
+ },
151
+ body: new URLSearchParams({
152
+ grant_type: 'refresh_token',
153
+ client_id: CONSTANTS.OAUTH_CLIENT_ID,
154
+ code: token.refresh_token,
155
+ }),
156
+ });
157
+ if (!response.ok) {
158
+ throw new AuthError('Failed to refresh token', [
159
+ 'Try logging in again with \'basic login\'',
160
+ ]);
161
+ }
162
+ const data = await response.json();
163
+ return {
164
+ access_token: data.access_token,
165
+ refresh_token: data.refresh_token || token.refresh_token,
166
+ expires_at: Date.now() + (data.expires_in * 1000),
167
+ token_type: data.token_type || 'Bearer',
168
+ };
169
+ }
170
+ async saveToken(token) {
171
+ const tokenPath = getConfigPath();
172
+ const configDir = getConfigDir();
173
+ // Create directory if it doesn't exist
174
+ await fs.mkdir(configDir, { recursive: true });
175
+ // Write token with restrictive permissions
176
+ await fs.writeFile(tokenPath, JSON.stringify(token, null, 2), { mode: 0o600 });
177
+ }
178
+ async deleteToken() {
179
+ const tokenPath = getConfigPath();
180
+ try {
181
+ await fs.unlink(tokenPath);
182
+ }
183
+ catch (error) {
184
+ if (error.code !== 'ENOENT') {
185
+ throw error;
186
+ }
187
+ }
188
+ }
189
+ generateState() {
190
+ const array = new Uint8Array(24);
191
+ crypto.getRandomValues(array);
192
+ return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');
193
+ }
194
+ getSuccessHtml() {
195
+ return `
196
+ <!DOCTYPE html>
197
+ <html>
198
+ <head>
199
+ <meta charset="UTF-8">
200
+ <title>Basic CLI Authentication</title>
201
+ <style>
202
+ :root { color-scheme: light dark; }
203
+ @media (prefers-color-scheme: light) {
204
+ :root {
205
+ --bg-color: #f5f5f5;
206
+ --container-bg: #ffffff;
207
+ --text-color: #000000;
208
+ --shadow: 0 2px 4px rgba(0,0,0,0.1);
209
+ }
210
+ }
211
+ @media (prefers-color-scheme: dark) {
212
+ :root {
213
+ --bg-color: #1a1a1a;
214
+ --container-bg: #2d2d2d;
215
+ --text-color: #ffffff;
216
+ --shadow: 0 2px 4px rgba(0,0,0,0.3);
217
+ }
218
+ }
219
+ body {
220
+ font-family: monospace;
221
+ display: flex;
222
+ justify-content: center;
223
+ align-items: center;
224
+ height: 100vh;
225
+ margin: 0;
226
+ background-color: var(--bg-color);
227
+ color: var(--text-color);
228
+ }
229
+ .container {
230
+ text-align: center;
231
+ padding: 2rem;
232
+ background: var(--container-bg);
233
+ border-radius: 8px;
234
+ box-shadow: var(--shadow);
235
+ }
236
+ .success-icon {
237
+ color: #AE87FF;
238
+ font-size: 32px;
239
+ margin-bottom: 1rem;
240
+ }
241
+ h2 { margin: 0 0 1rem 0; }
242
+ p { margin: 0; opacity: 0.8; }
243
+ .help-text {
244
+ margin-top: 1.5rem;
245
+ font-size: 0.9em;
246
+ opacity: 0.7;
247
+ text-align: left;
248
+ }
249
+ .help-text ol {
250
+ margin: 0;
251
+ padding-left: 1.5rem;
252
+ }
253
+ .help-text li { margin: 0.3rem 0; }
254
+ code {
255
+ background: var(--bg-color);
256
+ padding: 0.2em 0.4em;
257
+ border-radius: 4px;
258
+ font-family: monospace;
259
+ font-size: 0.9em;
260
+ }
261
+ a {
262
+ color: #AE87FF;
263
+ text-decoration: none;
264
+ }
265
+ a:hover { text-decoration: underline; }
266
+ </style>
267
+ </head>
268
+ <body>
269
+ <div class="container">
270
+ <div class="success-icon">✅</div>
271
+ <h2>Authentication Successful!</h2>
272
+ <p>You can close this window and return to the CLI.</p>
273
+ <div class="help-text">
274
+ <ol>
275
+ <li>Use command <code>basic help</code> to get started with the CLI</li>
276
+ <li>Visit the <a href="https://docs.basic.tech" target="_blank">Basic docs</a> for more info</li>
277
+ </ol>
278
+ </div>
279
+ </div>
280
+ <script>
281
+ setTimeout(() => window.close(), 3000);
282
+ </script>
283
+ </body>
284
+ </html>
285
+ `;
286
+ }
287
+ }
288
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ConfigTemplate, ConfigTemplateInfo } from './types';
2
+ export declare const CONFIG_TEMPLATES: Record<ConfigTemplate, ConfigTemplateInfo>;
3
+ export declare function generateConfigContent(template: ConfigTemplate, projectId: string, projectName: string): string;
4
+ export declare function createConfigFile(template: ConfigTemplate, projectId: string, projectName: string, targetDir?: string): Promise<string | null>;
5
+ export declare function checkForExistingConfig(targetDir?: string): Promise<string | null>;
6
+ export declare function readExistingConfig(targetDir?: string): Promise<{
7
+ projectId: string;
8
+ } | null>;
9
+ //# sourceMappingURL=config-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-templates.d.ts","sourceRoot":"","sources":["../../src/lib/config-templates.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAmBvE,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAyC9G;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAexB;AAED,wBAAsB,sBAAsB,CAAC,SAAS,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBtG;AAED,wBAAsB,kBAAkB,CAAC,SAAS,GAAE,MAAsB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAyBjH"}
@@ -0,0 +1,117 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ export const CONFIG_TEMPLATES = {
4
+ typescript: {
5
+ name: 'TypeScript',
6
+ description: '',
7
+ filename: 'basic.config.ts',
8
+ extension: 'ts'
9
+ },
10
+ javascript: {
11
+ name: 'JavaScript',
12
+ description: '',
13
+ filename: 'basic.config.js',
14
+ extension: 'js'
15
+ },
16
+ none: {
17
+ name: 'None',
18
+ description: 'No configuration file',
19
+ filename: '',
20
+ extension: ''
21
+ }
22
+ };
23
+ export function generateConfigContent(template, projectId, projectName) {
24
+ const baseConfig = {
25
+ project_id: projectId,
26
+ version: 0,
27
+ tables: {
28
+ example: {
29
+ type: 'collection',
30
+ fields: {
31
+ value: {
32
+ type: 'string'
33
+ }
34
+ }
35
+ }
36
+ }
37
+ };
38
+ switch (template) {
39
+ case 'typescript':
40
+ return `// Basic Project Configuration
41
+ // see the docs for more info: https://docs.basic.tech
42
+
43
+ const schema = ${JSON.stringify(baseConfig, null, 2)};
44
+
45
+ export default schema;
46
+ `;
47
+ case 'javascript':
48
+ return `// Basic Project Configuration
49
+ // see the docs for more info: https://docs.basic.tech
50
+
51
+ const schema = ${JSON.stringify(baseConfig, null, 2)};
52
+
53
+ module.exports = schema;
54
+ `;
55
+ case 'none':
56
+ return '';
57
+ default:
58
+ throw new Error(`Unknown template: ${template}`);
59
+ }
60
+ }
61
+ export async function createConfigFile(template, projectId, projectName, targetDir = process.cwd()) {
62
+ if (template === 'none') {
63
+ return null;
64
+ }
65
+ const templateInfo = CONFIG_TEMPLATES[template];
66
+ const configPath = path.join(targetDir, templateInfo.filename);
67
+ const content = generateConfigContent(template, projectId, projectName);
68
+ try {
69
+ await fs.writeFile(configPath, content, 'utf8');
70
+ return configPath;
71
+ }
72
+ catch (error) {
73
+ throw new Error(`Failed to create config file: ${error instanceof Error ? error.message : 'Unknown error'}`);
74
+ }
75
+ }
76
+ export async function checkForExistingConfig(targetDir = process.cwd()) {
77
+ const possibleConfigs = [
78
+ 'basic.config.ts',
79
+ 'basic.config.js',
80
+ 'basic.config.json'
81
+ ];
82
+ for (const filename of possibleConfigs) {
83
+ const filePath = path.join(targetDir, filename);
84
+ try {
85
+ await fs.access(filePath);
86
+ return filePath; // File exists
87
+ }
88
+ catch {
89
+ // File doesn't exist, continue checking
90
+ }
91
+ }
92
+ return null; // No config file found
93
+ }
94
+ export async function readExistingConfig(targetDir = process.cwd()) {
95
+ const configPath = await checkForExistingConfig(targetDir);
96
+ if (!configPath) {
97
+ return null;
98
+ }
99
+ try {
100
+ const content = await fs.readFile(configPath, 'utf8');
101
+ // Try to parse as JSON first
102
+ if (configPath.endsWith('.json')) {
103
+ const config = JSON.parse(content);
104
+ return { projectId: config.project_id };
105
+ }
106
+ // For .js/.ts files, try to extract project_id using regex
107
+ const projectIdMatch = content.match(/["']?project_id["']?\s*:\s*["']([^"']+)["']/);
108
+ if (projectIdMatch) {
109
+ return { projectId: projectIdMatch[1] };
110
+ }
111
+ return null;
112
+ }
113
+ catch (error) {
114
+ throw new Error(`Failed to read existing config: ${error instanceof Error ? error.message : 'Unknown error'}`);
115
+ }
116
+ }
117
+ //# sourceMappingURL=config-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-templates.js","sourceRoot":"","sources":["../../src/lib/config-templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare const CONSTANTS: {
2
+ readonly CLI_DIR: ".basic-cli";
3
+ readonly TOKEN_FILE: "token.json";
4
+ readonly API_BASE: "https://api.basic.tech";
5
+ readonly OAUTH_CLIENT_ID: "9c3f6704-87e7-4af9-8dd0-36dcb9b5c18c";
6
+ readonly OAUTH_REDIRECT: "http://localhost:8080/callback";
7
+ readonly OAUTH_SCOPES: "profile,admin";
8
+ readonly MAX_WIDTH: 80;
9
+ readonly SIMILARITY_THRESHOLD: 0.4;
10
+ readonly GITHUB_REPO: "basicdb/basic-cli";
11
+ };
12
+ export declare const COMMANDS: readonly ["account", "login", "logout", "status", "projects", "teams", "init", "version", "help", "push", "pull", "debug", "update"];
13
+ export declare const MESSAGES: {
14
+ readonly OFFLINE: "you are offline. please check your internet connection.";
15
+ readonly LOGGED_OUT: "you are not logged in. please login with 'basic login'";
16
+ readonly WELCOME: "welcome to basic-cli! use 'basic help' to see all commands";
17
+ };
18
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;;;;;CAUZ,CAAC;AAEX,eAAO,MAAM,QAAQ,sIAcX,CAAC;AAEX,eAAO,MAAM,QAAQ;;;;CAIX,CAAC"}
@@ -0,0 +1,32 @@
1
+ export const CONSTANTS = {
2
+ CLI_DIR: '.basic-cli',
3
+ TOKEN_FILE: 'token.json',
4
+ API_BASE: 'https://api.basic.tech',
5
+ OAUTH_CLIENT_ID: '9c3f6704-87e7-4af9-8dd0-36dcb9b5c18c',
6
+ OAUTH_REDIRECT: 'http://localhost:8080/callback',
7
+ OAUTH_SCOPES: 'profile,admin',
8
+ MAX_WIDTH: 80,
9
+ SIMILARITY_THRESHOLD: 0.4,
10
+ GITHUB_REPO: 'basicdb/basic-cli'
11
+ };
12
+ export const COMMANDS = [
13
+ 'account',
14
+ 'login',
15
+ 'logout',
16
+ 'status',
17
+ 'projects',
18
+ 'teams',
19
+ 'init',
20
+ 'version',
21
+ 'help',
22
+ 'push',
23
+ 'pull',
24
+ 'debug',
25
+ 'update'
26
+ ];
27
+ export const MESSAGES = {
28
+ OFFLINE: 'you are offline. please check your internet connection.',
29
+ LOGGED_OUT: 'you are not logged in. please login with \'basic login\'',
30
+ WELCOME: 'welcome to basic-cli! use \'basic help\' to see all commands'
31
+ };
32
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO,EAAE,YAAY;IACrB,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,wBAAwB;IAClC,eAAe,EAAE,sCAAsC;IACvD,cAAc,EAAE,gCAAgC;IAChD,YAAY,EAAE,eAAe;IAC7B,SAAS,EAAE,EAAE;IACb,oBAAoB,EAAE,GAAG;IACzB,WAAW,EAAE,mBAAmB;CACxB,CAAC;AAEX,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,OAAO;IACP,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,yDAAyD;IAClE,UAAU,EAAE,0DAA0D;IACtE,OAAO,EAAE,8DAA8D;CAC/D,CAAC"}