@hypequery/cli 0.0.6 → 0.0.8

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 (68) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +11 -11
  3. package/dist/bin/cli.d.ts +0 -3
  4. package/dist/bin/cli.d.ts.map +0 -1
  5. package/dist/bin/cli.js +0 -86
  6. package/dist/cli.d.ts +0 -4
  7. package/dist/cli.d.ts.map +0 -1
  8. package/dist/cli.js +0 -162
  9. package/dist/commands/create-api-types.d.ts +0 -6
  10. package/dist/commands/create-api-types.d.ts.map +0 -1
  11. package/dist/commands/create-api-types.js +0 -149
  12. package/dist/commands/dev.d.ts +0 -12
  13. package/dist/commands/dev.d.ts.map +0 -1
  14. package/dist/commands/dev.js +0 -249
  15. package/dist/commands/generate.d.ts +0 -8
  16. package/dist/commands/generate.d.ts.map +0 -1
  17. package/dist/commands/generate.js +0 -175
  18. package/dist/commands/init.d.ts +0 -9
  19. package/dist/commands/init.d.ts.map +0 -1
  20. package/dist/commands/init.js +0 -362
  21. package/dist/commands/toolkit.d.ts +0 -6
  22. package/dist/commands/toolkit.d.ts.map +0 -1
  23. package/dist/commands/toolkit.js +0 -159
  24. package/dist/generators/clickhouse.d.ts +0 -7
  25. package/dist/generators/clickhouse.d.ts.map +0 -1
  26. package/dist/generators/clickhouse.js +0 -229
  27. package/dist/generators/index.d.ts +0 -7
  28. package/dist/generators/index.d.ts.map +0 -1
  29. package/dist/generators/index.js +0 -13
  30. package/dist/templates/client.d.ts +0 -5
  31. package/dist/templates/client.d.ts.map +0 -1
  32. package/dist/templates/client.js +0 -6
  33. package/dist/templates/env.d.ts +0 -14
  34. package/dist/templates/env.d.ts.map +0 -1
  35. package/dist/templates/env.js +0 -37
  36. package/dist/templates/gitignore.d.ts +0 -13
  37. package/dist/templates/gitignore.d.ts.map +0 -1
  38. package/dist/templates/gitignore.js +0 -22
  39. package/dist/templates/queries.d.ts +0 -8
  40. package/dist/templates/queries.d.ts.map +0 -1
  41. package/dist/templates/queries.js +0 -27
  42. package/dist/test-utils.d.ts +0 -86
  43. package/dist/test-utils.d.ts.map +0 -1
  44. package/dist/test-utils.js +0 -153
  45. package/dist/utils/clickhouse-client.d.ts +0 -11
  46. package/dist/utils/clickhouse-client.d.ts.map +0 -1
  47. package/dist/utils/clickhouse-client.js +0 -86
  48. package/dist/utils/detect-database.d.ts +0 -21
  49. package/dist/utils/detect-database.d.ts.map +0 -1
  50. package/dist/utils/detect-database.js +0 -224
  51. package/dist/utils/ensure-ts-runtime.d.ts +0 -4
  52. package/dist/utils/ensure-ts-runtime.d.ts.map +0 -1
  53. package/dist/utils/ensure-ts-runtime.js +0 -66
  54. package/dist/utils/error-messages.d.ts +0 -6
  55. package/dist/utils/error-messages.d.ts.map +0 -1
  56. package/dist/utils/error-messages.js +0 -19
  57. package/dist/utils/find-files.d.ts +0 -21
  58. package/dist/utils/find-files.d.ts.map +0 -1
  59. package/dist/utils/find-files.js +0 -183
  60. package/dist/utils/load-api.d.ts +0 -2
  61. package/dist/utils/load-api.d.ts.map +0 -1
  62. package/dist/utils/load-api.js +0 -328
  63. package/dist/utils/logger.d.ts +0 -54
  64. package/dist/utils/logger.d.ts.map +0 -1
  65. package/dist/utils/logger.js +0 -122
  66. package/dist/utils/prompts.d.ts +0 -39
  67. package/dist/utils/prompts.d.ts.map +0 -1
  68. package/dist/utils/prompts.js +0 -282
