@jantokic/chtype 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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +192 -0
  3. package/dist/client/client.d.ts +41 -0
  4. package/dist/client/client.d.ts.map +1 -0
  5. package/dist/client/client.js +60 -0
  6. package/dist/client/client.js.map +1 -0
  7. package/dist/client/index.d.ts +2 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +2 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/codegen/cli.d.ts +10 -0
  12. package/dist/codegen/cli.d.ts.map +1 -0
  13. package/dist/codegen/cli.js +100 -0
  14. package/dist/codegen/cli.js.map +1 -0
  15. package/dist/codegen/config.d.ts +73 -0
  16. package/dist/codegen/config.d.ts.map +1 -0
  17. package/dist/codegen/config.js +53 -0
  18. package/dist/codegen/config.js.map +1 -0
  19. package/dist/codegen/generator.d.ts +16 -0
  20. package/dist/codegen/generator.d.ts.map +1 -0
  21. package/dist/codegen/generator.js +95 -0
  22. package/dist/codegen/generator.js.map +1 -0
  23. package/dist/codegen/index.d.ts +5 -0
  24. package/dist/codegen/index.d.ts.map +1 -0
  25. package/dist/codegen/index.js +5 -0
  26. package/dist/codegen/index.js.map +1 -0
  27. package/dist/codegen/introspect.d.ts +60 -0
  28. package/dist/codegen/introspect.d.ts.map +1 -0
  29. package/dist/codegen/introspect.js +118 -0
  30. package/dist/codegen/introspect.js.map +1 -0
  31. package/dist/codegen/type-mapper.d.ts +16 -0
  32. package/dist/codegen/type-mapper.d.ts.map +1 -0
  33. package/dist/codegen/type-mapper.js +118 -0
  34. package/dist/codegen/type-mapper.js.map +1 -0
  35. package/dist/index.d.ts +4 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +5 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/query/expressions.d.ts +28 -0
  40. package/dist/query/expressions.d.ts.map +1 -0
  41. package/dist/query/expressions.js +65 -0
  42. package/dist/query/expressions.js.map +1 -0
  43. package/dist/query/index.d.ts +7 -0
  44. package/dist/query/index.d.ts.map +1 -0
  45. package/dist/query/index.js +6 -0
  46. package/dist/query/index.js.map +1 -0
  47. package/dist/query/insert-builder.d.ts +18 -0
  48. package/dist/query/insert-builder.d.ts.map +1 -0
  49. package/dist/query/insert-builder.js +27 -0
  50. package/dist/query/insert-builder.js.map +1 -0
  51. package/dist/query/param.d.ts +11 -0
  52. package/dist/query/param.d.ts.map +1 -0
  53. package/dist/query/param.js +16 -0
  54. package/dist/query/param.js.map +1 -0
  55. package/dist/query/query-builder.d.ts +30 -0
  56. package/dist/query/query-builder.d.ts.map +1 -0
  57. package/dist/query/query-builder.js +36 -0
  58. package/dist/query/query-builder.js.map +1 -0
  59. package/dist/query/select-builder.d.ts +64 -0
  60. package/dist/query/select-builder.d.ts.map +1 -0
  61. package/dist/query/select-builder.js +182 -0
  62. package/dist/query/select-builder.js.map +1 -0
  63. package/dist/query/types.d.ts +30 -0
  64. package/dist/query/types.d.ts.map +1 -0
  65. package/dist/query/types.js +2 -0
  66. package/dist/query/types.js.map +1 -0
  67. package/package.json +65 -0