@@ -1,362 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- var __generator = (this && this.__generator) || function (thisArg, body) {
11
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
- function verb(n) { return function (v) { return step([n, v]); }; }
14
- function step(op) {
15
- if (f) throw new TypeError("Generator is already executing.");
16
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
- if (y = 0, t) op = [op[0] & 2, t.value];
19
- switch (op[0]) {
20
- case 0: case 1: t = op; break;
21
- case 4: _.label++; return { value: op[1], done: false };
22
- case 5: _.label++; y = op[1]; op = [0]; continue;
23
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
- default:
25
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
- if (t[2]) _.ops.pop();
30
- _.trys.pop(); continue;
31
- }
32
- op = body.call(thisArg, _);
33
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
- }
36
- };
37
- import { mkdir, writeFile, readFile, access } from 'node:fs/promises';
38
- import path from 'node:path';
39
- import ora from 'ora';
40
- import { logger } from '../utils/logger.js';
41
- import { promptDatabaseType, promptClickHouseConnection, promptOutputDirectory, promptGenerateExample, promptTableSelection, confirmOverwrite, promptRetry, promptContinueWithoutDb, } from '../utils/prompts.js';
42
- import { validateConnection, getTableCount, getTables, } from '../utils/detect-database.js';
43
- import { hasEnvFile, hasGitignore, } from '../utils/find-files.js';
44
- import { generateEnvTemplate, appendToEnv } from '../templates/env.js';
45
- import { generateClientTemplate } from '../templates/client.js';
46
- import { generateQueriesTemplate } from '../templates/queries.js';
47
- import { appendToGitignore } from '../templates/gitignore.js';
48
- import { getTypeGenerator } from '../generators/index.js';
49
- export function initCommand() {
50
- return __awaiter(this, arguments, void 0, function (options) {
51
- var dbType, connectionConfig, hasValidConnection, tableCount, required, spinner, isValid, retry, continueWithout, outputDir, resolvedOutputDir, filesToCreate, existingFiles, _i, filesToCreate_1, file, _a, shouldOverwrite, generateExample, selectedTable, tables, envPath, envExists, existingEnv, newEnv, envPath, envExists, placeholderConfig, schemaPath, typeSpinner, generator, error_1, clientPath, queriesPath, gitignorePath, gitignoreExists, existingGitignore, newGitignore, exampleQueryKey;
52
- var _b;
53
- if (options === void 0) { options = {}; }
54
- return __generator(this, function (_c) {
55
- switch (_c.label) {
56
- case 0:
57
- logger.newline();
58
- logger.header('Welcome to hypequery!');
59
- logger.info("Let's set up your analytics layer.");
60
- logger.newline();
61
- dbType = options.database;
62
- if (!(!dbType || dbType === 'unknown')) return [3 /*break*/, 2];
63
- return [4 /*yield*/, promptDatabaseType()];
64
- case 1:
65
- dbType = _c.sent();
66
- _c.label = 2;
67
- case 2:
68
- // Handle user cancellation
69
- if (!dbType) {
70
- logger.info('Setup cancelled');
71
- process.exit(0);
72
- }
73
- // Only ClickHouse is supported for now
74
- if (dbType !== 'clickhouse') {
75
- logger.error("".concat(dbType, " is not yet supported. Only ClickHouse is available."));
76
- process.exit(1);
77
- }
78
- connectionConfig = null;
79
- hasValidConnection = false;
80
- tableCount = 0;
81
- if (!options.noInteractive) return [3 /*break*/, 3];
82
- required = function (key) {
83
- var value = process.env[key];
84
- if (!value) {
85
- throw new Error("Missing ".concat(key, ". Provide ClickHouse connection info via environment variables when using --no-interactive."));
86
- }
87
- return value;
88
- };
89
- connectionConfig = {
90
- host: required('CLICKHOUSE_HOST'),
91
- database: required('CLICKHOUSE_DATABASE'),
92
- username: required('CLICKHOUSE_USERNAME'),
93
- password: (_b = process.env.CLICKHOUSE_PASSWORD) !== null && _b !== void 0 ? _b : '',
94
- };
95
- return [3 /*break*/, 5];
96
- case 3: return [4 /*yield*/, promptClickHouseConnection()];
97
- case 4:
98
- connectionConfig = _c.sent();
99
- _c.label = 5;
100
- case 5:
101
- if (!!connectionConfig) return [3 /*break*/, 6];
102
- logger.info('Skipping database connection for now.');
103
- logger.newline();
104
- return [3 /*break*/, 12];
105
- case 6:
106
- spinner = ora('Testing connection...').start();
107
- // Set env vars temporarily for connection test
108
- process.env.CLICKHOUSE_HOST = connectionConfig.host;
109
- process.env.CLICKHOUSE_DATABASE = connectionConfig.database;
110
- process.env.CLICKHOUSE_USERNAME = connectionConfig.username;
111
- process.env.CLICKHOUSE_PASSWORD = connectionConfig.password;
112
- return [4 /*yield*/, validateConnection(dbType)];
113
- case 7:
114
- isValid = _c.sent();
115
- if (!!isValid) return [3 /*break*/, 10];
116
- spinner.fail('Connection failed');
117
- logger.newline();
118
- logger.error("Could not connect to ClickHouse at ".concat(connectionConfig.host));
119
- logger.newline();
120
- logger.info('Common issues:');
121
- logger.indent('• Check your host URL includes http:// or https://');
122
- logger.indent('• Verify username and password');
123
- logger.indent('• Ensure database exists');
124
- logger.indent('• Check firewall/network access');
125
- logger.newline();
126
- return [4 /*yield*/, promptRetry('Try again?')];
127
- case 8:
128
- retry = _c.sent();
129
- if (retry) {
130
- return [2 /*return*/, initCommand(options)];
131
- }
132
- return [4 /*yield*/, promptContinueWithoutDb()];
133
- case 9:
134
- continueWithout = _c.sent();
135
- if (!continueWithout) {
136
- logger.info('Setup cancelled');
137
- process.exit(0);
138
- }
139
- logger.newline();
140
- logger.info('Continuing without database connection.');
141
- logger.info('You can configure the connection later in .env');
142
- logger.newline();
143
- connectionConfig = null; // Clear invalid config
144
- return [3 /*break*/, 12];
145
- case 10: return [4 /*yield*/, getTableCount(dbType)];
146
- case 11:
147
- tableCount = _c.sent();
148
- spinner.succeed("Connected successfully (".concat(tableCount, " tables found)"));
149
- logger.newline();
150
- hasValidConnection = true;
151
- _c.label = 12;
152
- case 12:
153
- outputDir = options.path;
154
- if (!(!outputDir && !options.noInteractive)) return [3 /*break*/, 14];
155
- return [4 /*yield*/, promptOutputDirectory()];
156
- case 13:
157
- outputDir = _c.sent();
158
- return [3 /*break*/, 15];
159
- case 14:
160
- if (!outputDir) {
161
- outputDir = 'analytics';
162
- }
163
- _c.label = 15;
164
- case 15:
165
- resolvedOutputDir = path.resolve(process.cwd(), outputDir);
166
- filesToCreate = [
167
- path.join(resolvedOutputDir, 'client.ts'),
168
- path.join(resolvedOutputDir, 'schema.ts'),
169
- path.join(resolvedOutputDir, 'queries.ts'),
170
- ];
171
- existingFiles = [];
172
- _i = 0, filesToCreate_1 = filesToCreate;
173
- _c.label = 16;
174
- case 16:
175
- if (!(_i < filesToCreate_1.length)) return [3 /*break*/, 21];
176
- file = filesToCreate_1[_i];
177
- _c.label = 17;
178
- case 17:
179
- _c.trys.push([17, 19, , 20]);
180
- return [4 /*yield*/, access(file)];
181
- case 18:
182
- _c.sent();
183
- existingFiles.push(path.relative(process.cwd(), file));
184
- return [3 /*break*/, 20];
185
- case 19:
186
- _a = _c.sent();
187
- return [3 /*break*/, 20];
188
- case 20:
189
- _i++;
190
- return [3 /*break*/, 16];
191
- case 21:
192
- if (!(existingFiles.length > 0 && !options.force)) return [3 /*break*/, 23];
193
- logger.warn('Files already exist');
194
- logger.newline();
195
- return [4 /*yield*/, confirmOverwrite(existingFiles)];
196
- case 22:
197
- shouldOverwrite = _c.sent();
198
- if (!shouldOverwrite) {
199
- logger.info('Setup cancelled');
200
- process.exit(0);
201
- }
202
- logger.newline();
203
- _c.label = 23;
204
- case 23:
205
- generateExample = !options.noExample && hasValidConnection;
206
- selectedTable = null;
207
- if (!(generateExample && !options.noInteractive && hasValidConnection)) return [3 /*break*/, 27];
208
- return [4 /*yield*/, promptGenerateExample()];
209
- case 24:
210
- generateExample = _c.sent();
211
- if (!generateExample) return [3 /*break*/, 27];
212
- return [4 /*yield*/, getTables(dbType)];
213
- case 25:
214
- tables = _c.sent();
215
- return [4 /*yield*/, promptTableSelection(tables)];
216
- case 26:
217
- selectedTable = _c.sent();
218
- generateExample = selectedTable !== null;
219
- _c.label = 27;
220
- case 27:
221
- logger.newline();
222
- // Step 7: Create directory
223
- return [4 /*yield*/, mkdir(resolvedOutputDir, { recursive: true })];
224
- case 28:
225
- // Step 7: Create directory
226
- _c.sent();
227
- if (!connectionConfig) return [3 /*break*/, 35];
228
- envPath = path.join(process.cwd(), '.env');
229
- return [4 /*yield*/, hasEnvFile()];
230
- case 29:
231
- envExists = _c.sent();
232
- if (!envExists) return [3 /*break*/, 32];
233
- return [4 /*yield*/, readFile(envPath, 'utf-8')];
234
- case 30:
235
- existingEnv = _c.sent();
236
- newEnv = appendToEnv(existingEnv, generateEnvTemplate(connectionConfig));
237
- return [4 /*yield*/, writeFile(envPath, newEnv)];
238
- case 31:
239
- _c.sent();
240
- logger.success('Updated .env');
241
- return [3 /*break*/, 34];
242
- case 32: return [4 /*yield*/, writeFile(envPath, generateEnvTemplate(connectionConfig))];
243
- case 33:
244
- _c.sent();
245
- logger.success('Created .env');
246
- _c.label = 34;
247
- case 34: return [3 /*break*/, 38];
248
- case 35:
249
- envPath = path.join(process.cwd(), '.env');
250
- return [4 /*yield*/, hasEnvFile()];
251
- case 36:
252
- envExists = _c.sent();
253
- placeholderConfig = {
254
- host: 'YOUR_CLICKHOUSE_HOST',
255
- database: 'YOUR_DATABASE',
256
- username: 'YOUR_USERNAME',
257
- password: 'YOUR_PASSWORD',
258
- };
259
- if (!!envExists) return [3 /*break*/, 38];
260
- return [4 /*yield*/, writeFile(envPath, generateEnvTemplate(placeholderConfig))];
261
- case 37:
262
- _c.sent();
263
- logger.success('Created .env (configure your credentials)');
264
- _c.label = 38;
265
- case 38:
266
- schemaPath = path.join(resolvedOutputDir, 'schema.ts');
267
- if (!hasValidConnection) return [3 /*break*/, 43];
268
- typeSpinner = ora('Generating TypeScript types...').start();
269
- _c.label = 39;
270
- case 39:
271
- _c.trys.push([39, 41, , 42]);
272
- generator = getTypeGenerator('clickhouse');
273
- return [4 /*yield*/, generator({ outputPath: schemaPath })];
274
- case 40:
275
- _c.sent();
276
- typeSpinner.succeed("Generated TypeScript types (".concat(path.relative(process.cwd(), schemaPath), ")"));
277
- return [3 /*break*/, 42];
278
- case 41:
279
- error_1 = _c.sent();
280
- typeSpinner.fail('Failed to generate types');
281
- logger.error(error_1 instanceof Error ? error_1.message : String(error_1));
282
- process.exit(1);
283
- return [3 /*break*/, 42];
284
- case 42: return [3 /*break*/, 45];
285
- case 43:
286
- // Create placeholder schema file
287
- return [4 /*yield*/, writeFile(schemaPath, "// Generated by hypequery\n// Run 'npx hypequery generate' after configuring your database connection\n\nexport interface IntrospectedSchema {\n // Your table types will appear here after generation\n}\n")];
288
- case 44:
289
- // Create placeholder schema file
290
- _c.sent();
291
- logger.success("Created placeholder schema (".concat(path.relative(process.cwd(), schemaPath), ")"));
292
- _c.label = 45;
293
- case 45:
294
- clientPath = path.join(resolvedOutputDir, 'client.ts');
295
- return [4 /*yield*/, writeFile(clientPath, generateClientTemplate())];
296
- case 46:
297
- _c.sent();
298
- logger.success("Created ClickHouse client (".concat(path.relative(process.cwd(), clientPath), ")"));
299
- queriesPath = path.join(resolvedOutputDir, 'queries.ts');
300
- return [4 /*yield*/, writeFile(queriesPath, generateQueriesTemplate({
301
- hasExample: generateExample,
302
- tableName: selectedTable || undefined,
303
- }))];
304
- case 47:
305
- _c.sent();
306
- logger.success("Created queries file (".concat(path.relative(process.cwd(), queriesPath), ")"));
307
- if (generateExample && selectedTable) {
308
- logger.success("Created example query using '".concat(selectedTable, "' table"));
309
- }
310
- gitignorePath = path.join(process.cwd(), '.gitignore');
311
- return [4 /*yield*/, hasGitignore()];
312
- case 48:
313
- gitignoreExists = _c.sent();
314
- if (!gitignoreExists) return [3 /*break*/, 52];
315
- return [4 /*yield*/, readFile(gitignorePath, 'utf-8')];
316
- case 49:
317
- existingGitignore = _c.sent();
318
- newGitignore = appendToGitignore(existingGitignore);
319
- if (!(newGitignore !== existingGitignore)) return [3 /*break*/, 51];
320
- return [4 /*yield*/, writeFile(gitignorePath, newGitignore)];
321
- case 50:
322
- _c.sent();
323
- logger.success('Updated .gitignore');
324
- _c.label = 51;
325
- case 51: return [3 /*break*/, 54];
326
- case 52: return [4 /*yield*/, writeFile(gitignorePath, appendToGitignore(''))];
327
- case 53:
328
- _c.sent();
329
- logger.success('Created .gitignore');
330
- _c.label = 54;
331
- case 54:
332
- // Step 13: Success message
333
- logger.newline();
334
- logger.header('Setup complete!');
335
- if (hasValidConnection) {
336
- logger.info('Try your first query:');
337
- logger.newline();
338
- logger.indent("import { api } from './".concat(path.relative(process.cwd(), queriesPath).replace(/\.ts$/, '.js'), "'"));
339
- exampleQueryKey = generateExample && selectedTable
340
- ? "".concat(selectedTable.replace(/_([a-z])/g, function (_, l) { return l.toUpperCase(); }), "Query")
341
- : 'exampleMetric';
342
- logger.indent("const result = await api.execute('".concat(exampleQueryKey, "')"));
343
- logger.newline();
344
- logger.info('Next:');
345
- logger.indent('npx hypequery dev Start development server');
346
- logger.newline();
347
- }
348
- else {
349
- logger.info('Next steps:');
350
- logger.newline();
351
- logger.indent('1. Configure your database connection in .env');
352
- logger.indent('2. Run: npx hypequery generate (to generate types)');
353
- logger.indent('3. Run: npx hypequery dev (to start dev server)');
354
- logger.newline();
355
- }
356
- logger.info('Docs: https://hypequery.com/docs');
357
- logger.newline();
358
- return [2 /*return*/];
359
- }
360
- });
361
- });
362
- }
@@ -1,6 +0,0 @@
1
- export interface ToolkitOptions {
2
- output?: string;
3
- name?: string;
4
- }
5
- export declare function toolkitCommand(file?: string, options?: ToolkitOptions): Promise<void>;
6
- //# sourceMappingURL=toolkit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolkit.d.ts","sourceRoot":"","sources":["../../src/commands/toolkit.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA4DD,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,iBA4D/E"}
@@ -1,159 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- var __generator = (this && this.__generator) || function (thisArg, body) {
11
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
- function verb(n) { return function (v) { return step([n, v]); }; }
14
- function step(op) {
15
- if (f) throw new TypeError("Generator is already executing.");
16
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
- if (y = 0, t) op = [op[0] & 2, t.value];
19
- switch (op[0]) {
20
- case 0: case 1: t = op; break;
21
- case 4: _.label++; return { value: op[1], done: false };
22
- case 5: _.label++; y = op[1]; op = [0]; continue;
23
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
- default:
25
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
- if (t[2]) _.ops.pop();
30
- _.trys.pop(); continue;
31
- }
32
- op = body.call(thisArg, _);
33
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
- }
36
- };
37
- import fs from 'node:fs/promises';
38
- import path from 'node:path';
39
- import ora from 'ora';
40
- import { logger } from '../utils/logger.js';
41
- import { findQueriesFile } from '../utils/find-files.js';
42
- import { loadApiModule } from '../utils/load-api.js';
43
- var DEFAULT_TYPE_NAME = 'HypequeryApi';
44
- var ensureDotPrefix = function (value) { return (value.startsWith('.') ? value : "./".concat(value)); };
45
- var removeExtension = function (value) { return value.replace(/\.(tsx|ts|mts|cts|jsx|js|mjs|cjs)$/i, ''); };
46
- function getDefaultOutputPath(queriesFile) {
47
- var directory = path.dirname(queriesFile);
48
- return path.join(directory, 'client.ts');
49
- }
50
- function buildImportPath(from, to) {
51
- var relative = path.relative(path.dirname(from), to).replace(/\\/g, '/');
52
- return removeExtension(ensureDotPrefix(relative));
53
- }
54
- function buildClientFile(typeName, queries, importPath) {
55
- var lines = [];
56
- lines.push('// @generated by hypequery toolkit');
57
- lines.push("// ".concat(new Date().toISOString()));
58
- lines.push('// Do not edit manually.');
59
- lines.push('');
60
- lines.push("import type { InferQueryInput, InferQueryResult } from '@hypequery/serve';");
61
- lines.push("import type * as HypequeryModule from '".concat(importPath, "';"));
62
- lines.push('');
63
- lines.push('type ServeApi = HypequeryModule extends { api: infer T }');
64
- lines.push(' ? T');
65
- lines.push(' : HypequeryModule extends { default: infer T }');
66
- lines.push(' ? T');
67
- lines.push(' : never;');
68
- lines.push('');
69
- lines.push("export type ".concat(typeName, " = {"));
70
- if (queries.length === 0) {
71
- lines.push(' // No queries registered yet');
72
- }
73
- else {
74
- for (var _i = 0, queries_1 = queries; _i < queries_1.length; _i++) {
75
- var query = queries_1[_i];
76
- lines.push(" ".concat(query, ": {"));
77
- lines.push(" input: InferQueryInput<ServeApi, '".concat(query, "'>;"));
78
- lines.push(" output: InferQueryResult<ServeApi, '".concat(query, "'>;"));
79
- lines.push(' };');
80
- }
81
- }
82
- lines.push('};');
83
- lines.push('');
84
- return lines.join('\n');
85
- }
86
- export function toolkitCommand(file_1) {
87
- return __awaiter(this, arguments, void 0, function (file, options) {
88
- var queriesFile, outputPath, typeName, spinner, api, queryKeys, importPath, fileContents, relativeOutput, error_1;
89
- var _a, _b, _c;
90
- if (options === void 0) { options = {}; }
91
- return __generator(this, function (_d) {
92
- switch (_d.label) {
93
- case 0: return [4 /*yield*/, findQueriesFile(file)];
94
- case 1:
95
- queriesFile = _d.sent();
96
- if (!queriesFile) {
97
- logger.error('Could not find queries file');
98
- logger.newline();
99
- logger.info('Expected one of:');
100
- logger.indent('• analytics/queries.ts');
101
- logger.indent('• src/analytics/queries.ts');
102
- logger.indent('• hypequery.ts');
103
- logger.newline();
104
- logger.info("Did you run 'hypequery init'?");
105
- logger.newline();
106
- logger.info('Or specify the file explicitly:');
107
- logger.indent('hypequery toolkit ./path/to/queries.ts');
108
- logger.newline();
109
- process.exit(1);
110
- }
111
- outputPath = path.resolve(process.cwd(), (_a = options.output) !== null && _a !== void 0 ? _a : getDefaultOutputPath(queriesFile));
112
- typeName = (_b = options.name) !== null && _b !== void 0 ? _b : DEFAULT_TYPE_NAME;
113
- spinner = ora('Loading serve API...').start();
114
- _d.label = 2;
115
- case 2:
116
- _d.trys.push([2, 6, , 7]);
117
- return [4 /*yield*/, loadApiModule(queriesFile)];
118
- case 3:
119
- api = _d.sent();
120
- spinner.succeed('Loaded serve API');
121
- queryKeys = Object.keys((_c = api.queries) !== null && _c !== void 0 ? _c : {}).sort();
122
- importPath = buildImportPath(outputPath, queriesFile);
123
- fileContents = buildClientFile(typeName, queryKeys, importPath);
124
- return [4 /*yield*/, fs.mkdir(path.dirname(outputPath), { recursive: true })];
125
- case 4:
126
- _d.sent();
127
- return [4 /*yield*/, fs.writeFile(outputPath, fileContents, 'utf8')];
128
- case 5:
129
- _d.sent();
130
- relativeOutput = path.relative(process.cwd(), outputPath);
131
- logger.newline();
132
- if (queryKeys.length === 0) {
133
- logger.warn('Generated client for an empty serve catalog. Add queries to your API file.');
134
- }
135
- else {
136
- logger.success("Mapped ".concat(queryKeys.length, " ").concat(queryKeys.length === 1 ? 'query' : 'queries'));
137
- }
138
- logger.success("Wrote ".concat(relativeOutput));
139
- logger.newline();
140
- logger.info("Import the generated type and pass it to createHooks() or your HTTP client.");
141
- return [3 /*break*/, 7];
142
- case 6:
143
- error_1 = _d.sent();
144
- spinner.fail('Failed to generate client types');
145
- logger.newline();
146
- if (error_1 instanceof Error) {
147
- logger.error(error_1.message);
148
- }
149
- else {
150
- logger.error(String(error_1));
151
- }
152
- logger.newline();
153
- process.exit(1);
154
- return [3 /*break*/, 7];
155
- case 7: return [2 /*return*/];
156
- }
157
- });
158
- });
159
- }
@@ -1,7 +0,0 @@
1
- export interface ClickHouseGeneratorOptions {
2
- outputPath: string;
3
- includeTables?: string[];
4
- excludeTables?: string[];
5
- }
6
- export declare function generateClickHouseTypes(options: ClickHouseGeneratorOptions): Promise<void>;
7
- //# sourceMappingURL=clickhouse.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clickhouse.d.ts","sourceRoot":"","sources":["../../src/generators/clickhouse.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AA4HD,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,0BAA0B,iBA0ChF"}