@@ -0,0 +1,95 @@
1
+ /**
2
+ * TypeScript code generator.
3
+ *
4
+ * Takes introspected table metadata and generates:
5
+ * - Per-table Row interfaces (for SELECT results)
6
+ * - Per-table Insert interfaces (DEFAULT fields optional, MATERIALIZED/ALIAS excluded)
7
+ * - A Database registry type mapping table names to their types + engine metadata
8
+ */
9
+ import { mapClickHouseType } from './type-mapper.js';
10
+ /** Valid JS identifier pattern — names that don't match need quoting. */
11
+ const VALID_IDENTIFIER = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
12
+ /** Quote a property name if it's not a valid JS identifier. */
13
+ function quoteProperty(name) {
14
+ return VALID_IDENTIFIER.test(name) ? name : `"${name}"`;
15
+ }
16
+ /** Convert snake_case to PascalCase, preserving casing within segments. */
17
+ function snakeToPascal(s) {
18
+ return s
19
+ .split('_')
20
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
21
+ .join('');
22
+ }
23
+ function rowName(tableName) {
24
+ return `${snakeToPascal(tableName)}Row`;
25
+ }
26
+ function insertName(tableName) {
27
+ return `${snakeToPascal(tableName)}Insert`;
28
+ }
29
+ function jsdoc(lines) {
30
+ if (lines.length === 0)
31
+ return '';
32
+ if (lines.length === 1)
33
+ return `/** ${lines[0]} */\n`;
34
+ return `/**\n${lines.map((l) => ` * ${l}`).join('\n')}\n */\n`;
35
+ }
36
+ function generateRowInterface(table, options) {
37
+ const docLines = [
38
+ `Table: \`${table.name}\``,
39
+ `Engine: ${table.engineFull || table.engine}`,
40
+ ];
41
+ if (table.sortingKey)
42
+ docLines.push(`ORDER BY: (${table.sortingKey})`);
43
+ if (table.partitionKey)
44
+ docLines.push(`PARTITION BY: ${table.partitionKey}`);
45
+ if (table.versionColumn)
46
+ docLines.push(`Version column: ${table.versionColumn}`);
47
+ if (table.comment)
48
+ docLines.push('', table.comment);
49
+ const fields = table.columns.map((col) => {
50
+ const tsType = mapClickHouseType(col.type, options);
51
+ const comment = col.comment ? ` /** ${col.comment} */\n` : '';
52
+ return `${comment} ${quoteProperty(col.name)}: ${tsType};`;
53
+ });
54
+ return `${jsdoc(docLines)}export interface ${rowName(table.name)} {\n${fields.join('\n')}\n}`;
55
+ }
56
+ function generateInsertInterface(table, options) {
57
+ const insertableColumns = table.columns.filter((col) => col.defaultKind !== 'MATERIALIZED' && col.defaultKind !== 'ALIAS');
58
+ if (insertableColumns.length === 0)
59
+ return '';
60
+ const fields = insertableColumns.map((col) => {
61
+ const tsType = mapClickHouseType(col.type, options);
62
+ const optional = col.defaultKind === 'DEFAULT' ? '?' : '';
63
+ const comment = col.comment ? ` /** ${col.comment} */\n` : '';
64
+ return `${comment} ${quoteProperty(col.name)}${optional}: ${tsType};`;
65
+ });
66
+ return `/** Insert type for \`${table.name}\` — DEFAULT columns are optional, MATERIALIZED/ALIAS columns excluded. */\nexport interface ${insertName(table.name)} {\n${fields.join('\n')}\n}`;
67
+ }
68
+ function generateDatabaseType(tables) {
69
+ const entries = tables.map((table) => {
70
+ const engineLiteral = JSON.stringify(table.engine);
71
+ const versionLiteral = table.versionColumn ? JSON.stringify(table.versionColumn) : 'null';
72
+ return ` ${quoteProperty(table.name)}: {\n row: ${rowName(table.name)};\n insert: ${insertName(table.name)};\n engine: ${engineLiteral};\n versionColumn: ${versionLiteral};\n };`;
73
+ });
74
+ return `/** Database registry — maps table names to their Row/Insert types and engine metadata. */\nexport interface Database {\n${entries.join('\n')}\n}`;
75
+ }
76
+ export function generate(tables, options) {
77
+ const header = [
78
+ '// @generated by chtype',
79
+ `// Database: ${options.database}`,
80
+ `// Generated at: ${new Date().toISOString()}`,
81
+ '//',
82
+ '// Do not edit manually — regenerate with: npx chtype generate',
83
+ '',
84
+ ].join('\n');
85
+ const sections = [header];
86
+ for (const table of tables) {
87
+ sections.push(generateRowInterface(table, options));
88
+ const insertIface = generateInsertInterface(table, options);
89
+ if (insertIface)
90
+ sections.push(insertIface);
91
+ }
92
+ sections.push(generateDatabaseType(tables));
93
+ return `${sections.join('\n\n')}\n`;
94
+ }
95
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/codegen/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { defineConfig, type ChtypeConfig } from './config.js';
2
+ export { generate, type GeneratorOptions } from './generator.js';
3
+ export { introspect, parseVersionColumn, matchesPattern, filterTables, type IntrospectedColumn, type IntrospectedTable, type IntrospectOptions, } from './introspect.js';
4
+ export { mapClickHouseType, type TypeMapperOptions } from './type-mapper.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { defineConfig } from './config.js';
2
+ export { generate } from './generator.js';
3
+ export { introspect, parseVersionColumn, matchesPattern, filterTables, } from './introspect.js';
4
+ export { mapClickHouseType } from './type-mapper.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAyB,MAAM,gBAAgB,CAAC;AACjE,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,YAAY,GAIb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAA0B,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * ClickHouse schema introspection.
3
+ *
4
+ * Queries system.tables and system.columns to build a complete picture
5
+ * of the database schema, including engine metadata and column flags.
6
+ */
7
+ import type { ClickHouseClient } from '@clickhouse/client';
8
+ export interface IntrospectedColumn {
9
+ name: string;
10
+ type: string;
11
+ defaultKind: 'DEFAULT' | 'MATERIALIZED' | 'ALIAS' | '';
12
+ defaultExpression: string;
13
+ comment: string;
14
+ isInSortingKey: boolean;
15
+ isInPrimaryKey: boolean;
16
+ isInPartitionKey: boolean;
17
+ }
18
+ export interface IntrospectedTable {
19
+ name: string;
20
+ engine: string;
21
+ engineFull: string;
22
+ versionColumn: string | null;
23
+ sortingKey: string;
24
+ partitionKey: string;
25
+ primaryKey: string;
26
+ comment: string;
27
+ columns: IntrospectedColumn[];
28
+ }
29
+ export interface IntrospectOptions {
30
+ include?: string[];
31
+ exclude?: string[];
32
+ }
33
+ interface SystemTableRow {
34
+ name: string;
35
+ engine: string;
36
+ engine_full: string;
37
+ sorting_key: string;
38
+ partition_key: string;
39
+ primary_key: string;
40
+ comment: string;
41
+ }
42
+ /**
43
+ * Introspect all tables in a ClickHouse database.
44
+ *
45
+ * Note: Fetches columns per-table (N+1 queries). This is fine for codegen
46
+ * (one-shot CLI tool) but may be slow for databases with 100+ tables.
47
+ */
48
+ export declare function introspect(client: ClickHouseClient, database: string, options?: IntrospectOptions): Promise<IntrospectedTable[]>;
49
+ /**
50
+ * Extract the version column from a ReplacingMergeTree engine_full string.
51
+ *
52
+ * Walks characters to find balanced parentheses instead of using a greedy regex,
53
+ * which handles edge cases like nested parens in replication paths.
54
+ */
55
+ export declare function parseVersionColumn(engine: string, engineFull: string): string | null;
56
+ /** Match table names against glob-like patterns (supports * wildcard). */
57
+ export declare function matchesPattern(name: string, pattern: string): boolean;
58
+ export declare function filterTables(tables: SystemTableRow[], include: string[], exclude: string[]): SystemTableRow[];
59
+ export {};
60
+ //# sourceMappingURL=introspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.d.ts","sourceRoot":"","sources":["../../src/codegen/introspect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,SAAS,GAAG,cAAc,GAAG,OAAO,GAAG,EAAE,CAAC;IACvD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAaD;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAyD9B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BpF;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGrE;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,cAAc,EAAE,EACxB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EAAE,GAChB,cAAc,EAAE,CAMlB"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * ClickHouse schema introspection.
3
+ *
4
+ * Queries system.tables and system.columns to build a complete picture
5
+ * of the database schema, including engine metadata and column flags.
6
+ */
7
+ /**
8
+ * Introspect all tables in a ClickHouse database.
9
+ *
10
+ * Note: Fetches columns per-table (N+1 queries). This is fine for codegen
11
+ * (one-shot CLI tool) but may be slow for databases with 100+ tables.
12
+ */
13
+ export async function introspect(client, database, options = {}) {
14
+ const tablesResult = await client.query({
15
+ query: `
16
+ SELECT name, engine, engine_full, sorting_key, partition_key, primary_key, comment
17
+ FROM system.tables
18
+ WHERE database = {database:String}
19
+ AND name NOT LIKE '.inner.%'
20
+ AND name NOT LIKE '.inner_id.%'
21
+ ORDER BY name
22
+ `,
23
+ query_params: { database },
24
+ format: 'JSONEachRow',
25
+ });
26
+ const tableRows = await tablesResult.json();
27
+ const filteredTables = filterTables(tableRows, options.include ?? [], options.exclude ?? []);
28
+ const tables = [];
29
+ for (const table of filteredTables) {
30
+ const columnsResult = await client.query({
31
+ query: `
32
+ SELECT name, type, default_kind, default_expression, comment,
33
+ is_in_sorting_key, is_in_primary_key, is_in_partition_key
34
+ FROM system.columns
35
+ WHERE database = {database:String} AND table = {table:String}
36
+ ORDER BY position
37
+ `,
38
+ query_params: { database, table: table.name },
39
+ format: 'JSONEachRow',
40
+ });
41
+ const columnRows = await columnsResult.json();
42
+ tables.push({
43
+ name: table.name,
44
+ engine: table.engine,
45
+ engineFull: table.engine_full,
46
+ versionColumn: parseVersionColumn(table.engine, table.engine_full),
47
+ sortingKey: table.sorting_key,
48
+ partitionKey: table.partition_key,
49
+ primaryKey: table.primary_key,
50
+ comment: table.comment,
51
+ columns: columnRows.map((col) => ({
52
+ name: col.name,
53
+ type: col.type,
54
+ defaultKind: (col.default_kind || ''),
55
+ defaultExpression: col.default_expression,
56
+ comment: col.comment,
57
+ isInSortingKey: col.is_in_sorting_key === 1,
58
+ isInPrimaryKey: col.is_in_primary_key === 1,
59
+ isInPartitionKey: col.is_in_partition_key === 1,
60
+ })),
61
+ });
62
+ }
63
+ return tables;
64
+ }
65
+ /**
66
+ * Extract the version column from a ReplacingMergeTree engine_full string.
67
+ *
68
+ * Walks characters to find balanced parentheses instead of using a greedy regex,
69
+ * which handles edge cases like nested parens in replication paths.
70
+ */
71
+ export function parseVersionColumn(engine, engineFull) {
72
+ if (!engine.includes('ReplacingMergeTree'))
73
+ return null;
74
+ const idx = engineFull.indexOf('ReplacingMergeTree(');
75
+ if (idx === -1)
76
+ return null;
77
+ const start = engineFull.indexOf('(', idx);
78
+ if (start === -1)
79
+ return null;
80
+ // Walk to find matching closing paren
81
+ let depth = 1;
82
+ let end = start + 1;
83
+ while (end < engineFull.length && depth > 0) {
84
+ if (engineFull[end] === '(')
85
+ depth++;
86
+ else if (engineFull[end] === ')')
87
+ depth--;
88
+ end++;
89
+ }
90
+ if (depth !== 0)
91
+ return null;
92
+ const args = engineFull.slice(start + 1, end - 1);
93
+ if (!args.trim())
94
+ return null;
95
+ // The version column is the last argument that isn't a quoted string
96
+ const parts = args.split(',').map((s) => s.trim());
97
+ const lastArg = parts[parts.length - 1];
98
+ if (!lastArg)
99
+ return null;
100
+ if (lastArg.startsWith("'") || lastArg.startsWith('"'))
101
+ return null;
102
+ return lastArg;
103
+ }
104
+ /** Match table names against glob-like patterns (supports * wildcard). */
105
+ export function matchesPattern(name, pattern) {
106
+ const regex = new RegExp(`^${pattern.replace(/\./g, '\\.').replace(/\*/g, '.*')}$`);
107
+ return regex.test(name);
108
+ }
109
+ export function filterTables(tables, include, exclude) {
110
+ return tables.filter((t) => {
111
+ if (include.length > 0 && !include.some((p) => matchesPattern(t.name, p)))
112
+ return false;
113
+ if (exclude.length > 0 && exclude.some((p) => matchesPattern(t.name, p)))
114
+ return false;
115
+ return true;
116
+ });
117
+ }
118
+ //# sourceMappingURL=introspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.js","sourceRoot":"","sources":["../../src/codegen/introspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Maps ClickHouse column types to TypeScript types.
3
+ *
4
+ * Handles all ClickHouse type constructors: Nullable, LowCardinality, Array, Map,
5
+ * Tuple, Enum, AggregateFunction, Decimal, DateTime64, FixedString, and all scalars.
6
+ */
7
+ export interface TypeMapperOptions {
8
+ /** Map UInt64/Int64/UInt128/Int128/UInt256/Int256 to bigint instead of string */
9
+ bigints?: boolean;
10
+ }
11
+ export declare function mapClickHouseType(chType: string, options?: TypeMapperOptions): string;
12
+ /** Find the index of the first top-level comma (not inside parentheses). */
13
+ export declare function findTopLevelComma(s: string): number;
14
+ /** Split a string by top-level commas (not inside parentheses). */
15
+ export declare function splitTopLevel(s: string): string[];
16
+ //# sourceMappingURL=type-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-mapper.d.ts","sourceRoot":"","sources":["../../src/codegen/type-mapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA+BD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CA2DzF;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAcjD"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Maps ClickHouse column types to TypeScript types.
3
+ *
4
+ * Handles all ClickHouse type constructors: Nullable, LowCardinality, Array, Map,
5
+ * Tuple, Enum, AggregateFunction, Decimal, DateTime64, FixedString, and all scalars.
6
+ */
7
+ const SCALAR_MAP = {
8
+ String: 'string',
9
+ UUID: 'string',
10
+ IPv4: 'string',
11
+ IPv6: 'string',
12
+ Date: 'string',
13
+ Date32: 'string',
14
+ DateTime: 'string',
15
+ Bool: 'boolean',
16
+ Boolean: 'boolean',
17
+ UInt8: 'number',
18
+ UInt16: 'number',
19
+ UInt32: 'number',
20
+ Int8: 'number',
21
+ Int16: 'number',
22
+ Int32: 'number',
23
+ Float32: 'number',
24
+ Float64: 'number',
25
+ };
26
+ const LARGE_INT_TYPES = new Set([
27
+ 'UInt64',
28
+ 'UInt128',
29
+ 'UInt256',
30
+ 'Int64',
31
+ 'Int128',
32
+ 'Int256',
33
+ ]);
34
+ export function mapClickHouseType(chType, options = {}) {
35
+ const t = chType.replace(/\s+/g, ' ').trim();
36
+ const nullableMatch = t.match(/^Nullable\((.+)\)$/);
37
+ if (nullableMatch) {
38
+ return `${mapClickHouseType(nullableMatch[1], options)} | null`;
39
+ }
40
+ const lcMatch = t.match(/^LowCardinality\((.+)\)$/);
41
+ if (lcMatch) {
42
+ return mapClickHouseType(lcMatch[1], options);
43
+ }
44
+ const arrayMatch = t.match(/^Array\((.+)\)$/);
45
+ if (arrayMatch) {
46
+ const inner = mapClickHouseType(arrayMatch[1], options);
47
+ return inner.includes('|') ? `(${inner})[]` : `${inner}[]`;
48
+ }
49
+ const mapMatch = t.match(/^Map\((.+)\)$/);
50
+ if (mapMatch) {
51
+ const inner = mapMatch[1];
52
+ const commaIdx = findTopLevelComma(inner);
53
+ if (commaIdx !== -1) {
54
+ const keyType = mapClickHouseType(inner.slice(0, commaIdx).trim(), options);
55
+ const valType = mapClickHouseType(inner.slice(commaIdx + 1).trim(), options);
56
+ return `Record<${keyType}, ${valType}>`;
57
+ }
58
+ }
59
+ const tupleMatch = t.match(/^Tuple\((.+)\)$/);
60
+ if (tupleMatch) {
61
+ const inner = tupleMatch[1];
62
+ const parts = splitTopLevel(inner);
63
+ const mapped = parts.map((p) => {
64
+ const namedMatch = p.trim().match(/^\w+\s+(.+)$/);
65
+ return mapClickHouseType(namedMatch ? namedMatch[1] : p.trim(), options);
66
+ });
67
+ return `[${mapped.join(', ')}]`;
68
+ }
69
+ if (t.startsWith('Enum8(') || t.startsWith('Enum16(')) {
70
+ return 'string';
71
+ }
72
+ const aggMatch = t.match(/^(?:SimpleAggregateFunction|AggregateFunction)\(.+?,\s*(.+)\)$/);
73
+ if (aggMatch) {
74
+ return mapClickHouseType(aggMatch[1], options);
75
+ }
76
+ if (t.startsWith('Decimal'))
77
+ return 'string';
78
+ if (t.startsWith('DateTime64'))
79
+ return 'string';
80
+ if (t.startsWith('FixedString'))
81
+ return 'string';
82
+ if (LARGE_INT_TYPES.has(t)) {
83
+ return options.bigints ? 'bigint' : 'string';
84
+ }
85
+ return SCALAR_MAP[t] ?? 'unknown';
86
+ }
87
+ /** Find the index of the first top-level comma (not inside parentheses). */
88
+ export function findTopLevelComma(s) {
89
+ let depth = 0;
90
+ for (let i = 0; i < s.length; i++) {
91
+ if (s[i] === '(')
92
+ depth++;
93
+ else if (s[i] === ')')
94
+ depth--;
95
+ else if (s[i] === ',' && depth === 0)
96
+ return i;
97
+ }
98
+ return -1;
99
+ }
100
+ /** Split a string by top-level commas (not inside parentheses). */
101
+ export function splitTopLevel(s) {
102
+ const parts = [];
103
+ let depth = 0;
104
+ let start = 0;
105
+ for (let i = 0; i < s.length; i++) {
106
+ if (s[i] === '(')
107
+ depth++;
108
+ else if (s[i] === ')')
109
+ depth--;
110
+ else if (s[i] === ',' && depth === 0) {
111
+ parts.push(s.slice(start, i));
112
+ start = i + 1;
113
+ }
114
+ }
115
+ parts.push(s.slice(start));
116
+ return parts;
117
+ }
118
+ //# sourceMappingURL=type-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-mapper.js","sourceRoot":"","sources":["../../src/codegen/type-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './codegen/index.js';
2
+ export * from './query/index.js';
3
+ export * from './client/index.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ // Re-export all submodules for convenience
2
+ export * from './codegen/index.js';
3
+ export * from './query/index.js';
4
+ export * from './client/index.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /** Represents a raw SQL expression with an optional alias. */
2
+ export declare class Expression {
3
+ readonly sql: string;
4
+ readonly alias?: string | undefined;
5
+ constructor(sql: string, alias?: string | undefined);
6
+ as(alias: string): Expression;
7
+ toString(): string;
8
+ }
9
+ /** ClickHouse function builders. */
10
+ export declare const fn: {
11
+ argMax(column: string, versionColumn: string): Expression;
12
+ argMin(column: string, versionColumn: string): Expression;
13
+ count(column?: string): Expression;
14
+ countDistinct(column: string): Expression;
15
+ sum(column: string): Expression;
16
+ avg(column: string): Expression;
17
+ min(column: string): Expression;
18
+ max(column: string): Expression;
19
+ groupArray(column: string): Expression;
20
+ arrayJoin(column: string): Expression;
21
+ uniq(column: string): Expression;
22
+ uniqExact(column: string): Expression;
23
+ toStartOfDay(column: string): Expression;
24
+ toStartOfHour(column: string): Expression;
25
+ /** Raw SQL expression — escape hatch for anything not covered. */
26
+ raw(sql: string): Expression;
27
+ };
28
+ //# sourceMappingURL=expressions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../src/query/expressions.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,qBAAa,UAAU;aAEH,GAAG,EAAE,MAAM;aACX,KAAK,CAAC,EAAE,MAAM;gBADd,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,YAAA;IAGhC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAI7B,QAAQ,IAAI,MAAM;CAGnB;AAED,oCAAoC;AACpC,eAAO,MAAM,EAAE;mBACE,MAAM,iBAAiB,MAAM,GAAG,UAAU;mBAG1C,MAAM,iBAAiB,MAAM,GAAG,UAAU;mBAG1C,MAAM,GAAG,UAAU;0BAGZ,MAAM,GAAG,UAAU;gBAG7B,MAAM,GAAG,UAAU;gBAGnB,MAAM,GAAG,UAAU;gBAGnB,MAAM,GAAG,UAAU;gBAGnB,MAAM,GAAG,UAAU;uBAGZ,MAAM,GAAG,UAAU;sBAGpB,MAAM,GAAG,UAAU;iBAGxB,MAAM,GAAG,UAAU;sBAGd,MAAM,GAAG,UAAU;yBAGhB,MAAM,GAAG,UAAU;0BAGlB,MAAM,GAAG,UAAU;IAGzC,kEAAkE;aACzD,MAAM,GAAG,UAAU;CAG7B,CAAC"}
@@ -0,0 +1,65 @@
1
+ /** Represents a raw SQL expression with an optional alias. */
2
+ export class Expression {
3
+ sql;
4
+ alias;
5
+ constructor(sql, alias) {
6
+ this.sql = sql;
7
+ this.alias = alias;
8
+ }
9
+ as(alias) {
10
+ return new Expression(this.sql, alias);
11
+ }
12
+ toString() {
13
+ return this.alias ? `${this.sql} AS ${this.alias}` : this.sql;
14
+ }
15
+ }
16
+ /** ClickHouse function builders. */
17
+ export const fn = {
18
+ argMax(column, versionColumn) {
19
+ return new Expression(`argMax(${column}, ${versionColumn})`);
20
+ },
21
+ argMin(column, versionColumn) {
22
+ return new Expression(`argMin(${column}, ${versionColumn})`);
23
+ },
24
+ count(column) {
25
+ return new Expression(column ? `count(${column})` : 'count()');
26
+ },
27
+ countDistinct(column) {
28
+ return new Expression(`count(DISTINCT ${column})`);
29
+ },
30
+ sum(column) {
31
+ return new Expression(`sum(${column})`);
32
+ },
33
+ avg(column) {
34
+ return new Expression(`avg(${column})`);
35
+ },
36
+ min(column) {
37
+ return new Expression(`min(${column})`);
38
+ },
39
+ max(column) {
40
+ return new Expression(`max(${column})`);
41
+ },
42
+ groupArray(column) {
43
+ return new Expression(`groupArray(${column})`);
44
+ },
45
+ arrayJoin(column) {
46
+ return new Expression(`arrayJoin(${column})`);
47
+ },
48
+ uniq(column) {
49
+ return new Expression(`uniq(${column})`);
50
+ },
51
+ uniqExact(column) {
52
+ return new Expression(`uniqExact(${column})`);
53
+ },
54
+ toStartOfDay(column) {
55
+ return new Expression(`toStartOfDay(${column})`);
56
+ },
57
+ toStartOfHour(column) {
58
+ return new Expression(`toStartOfHour(${column})`);
59
+ },
60
+ /** Raw SQL expression — escape hatch for anything not covered. */
61
+ raw(sql) {
62
+ return new Expression(sql);
63
+ },
64
+ };
65
+ //# sourceMappingURL=expressions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../src/query/expressions.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,OAAO,UAAU;IAEH;IACA;IAFlB,YACkB,GAAW,EACX,KAAc;QADd,QAAG,GAAH,GAAG,CAAQ;QACX,UAAK,GAAL,KAAK,CAAS;IAC7B,CAAC;IAEJ,EAAE,CAAC,KAAa;QACd,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAChE,CAAC;CACF;AAED,oCAAoC;AACpC,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,MAAM,CAAC,MAAc,EAAE,aAAqB;QAC1C,OAAO,IAAI,UAAU,CAAC,UAAU,MAAM,KAAK,aAAa,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,CAAC,MAAc,EAAE,aAAqB;QAC1C,OAAO,IAAI,UAAU,CAAC,UAAU,MAAM,KAAK,aAAa,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,KAAK,CAAC,MAAe;QACnB,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC;IACD,aAAa,CAAC,MAAc;QAC1B,OAAO,IAAI,UAAU,CAAC,kBAAkB,MAAM,GAAG,CAAC,CAAC;IACrD,CAAC;IACD,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,UAAU,CAAC,OAAO,MAAM,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,UAAU,CAAC,OAAO,MAAM,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,UAAU,CAAC,OAAO,MAAM,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,UAAU,CAAC,OAAO,MAAM,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,UAAU,CAAC,MAAc;QACvB,OAAO,IAAI,UAAU,CAAC,cAAc,MAAM,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,SAAS,CAAC,MAAc;QACtB,OAAO,IAAI,UAAU,CAAC,aAAa,MAAM,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,MAAc;QACjB,OAAO,IAAI,UAAU,CAAC,QAAQ,MAAM,GAAG,CAAC,CAAC;IAC3C,CAAC;IACD,SAAS,CAAC,MAAc;QACtB,OAAO,IAAI,UAAU,CAAC,aAAa,MAAM,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,UAAU,CAAC,gBAAgB,MAAM,GAAG,CAAC,CAAC;IACnD,CAAC;IACD,aAAa,CAAC,MAAc;QAC1B,OAAO,IAAI,UAAU,CAAC,iBAAiB,MAAM,GAAG,CAAC,CAAC;IACpD,CAAC;IACD,kEAAkE;IAClE,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { createQueryBuilder, type QueryBuilder } from './query-builder.js';
2
+ export { SelectBuilder } from './select-builder.js';
3
+ export { InsertBuilder } from './insert-builder.js';
4
+ export { Expression, fn } from './expressions.js';
5
+ export { Param, param, type ClickHouseParamType } from './param.js';
6
+ export type { DatabaseSchema, TableName, RowType, InsertType, ColumnName, CompiledQuery, SortDirection, ComparisonOp, SetOp, WhereOp, JoinType, } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACpE,YAAY,EACV,cAAc,EACd,SAAS,EACT,OAAO,EACP,UAAU,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACZ,KAAK,EACL,OAAO,EACP,QAAQ,GACT,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { createQueryBuilder } from './query-builder.js';
2
+ export { SelectBuilder } from './select-builder.js';
3
+ export { InsertBuilder } from './insert-builder.js';
4
+ export { Expression, fn } from './expressions.js';
5
+ export { Param, param } from './param.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAA4B,MAAM,YAAY,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { CompiledQuery, DatabaseSchema, InsertType, TableName } from './types.js';
2
+ export declare class InsertBuilder<DB extends DatabaseSchema, T extends TableName<DB> = TableName<DB>> {
3
+ private _table;
4
+ private _rows;
5
+ constructor(table: T);
6
+ values(rows: InsertType<DB, T>[]): this;
7
+ /**
8
+ * Compile the insert metadata.
9
+ *
10
+ * For bulk inserts, prefer using the client's `insert()` method
11
+ * which uses ClickHouse's native insert protocol.
12
+ */
13
+ compile(): CompiledQuery & {
14
+ table: string;
15
+ rows: InsertType<DB, T>[];
16
+ };
17
+ }
18
+ //# sourceMappingURL=insert-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert-builder.d.ts","sourceRoot":"","sources":["../../src/query/insert-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvF,qBAAa,aAAa,CACxB,EAAE,SAAS,cAAc,EACzB,CAAC,SAAS,SAAS,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;IAEvC,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,KAAK,CAA2B;gBAE5B,KAAK,EAAE,CAAC;IAIpB,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI;IAKvC;;;;;OAKG;IACH,OAAO,IAAI,aAAa,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAA;KAAE;CAYxE"}